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?
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.
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é.
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
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
}
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é .
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.