viernes, 17 de diciembre de 2010

Configuración de Grub2

Vuelvo a añadir otra receta de las que son parte de lo que llamo piedra angular para Administrar a Ubuntu. Esta es una receta con varias explicaciones de como configurar o reparar a Grub2.



Configuración
En Grub2, la configuración se almacena en el archivo /boot/grub/grub.cfg. Este archivo es generado automáticamente por la orden:
sudo update-grub
Que se basan en los scripts almacenados en:
/etc/grub.d
Y en el archivo
/etc/default/grub
Al contrario que Grub legacy, donde se edita el archivo /boot/grub/menu.lst  para hacer los cambios o añadidos en el arranque de Ubuntu, en Grub2 su archivo /boot/grub/grub.cfg no se puede editar, los que se editan son los scripts existentes en /etc/grub.d y el archivo /etc/default/grub.
Aquí os dejo un ejemplo de grub.cfg para que os hagáis una idea de lo que contiene:


#
# DO NOT EDIT THIS FILE
#
# It is automatically generated by grub-mkconfig using templates
# from /etc/grub.d and settings from /etc/default/grub
#


### BEGIN /etc/grub.d/00_header ###
if [ -s $prefix/grubenv ]; then
set have_grubenv=true
load_env
fi
set default="0"
if [ "${prev_saved_entry}" ]; then
set saved_entry="${prev_saved_entry}"
save_env saved_entry
set prev_saved_entry=
save_env prev_saved_entry
set boot_once=true
fi


function savedefault {
if [ -z "${boot_once}" ]; then
saved_entry="${chosen}"
save_env saved_entry
fi
}


function recordfail {
set recordfail=1
if [ -n "${have_grubenv}" ]; then if [ -z "${boot_once}" ]; then save_env recordfail; fi; fi
}


function load_video {
insmod vbe
insmod vga
}


insmod part_msdos
insmod ext2
set root='(hd0,msdos1)'
search --no-floppy --fs-uuid --set cc9cb17d-34c3-45d8-acd0-dda356ca1f54
if loadfont /usr/share/grub/unicode.pf2 ; then
set gfxmode=640x480
load_video
insmod gfxterm
fi
terminal_output gfxterm
insmod part_msdos
insmod ext2
set root='(hd0,msdos1)'
search --no-floppy --fs-uuid --set cc9cb17d-34c3-45d8-acd0-dda356ca1f54
set locale_dir=($root)/boot/grub/locale
set lang=es
insmod gettext
if [ "${recordfail}" = 1 ]; then
set timeout=-1
else
set timeout=10
fi
### END /etc/grub.d/00_header ###


### BEGIN /etc/grub.d/05_debian_theme ###
set menu_color_normal=white/black
set menu_color_highlight=black/light-gray
### END /etc/grub.d/05_debian_theme ###


### BEGIN /etc/grub.d/10_linux ###
menuentry 'Ubuntu, with Linux 2.6.35-23-generic' --class ubuntu --class gnu-linux --class gnu --class os {
recordfail
insmod part_msdos
insmod ext2
set root='(hd0,msdos1)'
search --no-floppy --fs-uuid --set cc9cb17d-34c3-45d8-acd0-dda356ca1f54
linux /boot/vmlinuz-2.6.35-23-generic root=UUID=cc9cb17d-34c3-45d8-acd0-dda356ca1f54 ro quiet splash
initrd /boot/initrd.img-2.6.35-23-generic
}
menuentry 'Ubuntu, with Linux 2.6.35-23-generic (recovery mode)' --class ubuntu --class gnu-linux --class gnu --class os {
recordfail
insmod part_msdos
insmod ext2
set root='(hd0,msdos1)'
search --no-floppy --fs-uuid --set cc9cb17d-34c3-45d8-acd0-dda356ca1f54
echo 'Loading Linux 2.6.35-23-generic ...'
linux /boot/vmlinuz-2.6.35-23-generic root=UUID=cc9cb17d-34c3-45d8-acd0-dda356ca1f54 ro single
echo 'Loading initial ramdisk ...'
initrd /boot/initrd.img-2.6.35-23-generic
}
menuentry 'Ubuntu, with Linux 2.6.35-22-generic' --class ubuntu --class gnu-linux --class gnu --class os {
recordfail
insmod part_msdos
insmod ext2
set root='(hd0,msdos1)'
search --no-floppy --fs-uuid --set cc9cb17d-34c3-45d8-acd0-dda356ca1f54
linux /boot/vmlinuz-2.6.35-22-generic root=UUID=cc9cb17d-34c3-45d8-acd0-dda356ca1f54 ro quiet splash
initrd /boot/initrd.img-2.6.35-22-generic
}
menuentry 'Ubuntu, with Linux 2.6.35-22-generic (recovery mode)' --class ubuntu --class gnu-linux --class gnu --class os {
recordfail
insmod part_msdos
insmod ext2
set root='(hd0,msdos1)'
search --no-floppy --fs-uuid --set cc9cb17d-34c3-45d8-acd0-dda356ca1f54
echo 'Loading Linux 2.6.35-22-generic ...'
linux /boot/vmlinuz-2.6.35-22-generic root=UUID=cc9cb17d-34c3-45d8-acd0-dda356ca1f54 ro single
echo 'Loading initial ramdisk ...'
initrd /boot/initrd.img-2.6.35-22-generic
}
### END /etc/grub.d/10_linux ###


### BEGIN /etc/grub.d/20_linux_xen ###
### END /etc/grub.d/20_linux_xen ###


### BEGIN /etc/grub.d/20_memtest86+ ###
menuentry "Memory test (memtest86+)" {
insmod part_msdos
insmod ext2
set root='(hd0,msdos1)'
search --no-floppy --fs-uuid --set cc9cb17d-34c3-45d8-acd0-dda356ca1f54
linux16 /boot/memtest86+.bin
}
menuentry "Memory test (memtest86+, serial console 115200)" {
insmod part_msdos
insmod ext2
set root='(hd0,msdos1)'
search --no-floppy --fs-uuid --set cc9cb17d-34c3-45d8-acd0-dda356ca1f54
linux16 /boot/memtest86+.bin console=ttyS0,115200n8
}
### END /etc/grub.d/20_memtest86+ ###


### BEGIN /etc/grub.d/30_os-prober ###
if [ "x${timeout}" != "x-1" ]; then
if keystatus; then
if keystatus --shift; then
set timeout=-1
else
set timeout=0
fi
else
if sleep --interruptible 3 ; then
set timeout=0
fi
fi
fi
### END /etc/grub.d/30_os-prober ###


### BEGIN /etc/grub.d/40_custom ###
# This file provides an easy way to add custom menu entries. Simply type the
# menu entries you want to add after this comment. Be careful not to change
# the 'exec tail' line above.
### END /etc/grub.d/40_custom ###


### BEGIN /etc/grub.d/41_custom ###
if [ -f $prefix/custom.cfg ]; then
source $prefix/custom.cfg;
fi
### END /etc/grub.d/41_custom ###

Configuración del archivo /etc/default/grub
Este archivo es el que ahora contiene la información necesaria, al igual que menu.lst en Grub legacy, por lo tanto para hacer lo cambios en Grub2 tendremos que hacer los cambios en este archivo editando el mismo con algunos de los editores para la terminal:
sudo nano /etc/default/grub
Despues de añadir o cambiar algun dato en el archivo y haberlos guardado tendras que generar de nuevo el archivo con la orden:
sudo update-grub
Este es un contenido típico:

# If you change this file, run 'update-grub' afterwards to update
      # /boot/grub/grub.cfg.

      GRUB_DEFAULT=0
      GRUB_HIDDEN_TIMEOUT=0
      GRUB_HIDDEN_TIMEOUT_QUIET=true
      GRUB_TIMEOUT=10
      GRUB_DISTRIBUTOR=`lsb_release -i -s 2> /dev/null || echo Debian`
      GRUB_CMDLINE_LINUX_DEFAULT="quiet splash"
      GRUB_CMDLINE_LINUX=""

      # Uncomment to disable graphical terminal (grub-pc only)
      #GRUB_TERMINAL=console

      # The resolution used on graphical terminal
      # note that you can use only modes which your graphic card supports via VBE
      # you can see them in real GRUB with the command `vbeinfo'
      #GRUB_GFXMODE=640x480

      # Uncomment if you don't want GRUB to pass "root=UUID=xxx" parameter to Linux
      #GRUB_DISABLE_LINUX_UUID=true

      # Uncomment to disable generation of recovery mode menu entrys
      #GRUB_DISABLE_LINUX_RECOVERY="true"

Sus items corresponden a:

GRUB_DEFAULT=0
Establece la entrada de menu por defecto, numerando los menuentry de 0 en adelante.

o
      GRUB_DEFAULT="Windows XP Professional (on /dev/sda1)"
Establece la entrada de menu por defecto, mediante el nombre del menuentry. 
          
o
       GRUB_DEFAULT=saved
Establece la entrada de menu por defecto a la seleccionada en el último inicio, si el menu se muestra
al inicio esta entrada se muestra iluminada si no se cambia la seleccion o el menu no se muestra
inicia la opción elegida en el último inicio.


      GRUB_TIMEOUT=5
Corresponde al número de segundos que se espera antes de iniciar con la entrada del menu por defecto
Si el valor es -1 el menu se muestra idefinidamente hasta que se selecciona un menu y se da enter.

      GRUB_HIDDEN_TIMEOUT=0
Oculta el menu si esta precedido por # 

     # GRUB_HIDDEN_TIMEOUT=0 
Si hay otro operativo detectado en el sistema el menu se muestra
Si no hay otro operativo detectado en el sistema el menu se oculta 
Si se usa un valor mayor de 0, el sistema espera tantos segundos, pero el menu no se muestra
Si se usa el valor 0, el sistema no espera y no se muestra su menu.
En este último caso, para ver el menu es necesario presionar la tecla Shift (mayusculas)
También puede presionarse la tecla  Esc 
Si esta activo, el splash screen establecido en el archivo /etc/grub.d/05_debian_theme se muestra

      GRUB_HIDDEN_TIMEOUT_QUIET=true
true - No muestra en contador, la pantalla esta en blanco
false - El contador se muestra durante un tiempo igual al valor establecido en GRUB_HIDDEN_TIMEOUT 
    
      GRUB_DISTRIBUTOR=lsb_release -i -s 2> /dev/null || echo Debian
Establece el nombre descriptivo correspondiente menuentry de la distribución elegida. (Ubuntu, Xubuntu, Debian, etc.) 
    
      GRUB_CMDLINE_LINUX
Si existe, agrega opciones  al final de las líneas de comando linux para inicios normales y de recuperación

      GRUB_CMDLINE_LINUX_DEFAULT="quiet splash"
Agrega las opciones al final de la línea de comando linux solo en inicio normal
Si se deja vacía, se muestran los mensajes de inicio del sistema

      #GRUB_TERMINAL=console
Descomentada, sin #, esta opción deshabilita la terminal gráfica, solo grub-pc 
    
      #GRUB_GFXMODE=640x480
Descomentada,sin #, se cambia la resolucion del cargador de arranque, debe usarse un ratio 4:3
                + GRUB_GFXMODE=640x480 
                + GRUB_GFXMODE=800x600
                + GRUB_GFXMODE=1024x768
                + GRUB_GFXMODE=1600×1200 

Se puede experimentar en caso de monitores widescreen con un ratio 16:10
                + GRUB_GFXMODE=640x400
                + GRUB_GFXMODE=800x500
                + GRUB_GFXMODE=1024x640
                + GRUB_GFXMODE=1280x800
                + GRUB_GFXMODE=1680x1050 

      #GRUB_DISABLE_LINUX_UUID=true
Descomentada, sin #, deshabilita que el Grub utilice el parámetro "root=UUID=xxx" para Linux. 
    
      #GRUB_DISABLE_LINUX_RECOVERY=true
Descomentada, sin #, evita que se muestre en el menu el menuentry de recuperación. 
    *
      GRUB_DISABLE_OS_PROBER=true
true - Desactiva la búsqueda por os-prober de otras particiones con otros sistemas operativos Windows, Linux, OSX and Hurd
false - Activa  la búsqueda por os-prober de otras particiones con otros sistemas operativos

Directorio /etc/grub.d
Los archivos existentes en este directorio, exportan su contenido al ejecutarse la orden
sudo update-grub 
al archivo de configuración de Grub2,  /boot/grub/grub.cfg.

Estos archivos se ejecutan en orden secuencial, por que su nombre comienza por números, cuya orden determina su localización en el menu del Grub2.
Las entradas personalizadas se agregan en el archivo 40_custom o en un nuevo archivo de número creciente. Todos estos archivos, deben recibir permiso de ejecución para poder ser incorporados a grub.cfg, mediante la orden:
sudo chmod u+x /etc/grub.d/nombre_archivo
Archivo:
00_header
Carga las configuraciones del archivo /etc/default/grub, presentaciones visuales, tiempo de espera y opciones de terminal.
Archivo:
05_debian_theme
Establece la imagen de fondo, los colores del texto y los temas. Para cambiar colores, prestar atención a olas líneas 8 y 9; 8 establece el color del texto; 9 la linea seleccionada. Ejemplo:
set menu_color_normal=magenta/black
set menu_color_highlight=cyan/blue 
Para cambiar la imagen de fondo se debe editar la línea 16:
for i in {/boot/grub,/usr/share/images/desktop-base}/NameOfPicture.{png,tga} ; 
Una forma es agregar el patch hacia la imagen entre las llaves ({})

Otra forma es copiar la imagen en una en uso:
sudo cp /home/nombre_usuario/Pictures/NameOfPicture /usr/share/images/desktop-base 
El archivo imagen debe estar en formato png o tga.

Si el tamaño de la imagen no coincide con la resolución del Grub2, no se ajustara, se verá recortada o insuficiente con área negra alrededor. Ejemplos:

{/boot/grub,/usr/share/images/desktop-base}/P1030084-picture-1024x768.png {/boot/grub,/usr/share/images/desktop-base}/CreatedFolderOfLink/picture.{png,tga}

Archivo:
10_hurd
Busca kernels hurd
Archivo:
10_linux
Busca kernels Linux, de la distribución determinada por "lsb_release -i -s" results ("Ubuntu").
Archivo:
20_memtest86+
Si el archivo /boot/memtest86+.bin existe, se incluye como un item del menu
Archivo:
30_os-prober
Busca otros sistermas operastivos y los incluye en el menu.
Archivo:
40_custom
Es una plantilla para incluir entradas de menu personalizadas.
Entradas definidas por el usuario:
Se crean actuando como con permisos temporales de administrador:
sudo nano 4x_nombre_archivo
Se guardan en /etc/grub.d/

Se les da permisos de ejecución:
sudo chmod +x /etc/grub.d/nombre_archivo
Se debe tener presente que:

Los discos duros siguen la nomenclatura de Grub Legacy

sda = hd0 
sdb = hd1 
sdc = hd2  
sdd = hd3

Las particiones inician desde 1

sda1 = hd0,1  
sdb2 = hd1,2 
sdc5 = hd2,5

Esto es algo que tendremos que tener en cuenta a la hora del reconocimiento del o los discos duros para las particiones o posibles arranques de ejecutables o adicciones en las lineas de arranque.

Borrado de kernels o añadidos en grub.cfg
Para remover entradas del menu de Grub 2, no se debe editar el archivo grub.cfg. Se quitan archivos del directorio /etc/grub.d o se desinstalan los kernels desde Synaptic y automáticamente se actualiza el archivo /boot/grub/grub.cfg
Si se elimina otro sistema operativo del ordenador, ejecutamos manualmente:
sudo update-grub 
Se actualiza el menu del Grub2

Si no se desea que aparezca memtest86+. Se le quita el permiso de ejecución al archivo que lo incorpora
sudo chmod -x /etc/grub.d/20_memtest86+ 
Si no se desea que aparezca la opción:  Recovery mode: (esta opción permite ingresar como administrador sin contraseña para solucionar problemas, en caso de intrusos para causar los mínimos cambios)
Se edita el archivo /etc/default/grub
Y se le agrega esta línea: 
GRUB_DISABLE_LINUX_RECOVERY=true


Sacar el menu de grub2 en el arranque
Si al terminar una instalación, el menu del Grub2 esta oculto por defecto hay que editar el archivo /etc/default/grub y comentar la linea GRUB_HIDDEN_TIMEOUT
sudo nano /etc/default/grub 
#GRUB_HIDDEN_TIMEOUT=3 GRUB_TIMEOUT=XXX 
Guardar el archivo. Ctrl+O
Cierra nano Ctrl+X
Ejecutar
sudo update-grub

Espero que después de esta pequeña guía, te hagas una idea de como manejar Grub2. Dejo por aquí también el enlace a este manual mas largo por si quieres sacarle mas jugo al tema.