Khởi động vào một chroot?


13

Tôi đã cài đặt Linux (Debian Jessie) trên ổ cứng. Lái xe - sda1, ext4fs và sda2- trao đổi

Tôi có một /chrootthư mục. Có cài đặt một hệ thống khác, trong /chrootthư mục.

Câu hỏi:

Làm thế nào để nói với bootmanager, để khởi động không phải hệ thống chính (chính, Debian Jessie), mà là hệ thống trong / chroot ? Có lẽ, thay đổi /menu.lst/chroot/etc/fstab? ( vmlinuz root=/dev/sda1/chroot?)

Hoặc một biến thể khác của câu hỏi: có thể, cài đặt linux không vào thư mục gốc của phân vùng, nhưng trong thư mục? ( /another_linux/bin, /another_linux/home, /another_linux/etc, ...)


1
vmlinuz root=/dev/sda1/chrootsẽ không làm việc Một người có lẽ có thể mô phỏng điều này với một phương thức tương tự như những gì được sử dụng trong initrd. Xem ví dụ ở đây . Bạn gắn kết /new_rootnhư mô tả ở đó, sau đó thay vì cd /new_rootlàm cd /new_root/chrootvà tiếp tục.
n. 'đại từ' m.

Câu trả lời:


7

Điều này không thể được thực hiện bởi bootloader hoặc kernel. Tham số cho roottùy chọn kernel như trong root=/dev/sda1trông giống như một tên đường dẫn Unix tiêu chuẩn, nhưng các tên đường dẫn như vậy được diễn giải theo hệ thống tệp hiện được gắn. Tại thời điểm roottùy chọn được diễn giải, không có hệ thống tập tin được gắn kết. Vâng, hầu như không có. Tại thời điểm khởi tạo kernel, có một phiên bản của một ramfshệ thống tệp tối thiểu được gọi rootfslà gốc làm tiến trình ban đầu đang chạy start_kernel(). Việc giải thích thực tế của roottham số tùy chọn được thực hiện trong một thói quen gọi là name_to_dev_t(). Một trong những cú pháp được hỗ trợ là /dev/nameđịnh dạng, trong đó tên được diễn giải bằng cách thực hiện gắn kết tạm thời của sysfshệ thống tệp trongrootfs root và tìm kiếm một tên khớp với mục nhập thiết bị khối bên dưới /sys/block. Quá trình này được giải thích chi tiết hơn ở đây .

Việc thiết lập như được mô tả sẽ cần được thực hiện bằng cách khởi động trước vào một môi trường tối thiểu như môi trường được cung cấp bởi initrd, gắn hệ thống tập tin gốc thực sự từ /dev/sda1một điểm gắn kết tạm thời, ví dụ /mnt/rootfs, sau đó thay đổi thư mục gốc sang /mnt/rootfs/chrootsử dụng pivot_root(8).

Điều này hơi giống với cách các hệ thống tập tin gốc cho LinuX Container ( LXC ) được thiết lập. LXC là một triển khai ảo hóa cấp hệ điều hành cho Linux. Ảo hóa cấp hệ điều hành thường được sử dụng trong các môi trường lưu trữ ảo như là một giải pháp thay thế nhẹ cho ảo hóa hoàn toàn được quản lý bởi một trình ảo hóa. Trong ảo hóa cấp hệ điều hành, một nhân hệ điều hành duy nhất được chia sẻ giữa nhiều trường hợp không gian người dùng bị cô lập. Mỗi phiên bản, thường được gọi là container, jail, Virtual Private Server (VPE) hoặc Virtual Môi trường (VE), về cơ bản là một bản cài đặt hệ điều hành riêng biệt được đặt trong một thư mục riêng trên hệ thống máy chủ.


6

Tôi đã gặp một vấn đề tương tự và cuối cùng đã viết nó để làm cho nó hoạt động không đau trên các hệ thống khác nhau (hiện tại là debian, ubfox):

Chạy make_chroot_initrdtập lệnh để tạo một hình ảnh initrd kích hoạt chroot mới từ hình ảnh hiện có:

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

Hình ảnh mới sẽ giống hệt nhau, ngoại trừ bây giờ nó có thể xử lý một chroot=tham số khởi động.

Với grub2 là bootloader, bạn có thể thêm một mục vào /boot/grub/grub.cfg:
(hoặc có lẽ tốt hơn /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
}

(thay đổi tập tin / phân vùng để phù hợp với của bạn)

Cài đặt toàn hệ thống

Khi bạn hài lòng với nó, bạn có thể thay đổi vĩnh viễn
(cho đến khi gói công cụ initramfs được nâng cấp).
Trong hệ thống 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

Từ bây giờ, hình ảnh initrd thông thường sẽ hỗ trợ khởi động chroot.
Không cần sử dụng initrd.chroot riêng biệt mà có thể không đồng bộ với nó sau đó.

Xem boot_chroot để biết chi tiết.


3

Có, bạn có thể thực hiện thủ thuật bằng cách sử dụng các biểu tượng con Btrfs .

Đầu tiên bạn cần chuyển đổi ext4 sang btrfs như được mô tả ở đây .

Chuyển đổi chroot của bạn thành subvilume nếu chưa:

 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

Bây giờ bạn có subvolume có tên path / to / chroot . Bạn có thể kiểm tra nó vớisudo btrfs subvol list /

Bây giờ bạn có thể tạo boot để ghi lại subvolume trong grub. Chỉ cần thêm rootflags=subvol=path/to/chrootvào hạt nhân Linux chuỗi tải trong grub menu hoặc sử dụng này để thăm dò tự động.

Khi sử dụng trang web của chúng tôi, bạn xác nhận rằng bạn đã đọc và hiểu Chính sách cookieChính sách bảo mật của chúng tôi.
Licensed under cc by-sa 3.0 with attribution required.