
Я хочу настроить пункт меню Grub для загрузки в chrooted-системе (установлен chrooted debootstrap, чтобы не трогать слишком много существующей системы).
В настоящее время я делаю следующее, чтобы этого достичь:
Установите linux-image и его аналоги в chroot-окружении
Вручную выполните ремастеринг initramfs для chroot-доступа к системе вместо обычного поведения:
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. Как сделать лучше?
решение1
Я столкнулся с той же проблемой и в итогепишу эточтобы он работал без проблем на разных системах (в настоящее время 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=
параметр загрузки.
Используя 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для получения подробной информации.
решение2
Зачем вы перешли с run-init на chroot? Вам не следует этого делать. run-init удаляет все в корне initramfs, затем chroot в $rootmnt. Вы хотите сохранить это поведение.
Что касается того, как избежать необходимости вручную пересобирать initramfs каждый раз, отредактируйте основную копию скрипта init в /usr/share/initramfs-tools. Это должно работать по крайней мере до тех пор, пока вы не обновите пакет initramfs-tools.
Постоянное решение — это исправление скрипта init для распознавания аргумента загрузки для добавления чего-либо к rootmnt и отправка этого исправления для включения в Debian. Затем вы можете добавить аргумент в Grub для записей, которые должны загружаться таким образом.