4

Я хочу настроить пункт меню Grub для загрузки в chroot-систему (установлен chroot-debootstrap, чтобы не трогать существующую систему слишком сильно).

В настоящее время я делаю следующее, чтобы достичь этого:

  1. Установите linux-образ и друзей внутри chrooted окружения

  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. Как сделать это лучше?

2 ответа2

3

Я столкнулся с той же проблемой и закончил тем, что написал ее, чтобы она работала безболезненно в разных системах (Debian, Ubuntu в настоящее время):

Запустите скрипт make_chroot_initrd чтобы создать новый образ 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

Новый образ будет точно таким же, за исключением того, что теперь он может обрабатывать параметр chroot= boot.

С 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).
В корневой системе:

# 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, а затем переводит в $ rootmnt. Вы хотите сохранить это поведение.

Что касается того, как избежать необходимости вручную перестраивать ваши initramfs каждый раз, отредактируйте основную копию сценария init в /usr /share /initramfs-tools. По крайней мере, это должно работать, пока вы не обновите пакет initramfs-tools.

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

Всё ещё ищете ответ? Посмотрите другие вопросы с метками .