Boot ke chroot?

13

Saya memiliki Linux (Debian Jessie) diinstal pada hard drive. Drive - sda1, ext4fs, dan sda2- swap

Saya punya /chrootfolder. Ada diinstal sistem lain, di /chrootfolder.

Pertanyaan:

Bagaimana cara memberitahu bootmanager, untuk boot bukan sistem utama (utama, Debian Jessie), tetapi sistem di / chroot ? Mungkin, berubah /menu.lstdan /chroot/etc/fstab? ( vmlinuz root=/dev/sda1/chroot?)

Atau varian pertanyaan lain: apakah mungkin, untuk menginstal linux tidak ke direktori root partisi, tetapi di folder? ( /another_linux/bin, /another_linux/home, /another_linux/etc, ...)

skrepki
sumber
1
vmlinuz root=/dev/sda1/chroottidak akan bekerja Orang mungkin bisa mensimulasikan ini dengan metode yang mirip dengan apa yang digunakan initrd. Lihat misalnya di sini . Anda me /new_root- mount seperti yang dijelaskan di sana, lalu bukannya cd /new_rootmelakukan cd /new_root/chrootdan melanjutkan.
n. 'kata ganti' m.

Jawaban:

7

Ini tidak dapat dilakukan oleh bootloader atau kernel. Parameter untuk rootopsi kernel seperti pada root=/dev/sda1tampak seperti nama path Unix standar, tetapi nama path tersebut ditafsirkan menurut sistem file yang saat ini dipasang. Pada saat rootopsi ditafsirkan, tidak ada sistem file yang terpasang. Yah, hampir tidak ada. Pada saat inisialisasi kernel terdapat sebuah instance dari ramfssistem file minimal yang disebut rootfsmount sebagai root untuk proses awal berjalan start_kernel(). Interpretasi aktual dari rootparameter opsi dilakukan dalam rutin yang disebut name_to_dev_t(). Salah satu sintaks yang didukung adalah /dev/nameformat, di mana nama ditafsirkan dengan melakukan mount sementara dari sistem sysfsfile dirootfsroot, dan cari blok pencocokan entri nama perangkat di bawah /sys/block. Proses ini dijelaskan secara lebih rinci di sini .

Setup seperti yang dijelaskan perlu dilakukan dengan mem-boot dulu ke lingkungan minimal seperti yang disediakan oleh initrd, me-mount filesystem root sebenarnya dari /dev/sda1pada mountpoint sementara, misalnya /mnt/rootfs, kemudian mengubah direktori root untuk /mnt/rootfs/chrootmenggunakan pivot_root(8).

Ini agak mirip dengan bagaimana filesystem root untuk LinuX Containers ( LXC ) diatur. LXC adalah implementasi virtualisasi tingkat sistem operasi untuk Linux. Virtualisasi tingkat sistem operasi umumnya digunakan dalam lingkungan hosting virtual sebagai alternatif ringan untuk virtualisasi penuh yang dikelola oleh hypervisor. Dalam virtualisasi tingkat sistem operasi, satu kernel sistem operasi dibagikan di antara banyak instance ruang pengguna yang terisolasi. Setiap instance, sering disebut container, jail, Virtual Private Server (VPE) atau Virtual Environment (VE), pada dasarnya adalah instalasi sistem operasi terpisah yang bertempat di direktori miliknya sendiri pada sistem host.

Thomas Nyman
sumber
6

Saya menemukan masalah yang sama dan akhirnya menulis ini untuk membuatnya bekerja tanpa rasa sakit di berbagai sistem (debian, ubuntu saat ini):

Lari make_chroot_initrd skrip untuk membuat gambar initrd yang diaktifkan dengan chroot baru dari yang sudah ada:

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

Gambar baru akan persis sama, kecuali sekarang dapat menangani chroot=parameter boot.

Dengan grub2 sebagai bootloader Anda dapat menambahkan entri ke /boot/grub/grub.cfg:
(atau mungkin lebih baik /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
}

(ubah file / partisi agar sesuai dengan milik Anda)

Pemasangan di seluruh sistem

Setelah puas, Anda dapat membuat perubahan permanen
(hingga paket initramfs-tools ditingkatkan).
Dalam sistem 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

Mulai sekarang gambar initrd biasa akan mendukung boot chroot.
Tidak perlu menggunakan initrd.chroot terpisah yang mungkin tidak sinkron dengannya.

Lihat boot_chroot untuk detailnya.

perasan lemon
sumber
3

Ya, Anda dapat melakukan trik menggunakan subvolume Btrfs .

Pertama, Anda perlu mengonversi ext4 ke btrfs seperti dijelaskan di sini .

Ubah chroot Anda menjadi subvilume jika belum:

 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

Sekarang Anda memiliki subvolume bernama path / to / chroot . Anda bisa memeriksanyasudo btrfs subvol list /

Sekarang Anda dapat membuat boot ke subvolume record di grub. Cukup tambahkan rootflags=subvol=path/to/chrootke linux load string di item menu grub atau gunakan ini untuk menyelidiki secara otomatis.

Sergei
sumber