Búsqueda de sitios web

Cómo deshabilité IPv6 en Linux


Simplifique su red doméstica desactivando IPv6.

IPv6 es bueno para Internet en general, pero lo encuentro innecesariamente complejo para su uso en la mayoría de los hogares y en las pequeñas y medianas empresas. Como muchos otros, sigo usando rangos de direcciones IPv4 privadas para mis propias redes internas y aquellas sobre las que tengo cierto nivel de responsabilidad. De todos modos, mi ISP solo proporciona direcciones IPv4, por lo que no tiene sentido usar IPv6 internamente cuando todos los paquetes externos son IPv4. Además, IPv4 es mucho más simple y uno de mis principios de la filosofía de Linux es "Encontrar la simplicidad".

Como resultado, desactivé IPv6 en todos mis hosts. Al principio parecía fácil. Así es como lo hice.

Pruebas para IPv6

Mis hosts ejecutan el giro de Fedora 36 Xfce junto con muchos paquetes y cambios de configuración que realizo después de la instalación inicial predeterminada. Todos mis hosts tienen instaladas las actualizaciones más recientes. Uno de esos hosts es mi firewall/enrutador, que es el primer host en el que desactivé IPv6.

Puede verificar si IPv6 está actualmente activo en su host Linux. Los resultados del comando nmcli a continuación provienen de mi enrutador/host de firewall. Todas las NIC activas tienen direcciones IPv4 e IPv6.

# nmcli
enp4s0: connected to enp4s0
        "Realtek RTL8111/8168/8411"
        ethernet (r8169), 84:16:F9:04:44:03, hw, mtu 1500
        ip4 default
        inet4 45.20.209.41/29
        route4 45.20.209.40/29 metric 102
        route4 default via 45.20.209.46 metric 102
        inet6 2600:1700:7c0:860:8616:f9ff:fe04:4403/64
        inet6 fe80::8616:f9ff:fe04:4403/64
        route6 fe80::/64 metric 256
        route6 default via fe80::a698:13ff:fee5:fa10 metric 1024
        route6 2600:1700:7c0:860::/64 metric 256

enp1s0: connected to enp1s0
        "Realtek RTL8111/8168/8411"
        ethernet (r8169), 84:16:F9:03:E9:89, hw, mtu 1500
        inet4 192.168.10.1/24
        route4 192.168.10.0/24 metric 101
        inet6 fe80::8616:f9ff:fe03:e989/64
        route6 fe80::/64 metric 256

enp2s0: connected to enp2s0
        "Realtek RTL8111/8168/8411"
        ethernet (r8169), 84:16:F9:03:FD:85, hw, mtu 1500
        inet4 192.168.0.254/24
        route4 192.168.0.0/24 metric 100
        inet6 fe80::8616:f9ff:fe03:fd85/64
        route6 fe80::/64 metric 256

lo: unmanaged
        "lo"
        loopback (unknown), 00:00:00:00:00:00, sw, mtu 65536

DNS configuration:
        servers: 192.168.0.52 8.8.8.8 8.8.4.4
        interface: enp4s0

        servers: 192.168.0.52 8.8.8.8
        interface: enp2s0

        servers: 192.168.0.52 8.8.8.8
        interface: enp1s0

Utilice GRUB para configurar el kernel

GRUB, el Grand Unified Bootloader, carga el kernel en la memoria y establece muchos parámetros del kernel durante el proceso de arranque de Linux. El gestor de arranque actual es en realidad GRUB2, la segunda versión principal de GRUB, pero es más fácil llamarlo simplemente GRUB.

El archivo de configuración de GRUB /boot/grub2/grub.cfg proporciona la configuración de inicio para el kernel, pero no debe modificarlo directamente. La ubicación del archivo de configuración UEFI GRUB puede variar según su distribución. Sin embargo, su ubicación es irrelevante a estos efectos. La configuración del kernel de inicio de Linux se puede modificar fácilmente usando el archivo de configuración /etc/default/grub, que configura el kernel correctamente independientemente de si arranca usando UEFI.

Hay dos argumentos de línea de comando para agregar al archivo /etc/default/grub para configurar el kernel de Linux para deshabilitar IPv6. El primero, GRUB_CMDLINE_LINUX="ipv6.disable=1" agrega "ipv6.disable=1" a la línea de comando del kernel.

El segundo, GRUB_CMDLINE_LINUX_DEFAULT="ipv6.disable=1 quiet splash" es un poco más complicado. Cuando configura GRUB_DISABLE_RECOVERY en true, se generará una entrada de menú para cada kernel de Linux. Cuando se establece en false, se crean dos entradas de menú para cada kernel: una entrada predeterminada y una entrada para el modo de recuperación. Esta opción enumera los argumentos de la línea de comandos que se agregarán solo a la entrada del menú predeterminada, después de los enumerados en GRUB_CMDLINE_LINUX.

Los otros dos argumentos definen cómo se ve el inicio del kernel en la pantalla. El argumento "quiet" desactiva la mayoría de los mensajes informativos emitidos por el kernel durante su inicio y autoconfiguración. El argumento "splash" hace que se muestre la pantalla de inicio durante el inicio del kernel. La pantalla de presentación puede ser un gráfico como un logotipo o una animación.

Mi archivo /etc/default/grub se ve así después de realizar esas adiciones:

GRUB_TIMEOUT=5
GRUB_DISTRIBUTOR="$(sed 's, release .*$,,g' /etc/system-release)"
GRUB_DEFAULT=saved
GRUB_DISABLE_SUBMENU=true
GRUB_TERMINAL_OUTPUT="console"
GRUB_CMDLINE_LINUX="rhgb quiet"
GRUB_DISABLE_RECOVERY="true"
GRUB_ENABLE_BLSCFG=true
GRUB_CMDLINE_LINUX_DEFAULT="ipv6.disable=1 quiet splash"
GRUB_CMDLINE_LINUX="ipv6.disable=1"

Después de realizar estas (o cualquiera) adiciones al archivo /etc/default/grub, ejecute el comando grub2-mkconfig, que agrega estos argumentos a la línea de comando del kernel en el Archivo de configuración grub.cfg para cada kernel instalado. Estos cambios no entran en vigor inmediatamente. Debe reiniciar los hosts para que se desactive IPv6.

Automatiza esta solución

Automatizar estas tareas con Ansible es sencillo. Simplemente cree un libro de estrategias con la siguiente configuración y ejecútelo en la lista de hosts que necesitan este cambio. Las dos primeras tareas de este manual añaden la configuración deseada:

- name: Play 1 - Modify /etc/default/grub to configure kernel boot parameters.
  hosts: f36vm

  tasks:
    - name: Append GRUB_CMDLINE_LINUX_DEFAULT variable to /etc/default/grub
      lineinfile:
        path: /etc/default/grub
        insertafter: EOF
        line: 'GRUB_CMDLINE_LINUX_DEFAULT="ipv6.disable=1 quiet splash"'

    - name: Append GRUB_CMDLINE_LINUX variable to /etc/default/grub
      lineinfile:
        path: /etc/default/grub
        insertafter: EOF
        line: 'GRUB_CMDLINE_LINUX="ipv6.disable=1"'

    - name: Run grub2-mkconfig to update /boot/grub/grub.cfg
      command:
        cmd: grub2-mkconfig

Una vez más, debe reiniciar los hosts para que se desactive IPv6. Puede agregar el reinicio al libro de jugadas para que los cambios surtan efecto inmediatamente o esperar hasta la próxima vez que sea necesario reiniciar los hosts por otros motivos.

La otra solución

Creé otra solución; Simplemente no es la mejor y más elegante opción. Sin embargo, quiero mostrar mi proceso de pensamiento porque aquí hay información que podría ser útil.

Agregue un archivo local a sysctl.d

Puede utilizar el archivo /etc/sysctl para agregar los ajustes de configuración necesarios, pero es mucho mejor agregar un archivo local al directorio /etc/sysctl.d para que que no se sobrescribirá durante las actualizaciones o mejoras. Tenga en cuenta que ya existe un archivo llamado 99-sysctl.conf. Puede usar ese archivo para establecer la configuración, pero creé un archivo llamado 99-local-network.conf con el siguiente contenido para este propósito. De esa manera, si el 99-sysctl.conf cambia con futuras actualizaciones o mejoras, mi archivo permanecerá intacto. Este no es un archivo ejecutable; es un archivo de configuración.

################################################################################
# Local NetworkManager settings - Specifically to disable IPV6                 #
################################################################################
#
net.ipv6.conf.all.disable_ipv6 = 1
net.ipv6.conf.default.disable_ipv6 = 1

Nota: Como muchos archivos de configuración en directorios de configuración como este, los archivos contenidos en el directorio se leen en orden natural. Eso significa que el valor de una variable declarada en un archivo con un orden de clasificación posterior anulará una declaración anterior para la misma variable.

Por lo general, se utiliza un reinicio para que estos cambios surtan efecto, pero luego aprendí cómo hacerlo sin reiniciar. Reinicié mi sistema y volví a ejecutar el comando nmcli con los siguientes resultados:

[root@wally ~]# nmcli
enp4s0: connected to enp4s0
        "Realtek RTL8111/8168/8411"
        ethernet (r8169), 84:16:F9:04:44:03, hw, mtu 1500
        ip4 default
        inet4 45.20.209.41/29
        route4 45.20.209.40/29 metric 101
        route4 default via 45.20.209.46 metric 101

enp1s0: connected to enp1s0
        "Realtek RTL8111/8168/8411"
        ethernet (r8169), 84:16:F9:03:E9:89, hw, mtu 1500
        inet4 192.168.10.1/24
        route4 192.168.10.0/24 metric 102

enp2s0: connected to enp2s0
        "Realtek RTL8111/8168/8411"
        ethernet (r8169), 84:16:F9:03:FD:85, hw, mtu 1500
        inet4 192.168.0.254/24
        route4 192.168.0.0/24 metric 100

lo: unmanaged
        "lo"
        loopback (unknown), 00:00:00:00:00:00, sw, mtu 65536

DNS configuration:
        servers: 192.168.0.52 8.8.8.8 8.8.4.4
        interface: enp4s0

        servers: 192.168.0.52 8.8.8.8
        interface: enp2s0

        servers: 192.168.0.52 8.8.8.8
        interface: enp1s0

Esto demuestra que mi solución simple funcionó.

Excepto...

Excepto que esa solución sólo funciona en una de mis doce computadoras con Linux. Después de escribir la parte anterior de este artículo, comencé a instalar esta solución en todos mis otros hosts. Sólo había hecho un sistema cuando me di cuenta de que este enfoque no siempre funcionaba. Luego lo probé en una de mis máquinas virtuales y también falló allí. Lo mejor que puedo decir es que sólo funciona en un host: el que uso como firewall y enrutador.

Después de investigar un poco más sobre una máquina virtual, descubrí que estas configuraciones también se podían emitir como comandos usando sysctl para que el sistema no necesitara reiniciarse. Podría ingresar esos comandos desde la línea de comando para desactivar IPv6. He aquí un ejemplo:

[root@f36vm ~]# sysctl -w net.ipv6.conf.all.disable_ipv6=1
net.ipv6.conf.all.disable_ipv6 = 1
[root@f36vm ~]# sysctl -w net.ipv6.conf.default.disable_ipv6=1
net.ipv6.conf.default.disable_ipv6 = 1
[root@f36vm ~]# nmcli
enp0s3: connected to Wired connection 1
        "Intel 82540EM"
        ethernet (e1000), 08:00:27:07:CD:FE, hw, mtu 1500
        ip4 default
        inet4 192.168.0.136/24
        route4 192.168.0.0/24 metric 100
        route4 default via 192.168.0.254 metric 100

lo: unmanaged
<SNIP>

Me tomó algún tiempo investigar esto y determinar que sysctl no estaba leyendo el archivo que creé, o al menos no procesando, durante el inicio de Linux. O, si lo era, se ignoraba o la configuración se sobrescribía más tarde con las mismas variables con valores diferentes. Después de esto, supe que no había ningún problema más profundo que lo impidiera.

Acerca del sistema

En este punto, analicé el comando sysctl con más detalle. El propósito del comando sysctl es establecer los parámetros del kernel en el directorio /proc. El usuario root puede usarlo para configurar parámetros individuales desde la línea de comando. Además, y esta es la clave de mi solución, puede usarlo para ver y configurar todos los parámetros del kernel almacenados en varias ubicaciones, incluido /etc/sysctl.conf y en archivos ubicados en < código>/etc/sysctl.d. El comando sysctl se utiliza durante el inicio de Linux para configurar los parámetros del kernel.

Repito: el sistema y el administrador del sistema pueden usar el comando sysctl para ver y configurar las variables del kernel mientras el sistema está en funcionamiento y sin reiniciar. Este comando y el poder que ofrece al administrador del sistema Linux es una de las diferencias más significativas entre Linux y otros sistemas operativos. Nos brinda una herramienta para hacer cosas imposibles en otros sistemas operativos.

Probé esto reiniciando la VM y ejecutando el siguiente comando para configurar las variables en todas las ubicaciones enumeradas en la página del manual sysctl:

[root@f36vm ~]# sysctl --system
* Applying /usr/lib/sysctl.d/10-default-yama-scope.conf ...
kernel.yama.ptrace_scope = 0
* Applying /usr/lib/sysctl.d/50-coredump.conf ...
kernel.core_pattern = |/usr/lib/systemd/systemd-coredump %P %u %g %s %t %c %h
kernel.core_pipe_limit = 16
fs.suid_dumpable = 2
* Applying /usr/lib/sysctl.d/50-default.conf ...
kernel.sysrq = 16
kernel.core_uses_pid = 1
net.ipv4.conf.default.rp_filter = 2
sysctl: setting key "net.ipv4.conf.all.rp_filter": Invalid argument
net.ipv4.conf.default.accept_source_route = 0
sysctl: setting key "net.ipv4.conf.all.accept_source_route": Invalid argument
net.ipv4.conf.default.promote_secondaries = 1
sysctl: setting key "net.ipv4.conf.all.promote_secondaries": Invalid argument
net.ipv4.ping_group_range = 0 2147483647
net.core.default_qdisc = fq_codel
fs.protected_hardlinks = 1
fs.protected_symlinks = 1
fs.protected_regular = 1
fs.protected_fifos = 1
* Applying /usr/lib/sysctl.d/50-libkcapi-optmem_max.conf ...
net.core.optmem_max = 81920
* Applying /usr/lib/sysctl.d/50-libreswan.conf ...
net.ipv6.conf.default.accept_redirects = 0
net.ipv6.conf.all.accept_redirects = 0
net.ipv4.conf.default.send_redirects = 0
net.ipv4.conf.default.accept_redirects = 0
net.ipv4.conf.all.send_redirects = 0
net.ipv4.conf.all.accept_redirects = 0
* Applying /usr/lib/sysctl.d/50-pid-max.conf ...
kernel.pid_max = 4194304
* Applying /etc/sysctl.d/99-local-network.conf ...
net.ipv6.conf.all.disable_ipv6 = 1
net.ipv6.conf.default.disable_ipv6 = 1
* Applying /etc/sysctl.d/99-sysctl.conf ...
* Applying /etc/sysctl.conf ...

[root@f36vm ~]#

Verificar el estado de la NIC con el comando nmcli mostró que IPv6 se había deshabilitado y que IPv4 todavía estaba activo y ejecutándose. Sí, veo los otros errores en ese flujo de datos, pero los ignoro por ahora. Asegúrese de leer la página de manual del comando sysctl, ya que es bastante interesante. Proporciona un método para procesar todos los archivos de configuración sysctl con la opción --service.

La solución

Ahora que entendía la verdadera naturaleza del problema, podía crear una solución real, aunque fuera sólo una elusión temporal. Pude hacerlo de una manera que mantiene la intención original de la secuencia de inicio de Linux y el método sysctl.d para configurar el kernel.

Dejé mi nuevo archivo de configuración en /etc/sysctl.d. Creé el script Bash simple que se muestra a continuación para ejecutar el comando sysctl --system y lo almacené en /usr/local/bin.

#!/bin/bash
<SNIP – discarded a bunch of comments to save space>
sysctl --system

Probé este script varias veces antes de continuar para asegurarme de que funcionaba. Si hace esto, asegúrese de probarlo varias veces, con y sin reinicio, para volver a la configuración original del kernel.

Crear el servicio

La verdadera clave de esta solución fue crear un nuevo servicio systemd que funcionaría de manera similar al antiguo script rc.local SystemV. En este caso, lo llamé MyStartup.service y cambié el nombre del script que creé anteriormente y lo llamé MyStartup.sh. Para crear el servicio en sí, creé un nuevo archivo de unidad systemd en el directorio /usr/local/lib/systemd/system, que también tuve que crear. Este servicio se ejecutará una vez al inicio. Llamé a este nuevo archivo MyStartup.service y agregué el siguiente contenido:

<SNIP – discarded a bunch of comments to save space>
[Unit]
Description=Runs /usr/local/bin/MyStartup.sh

[Service]
ExecStart=/usr/local/bin/MyStartup.sh

[Install]
WantedBy=multi-user.target

Tenga en cuenta que los archivos unitarios systemd como este no necesitan ser ejecutables. Es propiedad de root.root con 664 permisos. Es bastante sencillo crear este servicio y puedo usarlo para tantas tareas de inicio locales que planeo conservarlo incluso cuando haya una solución permanente al problema existente.

El siguiente comando habilita el nuevo servicio. Tenga en cuenta que el comando systemctl busca el nuevo directorio de forma predeterminada sin ninguna opción, argumento o insistencia por mi parte para localizar el nuevo archivo de unidad.

[root@f36vm ~]# systemctl enable MyStartup.service
Created symlink /etc/systemd/system/multi-user.target.wants/MyStartup.service → /usr/local/lib/systemd/system/MyStartup.service.

Al habilitar el servicio no se ejecuta el script MyStartup.sh. Este servicio ejecutará el script en cada reinicio.

Pruebas

Tan pronto como se reinició la máquina virtual, inicié sesión como root y ejecuté el siguiente comando para verificar el estado de IPv6, pero aún estaba activo. Después de más pruebas, determiné que el servicio estaba ejecutando los comandos demasiado pronto, así que agregué un comando al script MyStartup.sh para que durmiera durante 25 segundos antes de ejecutar los comandos. Aquí está el guión editado:

#!/bin/bash
<SNIP – discarded a bunch of comments to save space>
# Wait a bit for things to start up and settle. It doesn't work without this.
sleep 25
# Run the sysctl command.
sysctl --system

Reinicié nuevamente y verifiqué el estado tan pronto como pude iniciar sesión, con el resultado de que el servicio todavía estaba inactivo.

[root@f36vm ~]# systemctl status MyStartup.service
● MyStartup.service - Runs /usr/local/bin/MyStartup.sh
     Loaded: loaded (/usr/local/lib/systemd/system/MyStartup.service; enabled; vendor preset: disabled)
     Active: active (running) since Fri 2022-07-01 13:24:22 EDT; 14s ago
   Main PID: 667 (MyStartup.sh)
      Tasks: 2 (limit: 14129)
     Memory: 592.0K
        CPU: 1ms
     CGroup: /system.slice/MyStartup.service
             ├─ 667 /bin/bash /usr/local/bin/MyStartup.sh
             └─ 669 sleep 25

Después de esperar un poco más, verifiqué nuevamente y el servicio se había completado exitosamente, con los resultados claramente mostrados en las últimas entradas del diario. Pruebas adicionales demostraron que un retraso de tres segundos funciona de forma fiable, mientras que un retraso de sólo un segundo siempre falla.

Jul 01 13:24:22 f36vm.both.org systemd[1]: Started MyStartup.service - Runs /usr/local/bin/MyStartup.sh.

[root@f36vm ~]# systemctl status MyStartup.service
○ MyStartup.service - Runs /usr/local/bin/MyStartup.sh
     Loaded: loaded (/usr/local/lib/systemd/system/MyStartup.service; enabled; vendor preset: disabled)
     Active: inactive (dead) since Fri 2022-07-01 13:24:47 EDT; 358ms ago
    Process: 667 ExecStart=/usr/local/bin/MyStartup.sh (code=exited, status=0/SUCCESS)
   Main PID: 667 (code=exited, status=0/SUCCESS)
        CPU: 9ms

Jul 01 13:24:47 f36vm.both.org MyStartup.sh[1020]: net.ipv4.conf.all.send_redirects = 0
Jul 01 13:24:47 f36vm.both.org MyStartup.sh[1020]: net.ipv4.conf.all.accept_redirects = 0
Jul 01 13:24:47 f36vm.both.org MyStartup.sh[1020]: * Applying /usr/lib/sysctl.d/50-pid-max.conf ...
Jul 01 13:24:47 f36vm.both.org MyStartup.sh[1020]: kernel.pid_max = 4194304
Jul 01 13:24:47 f36vm.both.org MyStartup.sh[1020]: * Applying /etc/sysctl.d/99-local-network.conf ...
Jul 01 13:24:47 f36vm.both.org MyStartup.sh[1020]: net.ipv6.conf.all.disable_ipv6 = 1
Jul 01 13:24:47 f36vm.both.org MyStartup.sh[1020]: net.ipv6.conf.default.disable_ipv6 = 1
Jul 01 13:24:47 f36vm.both.org MyStartup.sh[1020]: * Applying /etc/sysctl.d/99-sysctl.conf ...
Jul 01 13:24:47 f36vm.both.org MyStartup.sh[1020]: * Applying /etc/sysctl.conf ...
Jul 01 13:24:47 f36vm.both.org systemd[1]: MyStartup.service: Deactivated successfully.

[root@f36vm ~]#

Puede ver en el resultado de datos anterior que se aplicaron las declaraciones de configuración en el archivo 99-sysctl.conf. También utilicé el comando nmcli para verificar que IPv6 se haya deshabilitado.

Automatizalo

Después de descubrir cómo lograr esta solución de manera consistente, agregué un conjunto de tareas para hacerlo al manual de estrategias de Ansible que uso para distribuir archivos de configuración nuevos y actualizados. Eso me facilita la administración de mis 12 hosts actuales. También lo agregué al manual que uso inmediatamente después de realizar una instalación básica en hosts nuevos o en aquellos que necesitan una reinstalación por algún motivo. Agregué las siguientes tareas a esos libros de jugadas.

Este primer conjunto de tareas es para que mi solución agregue un nuevo servicio:

    - name: Install 99-local-network.conf file to disable IPV6
      copy:
        src: /root/ansible/system-scripts/files/99-local-network.conf
        dest: /etc/sysctl.d
        mode: 0644
        owner: root
        group: root

    - name: Install MyStartup.sh
      copy:
        src: /root/ansible/system-scripts/files/MyStartup.sh
        dest: /usr/local/bin
        mode: 0754
        owner: root
        group: root

    - name: create /root/ansible/system-scripts/files/ directory
      file:
        path: /root/ansible/system-scripts/files/
        state: directory
        mode: 0755
        owner: root
        group: root  
      
    - name: Install MyStartup.service
      copy:
        src: /root/ansible/system-scripts/files/MyStartup.service
        dest: /usr/local/lib/systemd/system/
        mode: 0664
        owner: root
        group: root

    - name: Enable the MyStartup.service
      systemd:
        name: MyStartup.service
        state: stopped
        enabled: yes

    - name: Run the raw command to disable IPV4 so a reboot is not required at this time
      command:
        cmd: sysctl --system

La ventaja de esta solución más compleja de agregar el archivo de configuración al directorio sysctl.d y luego ejecutar un manual con esta serie de tareas es que deshabilita IPv6 sin necesidad de reiniciar.

Pensamientos finales

Aunque simplemente instalar el archivo con los parámetros correctos del kernel y reiniciar funcionó bien en uno de mis hosts, falló en todos los demás que probé. Busqué diferencias que pudieran explicar por qué falló en los demás mientras trabajaba en mi enrutador/firewall, pero no encontré nada que proporcionara una pista de por qué esto es así. Descubrí que este problema existe en hosts con Fedora 36 recién instalado sin ninguno de los cambios y configuración posterior a la instalación que siempre realizo y en aquellos con mis cambios habituales. Planeo seguir investigando. Tengo la intención de enviar un informe de error a Red Hat para que pueda haber una solución real a este problema en lugar de cualquiera de estas elusiones.

Ninguna elusión depende de la existencia de archivos de configuración de NIC, ya sea los archivos de configuración de interfaz de estilo antiguo que solían estar ubicados en /etc/sysconfig/network-scripts o los archivos de conexión de interfaz de NetworkManager más nuevos ubicados en el directorio /etc/NetworkManager/system-connections. Funciona con o sin esos archivos. El resultado es global para todas las interfaces de red del host.

Mi propia solución es un enfoque algo general que puede utilizar en lugar del antiguo script rc.local de los antiguos días de inicio de SystemV.

Recursos

Los siguientes recursos se mantienen lo más actualizados posible, pero es posible que no sean completamente precisos en un momento dado.

  • El manual de GRUB está disponible en varios formatos en el sitio web de GNU.
  • El sitio web de documentación de Fedora tiene una página excelente, Bootloading with GRUB2.
  • La documentación en línea de Red Hat RHEL 7 también tiene un buen capítulo sobre cómo trabajar con el gestor de arranque GRUB2.
  • El sitio web kernel.org tiene una larga lista de parámetros del kernel y una gran cantidad de información adicional sobre el kernel de Linux.

Artículos relacionados: