从 chroot 启动 Linux 系统:有没有更好的方法?

从 chroot 启动 Linux 系统:有没有更好的方法?

我想设置 Grub 菜单项来启动到 chrooted 系统(安装 chrooted debootstrap 以避免过多触及现有系统)。

目前我通过以下方式实现这一目标:

  1. 在 chrooted 环境中安装 linux-image 和其他相关工具

  2. 手动重新制作 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 的 initrd 映像:

#  ./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,否则可能会与其不同步。

启动根目录了解详情。

答案2

为什么要从 run-init 切换到 chroot?你不应该这么做。run-init 会删除 initramfs 根目录中的所有内容,然后 chroot 到 $rootmnt。你想保留这种行为。

至于如何避免每次都手动重建 initramfs,请编辑 /usr/share/initramfs-tools 中的 init 脚本主副本。这至少应该在升级 initramfs-tools 包之前有效。

永久解决方案是修补 init 脚本以识别引导参数,从而将某些内容附加到 rootmnt,然后提交该修补程序以纳入 debian。然后,您可以将参数添加到 grub 中,以获取应以此方式引导的条目。

相关内容