Démarrer dans un chroot?

13

J'ai Linux (Debian Jessie) installé sur un disque dur. Drive - sda1, ext4fs et sda2- swap

J'ai un /chrootdossier. Il est installé un autre système, dans le /chrootdossier.

Question:

Comment dire au gestionnaire de démarrage de démarrer non pas le système principal (principal, Debian Jessie), mais le système dans / chroot ? Probablement, changer /menu.lstet /chroot/etc/fstab? ( vmlinuz root=/dev/sda1/chroot?)

Ou une autre variante de question: est-il possible, d'avoir linux installé non pas dans le répertoire racine de la partition, mais dans le dossier? ( /another_linux/bin, /another_linux/home, /another_linux/etc, ...)

skrepki
la source
1
vmlinuz root=/dev/sda1/chrootne fonctionnera pas. On pourrait probablement simuler cela avec une méthode similaire à celle utilisée dans initrd. Voir par exemple ici . Vous montez /new_rootcomme décrit ici, puis au lieu de cd /new_rootfaire cd /new_root/chrootet de continuer.
n. «pronoms» m.

Réponses:

7

Cela ne peut pas être fait par le chargeur de démarrage ou le noyau. Le paramètre de l' rootoption du noyau tel que dans root=/dev/sda1ressemble à un chemin d'accès Unix standard, mais ces chemins d'accès sont interprétés en fonction du système de fichiers actuellement monté. Au moment où l' rootoption est interprétée, il n'y a pas de système de fichiers monté. Enfin, presque rien. Au moment de l'initialisation du noyau, il existe une instance d'un ramfssystème de fichiers minimal appelé rootfsmonté en tant que racine pour le processus initial en cours d'exécution start_kernel(). L'interprétation réelle du rootparamètre d'option se fait dans une routine appelée name_to_dev_t(). L'une des syntaxes prises en charge est le /dev/nameformat, où le nom est interprété en effectuant un montage temporaire du sysfssystème de fichiers dans lerootfsroot, et en recherchant une entrée de périphérique de bloc correspondant au nom sous /sys/block. Ce processus est expliqué plus en détail ici .

La configuration telle que décrite devrait être effectuée en démarrant d'abord dans un environnement minimal tel que celui fourni par an initrd, montez le véritable système de fichiers racine à partir /dev/sda1d'un point de montage temporaire, par exemple /mnt/rootfs, puis changez le répertoire racine en /mnt/rootfs/chrootutilisant pivot_root(8).

Ceci est quelque peu similaire à la configuration des systèmes de fichiers racine pour les conteneurs LinuX ( LXC ). LXC est une implémentation de virtualisation au niveau du système d'exploitation pour Linux. La virtualisation au niveau du système d'exploitation est couramment utilisée dans les environnements d'hébergement virtuels comme alternative légère à la virtualisation complète gérée par un hyperviseur. Dans la virtualisation au niveau du système d'exploitation, un seul noyau de système d'exploitation est partagé entre plusieurs instances d'espace utilisateur isolées. Chaque instance, souvent appelée conteneur, prison, serveur privé virtuel (VPE) ou environnement virtuel (VE), est essentiellement une installation de système d'exploitation distincte hébergée dans son propre répertoire sur le système hôte.

Thomas Nyman
la source
6

Je suis tombé sur le même problème et j'ai fini par écrire ceci pour le faire fonctionner sans douleur sur différents systèmes (debian, ubuntu actuellement):

Exécutez le make_chroot_initrdscript pour créer une nouvelle image initrd compatible chroot à partir de l'image existante:

#  ./make_chroot_initrd /chroot/trusty/boot/initrd.img-3.13.0-32-generic
making new initrd: /chroot/trusty/boot/initrd.img-3.13.0-32-generic.chroot

La nouvelle image sera exactement la même, sauf qu'elle peut désormais gérer un chroot=paramètre de démarrage.

Avec grub2 comme chargeur de démarrage, vous pouvez ajouter une entrée à /boot/grub/grub.cfg:
(ou peut-être mieux /etc/grub.d/40_custom)

menuentry "ubuntu trusty, (linux 3.13.0-32) (chroot)" {
    insmod ext2                       # or whatever you're using ...
    set root='(hd0,7)'                # partition containing the chroot
    set chroot='/chroot/trusty'       # chroot path
    linux   $chroot/boot/vmlinuz-3.13.0-32-generic root=/dev/sda7 chroot=$chroot rw
    initrd  $chroot/boot/initrd.img-3.13.0-32-generic.chroot
}

(modifiez les fichiers / partitions en fonction des vôtres)

Installation à l'échelle du système

Une fois que vous en êtes satisfait, vous pouvez rendre les modifications permanentes
(jusqu'à ce que le package initramfs-tools soit mis à niveau).
Dans le système chrooté:

# cd /usr/share/initramfs-tools
# cp -pdrv .  ../initramfs-tools.orig       # backup
# patch -p1 < path_to/boot_chroot/initrd.patch
# rm *.orig */*.orig
# update-initramfs -u

À partir de maintenant, l'image initrd normale prendra en charge le démarrage chroot.
Pas besoin d'utiliser un initrd.chroot séparé qui pourrait alors se désynchroniser avec lui.

Voir boot_chroot pour plus de détails.

citronnelle
la source
3

Oui, vous pouvez faire l'affaire en utilisant des sous-volumes Btrfs .

Vous devez d'abord convertir ext4 en btrfs comme décrit ici .

Convertissez votre chroot en sous-volume s'il ne l'est pas encore:

 sudo mv /path/to/chroot /path/to/chroot-tmp
 sudo btrfs subvol create /path/to/chroot
 sudo mv /path/to/chroot-tmp/* /path/to/chroot
 sudo mv /path/to/chroot-tmp/* /path/to/chroot -r # for directories

Vous avez maintenant un sous-volume nommé path / to / chroot . Vous pouvez le vérifier avecsudo btrfs subvol list /

Vous pouvez maintenant créer un enregistrement de démarrage vers un sous-volume dans grub. Ajoutez simplement rootflags=subvol=path/to/chrootà la chaîne de chargement du noyau linux dans l'élément de menu grub ou utilisez -le pour sonder automatiquement.

Sergei
la source