我的问题很简单,但我在网上找不到任何解决方案:我有一个包含 init.d 脚本的文件系统。我希望这个脚本在系统第一次启动时运行。我该怎么做呢?如果可能的话,我想避免手动创建 init.d 符号链接。
编辑:我正在使用 Debian 4.19。包含init.d脚本的文件系统是最终系统的rootfs。首次启动我的意思是我希望脚本在第一次使用其所在的文件系统启动计算机时运行(我使用的内核也将首次启动,但我认为这并不重要) 。我想保留这个 init.d 脚本,如果可能的话,不要转移到任何其他服务管理。基本上问题很简单:我可以访问我想要启动的 Linux 文件系统,并且我想启用 init.d 脚本而不启动整个系统。
答案1
首先,“Debian 4.19”并不存在:您可能正在查看带有以下内容的 Debian 系统:Linux 内核版本 4.19这意味着它是一个Debian 10(“buster”,随着 Debian 11 大约两周前发布而成为“oldstable”的版本)。
Debian 自 Debian 8 以来一直在使用systemd
,但它们仍然保持了一些 SysVinit 兼容性以及替换其他 init 系统的选项systemd
...尽管我不知道在 Debian 10 中使用 SysVinit 实际上有多实用,因为很多系统集成现在受益于或依赖于systemd
.但systemd
在 Debian 10(以及 11)上仍然具有完整的 init.d 脚本兼容性机制,因此无论使用哪种 init 系统,这个答案都应该适用。
因此,您有一个包含 Debian 10 安装根分区的磁盘,例如/dev/sdXN
,您希望在系统实际启动之前对其进行修改以添加 init.d 脚本。
您可以将磁盘挂载到另一个系统中:
mount /dev/sdXN /mnt
然后将脚本复制到新安装的/etc/init.d/
目录中:
cp /some/where/myscript /mnt/etc/init.d/
chmod a+rx /mnt/etc/init.d/myscript
注意:为了systemd
兼容性,您的脚本需要在开头包含 LSB 样式的注释块,以记录其依赖项并防止systemd
在启动过程中过早运行它。请参阅这篇 Debian Wiki 文章或者insserv(8)
手册页更多细节。
基本上,您的脚本必须在脚本开头有一个像这样的注释块在任何其他非注释行之前:
### BEGIN INIT INFO
# Provides: myscript
# Required-Start: $local_fs $syslog $network
# Required-Stop: $local_fs $syslog $network
# Default-Start: 2 3 4 5
# Default-Stop: 0 1 6
# Short-Description: Start myscript at boot time
# Description: Enable service provided by myscript.
### END INIT INFO
您应该根据脚本的要求调整Required-Start
和行。Required-Stop
脚本就位后,您可以chroot
进入新安装以运行update-rc.d
为您创建 init.d 符号链接的工具。但在实际的 chroot 命令之前,您应该挂载/proc
,/sys
和/dev
文件系统,否则您将无法执行太多操作:
mount -t proc none /mnt/proc
mount -t sysfs none /mnt/sys
mount -o rbind /dev /mnt/dev
chroot /mnt /bin/bash # From this point on, /mnt will be this session's root directory
现在,您的会话将在新安装的环境“内”运行,并且您可以使用该安装的大多数工具,就像系统已经在运行新安装一样。因此,您可以使用以下update-rc.d
命令:
/usr/sbin/update-rc.d myscript defaults
之后,您可以撤消 chroot 并卸载新安装的根文件系统以干净地结束该过程:
exit # back to having the real root directory
umount /mnt/dev
umount /mnt/proc
umount /mnt/sys
umount /mnt
(挂载非活动安装的根文件系统的过程适用于许多维护和故障排除情况,例如修复损坏的引导加载程序或更改丢失的 root 密码。在这种特定情况下,可能不需要在非活动安装中挂载/proc
并安装/sys
...但我选择以“通用”形式显示 chroot 过程,因此它也更容易适用于其他情况。)