Grub
classé dans Geekeries, Linux, Humeur
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 ticket 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.