Modifier le GRUB pour un "triboot"

Bonjour,

Je possède un ordinateur avec 3 systèmes d’exploitation : Windows 7, Windows XP et Linux (Debian).

Lorsque je lance mon ordinateur, j’ai le GRUB qui s’ouvre pendant 15 secondes et il me propose de lancer Debian, Debian (user only) ou Windows 7. Si je n’effectue aucune action, il lance Debian, si je sélectionne Windows 7, il me propose le choix dual boot avec Windows XP.

Ce que je j’aimerais faire, c’est d’avoir le choix, depuis le GRUB, entre Debian, XP et 7. J’ai passé la journée dessus, GRUB1, GRUB2, modifier des fichiers, mettre à jour, etc… mais rien à faire, je comprend pas comment faire pour avoir uniquement ces 3 choix au lancement de mon ordinateur.

Auriez-vous des informations à me fournir ou des tutoriaux explicatifs ?

Merci à vous.

Pas sûr que ce soit possible.

Lorsque plusieurs systèmes Windows sont installés sur la même machine, ils sont tous lancés par le même chargeur d’amorçage, généralement le dernier installé. Un peu comme les distributions Linux : la dernière installée rend son chargeur prioritaire et intègre les précédentes dans son menu de démarrage.

Windows XP installe un chargeur nommé “ntldr” à la racine de la partition de boot (C:), alors que Windows 7 installe un chargeur nommé “bootmgr” au même endroit.
Si les deux fichiers sont présents, tu peux créer des entrées de menu pour GRUB utilisant la commande [mono]ntldr[/mono] comme dans l’exemple fourni dans https://www.gnu.org/software/grub/manual/html_node/Multi_002dboot-manual-config.html.

[code]menuentry “Windows XP” {
insmod ntfs
search --set=root --label WINDOWS_XP --hint hd0,msdos1
ntldr /ntldr
}

menuentry “Windows 7” {
insmod ntfs
search --set=root --label WINDOWS_7 --hint hd0,msdos2
ntldr /bootmgr
}[/code]
Ajuster les numéros de partition et le critère de recherche (label, UUID) en fonction de la situation.

Et si ils ne sont pas présents de base, un moyen de les ajouter manuellement ?

Pour tout vous dire, c’est un travail à effectuer lors d’une formation.
Le formateur nous à bien dis que c’était possible en passant par GRUB2 en modifiant un fichier et en mettant à jour derrière.

Si ntldr a été effacé par Windows 7, alors cela ne relève pas de Debian ni GRUB mais de Windows. A moins qu’il soit possible pour GRUB d’invoquer bootmgr en lui passant en argument le système à démarrer, mais je n’en sais rien et n’ai rien vu de tel.

C’est bête, j’ai des multiboot entre deux Windows XP (ntldr), entre Windows Vista et Windows 7 (bootmgr) mais pas entre Windows 7 et Windows XP.

D’accord, je vais voir si d’autres personnes pensent avoir une idée.
Quand j’obtiendrai la correction de cette manipe, je l’indiquerai ici.

Comme je suis curieux, j’ai testé. Les deux chargeurs sont bien présents et peuvent être lancés par GRUB comme illustré plus haut.

Donc je peux mettre en place mon “triboot” en recopiant le chargeur d’XP et en supprimant celui de Debian en only one user ?

Je ne comprends pas la question. Qu’entends-tu par “recopier le chargeur d’XP”, “supprimer celui de Debian”, “en only one user” ?

De mon point de vue il n’y a rien à recopier ni a supprimer. Si tu supprimes le chargeur de Debian, tu n’auras plus le menu de démarrage de GRUB, et probablement plus de démarrage du tout.

La ou les entrées de menu supplémentaires pour Windows doivent être ajoutées dans [mono]/etc/grub.d/40_custom[/mono] ou [mono]/boot/grub/custom.cfg[/mono], puis [mono]update-grub[/mono] doit être exécuté pour regénérer le fichier de configuration de GRUB.

Si le paquet os-prober est installé et le fichier [mono]/etc/default/grub[/mono] ne contient pas de ligne [mono]GRUB_DISABLE_OS_PROBER=“true”[/mono] (situation par défaut), alors [mono]update-grub[/mono] détecte automatiquement la présence d’un chargeur pour Windows sur la partition de boot de Windows et il suffit d’ajouter une entrée de menu pour l’autre chargeur inactif (probablement ntldr). Dans le cas contraire, il faut ajouter deux entrées de menu, une pour XP (ntldr) et une pour W7 (bootmgr).

Effectivement, je viens de travailler dessus ce matin.

J’ai désactivé OS PROBER.

J’ai créer un nouveau fichier 25_custom dans /etc/grub.d/40_custom car le système charger les deux linux et Windows 7 qui se trouve dans le fichier 30_os_proper et ignorer mes entrées dans le fichier 40_custom.

Du coup, quand j’allume l’ordinateur j’ai ces entrées :

  • Linux
  • Linux
  • Windows 7 (fichier 30_os-prober)
  • Windows XP (fichier 25_custom)
  • Windows 7 (fichier 25_custom)

Quand j’essayes de lancer Windows XP et 7 (les deux dernières entrées), il m’indique “no such device”. Je pense que j’ai fais une erreur dans le chemin.

Mon fichier 25_custom ressemble à ça :

[code]#!/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.

menuentry “Windows XP” {
insmod part_msdos
insmod ntfs
set root=’(hd1,5)'
ntldr /ntldr
}

menuentry “Windows 7” {
insmod part_msdos
insmod ntfs
set root=’(hd1,1)'
ntldr /bootmgr
}
[/code]

Une fois que j’aurais réussi à corriger ce fichier et à booter sur XP ou 7, il me faudra supprimer la première entrée de Windows 7 qui s’affiche sur le GRUB depuis le début et je pense que ce sera bon.

MAJ:

J’ai réussi à booter sur Windows 7 en modifiant le menu entry :

menuentry "Windows 7" { insmod part_msdos insmod ntfs set root=(hd1,1) chainloader +1 ntldr /bootmgr }

Par contre, Windows XP est sur une partition logique, du coup il ne se lance pas. En tout cas c’est mon avis de son “non-boot”.

menuentry "Windows 7" { insmod part_msdos insmod ntfs set root=(hd1,1) chainloader +1 ntldr /bootmgr }

Auriez-vous une solution ?

Merci

C’est louche. Il n’y a pas d’interaction entre les fichiers dans /etc/grub.d/ et je ne vois pas comment l’un pourrait en faire ignore un autre.

[quote=“DKProject”]Du coup, quand j’allume l’ordinateur j’ai ces entrées :

  • Linux
  • Linux
  • Windows 7 (fichier 30_os-prober)
  • Windows XP (fichier 25_custom)
  • Windows 7 (fichier 25_custom)[/quote]
    Si tu as désactivé os_prober et exécuté update-grub la 3e entrée ne devrait plus être présente.

Lors de mon test, les fichiers [mono]ntldr[/mono] et [mono]bootmgr[/mono] étaient installés dans la même partition, celle définie comme bootable, bien que chaque version de Windows soit installée dans une partition séparée. Vérifie bien dans quelle partition ils se trouvent.
disque /dev/sda = (hd0)
partition /dev/sda1 = (hd0,1)
disque /dev/sdb = (hd1)
partition /dev/sdb1 = (hd1,1)

Ta machine a deux disques et Windows est sur le second (hd1) ?

[mono]chainloader[/mono] et [mono]ntldr[/mono] sont deux méthodes d’amorçage mutuellement exclusives. Je ne sais pas quelle commande est prise en compte, la première ou la dernière, mais une chose est sûre : une seule suffit.

Note : [mono]chainloader[/mono] charge et exécute le secteur d’amorce de la partition désignée, qui à son tour lance le chargeur associé, a priori bootmgr ici. [mono]ntldr[/mono] lance directement le chargeur à partir du fichier désigné.

  1. C’est le même paragraphe que pour Windows 7, il doit y avoir une erreur de copier-coller.
  2. Peu importe où est installé Windows XP, l’important est l’endroit où se trouve le fichier [mono]ntldr[/mono].

Oui, j’ai deux disques durs :

[code]root@PC10LX:/# fdisk -l

Disque /dev/sdb : 160.0 Go, 160041885696 octets
255 têtes, 63 secteurs/piste, 19457 cylindres, total 312581808 secteurs
Unités = secteurs de 1 * 512 = 512 octets
Taille de secteur (logique / physique) : 512 octets / 512 octets
taille d’E/S (minimale / optimale) : 512 octets / 512 octets
Identifiant de disque : 0x741a66d5

Périphérique Amorce Début Fin Blocs Id Système
/dev/sdb1 * 206848 218206207 108999680 7 HPFS/NTFS/exFAT
/dev/sdb2 218208254 312581631 47186689 f Étendue W95 (LBA)
/dev/sdb5 281120772 312581631 15730430 7 HPFS/NTFS/exFAT
/dev/sdb6 218208256 222111743 1951744 83 Linux
/dev/sdb7 222113792 229924863 3905536 82 partition d’échange Linux / Solaris
/dev/sdb8 229926912 281104383 25588736 83 Linux

Les entrées de la table de partitions ne sont pas dans l’ordre du disque

Disque /dev/sda : 160.0 Go, 160041885696 octets
255 têtes, 63 secteurs/piste, 19457 cylindres, total 312581808 secteurs
Unités = secteurs de 1 * 512 = 512 octets
Taille de secteur (logique / physique) : 512 octets / 512 octets
taille d’E/S (minimale / optimale) : 512 octets / 512 octets
Identifiant de disque : 0x6eea8ab7

Périphérique Amorce Début Fin Blocs Id Système
/dev/sda1 63 19535039 9767488+ 83 Linux
/dev/sda2 19535040 58605119 19535040 83 Linux[/code]

Il me semble que j’ai un problème avec la commande de base : update-grub que je dois remplacer par : grub-mkconfig -o /boot/grub/grub.cfg pour que le GRUB soit à jour.

[code]#!/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.

menuentry “Windows XP” {
insmod part_msdos
insmod ntfs
set root=(hd1,msdos5)
search --no-floppy --fs-uuid --set=root D4D43432D4341966
drivemap -s (hd1) ${root}
chainloader +1
}

menuentry “Windows 7” {
insmod ntfs
set root=(hd1,1)
search --no-floppy --fs-uuid --set=root 22727B07727ADF4B
chainloader +1
}
[/code]

Une capture des partitions du disque pour mieux comprend la situation :

Situation du disque : http://hpics.li/2ed6ada

Plus qu’à voir pour XP mais je ne parviens pas à le lancer. Ecran noir avec tiret en haut à gauche.

Quel problème au juste ? Normalement c’est équivalent.

Cela n’apporte pas grans-chose, la sortie de fdisk suffisait.

chainloader le secteur d’amorce d’une partition logique Windows n’est pas la bonne méthode car Les partitions logiques de Windows ne sont jamais amorçables. Y a-t-il oui ou non un fichier [mono]ntldr[/mono] à la racine d’une des partitions Windows ?
Dans quel ordre les deux Windows ont-ils été installés ?

Installation de Windows 7, puis Windows XP et enfin Debian.

Donc oui, je pense qu’il y a un fichier ntldr mais pas forcément à la racine. Je pense que ce fichier se trouve dans la partition étendue au niveau de Windows XP, d’où le problème.

Mon formateur m’avait mis sur la voie de créer une petite partition avec les 3 fichiers XP dessus pour que la reconnaissance d’amorçage soit possible.

J’avais installé Windows XP en premier pour mon test.
En faisant l’inverse, je constate que le chargeur de Windows XP (ntldr) prend la priorité sur le chargeur de Windows 7 (bootmgr), ce qui me semble logique, c’est le dernier installé qui prend la priorité. Je suis donc surpris que dans ton cas bootmgr ait la priorité.

[quote=“DKProject”]
Donc oui, je pense qu’il y a un fichier ntldr mais pas forcément à la racine. Je pense que ce fichier se trouve dans la partition étendue au niveau de Windows XP, d’où le problème.[/quote]
As-tu vérifié ? Dans mon cas les deux chargeurs sont à la racine de la partition de boot. Le chargeur de Windows n’a rien à faire à la racine d’une partition logique qui n’est pas bootable.

J’ai un boot.ini et un ntldr à la racine de ma partition C là où est Windows 7

[boot loader] timeout=1 default=multi(0)disk(0)rdisk(0)partition(3)\WINDOWS [operating systems] multi(0)disk(0)rdisk(0)partition(3)\WINDOWS="Microsoft Windows XP Professionnel" /noexecute=optin /fastdetect

Comme prévu.
Il faut donc spécifier le numéro et l’UUID de cette partition dans l’entrée de menu de GRUB pour Windows XP, et la commande [mono]ntldr[/mono] devrait lancer le chargeur d’amorçage de Windows XP.

menuentry "Windows XP" { insmod ntfs set root=(hd1,1) search --no-floppy --fs-uuid --set=root 22727B07727ADF4B ntldr /ntldr }
La commande [mono]drivemap[/mono] peut être nécessaire, je n’ai pas testé avec deux disques. A vérifier. Par contre ce ne sera sûrement pas

mais plutôt

pour que le disque soit vu comme disque 0.

Malheureusement même avec l’UUID Windows XP ne se lance pas. Je suis obligé de passer par l’amorçage de Seven pour pouvoir choisir XP.

Chez moi ça marche mais j’ai effectivement dû utiliser [mono]drivemap -s hd0 hd1[/mono] pour permuter les deux disques sinon ça reboote ou ça se fige.
Laisse tomber l’UUID et teste en manuel dans le shell de GRUB (touche c).