GRUB
Grub (GRand Unified Bootloader), anciennement Grub2 est dérivé de PUPA qui était un projet de recherche pour étudier la prochaine génération de GRUB. Il a été réécrit à partir de 0 afin d'offrir modularité et portabilité.
Brièvement, le bootloader est le premier logiciel qui s'exécute lorsque l'ordinateur démarre. Il est responsable du chargement et du transfert de contrôle au noyau. Ce dernier initialise le reste du système d'exploitation.
Sommaire
|
Préface
GRUB Legacy (version 0.9x) est déprécié par ses développeurs et ne reçoit plus que les corrections de bugs. Il est remplacé par Grub dans de nombreuses distributions.
Notes pour les utilisateurs actuels de GRUB
- Il y a des différences dans les commandes de GRUB Legacy et GRUB. (Commandes de GRUB)
- Grub est modulaire. En conséquence, le bootloader est lui-même limité - les modules sont chargés depuis le disque dur si nécessaire pour étendre les fonctionnalités (LVM ou support RAID par exemple).
- Les disques sont toujours numérotés à partir de 0, alors que les partitions sont numérotées à partir de 1 au lieu de 0 et sont préfixées du type de table de partitions. Par exemple, /dev/sda1 serait appelée (hd0,msdos1) (MBR) ou (hd0,gpt1) (GPT).
Installation
Systèmes BIOS
pacman -S grub-bios
parted /dev/disk set partition-number bios_grub on
# fdisk -l /dev/sda[...] Périphérique Amorce Début Fin Blocs Id Système /dev/sda1 63 257039 128488+ 83 Linux [...]
(Source)
Pour l'installer sur le disque /dev/sda :
modprobe dm-mod
grub-install --boot-directory=/boot --no-floppy --recheck /dev/sda
cp /usr/share/grub/{unicode.pf2,ascii.pf2} /boot/grub/
Vous pouvez éventuellement générer un fichier core.img qui permet de chaîner depuis un GRUB Legacy :
grub-install --grub-setup=/bin/true --boot-directory=/boot --no-floppy --recheck /dev/sda
Systèmes UEFI
Les fabricants de carte-mère implémentent UEFI de différentes manières. Si ce qui suit ne fonctionne pas pour vous, voyez le wiki (en).
Préalable
Une partition système UEFI doit être rajoutée. Elle peut être de n'importe quelle taille, mais forcément formatée en FAT32 et d'un minimum de 512 Mb (prévoir davantage si vous avez plusieurs chargeurs UEFI ou plusieurs systèmes démarrés par UEFI).
Créer la partition système UEFI
Tables de partition GPT
Au choix:
- Utiliser GNU Parted/GParted: créer une partition FAT32. Placer le drapeau "boot" sur cette partition.
- Utiliser GPT fdisk (aka gdisk): créer une partition avec gdisk de type "EF00". Puis formater cette partition en FAT32 en utilisant mkfs.vfat -F32 /dev/<PARTITION>
Tables de partition MBR
Deux possibilités:
- Utiliser GNU Parted/GParted: créer une partition FAT32. Changer le code type de cette partition à 0xEF en utilisant fdisk, cfdisk ou sfdisk.
- Utiliser fdisk: créer une partition de type 0xEF et la formater en FAT32 avec mkfs.vfat -F32 /dev/<PARTITION>
Monter la partition système UEFI
mkdir -p /boot/efi mount -t vfat <UEFISYS_PART_DEVICE> /boot/efi
Il faut rajouter un répertoire <PARTITION_SYSTEME_UEFI>/EFI:
mkdir -p /boot/efi/EFI
Installer le paquet grub-uefi
Pour savoir quel paquet installer, il vous faut déterminer quelle architecture est employée par votre firmware UEFI:
- Si vous avez un système non-mac UEFI, alors vous avez un x86_64 (aka 64-bit) UEFI 2.x du firmware.
- Certains des firmwares 2.x connus comme x86_64 UEFI sont SecureCore Phoenix Tiano, AMI Aptio, Insyde H2O. Certains des systèmes connus utilisant ces firmwares sont Asus EZ Mode BIOS (en Sandy Bridge P67 et H67 cartes mères), MSI ClickBIOS, HP EliteBooks, Sony Vaio série Z, de nombreuses cartes mères Intel Server et Desktop.
- Les Mac pre-2008 ont surtout un firmware i386-efi alors que les Mac post-2008 ont pour la plupart x86_64-efi. Tous les macs capables d'exécuter Mac OS X Snow Leopard 64 bits ont un firmware x86_64 EFI 1.x.
Pour déterminer l'architecture du firmware EFI d'un Mac, démarrez sous Mac OS X et entrez la commande suivante:
ioreg -l -p IODeviceTree | grep firmware-abi
Si la commande renvoie EFI32 alors c'est un firmware 1.x EFI i386. Si elle retourne EFI64 alors c'est un firmware 1.x EFI x86_64. Les Macs n'ont pas de firmware UEFI 2.x du fait que la mise en œuvre EFI d'Apple n'est pas entièrement conforme à la spécification UEFI.
Sachant cela, reste à installer le paquet approprié:
- Pour le firmware UEFI x86_64:
pacman -S grub-efi-x86_64
- Pour le firmware UEFI i386:
pacman -S grub-efi-i386
Installer les fichiers de démarrage grub-uefi
La partition système UEFI devra être montée dans /boot/efi/ pour que le script d'installation de GRUB puisse la détecter:
mkdir -p /boot/efi mount -t vfat /dev/sdXY /boot/efi
Installez l'application UEFI GRUB dans /boot/efi/EFI/arch_grub et ses modules dans /boot/grub/x86_64-efi (recommandé) à l'aide de:
modprobe dm-mod grub-install --target=x86_64-efi --efi-directory=/boot/efi --bootloader-id=arch_grub --recheck --debug mkdir -p /boot/grub/locale cp /usr/share/locale/en\@quot/LC_MESSAGES/grub.mo /boot/grub/locale/en.mo
source_dir doesn't exist. Please specify --target or --directory
Si vous souhaitez installer les modules grub et grub.cfg dans /boot/efi/EFI/grub et l'application grubx64.efi dans /boot/efi/EFI/arch_grub (c'est-à-dire tous les fichiers UEFI grub à l'intérieur de la partition système UEFI elle-même) utilisez:
modprobe dm-mod grub-install --target=x86_64-efi --efi-directory=/boot/efi --bootloader-id=arch_grub --boot-directory=/boot/efi/EFI --recheck --debug mkdir -p /boot/efi/EFI/grub/locale cp /usr/share/locale/en\@quot/LC_MESSAGES/grub.mo /boot/efi/EFI/grub/locale/en.mo
L'option --efi-directory mentionne le point de montage de la partition système UEFI, --bootloader-id mentionne le nom du répertoire utilisé pour stocker le fichier grubx64.efi et --boot-directory mentionne le répertoire dans lequel les modules actuels seront installés (et dans lequel grub.cfg devrait être créé).
En résumé, les chemins actuels sont:
- <efi-directory>/<EFI ou efi>/<bootloader-id>/grubx64.efi
- <boot-directory>/grub/x86_64-efi/<tous les modules, grub.efi, core.efi, grub.cfg>
Vous pouvez maintenant être en mesure de démarrer votre système UEFI après création d'un fichier grub.cfg. :-)
Générer le fichier grub.cfg
Pour générer une configuration de grub:
grub-mkconfig -o <boot-directory>/grub/grub.cfg
Si vous avez utilisé précédemment --boot-directory=/boot:
grub-mkconfig -o /boot/grub/grub.cfg
Si vous avez utilisé --boot-directory=/boot/efi/EFI:
grub-mkconfig -o /boot/efi/EFI/grub/grub.cfg
Ceci est indépendant de la valeur de l'option --bootloader-id.
Si, lors du redémarrage, GRUB se plaint à propos de "no suitable mode found" essayez ceci (en).
Voir la partie Configuration pour plus d'informations.
Configuration
grub-menulst2cfg /boot/grub/menu.lst /boot/grub/grub.cfg
grub.cfg
Le fichier de configuration est /boot/grub/grub.cfg, exemple (en supprimant quelques commentaires):
# Config file for GRUB - The GNU GRand Unified Bootloader
# /boot/grub/grub.cfg
# Timeout for menu
set timeout=5
# Set default boot entry as Entry 0
set default=0
# (0) Arch Linux
menuentry "Arch Linux" {
set root=(hd0,1)
linux /vmlinuz-linux root=/dev/sda1 ro
initrd /initramfs-linux.img
}
## (1) Windows
#menuentry "Windows" {
#set root=(hd0,3)
#chainloader +1
#}
Options
Quelques options:
- (hdn,m): partition m du disque n, le numéro du disque commence par zéro (0), les partitions par un (1).
- set default=n: entrée par défaut, qui démarrera automatiquement après le timeout.
- set timeout=m: m secondes d'attente avant que le choix par défaut ne démarre.
- set root=(hdn,m) définit la partition où est installé le noyau.
- menuentry "str"{options} Une entrée.
- linux /path ro root=/dev/device : noyau à charger.
- initrd /initrd.img : ramdisk à charger.
- chainloader +1 : passe le relais à une au autre chargeur de démarrage
grub-mkconfig
Pour générer un grub.cfg automatiquement, vous pouvez lancer :
grub-mkconfig -o /boot/grub/grub.cfg
On peut configurer la génération automatique. Un exemple est détaillé dans la section dual boot.
Identifier les partitions par UUID ou label
Les numéros de partitions (que ce soit /dev/sdXy ou (hdX,Y)) sont trop dépendants de la machine, les numéros peuvent changer lorsqu'on ajoute un disque, ou lorsque le BIOS est d'humeur taquine et décide de détecter un disque avant l'autre. Enfin, ce n'est pas très élégant. Grub aussi bien que Linux sont capables d'identifier les partitions par UUID ou par label.
Les UUID sont des identifiants uniques (il est statistiquement impossible d'avoir plusieurs objets ayant le même UUID). Un UUID est attribué à une partition lors du mkfs. Il est possible de le récupérer avec blkid.
Pour indiquer à Grub la partition root, on utilisera la commande search :
search --fs-uuid --set root 355ccb5c-99e1-400d-b612-451f9247e35e
Ensuite, pour indiquer au noyau la partition de boot, on utilisera :
root=/dev/disk/by-uuid/355ccb5c-99e1-400d-b612-451f9247e35e
Si vous regardez dans /dev/disk, vous verrez plusieurs façons d'adresser les disques, sous forme de liens symboliques maintenus par udev vers les vraies partitions.
En résumé, une entrée de menu n'utilisant aucun numéro de partitions susceptible de changer :
menuentry "Arch Linux, session graphique" {
search --fs-uuid --set root 355ccb5c-99e1-400d-b612-451f9247e35e
linux /boot/vmlinuz-linux root=/dev/disk/by-uuid/355ccb5c-99e1-400d-b612-451f9247e35e ro
initrd /boot/initramfs-linux.img
}
De la même façon, on peut utiliser les labels (cependant, il est possible que certains systèmes de fichiers ne les prennent pas en charge). Les labels sont donnés par l'administrateur, avec une commande telle que:
tune2fs -L archroot /dev/sda2
L'avantage des labels est que, étant choisis par l'opérateur, ils sont humainement lisibles. L'inconvénient des labels est que, étant choisis par l'opérateur, des collisions sont plus probables. Ceci dit, utiliser les labels donne une configuration bien plus élégante et agréable à lire. Par exemple, l'entrée avec laquelle j'ai démarré ce matin :
menuentry "Arch Linux, session graphique" {
search --label --set root archroot
linux /boot/vmlinuz-linux root=/dev/disk/by-label/archroot quiet ro 5
initrd /boot/initramfs-linux.img
}
Arguments additionnels
Options temporaires
Vous pouvez configurer les différentes options de démarrage en modifiant la ligne du menu pendant l'exécution de GRUB. Pour cela, il suffit de se placer sur la ligne que vous vous voulez modifier et appuyer sur e :
setparams 'Arch Linux' set root=(hd0,1) linux /vmlinuz-linux root=/dev/sda3 ro initrd /initramfs-linux.img
Pour démarrer sans le mode graphique par exemple :
setparams 'Arch Linux' set root=(hd0,1) linux /vmlinuz-linux root=/dev/sda3 ro systemd.unit=multi-user.target initrd /initramfs-linux.img
Puis Ctrl-x pour démarrer.
Options permanentes
Pour rendre le passage d'arguments additionnels à l'image Linux permanent lors du démarrage, vous pouvez modifier la variable GRUB_CMDLINE_LINUX dans /etc/default/grub, sans oublier de regénérer le grub.cfg avec grub-mkconfig (ou éditez directement grub.cfg si vous vous passez de cette utilitaire).
Par exemple, pour l'hibernation, la partition de swap étant /dev/sda5 :
GRUB_CMDLINE_LINUX="resume=/dev/sda5"
ou bien:
GRUB_CMDLINE_LINUX="resume=UUID=xxxxx-xxxx-xxxxxx-xxxxxx"
Configuration du clavier
Par défaut, GRUB utilise un clavier qwerty. Pour que GRUB utilise une autre configuration de clavier, il va falloir générer un fichier de configuration et l'ajouter à GRUB.
Générez un nouveau fichier de configuration clavier
Récupérez le script ckbcomp disponible dans le paquet console-setup pour Debian (grub-kbdcomp en a besoin), le copier dans /usr/bin puis:
grub-kbdcomp -o /boot/grub/fr.gkb fr
Inclure la nouvelle configuration de clavier dans GRUB
#!/bin/sh echo 'insmod keylayouts' echo 'keymap /boot/grub/fr.gkb'
GRUB_TERMINAL_INPUT=at_keyboard
# Regénérez la configuration de GRUB : grub-mkconfig -o /boot/grub/grub.cfg
Installer ou restaurer GRUB
GRUB peut être installé directement depuis votre système ou depuis un live-cd via Chroot.
Lancez la commande suivante (grub_efi*-install pour un système EFI):
grub-install --no-floppy /dev/sda
Là où /dev/sda est la destination de l'installation. Dans ce cas, sur le MBR du premier disque.
Démarrer d'autres systèmes
Si vous utilisez grub-mkconfig, vous pouvez soit installer os-prober afin d'avoir une détection automatique des systèmes installés, soit utiliser le fichier /etc/grub.d/40_custom pour y rajouter les systèmes que vous voulez.
Si vous ne l'utilisez pas, rajoutez simplement les entrées au fichier /boot/grub/grub.cfg.
Microsoft Windows
Il faut adapter le disque et la partition ( (hd0,3) ) à votre cas.
menuentry "Windows" {
set root=(hd0,3)
chainloader +1
}
GNU/Linux
Il faut adapter le disque, la partition ainsi que les options du noyau à votre cas.
menuentry "Autre Linux" {
set root=(hd0,2)
linux /boot/vmlinuz root=/dev/sdXY ro
initrd /boot/initrd.img
}