有没有一种方法可以根据启动时参数(和/或运行的内核类型)启用或禁用某些内核模块、挂载点和启动时服务(在 Systemd 或 OpenRC 中)?
更进一步,初始化系统是否可以以类似的方式进行交换? (我知道init=...
内核参数,但是(例如)systemd 和 OpenRC 可以在同一安装中共存,并在启动时随意交换)吗?
对于一些背景(如果有人足够老来记住这一点),我的思路源于 DOS 技术,在 config.sys/autoexec.bat 中拥有多个系统配置文件,可以根据启动时菜单进行选择。
因此,如果我(纯粹为了举例)想要在 GRUB 中拥有三个菜单项:
“游戏”:将加载自定义内核,加载专有的 nvidia 驱动程序并启用 optimus(或 vfio 直通),然后启动到 X11;
“工作”:将加载另一个内核,加载英特尔视频驱动程序,安装我的加密工作分区,然后启动到 Wayland;
“服务器”:将加载第三个(高延迟)内核,启动特定的附加后台服务(即 Web 服务器、ssh 主机、vm 主机),然后启动到文本控制台。
以上只是示例,但希望能够传达这一点。
Linux 中可能有这样的事情吗?
答案1
当然。根据您的发行版,这可能很简单也可能很困难,但是是的。
对于模块来说,这篇 U&L 帖子提到了modules_load
加载模块的内核参数以及这另一篇文章有一个用于阻止模块的参数。在 Arch Linux 上,mkinitcpio
可以轻松生成具有不同配置的多个内核映像(嗯,至少对于预加载的模块等,但不是构建配置)。
对于加载服务、安装卷等,systemd 使这两个单元都可以成为依赖链的一部分,从而使事情变得容易。因此,您可以创建一个“目标”,该gaming.target
“目标”是启动 X11 的服务,或者是由加密工作分区的安装单元和设备单元组成的“目标” ,以及启动 Wayland 的单元,等等。然后,您想要启动的目标将成为内核命令行的一部分,使用Wants
Requires
WantedBy
RequiredBy
work.target
Wants
Requires
WantedBy
RequiredBy
systemd.unit
参数(例如,systemd.unit=gaming.target
或systemd.unit=work.target
)。
由于需要在内核命令行中设置目标,并且可能还需要加载模块,因此您将需要更新引导加载程序配置,以便为每个目标创建具有相应内核映像和命令行的单独条目。
Init 系统可以交换 - 当 Ubuntu 首次引入 systemd 时,可以在 Upstart 和 systemd 之间交换。我觉得Gentoo还是支持的。对于其他发行版,必须有人为非默认初始化系统设置服务配置等(这个人很可能就是您,需要做很多工作)。