Uruchomić chroota?


13

Mam Linux (Debian Jessie) zainstalowany na dysku twardym. Drive - sda1, ext4fs i sda2- swap

Mam /chrootfolder W /chrootfolderze jest zainstalowany inny system .

Pytanie:

Jak powiedzieć bootmanagerowi, żeby nie uruchamiał systemu podstawowego (main, Debian Jessie), ale system w / chroot ? Prawdopodobnie zmienić /menu.lsti /chroot/etc/fstab? ( vmlinuz root=/dev/sda1/chroot?)

Lub inny wariant pytania: czy jest możliwe, aby Linux był zainstalowany nie w katalogu głównym partycji, ale w folderze? ( /another_linux/bin, /another_linux/home, /another_linux/etc, ...)


1
vmlinuz root=/dev/sda1/chrootnie zadziała. Prawdopodobnie można to zasymulować za pomocą metody podobnej do tej, która jest używana initrd. Zobacz np . Tutaj . Montujesz /new_roottak, jak tam opisano, a następnie zamiast cd /new_rootrobić cd /new_root/chrooti kontynuować.
n. „zaimki” m.

Odpowiedzi:


7

Nie może tego zrobić bootloader lub jądro. Parametr rootopcji jądra , taki jak in, root=/dev/sda1wygląda jak standardowa ścieżka uniksowa, ale takie ścieżki są interpretowane zgodnie z aktualnie podłączonym systemem plików. W momencie rootinterpretacji opcji nie ma zamontowanych systemów plików. Cóż, prawie żaden. Podczas inicjalizacji jądra występuje instancja minimalnego ramfssystemu plików o nazwie rootfsmontowany jako root dla początkowego procesu start_kernel(). Rzeczywista interpretacja rootparametru opcji odbywa się w procedurze o nazwie name_to_dev_t(). Jedną z obsługiwanych składni jest /dev/nameformat, w którym nazwa jest interpretowana przez wykonanie tymczasowego podłączenia sysfssystemu plików w systemierootfsroot i szukanie wpisu urządzenia blokowego pasującego do nazwy pod /sys/block. Proces ten wyjaśniono bardziej szczegółowo tutaj .

Instalację zgodnie z opisem należy wykonać, najpierw uruchamiając system w minimalnym środowisku, takim jak to zapewnione przez initrd, zamontuj prawdziwy główny system plików z /dev/sda1tymczasowego punktu montowania, np. /mnt/rootfsNastępnie zmień katalog główny na /mnt/rootfs/chrootusing pivot_root(8).

Jest to nieco podobne do konfiguracji głównych systemów plików dla kontenerów LinuX ( LXC ). LXC to implementacja wirtualizacji na poziomie systemu operacyjnego dla systemu Linux. Wirtualizacja na poziomie systemu operacyjnego jest powszechnie stosowana w wirtualnych środowiskach hostingowych jako lekka alternatywa dla pełnej wirtualizacji zarządzanej przez hiperwizora. W wirtualizacji na poziomie systemu operacyjnego jedno jądro systemu operacyjnego jest współużytkowane przez wiele izolowanych instancji przestrzeni użytkownika. Każde wystąpienie, często nazywane kontenerem, więzieniem, wirtualnym serwerem prywatnym (VPE) lub środowiskiem wirtualnym (VE), jest zasadniczo osobną instalacją systemu operacyjnego, która znajduje się we własnym katalogu w systemie hosta.


6

Natknąłem się na ten sam problem i ostatecznie napisałem go, aby działał bezboleśnie w różnych systemach (obecnie debian, ubuntu):

Uruchom make_chroot_initrdskrypt, aby utworzyć nowy obraz initrd z obsługą chroot z istniejącego:

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

Nowy obraz będzie dokładnie taki sam, tyle że teraz może obsłużyć chroot=parametr rozruchowy.

Z grub2 jako bootloaderem możesz dodać wpis do /boot/grub/grub.cfg:
(lub może lepiej /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
}

(zmień pliki / partycje na swoje)

Instalacja w całym systemie

Gdy będziesz zadowolony, możesz wprowadzić zmiany na stałe
(do momentu aktualizacji pakietu initramfs-tools).
W systemie chrootowanym:

# 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

Od teraz zwykły obraz initrd będzie obsługiwał ładowanie chroot.
Nie trzeba używać osobnego pliku initrd.chroot, który może wtedy nie być zsynchronizowany.

Szczegóły znajdziesz w boot_chroot .


3

Tak, możesz to zrobić za pomocą podwoluminów Btrfs .

Najpierw musisz przekonwertować ext4 na btrfs, jak opisano tutaj .

Przekształć chroot w podwilum, jeśli jeszcze go nie ma:

 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

Teraz masz podwolumnę o nazwie path / to / chroot . Możesz to sprawdzić za pomocąsudo btrfs subvol list /

Teraz możesz utworzyć boot w celu zapisania wolumenu w grub. Po prostu dodaj rootflags=subvol=path/to/chrootdo łańcucha ładowania jądra linuksa w menu grub lub użyj tego do automatycznego sondowania.

Korzystając z naszej strony potwierdzasz, że przeczytałeś(-aś) i rozumiesz nasze zasady używania plików cookie i zasady ochrony prywatności.
Licensed under cc by-sa 3.0 with attribution required.