Chibi-nah::blog

Des geekeries, de la MAO, de tout et de rien…

Archives

Grub

Les joies de l'informatique, l'évolution des logiciels, l'abandon sur le bord de la route des anciennes versions considérées comme étant obsolètes, je m'égare… Bref, unticketarticle pour dire encore que c'était mieux avant , en regardant le cas de GRUB "Legacy" et Grub "2"

GRUB, pour GRand Unified Bootloader, est un petit "logiciel", qui s'exécute au démarrage de l'ordinateur [1], entre le moment où le BIOS/EFI [2] donne la main et qu'un système d'exploitation [3] démarre.

GRUB permet (entre autres)

  • De choisir un Système d'Exploitation [4]
  • De choisir un autre chargeur de démarrage (pratique pour "chaîner" les bootloaders [5]
  • De passer en mode "ligne de commande" et de booter n'importe quoi n'importe comment [6]

GRUB existe en deux versions :

  • GRUB Legacy, "l'ancienne" version
  • GRUB2, la "nouvelle" version

La principale différence entre les deux (point de vue administration) est dans la configuration. Les autres innovations sont au niveau du support des gros disques, de gpt et d'autres trucs que je n'ai pas retenu.

GRUB Legacy

Un seul fichier, simple, clair, parfaitement lisible et éditable depuis un liveCD/USB, situé dans /boot/grub/menu.lst

Genre :

# Config file for GRUB - The GNU GRand Unified Bootloader
# /boot/grub/menu.lst

# DEVICE NAME CONVERSIONS
#
#  Linux           Grub
# -------------------------
#  /dev/fd0        (fd0)
#  /dev/sda        (hd0)
#  /dev/sdb2       (hd1,1)
#  /dev/sda3       (hd0,2)
#

#  FRAMEBUFFER RESOLUTION SETTINGS
#  for more details and different resolutions see
#  http://wiki.archlinux.org/index.php/GRUB#Framebuffer_Resolution

# general configuration
timeout   10
default   1
color light-blue/black light-cyan/blue

# boot sections follow
# each is implicitly numbered from 0 in the order of appearance below
#-*

# (0) Arch Linux
title  Arch Linux (RC)
root    (hd0,5)
kernel /boot/vmlinuz-3.4-rc6-yue root=/dev/sda6 ro

# (1) Arch Linux
title  Arch Linux (Stable)
root    (hd0,5)
kernel /boot/vmlinuz-3.2.7-yue root=/dev/sda6 ro

# (2) Arch Linux
title  Arch Linux (Old stable)
root    (hd0,5)
kernel /boot/vmlinuz-3.2.6-yue root=/dev/sda6 ro

# (3) Windows
title Windows
rootnoverify (hd0,0)
#makeactive
chainloader +1

# (4) Meego (default kernel)
title Meego
root (hd0,6)
kernel /boot/vmlinuz-2.6.38.2-8.26-adaptation-pinetrail root=/dev/sda7

# (5) Meego (custom kernel)
title "Meego-yue"
root (hd0,6)
kernel /boot/vmlinuz-2.6.38-yue root=/dev/sda7

#configfile /boot/grub/menu.lst
GRUB2

Un brol monstre dans /etc, avec des fichiers éparpillés dans grub.d, genre (tiré d'Ubuntu 11.10)

dans /boot/grub

$ ls
915resolution.mod               gcry_tiger.mod                  parttool.mod
acpi.mod                        gcry_twofish.mod                password.mod
affs.mod                        gcry_whirlpool.mod              password_pbkdf2.mod
afs.mod                         gettext.mod                     pbkdf2.mod
afs_be.mod                      gfxblacklist.txt                pci.mod
aout.mod                        gfxmenu.mod                     play.mod
at_keyboard.mod                 gfxterm.mod                     png.mod
ata.mod                         gptsync.mod                     probe.mod
ata_pthru.mod                   grldr.img                       pxe.mod
befs.mod                        grub.cfg                        pxeboot.img
befs_be.mod                     grubenv                         pxecmd.mod
biosdisk.mod                    gzio.mod                        raid.mod
bitmap.mod                      halt.mod                        raid5rec.mod
bitmap_scale.mod                hashsum.mod                     raid6rec.mod
blocklist.mod                   hdparm.mod                      read.mod
boot.img                        hello.mod                       reboot.mod
boot.mod                        help.mod                        regexp.mod
bsd.mod                         hexdump.mod                     reiserfs.mod
btrfs.mod                       hfs.mod                         relocator.mod
bufio.mod                       hfsplus.mod                     scsi.mod
cat.mod                         hwmatch.mod                     search.mod
cdboot.img                      iorw.mod                        search_fs_file.mod
chain.mod                       iso9660.mod                     search_fs_uuid.mod
cmostest.mod                    jfs.mod                         search_label.mod
cmp.mod                         jpeg.mod                        sendkey.mod
command.lst                     kernel.img                      serial.mod
configfile.mod                  keylayouts.mod                  setjmp.mod
core.img                        keystatus.mod                   setpci.mod
cpio.mod                        legacycfg.mod                   sfs.mod
cpuid.mod                       linux.mod                       sleep.mod
crypto.lst                      linux16.mod                     squash4.mod
crypto.mod                      lnxboot.img                     tar.mod
cs5536.mod                      loadenv.mod                     terminal.lst
date.mod                        locale                          terminal.mod
datehook.mod                    loopback.mod                    terminfo.mod
datetime.mod                    ls.mod                          test.mod
diskboot.img                    lsacpi.mod                      test_blockarg.mod
dm_nv.mod                       lsapm.mod                       testload.mod
drivemap.mod                    lsmmap.mod                      tga.mod
echo.mod                        lspci.mod                       trig.mod
efiemu.mod                      lvm.mod                         true.mod
efiemu32.o                      mdraid09.mod                    udf.mod
efiemu64.o                      mdraid1x.mod                    ufs1.mod
elf.mod                         memdisk.mod                     ufs2.mod
example_functional_test.mod     memrw.mod                       uhci.mod
ext2.mod                        minicmd.mod                     usb.mod
extcmd.mod                      minix.mod                       usb_keyboard.mod
fat.mod                         minix2.mod                      usbms.mod
font.mod                        mmap.mod                        usbserial_common.mod
fs.lst                          moddep.lst                      usbserial_ftdi.mod
fshelp.mod                      msdospart.mod                   usbserial_pl2303.mod
functional_test.mod             multiboot.mod                   usbtest.mod
g2hdr.img                       multiboot2.mod                  vbe.mod
gcry_arcfour.mod                nilfs2.mod                      vga.mod
gcry_blowfish.mod               normal.mod                      vga_text.mod
gcry_camellia.mod               ntfs.mod                        video.lst
gcry_cast5.mod                  ntfscomp.mod                    video.mod
gcry_crc.mod                    ntldr.mod                       video_bochs.mod
gcry_des.mod                    ohci.mod                        video_cirrus.mod
gcry_md4.mod                    part_acorn.mod                  video_fb.mod
gcry_md5.mod                    part_amiga.mod                  videoinfo.mod
gcry_rfc2268.mod                part_apple.mod                  videotest.mod
gcry_rijndael.mod               part_bsd.mod                    xfs.mod
gcry_rmd160.mod                 part_gpt.mod                    xnu.mod
gcry_seed.mod                   part_msdos.mod                  xnu_uuid.mod
gcry_serpent.mod                part_sun.mod                    xzio.mod
gcry_sha1.mod                   part_sunpc.mod                  zfs.mod
gcry_sha256.mod                 partmap.lst                     zfsinfo.mod
gcry_sha512.mod                 parttool.lst

Dans /etc/grub.d

$ ls
00_header       05_debian_theme 10_linux        20_linux_xen    20_memtest86+   30_os-prober    40_custom       41_custom       README

Le contenu de grub.cfg (attention les yeux)

#
# 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 video_bochs
  insmod video_cirrus
}

insmod part_msdos
insmod ext2
set root='(hd0,msdos1)'
search --no-floppy --fs-uuid --set=root 279b47e5-8d60-4520-aba9-aef38ec9e3b5
if loadfont /usr/share/grub/unicode.pf2 ; then
  set gfxmode=auto
  load_video
  insmod gfxterm
  insmod part_msdos
  insmod ext2
  set root='(hd0,msdos1)'
  search --no-floppy --fs-uuid --set=root 279b47e5-8d60-4520-aba9-aef38ec9e3b5
  set locale_dir=($root)/boot/grub/locale
  set lang=fr_FR
  insmod gettext
fi
terminal_output gfxterm
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
if background_color 44,0,30; then
  clear
fi
### END /etc/grub.d/05_debian_theme ###

### BEGIN /etc/grub.d/10_linux ###
if [ ${recordfail} != 1 ]; then
  if [ -e ${prefix}/gfxblacklist.txt ]; then
    if hwmatch ${prefix}/gfxblacklist.txt 3; then
      if [ ${match} = 0 ]; then
        set linux_gfx_mode=keep
      else
        set linux_gfx_mode=text
      fi
    else
      set linux_gfx_mode=text
    fi
  else
    set linux_gfx_mode=keep
  fi
else
  set linux_gfx_mode=text
fi
export linux_gfx_mode
if [ "$linux_gfx_mode" != "text" ]; then load_video; fi
menuentry 'Ubuntu, avec Linux 3.0.0-12-generic' --class ubuntu --class gnu-linux --class gnu --class os {
    recordfail
    set gfxpayload=$linux_gfx_mode
    insmod gzio
    insmod part_msdos
    insmod ext2
    set root='(hd0,msdos1)'
    search --no-floppy --fs-uuid --set=root 279b47e5-8d60-4520-aba9-aef38ec9e3b5
    linux   /boot/vmlinuz-3.0.0-12-generic root=UUID=279b47e5-8d60-4520-aba9-aef38ec9e3b5 ro   quiet splash vt.handoff=7
    initrd  /boot/initrd.img-3.0.0-12-generic
}
menuentry 'Ubuntu, avec Linux 3.0.0-12-generic (mode de dépannage)' --class ubuntu --class gnu-linux --class gnu --class os {
    recordfail
    insmod gzio
    insmod part_msdos
    insmod ext2
    set root='(hd0,msdos1)'
    search --no-floppy --fs-uuid --set=root 279b47e5-8d60-4520-aba9-aef38ec9e3b5
    echo    'Chargement de Linux 3.0.0-12-generic ...'
    linux   /boot/vmlinuz-3.0.0-12-generic root=UUID=279b47e5-8d60-4520-aba9-aef38ec9e3b5 ro recovery nomodeset
    echo    'Chargement du disque mémoire initial ...'
    initrd  /boot/initrd.img-3.0.0-12-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=root 279b47e5-8d60-4520-aba9-aef38ec9e3b5
    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=root 279b47e5-8d60-4520-aba9-aef38ec9e3b5
    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 ###

Dès que l'on a modifié une entrée dans un fichier, il faut exécuter une commande, grub-mkconfig, qui va regénérer la config de GRUB. On se croirait PRESQUE revenu sur LILO, la légèreté en moins. (LILO au moins est clair).

L'avantage serait : "Cela permet de définir des options dans différents fichiers, et le script de mise à jour génère automatiquement un fichier de config propre. Pourquoi pas, mais que ça génère alors un truc léger et propre, pas un truc quasiment illisible.

Il faudrait regarder sur des autres distributions (genre maegia, fedora, suse) pour voir si c'est aussi "bordélique".


Notes :

[1]: Type PC x86, à quelques exceptions près (rEFIt) pour les MacIntel. Cela n'inclut pas les téléphones, les mainframe AS/400 ni Skynet.

[2]: Le truc qui affiche des lignes genre "AMI truc, Phoenix machin, 2048MB Found, ou qui affiche le logo du constructeur du PC

[3]: Vu ce que l'utilisateur doit faire comme tâches d'administration, je confirme en disant qu'il s'agit d'un Système d'Exploitation de l'Utilisateur.

[4]: Et oui, de nos jours, on peut choisir à quelle sauce on sera mangé, c'est beau le progrès…

[5]: Au boot : GRUB, permettant de choisir entre le GRUB d'ubuntu, le GRUB d'ArchLinux et le GRUB de Meego

[6]: Celui qui se demande l'intérêt de cette possibilité n'a jamais vu de boot cassé suite à la mise à jour d'un noyau sous GNU/Linux.