Introduction Construction du fichier grub.cfg
Transcription
Introduction Construction du fichier grub.cfg
Le chargeur GRUB2 Introduction Le projet GRUB2 n'est pas une continuité du projet GRUB, dit « Legacy » mais le développement d'un nouveau produit. Il vise à une plus grande portabilité sur de nombreuses architectures matérielles. Le fichier exécuté au boot du système et qui configure GRUB s'appelle maintenant grub.cfg. Source : http://grub.enbug.org/grub.cfg.fr Au chargement de GRUB 2, le fichier grub.cfg est lu. Celui-ci contient toutes les informations pour que GRUB 2 agisse tel que l'utilisateur le souhaite et construise un menu de chargement. GRUB 2 utilise un nouveau langage de script, semblable à Bash, afin de générer ce fichier de menu. Éditer manuellement ce fichier est inutile et non recommandé : il est entièrement reconstruit à l'aide de plusieurs scripts à chaque exécution de update-grub2 ou de grub-mkconfig. Pour modifier grub.cfg, modifiez les scripts de génération situés dans le dossier /etc/grub.d ou les options de GRUB 2 dans /etc/default/grub. Utilisez les commandes update-grub2 ou grub-mkconfig pour regénérer le menu de GRUB 2 après chaque modification des fichiers de configuration. Construction du fichier grub.cfg Le fichier grub.cfg est toujours localisé dans /boot/grub. La commande grub-mkconfig produit le fichier de configuration grub.cfg. La comande update-grub régénère après modification de la configuration. Extrait du fichier grub.cfg Vous constatez que si cela n'est pas du shell bash, cela y ressemble beaucoup. # # DO NOT EDIT THIS FILE # # It is automatically generated by /usr/sbin/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 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 © Gilles GOUBET – 2010 Page 1 Le chargeur GRUB2 set boot_once=true fi Le fichier /etc/default/grub Il contient des définitions de variables dont nous devinons aisément qu'elles correspondent aux anciennes directives globales du fichier menu.lst (« grub.conf »). # 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 entries #GRUB_DISABLE_LINUX_RECOVERY="true" # Uncomment to get a beep at grub start #GRUB_INIT_TUNE="480 440 1" Variable Définition GRUB_DEFAULT Le système qu'il faut charger par défaut. Cela peut être un nombre, la ligne nommant le système ("ligne complète") ou "saved" pour charger le dernier système chargé correctement par grub2. GRUB_HIDDEN_TIMEOUT Ce paramètre permet de dire combien de temps l'écran reste sans que le menu soit affiché. Dans cet intervalle, l'utilisateur peut appuyer sur n'importe quelle touche pour faire apparaître le menu. Cette option n'est valide © Gilles GOUBET – 2010 Page 2 Le chargeur GRUB2 que si l'ordinateur n'abrite qu'un seul OS. GRUB_HIDDEN_TIMEOUT_QUIET Si cette variable est à true, l'écran affiché par l'écran précédent reste vierge, sinon un compteur est affiché. GRUB_TIMEOUT Définit un timeout si l'option « GRUB_HIDDEN_TIMEOUT » est désactivée. La valeur -1 signifie pas de timeout. L'utilisateur doit valider son choix. GRUB_DISTRIBUTOR Cette variable permet de définir la forme des lignes de menu concernant votre distribution Linux. Rappelons la sortie standard de la commande lsb. $ lsb_release -i -s 2> /dev/null || echo Debian Ubuntu GRUB_CMDLINE_LINUX_DEFAULT GRUB_CMDLINE_LINUX Ces deux variables permettent de définir des paramètres du noyau comme le permettait la directive kernel de GRUB Legacy. GRUB_TERMINAL Cette clause désactive le mode graphique. GRUB_GFXMODE Cette clause définit la résolution graphique de la console. GRUB_DISABLE_LINUX_UUID Cette clause permet de ne pas passer le paramètre root=UUID=xxx au noyau. Rappelons que ce paramètre qui existe sur la ligne kernel de GRUB Legacy définit le « root file system » de Linux. GRUB_DISABLE_LINUX_RECOVERY Cette clause empèche la génération des lignes « Recovery » dans le menu de démarrage de Grub. GRUB_INIT_TUNE Cette clause active un « beep » avant l'affichage du menu. Le répertoire /etc/grub.d Le répertoire /etc/grub.d contient des scripts qui peuvent être personnalisés par l'administrateur pour ajouter de nouvelles entrées au menu proposé par GRUB. Les scripts sont exécutés dans l'ordre de leur numérotation. La commande update-grub doit être exécutée après que ce répertoire ait été modifié. $ ls 00_header 10_linux 30_os-prober README 05_debian_theme 20_memtest86+ 40_custom Les scripts sont exécutés dans l'ordre de leur numérotation. 00_header positionne les paramètres de GRUB2 comme le terminal et les valeurs définis dans /etc/default/grub. 05_debian_theme charge la « splash image », la couleur du texte. 10_linux recherche les systèmes Linux installés. il utilise pour cela le répertoire /boot qui contient © Gilles GOUBET – 2010 Page 3 Le chargeur GRUB2 les noyaux. Pour ne plus proposer un noyau, il faut le retirer de /boot. Pour réaliser cette opération, il faut utiliser la commande qui retire le paquet correspondant au noyau que vous souhaitez supprimer. L'exemple suivant est réalisé sur Ubuntu 10.04. # dpkg -l … ii linux-image-2.6.32-24-generic 2.6.32-24.43 Linux kernel image for version 2.6.32 on x86 ii linux-image-2.6.32-25-generic 2.6.32-25.45 Linux kernel image for version 2.6.32 on x86 … # apt-get remove linux-image-2.6.32-24-generic depmod........ … DKMS: uninstall Completed. Running postrm hook script /usr/sbin/update-grub. Generating grub.cfg ... Found linux image: /boot/vmlinuz-2.6.32-25-generic Found initrd image: /boot/initrd.img-2.6.32-25-generic Found memtest86+ image: /memtest86+.bin Found Windows Recovery Environment (loader) on /dev/sda2 done The link /vmlinuz.old is a damaged link Removing symbolic link vmlinuz.old you may need to re-run your boot loader[grub] The link /initrd.img.old is a damaged link Removing symbolic link initrd.img.old you may need to re-run your boot loader[grub] 20_memtest86+ recherche le fichier /boot/memtest86+ et l'inclut automatiquement dans le menu. Il n'y a pas de variable prévue das /etc/default/grub pour l'inhiber. La solution proposée est de retirer le droit d'endossement au script et,bien entendu, d'exécuter update-grub. 30_os-prober recherche les systèmes d'exploitation, dont Windows, en appelant la commande os-prober. 40_custom Dans la distribution Ubuntu, le script 40_custom permet d'ajouter des entrées dans le menu de GRUB. $ cat 40_custom #!/bin/sh exec tail -n +3 $0 # 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 © Gilles GOUBET – 2010 Page 4 Le chargeur GRUB2 not to change # the 'exec tail' line above. La structure d'une entrée à ajouter dans le fichier 40_custom est de la forme : menuentry "titre de l'entrée (ancien title)" { directives de chargement de l'OS } Parmi les directives, nous pouvons en mentionner quelques unes qui reprennent ce à quoi nous étions habitués dans GRUB Legacy. GRUB 2 GRUB Legacy set root=(hdx,y)1 linux initrd root=(hdx,y-1) kernel initrd On trouve toujours chainloader, typiquement utilisée pour booter Windows. Quelques exemples tirés de la documentation de GRUB2 A sample entry copied from the grub.cfg and altered by the user might look like this: menuentry "My Default Karmic" { set root=(hd0,1) search --no-floppy --fs-uuid --set cb201140-52f8-4449-9a95-749b27b58ce8 linux /boot/vmlinuz-2.6.31-11-generic root=UUID=cb201140-52f8-4449-9a95749b27b58ce8 ro quiet splash initrd /boot/initrd.img-2.6.31-11-generic } A sample entry for a hard drive version of SystemRescueCD installed per the instructions on the web site (on sda8). menuentry "System Rescue CD" { set root=(hd0,8) linux /sysrcd/rescuecd subdir=sysrcd setkmap=us initrd /sysrcd/initram.igz } A sample entry for chainloading to another GRUB bootloader. menuentry "Grub 1 Bootloader" { set root=(hd0,8) chainloader +1 } Le tableau qui suit présente la totalité des directives possibles dans un menu défini par menuentry. Il est accessible sur : http://www.gnu.org/software/grub/manual/html_node/Command_002dline-and-menu-entrycommands.html#Command_002dline-and-menu-entry-commands 1 Dans GRUB2, la numérotation des disques commencent toujours à 0 mais celles des partitions démarre maintenant à 1. © Gilles GOUBET – 2010 Page 5 Le chargeur GRUB2 * acpi: Load ACPI tables * badram: Filter out bad regions of RAM * blocklist: Print a block list * boot: Start up your operating system * cat: Show the contents of a file * chainloader: Chain-load another boot loader * cmp: Compare two files * configfile: Load a configuration file * cpuid: Check for CPU features * crc: Calculate CRC32 checksums * date: Display or set current date and time * drivemap: Map a drive to another * echo: Display a line of text * export: Export an environment variable * gettext: Translate a string * gptsync: Fill an MBR based on GPT entries * halt: Shut down your computer * help: Show help messages * initrd: Load a Linux initrd * initrd16: Load a Linux initrd (16-bit mode) * insmod: Insert a module * keystatus: Check key modifier status * linux: Load a Linux kernel * linux16: Load a Linux kernel (16-bit mode) * ls: List devices or files * parttool: Modify partition table entries * password: Set a clear-text password * password_pbkdf2: Set a hashed password * play: Play a tune * pxe_unload: Unload the PXE environment * reboot: Reboot your computer * search: Search devices by file, label, or UUID * sendkey: Emulate keystrokes * set: Set an environment variable * unset: Unset an environment variable * uppermem: Set the upper memory size Outre celles déjà rencontrées (linux, initrd, set), nous noterons particulièrement : insmod Cette commande permet de charger l'un des nombreux modules du répertoire /boot/grub. $ ls *mod 915resolution.mod cmp.mod gcry_arcfour.mod gfxterm.mod ls.mod part_sun.mod search_label.mod usbms.mod password_pbkdf2 Cette commande permet d'associer un mot de passe à un utilisateur. password_pbkdf2 utilisateur mot de passe © Gilles GOUBET – 2010 Page 6 Le chargeur GRUB2 Il faut préalablement créer les noms d'utilisateur pour lesquels vous allez créer le mot de passe. Cela se fait avec la commande set superusers="user1" (cf. ajout d'un mot de passe dans un menu). C'est la commande grub-mkpasswd-pbkdf2 qui génère le mot de passe. # grub-mkpasswd-pbkdf2 Enter password: Reenter password: Your PBKDF2 is grub.pbkdf2.sha512.10000.E9C5C0818881D3C983D834595D45D2AEE3 422200994C59E4CF716B2C53FC7765BEAB0295900BB1F0CF2FAF3F 04D9D0E4396E483AFEE47DA09EA0AB052D3ED6B2.CBF335AD5CC C7A166AB24E7E40E2AA93C6396B3359C1769557981647ECD318BD7 F8F1ED78961487E812C3B7D2AD2778099DF8C0BDF296B18338217B 34ADAFC2E search Vette commande recherche un périphérique par son nom, son label ou son UUID. Ajout d'une entrée dans le fichier 40_custom Le fichier 40_custom a été modifié pour ajouter une entrée permettant de booter le système Ubuntu d'une clé bootable. Il est nécessaire de dire, par souci de simplicité, que si vous exécutez la commande update-grub après avoir branché votre clé, le script 10_linux fait le nécessaire car il détecte le système installé sur la clé. menuentry "Ubuntu sur clef bootable" { insmod ext2 set root=(hd1,2) search --no-floppy --fs-uuid --set 25b1b64d-f1cb-47cf-9ae3e0578d177319 linux /boot/vmlinuz-2.6.32-25-generic root=UUID=25b1b64d-f1cb47cf-9ae3-e0578d177319 ro quiet splash initrd /boot/initrd.img-2.6.32-25-generic } # update-grub Generating grub.cfg ... Found linux image: /boot/vmlinuz-2.6.32-25-generic Found initrd image: /boot/initrd.img-2.6.32-25-generic Found memtest86+ image: /memtest86+.bin Found Windows Recovery Environment (loader) on /dev/sda2 done © Gilles GOUBET – 2010 Page 7 Le chargeur GRUB2 Ajout d'un mot de passe dans un menu # cat /etc/grub.d/40_custom #!/bin/sh exec tail -n +3 $0 # 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. set superusers="gilles" password_pbkdf2 gilles grub.pbkdf2.sha512.10000.E9C5C0818881D3C983D834595D45D2AEE3422 200994C59E4CF716B2C53FC7765BEAB0295900BB1F0CF2FAF3F04D9D0E4396 E483AFEE47DA09EA0AB052D3ED6B2.CBF335AD5CCC7A166AB24E7E40E2AA93 C6396B3359C1769557981647ECD318BD7F8F1ED78961487E812C3B7D2AD277 8099DF8C0BDF296B18338217B34ADAFC2E menuentry "Ubuntu sur clef bootable" { insmod ext2 set root=(hd1,2) search --no-floppy --fs-uuid --set 25b1b64d-f1cb-47cf-9ae3e0578d177319 linux /boot/vmlinuz-2.6.32-25-generic root=UUID=25b1b64d-f1cb47cf-9ae3-e0578d177319 ro quiet splash initrd /boot/initrd.img-2.6.32-25-generic } Comme dans GRUB Legacy, il n'est possible d'entrer en mode édition pendant le boot qu'après avoir saisi le nom et le mot de passe défini par set superusers et password_pbkdf2. Sur l'écran apparaît : Saisir le nom de l 'utilisateur : gilles Saisir le mot de passe : xxxxx Références http://doc.ubuntu-fr.org/grub2 https://help.ubuntu.com/community/Grub2 http://www.gnu.org/software/grub/ https://wiki.ubuntu.com/Grub2 http://www.gnu.org/software/grub/manual/html_node/ © Gilles GOUBET – 2010 Page 8