GRUB

De ArchwikiFR
(Redirigé depuis GRUB2)


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.

Notes pour les utilisateurs actuels de GRUB Legacy

  • 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

Il vous faut installer le paquet grub :

pacman -S grub

Si vous utilisez LVM, RAID, une méthode de chiffrage ou tout autre système faisant appel au module dm-mod, pensez à le charger (si ce n'est déjà fait) :

modprobe dm-mod

Systèmes BIOS

Recommendations de partitionnement

(Source)

Si vous utilisez un schéma de partitionnement GPT, il est recommandé de créer une partition au début du disque avec pour type bios_grub (parted) 0xEF02 (gptfdisk), exemple :

parted /dev/disk set partition-number bios_grub on

Que ce soit en partitionnement GPT ou en MBR, assurez vous que la première partition commence au minimum à partir du secteur 63 (31Ko), par exemple pour un partitionnement MBR :

# fdisk -l /dev/sda

<pre<noinclude></noinclude> style="white-space: pre-wrap; overflow-x: auto; border-top: none; margin-top: 0">[...] Périphérique Amorce Début Fin Blocs Id Système /dev/sda1 63 257039 128488+ 83 Linux [...]</pre<noinclude></noinclude>>

Attention: Si vous avez des besoins spécifiques (un /boot en LVM par exemple), il se peut que les 31Ko laissés au début du partitionnement ne soient pas suffisant et vous risquez d'avoir une erreur lors de l'installation du MBR :
/usr/bin/grub-bios-setup : attention : core.img est exceptionnellement grand. Il ne tiendra pas dans la zone d'embarquage.
/usr/bin/grub-bios-setup : erreur : l'embarquage est impossible, il est pourtant nécessaire pour les installations RAID et LVM.

Dans ce cas, il vous faut prévoir plus de place, 1Mo est suffisant :

# fdisk -l /dev/sda

<pre<noinclude></noinclude> style="white-space: pre-wrap; overflow-x: auto; border-top: none; margin-top: 0">[...] Périphérique Amorce Début Fin Blocs Id Système /dev/sda1 2048 204799 101376 83 Linux [...]</pre<noinclude></noinclude>>

Mise en place

Pour l'installer sur le disque /dev/sda :

grub-install --no-floppy --recheck /dev/sda

Vous pouvez éventuellement juste générer un fichier core.img qui permet de chaîner depuis un GRUB Legacy :

grub-install --grub-setup=/bin/true --no-floppy --recheck /dev/sda

Il faudra passer /boot/grub/i386-pc/core.img à grub 0.x.

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

Note: Cette partition se rajoute à une partition éventuelle dédiée à /boot.

Créer la partition système UEFI

Attention: Pour ce qui suit, n'utilisez pas fdisk, cfdisk or sfdisk pour changer les codes de type d'un disque GPT. De même, n'utilisez pas gdisk, cgdisk or sgdisk sur un disque MBR, sous peine de le convertir automatiquement en GPT (le changement n'induit pas de perte de données, mais le système ne pourra pas démarrer).
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>
Note: Modifier le drapeau "boot" avec parted d'une partition MBR la marque comme partition active, tandis que le même drapeau "boot" d'une partition GPT la définit comme "partition système UEFI".
Tables de partition MBR
Note: Il est recommandé d'utiliser GPT car certains firmwares UEFI ne permettent pas le démarrage UEFI-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>

x86_64 ou i386

Par la suite, on suppose que vous avez un EFI x86_64, dans le cas contraire, il suffit de remplacer x86_64 par i386 dans les commandes ci-dessous.

Astuce:
  • Les PCs ont pour la plupart un UEFI 2.x x86_64.
  • Pour les macs, vous pouvez lancer la commande suivante pour connaître l'architecture de votre UEFI :
    ioreg -l -p IODeviceTree | grep firmware-abi
    EFI32 pour i386 et EFI64 pour x86_64.

Mise en place

Important: Pour ce faire, vous devez démarrer en utilisant UEFI et non le BIOS. Si vous avez démarré en copiant simplement le fichier ISO sur un disque USB, vous devrez suivre ce guide (en) pour créer un USB démarrant sur UEFI à partir de l'ISO sans quoi grub-install affichera des erreurs.

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

Créer le répertoire /boot/efi/EFI

mkdir -p /boot/efi/EFI

Installez l'application UEFI GRUB dans /boot/efi/EFI/arch_grub et ses modules dans /boot/grub/x86_64-efi à l'aide de :

grub-install --target=x86_64-efi --efi-directory=/boot/efi --bootloader-id=arch_grub --recheck

Vous pouvez maintenant être en mesure de démarrer votre système UEFI après création d'un fichier grub.cfg.

Configuration

Astuce: Pour une mise à jour depuis GRUB Legacy, vous pouvez convertir votre /boot/grub/menu.lst en /boot/grub/grub.cfg :
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) :

Fichier: /boot/grub/grub.cfg

<pre<noinclude></noinclude> style="padding: 0.25em; margin: 0 0 0.50em 0; background-color: #F7F7F7; border: thin dashed #7F7F7F; border-top: none"> # 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 rw initrd /initramfs-linux.img } ## (1) Windows #menuentry "Windows" { #set root=(hd0,3) #chainloader +1 #} </pre<noinclude></noinclude>>

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 rw 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 démarrer d'autres systèmes.

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 rw
    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. Exemple :

menuentry "Arch Linux, session graphique" {
    search --label --set root archroot
    linux /boot/vmlinuz-linux root=/dev/disk/by-label/archroot quiet rw 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 rw
  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 rw systemd.unit=multi-user.target
  initrd /initramfs-linux.img

Puis Ctrl-x pour démarrer.

Options permanentes

Si vous n'utilisez pas grub-mkconfig, il suffit de mettre les options voulues dans le fichier /boot/grub/grub.cfg, sinon, 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

Si vous n'utilisez pas grub-mkconfig, il vous faut rajouter :

Fichier: /boot/grub/grub.cfg

<pre<noinclude></noinclude> style="padding: 0.25em; margin: 0 0 0.50em 0; background-color: #F7F7F7; border: thin dashed #7F7F7F; border-top: none"> insmod keylayouts keymap /boot/grub/fr.gkb terminal_input at_keyboard </pre<noinclude></noinclude>>

Dans le cas contraire, modifiez les fichiers suivant :

Fichier: /etc/grub.d/50_keyboard

<pre<noinclude></noinclude> style="padding: 0.25em; margin: 0 0 0.50em 0; background-color: #F7F7F7; border: thin dashed #7F7F7F; border-top: none"> #!/bin/sh exec tail -n +3 $0 # Clavier fr insmod keylayouts keymap /boot/grub/fr.gkb </pre<noinclude></noinclude>>

Fichier: /etc/default/grub

<pre<noinclude></noinclude> style="padding: 0.25em; margin: 0 0 0.50em 0; background-color: #F7F7F7; border: thin dashed #7F7F7F; border-top: none"> GRUB_TERMINAL_INPUT=at_keyboard </pre<noinclude></noinclude>>

Et regénérez la configuration de GRUB :

grub-mkconfig -o /boot/grub/grub.cfg

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.

Fichier: /boot/grub/grub.cfg

<pre<noinclude></noinclude> style="padding: 0.25em; margin: 0 0 0.50em 0; background-color: #F7F7F7; border: thin dashed #7F7F7F; border-top: none"> menuentry "Windows" { set root=(hd0,3) chainloader +1 } </pre<noinclude></noinclude>>

GNU/Linux

Il faut adapter le disque, la partition ainsi que les options du noyau à votre cas.

Fichier: /boot/grub/grub.cfg

<pre<noinclude></noinclude> style="padding: 0.25em; margin: 0 0 0.50em 0; background-color: #F7F7F7; border: thin dashed #7F7F7F; border-top: none"> menuentry "Autre Linux" { set root=(hd0,2) linux /boot/vmlinuz root=/dev/sdXY rw initrd /boot/initrd.img } </pre<noinclude></noinclude>>

Dépannage

Restaurer GRUB

GRUB peut être installé directement depuis votre système ou depuis un live-cd via Chroot.

Il suffira de relancer les commandes selon votre système : BIOS ou EFI

grub-install échoue

Vous pouvez éventuellement lui rajouter l'option --debug afin d'avoir plus de précision sur la raison de l'échec.