GRUB : Différence entre versions

De ArchwikiFR
m (Configuration du clavier : complément du -o (pas besoin du mv) ; modèle ; -liens (tout est là))
m (Installer ou restaurer GRUB : Ajout lien page chroot)
Ligne 278 : Ligne 278 :
  
 
== Installer ou restaurer GRUB ==
 
== Installer ou restaurer GRUB ==
GRUB peut être installé depuis un live-cd ou directement depuis votre système.
+
GRUB peut être installé directement depuis votre système ou depuis un live-cd via [[Chroot]].
  
 
Lancez la commande suivante ({{codeline|grub_efi*-install}} pour un système EFI):
 
Lancez la commande suivante ({{codeline|grub_efi*-install}} pour un système EFI):

Version du 27 novembre 2012 à 01:15


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.


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
Note : 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
Note : Pour un schéma de partitionnement MBR (msdos), assurez vous que la première partition commence au minimum à partir du secteur 63:
# 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).

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>

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.

Important : Il s'agit bien de l'architecture du firmware UEFI et non de l'architecture sous laquelle Arch est installée.

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
Note : L'installation du paquet ne mettra pas à jour le fichier core.efi et les modules GRUB dans la partition système UEFI. Vous devez le faire manuellement en passant par grub-install comme expliqué plus bas.

Installer les fichiers de démarrage grub-uefi

Note : Les commandes ci-dessous supposent que vous utilisez grub-efi-x86_64 (pour grub-efi-i386, remplacez x86_64 par i386 dans les commandes ci-dessous).
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 pour créer un USB démarrant sur UEFI à partir de l'ISO (en) 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

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
Note : Sans --target ou --directory, grub-install ne peut pas déterminer quel firmware grub est en cours d'installation. Dans de tels cas, grub-install montrera le message suivant:
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>
Note : L'option --bootloader-id ne change pas <boot-directory>/grub, c'est-à-dire que vous ne pouvez pas installer les modules dans <boot-directory>/<bootloader-id>, le chemin est codé en dur pour être <boot-directory>/grub.

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
Note : Le chemin du fichier est <boot-directory>/grub/grub.cfg, et non <boot-directory>/grub/x86_64-efi/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

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
# 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
}

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.


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

Fichier: /etc/grub.d/50_keyboard
 #!/bin/sh
 echo 'insmod keylayouts'
 echo 'keymap /boot/grub/fr.gkb'
Fichier: /etc/default/grub
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.

Dual-boot

grub-mkconfig

Si vous voulez que, comme dans Debian, GRUB recherche automatiquement d'autres systèmes, vous devez installer os-prober.

Si os-prober ne détecte pas tous les systèmes installés, vous pouvez également ajouter manuellement des entrées au fichier /etc/grub.d/40_custom. Elles seront insérées automatiquement quand vous exécuterez grub-mkconfig.

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

pour générer le fichier grub.cfg modifié.

Microsoft Windows

Fichier: /boot/grub/grub.cfg
# (2) Windows XP
menuentry "Windows XP" {
 set root=(hd0,3)
 chainloader +1
}

GNU/Linux

Ceci est géré de la même manière que pour Archlinux:

Fichier: /boot/grub/grub.cfg
menuentry "L'autre Distro" {
 set root=(hd0,2)
 linux /boot/vmlinuz (ajoutez les autres options du noyau si nécessaire)
 initrd /boot/initrd.img (si le noyau de la seconde distribution en a besoin)
}