Outils pour utilisateurs

Outils du site


expert:boot_ubuntu_iso_grub2

Installer Ubuntu à partir d'une image ".iso" avec Grub2

La situation est la suivante : vous voulez installer Ubuntu (ou n'importe laquelle de ses variantes), mais vous n'avez pas de cdrom sous la main, ou vous ne voulez pas gâcher un media optique, ou encore votre machine ne possède pas de lecteur optique.
Pour répondre à ces situation nous allons utiliser un système existant utilisant le chargeur d'amorçage grub2 pour démarrer l'image “.iso” du disque d'installation Ubuntu, et effectuer l'installation directement depuis cette image “.iso” sans gravure.

Un signe $ précède les commandes qui ne nécessitent pas de droits administrateur ; un signe # précède celles qui nécessitent des droits administrateur (ces signes ne font PAS partie des commandes). Les lignes qui ne commencent pas par un signe $ ou # correspondent au résultat de la commande précédente.
Les touches utilisées sont indiquées entre crochets, exemple [ctrl] pour la touche “contrôle”

Démarrer sur une image ".iso" avec grub2

Grub2 permet de démarrer à partir d'une image “.iso” très facilement, sans aucune modification de l'image elle-même ni extraction de l'initrd ou du noyau.
Grub2 est capable de monter l'image “.iso” et de l'amorcer grâce à l'option “loopback” qui permet de simuler un “device” (un périphérique bloc) à partir d'un fichier.

Mise en place d'une entrée de menu grub

Pour pouvoir démarrer sur votre image il vous faudra simplement placer celle-ci quelque part sur votre disque dur, une carte mémoire, ou comme dans cet exemple sur une clé usb.
Ici nous utiliserons un disque d'installation d' Ubuntu 9.04 (pour le test il s'agit d'un cd “Ubuntu 9.04 amd64 alternate”).

Il nous faut tout d'abord créer une entrée au menu grub nous permettant de choisir l'image “.iso” au démarrage. Le fichier /boot/grub/grub.cfg n'étant pas destiné à être édité directement, nous allons créer un “modèle” à l'aide du fichier /etc/grub.d/40_custom. Le nom exact de ce fichier peut varier sur votre distribution, une fois que vous l'avez identifié vous pouvez l'ouvrir dans votre éditeur de texte favori, des droits “root” seront nécessaires :

# nano /etc/grub.d/40_custom

Le fichier devrait ressembler à ça une fois édité :

#!/bin/sh
exec tail -n +3 $0
##This file is an example on how to add custom entries

menuentry "Image iso" {
insmod loopback
insmod iso9660
loopback loop (hd3,1)'/ubuntu 9.04 amd64.iso'
linux (loop)/install/vmlinuz
initrd (loop)/install/initrd.gz
}

La première partie de l'entrée est facultative (“insmod…”), elle vise simplement à assurer le chargement des modules nécessaires au montage de l'image “.iso” par grub2. Ces modules devraient normalement être chargés par défaut.
La partition racine “root” devra être celle où est enregistrée l'image “.iso”, ici on suppose que la clé usb est le quatrième disque (trois disques dur internes), soit la première partition du quatrième disque dur (hd3,1).
La partie intéressante est la localisation du noyau et de l'“initrd” (initial ram disk) sur lesquels grub va opérer l'amorçage. Pour connaître la localisation exacte vous aurez sans doute besoin de monter l'image “.iso” pour examiner son contenu.
Monter l'image n'est pas difficile, il suffit de créer un répertoire qui fera office de point de montage, et de monter l'image “.iso” dessus avec les bonnes options :

$ mkdir ~/iso

# mount -o loop -t iso9660 ~/ubuntu\ 9.04\ amd64.iso ~/iso

$ find ~/iso \( -name initrd* -o -name vmlinuz \)
/iso/install/initrd.gz
/iso/install/vmlinuz

La recherche avec “find” nous indique rapidement ce que nous cherchons, ici les fichiers “/install/initrd.gz” et “/install/vmlinuz”.

Pour donner d'autres exemples, et servir de point de départ à d'autres expériences ;-), la même recherche pour une image “.iso” de Debian amd64 donne “/install.amd/gtk/initrd.gz” et “/install.amd/vmlinuz” ; sur une Fedora11 amd64 cela donne “/isolinux/initrd.img” et “/isolinux/vmlinuz”. Certains live-cd ou disques d'installation utilisent des dénominations différentes pour le noyau et l'initrd, généralement vous trouverez ces deux éléments dans un répertoire “isolinux” ou “install”.

Attention à la syntaxe de la ligne “loopback loop (hd3,1)'/ubuntu 9.04 amd64.iso'”, “loop” n'est pas collé au chemin de l'image “.iso” (contrairement aux lignes suivantes), et le nom de l'image “.iso” est encadré de guillemets simples en raison des espaces. Une autre solution serait d'échapper les espaces avec des anti-slash (/ubuntu\ 9.04\ amd64.iso), ou de renommer l'image “.iso” sans espaces.

:!: Si vous enregistrez l'image “.iso” sur votre disque dur dans votre répertoire personnel, le chemin commencera “/home/” si vous ne disposez que d'une partition (système et répertoire personnel non séparés). Si vous disposez d'une partition “/home” séparée le chemin commencera directement par votre nom d'utilisateur, sans “/home/” devant.

Lorsque l'entrée du fichier “40_custom” est en place, on peut l'enregistrer et exécuter grub pour mettre à jour le grub.cfg :

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

ou, sur Ubuntu par exemple :

# update-grub2

Oui, mais... Résoudre les problèmes

Le résultat est dépendant de votre installation, par exemple si votre système fonctionne sur une partition “ext4” ou de type “raid-autodetect”, grub2 n'aura pas de problème à amorcer l'initrd et le noyau à partir de l'image “.iso”, mais ceux-ci devront également supporter le système de fichier en question. Rare sont les installateurs à supporter l'ext4, dans ce cas mieux vaut copier l'image sur une clé usb formatée en “ext2/3” ou en “fat16/32”. Ubuntu ne supporte nativement l'ext4 qu'à partir de “Karmic Koala”.

Souvenez-vous que grub2 permet d'éditer les entrées du menu (touche [e], puis [ctrl][x] pour démarrer sur l'entrée éditée), mais aussi de basculer sur une console depuis le mode d'édition (avec [ctrl][c], on quitte le shell avec [esc]) et de lister toutes les partitions avec la commande “ls”. De cette manière vous n'aurez aucun mal à trouver l'adresse de votre clé usb ou disque dur externe, et modifier en conséquence l'entrée du menu grub à la volée en cas d'erreur “file not found” ou “you must load the kernel first”.

Ensuite il reste un écueil majeur, la plupart des live-cd et images d'installation s'attendent à fonctionner depuis un lecteur de cdrom, et vont chercher les fichiers dans /cdrom… Sauf que si l'image “.iso” s'exécute depuis le disque dur où une clé usb les scripts vont échouer, et la procédure d'installation/démarrage va s'arrêter. Voici comment contourner le problème avec l'image “.iso” d'Ubuntu :

Une fois amorcé, la procédure d'installation va s'effectuer normalement jusqu'au stade du montage du cdrom, qui va échouer. Lorsque l'installateur demande s'il faut réessayer de monter le cdrom répondez “non”. Une message d'alerte vous indique qu'une étape indispensable vient d'échouer, validez.




De retour à la liste des options choisissez “d'exécuter un shell” (ligne de commande). Une fois le shell (ash) lancé créez un répertoire qui servira de point de montage avec “mkdir”, et montez dessus la partition qui contient l'image “.iso”.

# mkdir /mnt/iso
mount -t vfat /dev/sdd1 /mnt/iso

Ici la clé usb qui contient l'image “.iso” est formatée en “fat” (option “-t vfat”). Si vous doutez du nom de la partition vous pouvez examiner “/dev” avec la commande “ls” :

$ ls -l /dev | grep sd

Une fois la partition montée, il reste à monter l'image “.iso” là où l'installateur s'attend à la trouver, sur “/cdrom” :

# mount -o loop -t iso9660 /mnt/iso/ubuntu\ 9.04\ amd64.iso /cdrom

Le tour est joué, quitter le shell en tapant “exit”, et reprenez la procédure à “détecter et monter le cdrom”, à partir de là l'installation se passera normalement.

Les options spéciales "isofrom", "findiso" et autres.

Certains live-cd et disques d'installation permettent de contourner le problème de la recherche du cdrom, grâce à une directive spéciale à passer sur la ligne du noyau dans le menu grub.

Le live-cd de maintenance “GRML” accepte par exemple l'option “findiso=/grml-small_[version].iso”, ou sur les versions plus anciennes (avant 2009.05) l'option “isofrom=/dev/sdd1/grml-small_[version].iso”. Vous trouverez un exemple de son utilisation sur ce blogue(eng).
Le live-cd “Sidux” accepte également “fromiso=/sidux-[version].iso”, un exemple d'utilisation sur ce blog(eng).

Enfin dans cet article de LinuxPedia vous apprendrez que “Zenwalk” honore également l'option “isofrom=”.

Les récalcitrants...

Certaines images “.iso” s'obstinent à ne pas fonctionner de cette manière, c'est le cas des images “netinstall” de Fedora11 que j'ai pu tester. D'autres demandent des manipulations fastidieuses comme le chargement de modules avec modprobe, la création d'un node “/dev/loop” avec “mknod” avant de pouvoir monter l'image “.iso” sur /cdrom (Debian testing “netinstall”). Enfin les systèmes de fichiers supportés sont parfois très restreints, voir limités au seul “fat” (!!), si votre image “.iso” réside sur de l'ext2/3/4, une partition marquée “raid-autodetect” (raid logiciel par mdadm), ou autre (ntfs, reiser4…) la procédure échouera. :-(

Tout ceci fait un peu fouillis, mais grub2 est encore jeune et son adoption progressive va stabiliser les choses. Ubuntu Karmic Koala sera la première distribution à l'utiliser nativement, Debian le recommande déjà, Fedora teste Grub2 en ce moment… Il est probable que les cdrom d'installation supporteront quasiment tous une option comparable à “findiso”, ou mieux embarqueront leur propre “grub.cfg” et supporteront le démarrage direct par grub2. D'ici là, à vos bidouilles ! ;-)


Liens

expert/boot_ubuntu_iso_grub2.txt · Dernière modification: 2014/05/09 18:56 (modification externe)