Est-il possible de mettre root dans LVM sans utiliser initrd?

12

Je viens de mettre en place un système de base Gentoo (ce qui signifie que je peux démarrer et me connecter et faire des choses avec lui maintenant). Ma partition racine se trouve dans un groupe virtuel LVM2 (avec une /bootpartition séparée ). Pour démarrer, je dois transmettre les paramètres ci-dessous au noyau:

root=/dev/ram0 real_root=/dev/vg/rootlv init=/linuxrc dolvm

Apparemment, il utilise un ramdisk initial pour faire quelque chose (je suppose charger les choses LVM) avant de monter root. Existe-t-il un moyen de mettre ce code dans le noyau lui-même afin qu'aucun initrd ne soit nécessaire? Sinon, comment puis-je faire l'initrd moi-même?

Il pourrait être utile d'ajouter que j'avais essayé de compiler le noyau pour une racine non LVM, sans initrd et cela fonctionnait parfaitement. Ensuite, j'ai essayé de mettre le tout sous LVM et je n'ai pas pu démarrer la machine (je suppose que cela ne peut pas gérer les choses LVM). Ensuite, j'ai utilisé l' genkerneloutil avec l' --lvmoption et il crée le noyau de travail et initrd que j'utilise actuellement.

Maintenant, je veux sauter genkernelet tout faire par moi-même, de préférence sans initrd pour que la machine démarre un peu plus vite (je n'ai pas besoin de la flexibilité de toute façon).

phunehehe
la source
Un initrd peut avoir un petit effet sur les temps de démarrage, mais il n'affectera pas les performances de votre système une fois qu'il sera opérationnel.
Kristof Provost
oh oui, je voulais dire le temps de démarrage, édité
phunehehe

Réponses:

6

Réponse simple: Non. Si vous voulez LVM, vous avez besoin d'un initrd.

Mais comme d'autres l'ont déjà dit: les LVM ne ralentissent pas votre système ou ne font rien de mal d'une autre manière, ils vous permettent simplement de créer un environnement qui permet à votre noyau de se charger et de faire son travail.

L'initrd permet de charger votre noyau: Si votre noyau est sur un lecteur LVM, tout l'environnement LVM doit être établi avant que le binaire qui contient le noyau puisse être chargé.

Consultez l'entrée Wikipedia sur initrd qui explique ce que fait l'initrd et pourquoi vous en avez besoin.

Autre remarque: je vois votre intérêt à vouloir faire les choses vous-même mais vous pouvez vous salir les mains même avec genkernel. Utilisez genkernel --menuconfig all et vous pouvez tout configurer comme si vous construisiez votre noyau complètement sans prise en charge d'outils, genkernel ajoute simplement le make bzImage, make modules et make modules_install lines pour vous et fait ce truc initrd méchant.

Vous pouvez évidemment construire l'initrd vous-même comme il est indiqué ici pour initramfs ou ici pour initrd .

tante
la source
Merci pour la confirmation, mais vous manquez la partie "Sinon, comment puis-je faire l'initrd moi-même?"
phunehehe
Ajout d'informations et fusion de mon autre réponse dans celle-ci.
Tante
8
Une correction mineure: initrd n'est pas utilisé pour charger le noyau : le noyau est chargé par le chargeur de démarrage (GRUB, LILO, peu importe); initrd est une sorte de disque ram qui fournit le système de fichiers racine initial. Il doit contenir tous les fichiers binaires (par exemple, les modules du noyau, les programmes de prise en charge de l'espace utilisateur) nécessaires pour réellement rendre le système opérationnel. C'est pourquoi il est nécessaire pour une racine LVM: le sous-système LVM doit être initialisé et son initialisation est trop complexe pour être effectuée commodément avec les seuls paramètres de démarrage du noyau; ainsi, le linuxrcscript dans initrd effectue cette tâche.
Riccardo Murri
Vous avez bien sûr raison, j'étais un peu bâclé avec ma formulation.
tante
2
Impossible de voter en raison d'une erreur assez importante dans la réponse (initrd ne permet pas de charger le noyau).
wzzrd
5

edit: je viens de réaliser que vous essayez de démarrer sur LVM, je n'ai jamais configuré de LVM, je n'en ai jamais eu besoin, donc l'approche ici peut ne pas fonctionner

Voici les règles de base que vous devez faire pour créer un noyau sans initrd (à partir de la mémoire, je ne me souviens pas exactement):

  1. Recompilez votre noyau, assurez-vous de l'intégrer dans le noyau (IMPORTANT: pas en tant que module!):

    1. pilote de carte mère et pilote de disque dur (tous deux sous Device Drivers)
    2. pilote de système de fichiers pour /, /etc/*et /lib/modules/*(sous File systems)

    Fondamentalement, le noyau doit être capable de monter le système de fichiers racine, de lire le fichier / etc / fstab, de charger d'autres modules de pilote (si nécessaire) et de monter d'autres systèmes de fichiers non root pour terminer le reste du processus de démarrage. Si vous avez un processus de démarrage plus complexe, par exemple un démarrage réseau, vous devez également intégrer ces pilotes.

  2. Désactivez initrd depuis le noyau "Configuration générale> Prise en charge des systèmes de fichiers RAM initiaux et du disque RAM (initramfs / initrd)" aka CONFIG_BLK_DEV_INITRD = n.

  3. Modifiez la configuration de GRUB, vous n'avez plus besoin d'init = et de realroot =, et de configurer root = pour qu'il pointe vers le périphérique du système de fichiers racine.

Je pense que c'est tout. N'oubliez pas de conserver un noyau de sauvegarde et une bonne copie d'un Live CD amorçable, au cas où quelque chose se produirait.

Choses qui pourraient mal tourner: si vous avez compilé dans les mauvais pilotes ou si vous compilez les pilotes de base en tant que module, le noyau ne peut pas lire le système de fichiers. Redémarrez avec un nouveau noyau ou avec un Live CD et recompilez un noyau avec les bons pilotes.

La seule partie difficile consiste à déterminer quel pilote est pertinent pour votre matériel. Vous pouvez utiliser lspciet lshwpour aider à identifier votre matériel. Si vous n'avez pas déjà ces outils, alors emerge lshw pciutils.

Lie Ryan
la source
+1 pour avoir mentionné le module intégré par rapport au module dans la compilation du noyau.
amphetamachine
lsmodà partir d'un noyau en cours d'exécution est également utile.
LawrenceC
2

Oui, vous avez besoin d'un initrd. Voici pourquoi:

Le processus de démarrage normal commence par le chargeur de démarrage, qui en sait juste assez sur votre système pour trouver le noyau et l'exécuter. (GRUB2 est assez intelligent pour trouver un noyau situé sur une partition LVM2 ou RAID, mais GRUB1 ne l'est pas, il est donc généralement recommandé de créer / démarrer en tant que partition séparée avec une disposition simplifiée.) Une fois qu'il est chargé, le noyau a besoin pour pouvoir trouver le système de fichiers racine, afin qu'il puisse démarrer le processus de démarrage. Cependant, LVM ne peut pas démarrer sans être déclenché par certains outils de l'espace utilisateur, qui existent sur le système de fichiers racine, qui ne peuvent pas être chargés sans les outils LVM, qui existent sur le système de fichiers racine ...;)

Pour briser ce cycle, un initrd ou initramfs est un système de fichiers compressé qui est stocké avec le noyau (soit dans / boot, soit à l'intérieur du noyau lui-même), qui contient juste assez de système Linux pour démarrer des services tels que LVM ou MD ou quoi que ce soit d'autre tu veux. C'est un système de fichiers temporaire, et agit uniquement comme votre système de fichiers racine assez longtemps pour que la vraie racine soit chargée.

En ce qui concerne la création, la plupart de la documentation sur le sujet est incroyablement obsolète - lvm2create_initrd, par exemple, ne fonctionne même plus sur Gentoo. (J'ai installé la même chose il y a quelques mois, et je devais tout sauf réécrire le script avant d'en avoir un initrd fonctionnel.) Créer vos propres initramfs peut être amusant, et c'est le seul moyen d'obtenir un démarrage absolument minimal processus (et apprendre les tenants et aboutissants sur la façon dont Linux démarre dans le processus), mais c'est beaucoup de travail.

La réponse courte: utilisez Dracut. C'est un nouveau framework qui est en cours de création pour générer un initramfs de manière principalement automatisée, et il est en portage. La documentation est un peu clairsemée, mais il y en a suffisamment pour comprendre les choses, et c'est de loin le moyen le plus simple d'obtenir un initramfs solide et une racine LVM.

p-statique
la source
2

Bien qu'il ne soit pas possible de ne pas utiliser une sorte d'initrd, il est possible de ne pas utiliser de fichiers initrd séparés. (Je n'ai jamais utilisé genkernel, je ne peux donc pas donner d'instructions à ce sujet).

Par exemple, j'ai défini l'option:

CONFIG_INITRAMFS_SOURCE="/usr/src/initrd.contents"

/usr/src/initrd.contentsdans mon cas ressemble (j'ai LVM + tuxonice + fbsplash):

dir /bin                                    0755 0 0
file    /bin/busybox                        /bin/busybox                        0755 0 0
file    /bin/lvm                        /sbin/lvm.static                    0755 0 0
dir /dev                                    0755 0 0
dir /dev/fb                                 0755 0 0
dir /dev/misc                               0755 0 0
dir /dev/vc                                 0755 0 0
nod /dev/console                                0600 0 0    c  5   1
nod /dev/null                               0600 0 0    c  1   3
nod /dev/snapshot                               0600 0 0    c 10 231
nod /dev/tty1                               0600 0 0    c  4   0
dir /etc                                    0755 0 0
dir /etc/splash                             0755 0 0
dir /etc/splash/natural_gentoo                      0755 0 0
dir /etc/splash/natural_gentoo/images                   0755 0 0
file    /etc/splash/natural_gentoo/images/silent-1680x1050.jpg  /etc/splash/natural_gentoo/images/silent-1680x1050.jpg  0644 0 0
file    /etc/splash/natural_gentoo/images/verbose-1680x1050.jpg /etc/splash/natural_gentoo/images/verbose-1680x1050.jpg 0644 0 0
file    /etc/splash/natural_gentoo/1680x1050.cfg        /etc/splash/natural_gentoo/1680x1050.cfg        0644 0 0
slink   /etc/splash/tuxonice                    /etc/splash/natural_gentoo              0755 0 0
file    /etc/splash/luxisri.ttf                 /etc/splash/luxisri.ttf                 0644 0 0
dir /lib64                                  0755 0 0
dir /lib64/splash                               0755 0 0
dir /lib64/splash/proc                          0755 0 0
dir /lib64/splash/sys                           0755 0 0
dir /proc                                   0755 0 0
dir /mnt                                    0755 0 0
dir /root                                   0770 0 0
dir /sbin                                   0755 0 0
file    /sbin/fbcondecor_helper                 /sbin/fbcondecor_helper                 0755 0 0
slink   /sbin/splash_helper                 /sbin/fbcondecor_helper                 0755 0 0
file    /sbin/tuxoniceui_fbsplash               /sbin/tuxoniceui_fbsplash               0755 0 0
file    /sbin/tuxoniceui_text                   /sbin/tuxoniceui_text                   0755 0 0
dir /sys                                    0755 0 0
file    /init                           /usr/src/init

Et /usr/src/initc'est:

#!/bin/busybox ash
local X ROOT RUNLEVEL INIT PARAM
# Preliminary stuff
mount -t proc proc /proc
mount -t sysfs sysfs /sys
mdev -s
/bin/lvm vgchange -ay picard-main

# Try to resume. This never returns if it succeeds
test -e /sys/power/tuxonice/do_resume && echo 1 > /sys/power/tuxonice/do_resume
#/bin/resume

# Parse the command line for relevant options.
INIT=/sbin/init
RESCUE=""
PARAM=" "
for X in `cat /proc/cmdline`
do
        case "$X" in
                root=*) ROOT=${X#root=} ;;
                [0-6Ss]) RUNLEVEL=${X} ;;
                init=*) INIT=${X#init=} ;;
                rescue) RESCUE="rescue" ;;
        splash=*) PARAM="${PARAM} ${X}" ;;
        consol=*) PARAM="${PARAM} ${X}" ;;
        esac
done

if [ x${RESCUE} = xrescue ]
then
        busybox ash
fi

# Mount and switch root.
mount -o ro ${ROOT} /mnt
umount -f /sys || umount -l /sys
umount -f /proc || umount -l /proc

exec switch_root /mnt ${INIT} ${RUNLEVEL} ${PARAM}
Maciej Piechotka
la source
1

Oui, ça l'est.

Les complications résultant de la création et de la gestion des initrds sont rendues inutiles si vous installez et utilisez grub2. Le wiki grub2 http://grub.enbug.org/LVMandRAID décrit comment vous pouvez avoir votre / boot sur lvm avec rien de plus qu'un insmod lvm dans grub.cfg, le fichier de configuration grub, donc pas besoin d'initrd.

grub2 maintenant à la version 1.98 mais toujours dans la branche expérimentale de gentoo. Cependant, il peut être installé dans un autre emplacement et est parfaitement utilisable.

Prendre plaisir!

chiguire
la source
Hé, ça a l'air super, je dois essayer!
phunehehe