title: Grub
date: 2012-05-11
tags: Geekeries, Linux, Humeur
url: 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, un<s>ticket</s>article 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.
</troll>

[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.