Завантаження Linux системи від chroot: чи є кращий спосіб це зробити?


4

Я хочу налаштувати елемент меню Grub для завантаження в систему chrooted (встановлено debootstrap chrooted, щоб не торкатися існуючої системи занадто багато).

Наразі для досягнення цієї мети я виконую такі дії:

  1. Встановіть linux-image і друзі в середовищі chroot

  2. Вручну перейменувати initramfs, щоб замінити звичайну поведінку в системі:

rootmnt=$rootmnt/root/squeeze
...
#exec run-init ${rootmnt} ${init} "$@" <${rootmnt}/dev/console >${rootmnt}/dev/console
exec chroot ${rootmnt} ${init} "$@"  <${rootmnt}/dev/console >${rootmnt}/dev/console

3 .. Додати запис до /boot/grub.cfg:

menuentry 'Chrooted debian Squeeze' {
    ...
    linux   /root/squeeze/boot/vmlinuz root=... rw
    initrd  /root/squeeze/boot/initrd-chroot
}

Вона працює, але не проста в налаштуванні і потребує ручного злому кожного разу, коли initrd слід змінити. Як це зробити краще?

Відповіді:


3

Я натрапив на ту ж саму проблему і закінчився написання цього щоб безболісно працювати в різних системах (debian, ubuntu):

Запустити make_chroot_initrd скрипт, щоб створити нове зображення з ініційованим параметром chroot з існуючого:

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

Нове зображення буде точно таким же, за винятком тепер він може обробляти a chroot= параметр завантаження.

За допомогою grub2 як завантажувача можна додати запис /boot/grub/grub.cfg:
(або, можливо, краще /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
}

(змінюйте файли / розділи відповідно до ваших)

Загальносистемна інсталяція

Як тільки ви задоволені цим, ви можете зробити зміни постійними
(до оновлення пакету initramfs-tools).
У системі chrooted:

# 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

Відтепер регулярне зображення initrd буде підтримувати завантаження chroot.
Немає необхідності використовувати окремий initrd.chroot, який потім може вийти з неї.

Подивитися boot_chroot для деталей.


1

Чому ви перейшли з run-init до chroot? Ви не повинні робити цього. run-init видаляє все в корені initramfs, потім chroots до $ rootmnt. Ви хочете зберегти цю поведінку.

Щодо того, як уникнути необхідності вручну відновлювати ваші initramfs кожного разу, відредагуйте головну копію скрипту init в / usr / share / initramfs-tools. Це має принаймні працювати до оновлення пакета initramfs-tools.

Постійним рішенням буде виправлення скрипту init, щоб розпізнати аргумент завантаження, щоб додати щось rootmnt, і представити цей патч для включення до debian. Потім ви можете додати аргумент grub для записів, які повинні бути завантажені таким чином.


"Чому ..." - & gt; Через це не вдалося (не пам'ятаю, як саме), поки я не спростив його таким чином.
Vi.

Таким чином, не існує існуючого рішення типу "apt-get install initrd-chroot", призначеного для таких установок.
Vi.

Ах, замість того, щоб додати шлях до rootmnt, спробуйте змінити змінну init для запуску chroot після запуску init: init = chroot / root / squeeze $ {init}.
psusi

Тоді це буде mount -n -o move /sys ${rootmnt}/sys і друзі не будуть робити те, що потрібно ...
Vi.

Пробували з фіксованим mount -o move s і с init=/usr/sbin/chroot /root/squeeze /sbin/init і оновлені / dev / console redirections. Він завантажився, але якось дивно. Поскаржившись на abount / dev, "INIT: Id" 5 "відроджується занадто швидко" і завантажується повільніше, ніж зазвичай.
Vi.
Використовуючи наш веб-сайт, ви визнаєте, що прочитали та зрозуміли наші Політику щодо файлів cookie та Політику конфіденційності.
Licensed under cc by-sa 3.0 with attribution required.