![从 Linux 内部启动新的 Linux 内核?](https://linux22.com/image/543708/%E4%BB%8E%20Linux%20%E5%86%85%E9%83%A8%E5%90%AF%E5%8A%A8%E6%96%B0%E7%9A%84%20Linux%20%E5%86%85%E6%A0%B8%EF%BC%9F.png)
有谁知道从 Linux 内部“启动”另一个 Linux 内核并丢弃原始内核/initrd 的方法吗?我的想法是,我可以从 Linux 的一个小型只读副本启动我的服务器,该副本执行一些日常工作/数据收集任务,然后与管理服务器联系以找出如何处理服务器。大多数情况下,只需从本地硬盘启动 Linux/Windows 或对盒子进行映像处理即可。
基本上,我想要一个 Linux 的小副本来是引导加载程序,而不是专门的(灵活性较差的)引导加载程序包。Linux 的微型副本可以放在 USB 密钥上,也可以通过 PXE 交付。
Loadlin 曾经在 Windows 上做过这个,所以我可以在 DOS 中创建这个环境……但是网络可能很棘手,我丢失了很多工具。
其他选项是虚拟化。上述所有自动化都是主机操作系统的一部分,它会与管理服务器进行检查,以确定要启动的客户端等。云服务器是如何做到的。或者我可以在 PXE 端做一些神奇的事情:首先 PXE 启动 Linux 的数据收集副本,对 PXE 服务器进行更改,然后重新启动它,第二次 PXE 启动远程内核但使用本地操作系统驱动器。
答案1
在纯 Linux 设置中,您可以使用 kexec 来“重启”内核/操作系统,而无需重置硬件/再次加载 BIOS。除了内核崩溃之外,它对所有情况都有效。
但在混合环境中,我认为 Eater 可能有一个解决方案。本质上,您可以启动 Linux,运行所需的任何脚本/执行所需的任何日常工作,然后重新启动到您选择的操作系统。
但请注意,这会导致加载时间异常缓慢。即使你可以将 Linux 启动时间优化到只需几秒钟的程度,你仍然需要处理两次加载 BIOS 的问题。所有这些都对用户可见,然后用户可能会感到恐慌。
答案2
使用 GRUB,您可以执行以下操作:
[root@localhost ~]# echo "savedefault --default=2 --once" | grub --batch
[root@localhost ~]# reboot
这指示 GRUB 绕过启动项 2中的timeout
和default
设置/boot/grub.conf
仅一次。使用该标志可确保在后续启动时遵循--once
默认值。boot/grub.conf
答案3
据我所知,您无法从当前正在运行的内核内部启动第二个内核。
最好通过 Xen 安装虚拟机,并让其通过虚拟网络接口执行任务。如果您配置了新的虚拟机,您将能够使用 SSH 重新连接到主机并根据需要运行脚本和工具。
对于你正在做的事情,这将是我的选择。