我的机器上安装了多个独立的 Linux,然后重新启动到合适的一个。我想知道是否可以在不完全重新启动的情况下从一个切换到另一个,例如,复制 fstab 并列出新安装的分区,然后mount -a
.
显然,内核不会改变,但没关系,我希望只改变工作分区。我还认为很明显,这必须在没有任何运行的情况下从命令行完成(如果可能的话)。或者这个想法从一开始就是无效的和纯粹的疯狂?
原因是我通常会在单独的“实验”安装中尝试根本性的更改(例如移至 Debian 中的“amd64”内核)。重新启动来启动它当然很好,但如果我可以在不完全重新启动的情况下跳到该安装,那就太酷了。您可以认为这只是动态更改根分区,但也许这根本不可能。
是的,这是可能的,正如我在下面了解到的那样。如果您不需要换出内核本身,请使用“chroot”。如果您想模拟完全重新启动,请使用“kexec”。
答案1
我认为这是不可能的。
理论上你想要做的是:
- 使用 将系统移至“单一”运行级别
init 1
,理论上您只运行 init 和 bash。 - 卸载除 / 之外的所有分区。此时您的系统可能会停止工作,具体取决于 /usr 是否位于根分区上。
- 将其他操作系统的根目录安装到某处。
- ivot_root 将根更改为新分区。
init 5
告诉 init 通过运行(或 2 或任何合适的)来启动新系统。
问题是pivot_root只改变当前进程的根分区,这意味着它不会影响init,当你告诉init启动系统时,它会启动你的旧系统。您需要某种方法来告诉 init 执行pivot_root,我认为这是不可能的。
哦,我们不要讨论当您的其他操作系统使用不同的 init 服务时会发生什么(例如,Fedora 使用 systemd,而 Ubuntu 使用 upstart)。您需要替换内核下的 init 进程(pid 1),这确实是不行的。
答案2
如果您想尝试不同的内核,则必须重新启动或在虚拟机中运行它们。虚拟机更方便,但你无法在真实硬件上测试内核。
如果您想对不同的已安装程序集进行不同的设置,您也可以使用虚拟机。如果您想避免虚拟机的开销,您可以在chroot。我经常这样做是为了在 64 位安装上轻松访问 32 位程序,或者除了稳定版(例如 Debian stable)之外还可以获得最新的东西(例如 Debian不稳定版)。我写了一个为备用 Debian/Ubuntu 版本设置 chroot 的指南。也可以看看轻量级隔离linux环境
答案3
如果你不想要/需要更改内核,但只想使用其他文件系统,正如您在这里指出的那样:
显然,内核不会改变,但没关系,我希望只改变工作分区。
那么也许你只需要(挂载和)chroot,用你的话来说,
您可以认为这只是动态更改根分区
我一直在救援系统(如 Clonezilla)中使用 chroot 来与通常使用不同内核的文件系统进行交互。我不期望能够执行诸如加载新内核模块之类的操作,但它对于读取和写入文件(修复 fstab、调整 grub.conf 等)来说很好。
您可以使用绑定安装来使 chroot 环境更有用。我一直使用它来复制 chroot 目标内已安装的文件系统:
mount /dev/sda1 /mnt
for d in dev sys proc; do mount -obind /$d /mnt/$d; done
chroot /mnt