web-dev-qa-db-fra.com

Comment le chargeur de démarrage Grub sait-il?

Je ne comprends pas comment il faut savoir quelle image du noyau charger? J'en ai beaucoup. Une fois, j'avais créé mon propre noyau et recompilé. Comment apprend-il que c'est celui-ci à charger?

2
akshay

Pour répondre à votre dernière question:

Vous pouvez placer le nouveau menuentry n'importe où dans /etc/grub.d/40_custom.

Ensuite, éditez/etc/default/grub, et remplacez DEFAULT par le nom du menuentry que vous avez ajouté à 40_custom. (Il est préférable d'utiliser le nom plutôt qu'un nombre indexé par 0, car cela permet d'ajouter ou de supprimer plus d'images du noyau ultérieurement: voir grub2 infopage ).

Puis assurez-vous que exécute Sudo update-grub2 (sinon vos modifications ne seront pas écrites dans grub.cfg).

Raisonnement: 40_custom est ajouté au menu grub sous toutes les images du noyau trouvées par grub-update2. Par conséquent, l'ordre dans 40_custom ne remplacera pas les noyaux trouvés par 10_linux.

0
hope

Voici ce que j'ai glané de info grub et ceci tutoriel grub .

En résumé, oui, si vous modifiez le fichier /boot/grub/grub.cfg, le chargeur de démarrage grub2 lira ces modifications et agira en conséquence.

  • L’avantage est que si vous faites une petite faute de frappe, votre système ne démarrera pas (bien que grub2 s’exécute et que vous puissiez utiliser le shell grub pour boot, avec trois commandes, si vous savez ce que vous faites). Donc, au lieu de modifier une entrée de démarrage dans grub.cfg, la dupliquez et donnez un nouveau nom à la nouvelle menuentry.Si la nouvelle démarre, correctement, vous pouvez en faire la nouvelle valeur par défaut (voir ci-dessous) ou supprimer l’ancien.

  • La complication est que par défaut, chaque fois que Ubuntu pousse un grub ou le noyau, le met à jour complètement réécrit ​​grub.cfg (via le shell script/usr/sbin/update-grub2). Donc, si vous modifiez manuellement le fichier grub.cfg pour démarrer un noyau personnalisé, ces modifications risquent d'être écrasées.

Pour contourner ce problème , au lieu de jouer avec grub.cfg, ajoutez l'entrée de menu du noyau personnalisée à la fin de /etc/grub.d/40_custom et exécutez #Sudo update-grub2

(Cela garantira que votre noyau personnalisé sera toujours dans le fichier grub.cfg même lorsque des mises à jour du noyau ou du noyau ont été mises à jour par Ubuntu).

Vous devez toujours vous assurer que votre noyau est démarré par défaut. Faites-le en modifiant le fichier/etc/default/grub

Changer la ligne

GRUB-DEFAULT=0

à

GRUB-DEFAULT='My super duper kernel 3.11.xxx'

où la chaîne entre guillemets est exactement ​​entre guillemets pour le menuentry correspondant dans grub.cfg

Vous devrez peut-être exécuter update-grub2 à nouveau.

Ça y est, vous avez terminé.

Exemple:

J'ai le noyau et initrd suivants:

vmlinuz-3.11.0-18-generic

initrd.img-3.11.0-18-generic

et voulez plutôt démarrer le noyau personnalisé suivant par défaut

my_super_duper_kernel_3.11

initrd.img-my_super_duper_kernel_3.11

1) Je cherche dans l’entrée courante dans/boot/grub/grub/cfg. (Remarque, il semble y avoir beaucoup d'éléments non essentiels dans chaque menu - voir la fin de ce billet pour un exemple simple).

menuentry 'Ubuntu' --class ubuntu --class gnu-linux --class gnu --class os
$menuentry_id_option 'gnulinux-simple-83af7d46-f6f8-4161-b7a4-47c44de0dd5e' {


... stuff deleted for brevity...

#this specifies first hard disk, first partition (i have a separate /boot partition)    
set root='hd0,msdos1'

linux   /vmlinuz-3.11.0-18-generic root=/dev/mapper/linuxlvm-lvubuntu ro   quiet splash $vt_handoff

initrd  /initrd.img-3.11.0-18-generic

}

2) J'ajoute menuitem à /etc/grub.d/40_custom, en lui substituant un nouveau nom de menuentry, une image du noyau et un initrd:

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

#menu entry changed. It can be anything as long as it's unique
menuentry 'my_super_duper_kernel_3.11' --class ubuntu --class gnu-linux --class gnu --class os $menuentry_id_option 'gnulinux-simple-83af7d46-f6f8-4161-b7a4-47c44de0dd5e' {


set root='hd0,msdos1'

#kernel image here must match the one in /boot
linux   /my_super_duper_kernel_3.11 root=/dev/mapper/linuxlvm-lvubuntu ro   quiet 

splash $vt_handoff

#initrd image, if you use one
initrd  /initrd-my_super_duper_kernel_3.11

#don't forget the closing bracket
}

3) exécuter #Sudo update-grub2

4) redémarrer. vous devriez voir le nouveau noyau au bas de la liste du chargeur de démarrage.

5) Faites-le par défaut en modifiant la ligne par défaut dans/etc/default/grub. Il doit correspondre exactement à ce que vous mettez entre guillemets dans /etc/grub.d/40_custom juste après menuentry=

GRUB-DEFAULT='My super duper kernel 3.11'

6) Pas sûr que ce soit nécessaire, mais ça ne fera pas de mal de relancer `#Sudo update-grub2

Informations de fond:

Terminologie: `Le chargeur de démarrage s'appelle grub2, mais familièrement ppl l'appelle toujours 'grub'. Donc, si vous recherchez de l'aide sur le sujet sur Google, assurez-vous de rechercher spécifiquement grub2. Googler juste 'grub' apportera des informations obsolètes sur l'ancien chargeur Grub (qui est toujours utilisé, mais renommé 'grub-legacy').

Comment il sait: Grub2 consiste en un petit logiciel (boot.img) installé (généralement sur le MBR de votre disque) et codé en dur dans celui-ci les emplacements sur votre disque du fichier grub.cfg et de plusieurs logiciels (core.img et divers fichiers * .mod) qui démarrent réellement le noyau Linux. Donc, boot.img sait trouver core.img, qui lira à son tour grub.cfg

grub.cfg est généré par le script de shell/usr/sbin/update-grub2. Il exécute tous les scripts exécutables dans /etc/grub.d/ (par ordre alphabétique, donc 10_linux est exécuté avant 40_custom, etc.) et envoie leurs sorties à grub.cfg.

Fichier Barebone Sauf si vous utilisez des systèmes de fichiers ou du matériel non standard, vous n'avez besoin que de quelques lignes pour démarrer un noyau Linux sur un PC standard avec grub. Les autres éléments concernent les écrans de démarrage graphiques et je ne sais pas quoi d'autre (ce qui suit a été testé avec une partition ext4/boot et/dans lvm-ext4):

menuentry 'foo' {
set root='hd0,msdos1' #depends on your partitioning scheme 

linux   /kernel_image root=/dev/mapper/linuxlvm-lvubuntu ro  
#root= should be set to whatever /etc/fstab (or the mount command) says for the device that / is mounted on.

#initrd image, if you use one
initrd  /initrd-my_super_duper_kernel_3.11
}
2
hope

Il ne sait pas Il ne recherche que certains fichiers (initrd*, vmlinuz*) dans le répertoire /boot et écrit un fichier de configuration (/boot/grub/grub.cfg). Vous pouvez mettre à jour ce fichier en utilisant

Sudo update-grub2

ou

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

Ensuite, lors de l’étape de démarrage, GRUB examine le fichier et utilise les informations qu’il y a placées. C'est simple.

Exemple de sortie:

 $ Sudo update-grub2 
 Générer un fichier grub.cfg ... 
 Image linux trouvée: /boot/vmlinuz-3.11.0-18-generic[.____. strangeFound initrd image: /boot/initrd.img-3.11.0-18-generic
Found memtest86 + image: /memtest86+.bin
 Aucun groupe de volumes trouvé 
 effectué 
.
1
Danatela

Pour élaborer la réponse de Danatela, il existe des scripts d'assistance grub-mkconfig dans /etc/grub.d/ qui définissent où GRUB doit rechercher les noyaux (10_linux) et si d'autres systèmes d'exploitation installés doivent être installés. inclus (30_os-prober peut être désactivé en ajoutant GRUB_DISABLE_OS_PROBER=true à /etc/default/grub).

Vous pouvez soit regarder le code dans 10_linux pour avoir un aperçu de la façon dont GRUB "trouve" les noyaux et essaie de les inclure, ou ajoutez votre propre code à 40_custom, qui Cela pourrait être un peu difficile car le code 10_linux est plutôt complexe et difficile à personnaliser.

0
LiveWireBT