当磁盘安装完成后,如何在启动时运行脚本?

当磁盘安装完成后,如何在启动时运行脚本?

注意:我不是询问在启动完成时运行服务(或其他任何内容)(我知道如何做到这一点)。

背景

系统从 SDCard 启动,SDCard 上有完整的系统。连接到它的是外部 USB 磁盘或 SATA SSD – 在某些情况下什么都没有。我想将一些“东西”“外包”到外部介质,包括例如/var/log,如果该介质可用。如果没有,则应使用“内部”SD 卡。(如果您想知道:是的,它是一台小型单板计算机)。

问题

显然,在 Init 进程启动之前,通常的目录结构必须已经存在。/etc/fstab在此之前,文件系统的安装(来自)由内核完成。继续以下示例/var/log(这不是唯一要处理的示例)和一个外部驱动器,/mnt/external当存在时安装如下:

如果驱动器存在,我该如何将其放置/var/log(例如通过符号链接) ,否则将其放置在下面 – 以安全和干净的方式?/mnt/external/mnt/local

答案1

我知道您“不是在询问运行服务”,但不幸的是,问题的性质要求您将脚本放入服务中,并在安装磁盘后立即将其挂接到适当的位置。

我同意您没有运行服务,但包含在该服务中的脚本不需要继续运行。从 Linux 启动时您需要做的就是在正确的时刻触发/调用它,然后在完成正确设置后退出。

我相信一旦你克服了这个障碍,你就能完成剩下的事情,但如果你需要更多信息,请告诉我。

答案2

执行此操作的正确位置似乎是以下之一:

  • /etc/init.d/checkroot-bootclean.sh:在根分区 ( /) 挂载时运行,但在其他分区可用之前。这可能是最适合所述情况的地方,因为来自其他文件系统的符号链接的目标在挂载之前就已经存在——尤其是/var/log当系统开始写入日志时,外包就会存在
  • /etc/init.d/mountall-bootclean.sh:当所有本地文件系统都已挂载时运行。这就是 eg/tmp将被清理的地方——但在这里我不确定日志是否已经需要可访问。

理想情况下,我们的脚本应该放在“这两者之间”。根据系统的不同,也可能有其他地方。

在 Debian(以及衍生版本,就像我的情况一样)中,/etc/init/mountall.conf安装内容的配置如下:

# This helper mounts filesystems in the correct order as the devices
# and mountpoints become available.

这一个命令mountall要注意“正确的顺序”,因此可以找到一些细节man mountall——但不幸的是,这都没有/usr/share/doc/mountall/*提供有关如何挂钩的详细信息。发出findformountall为我找到了更多文件,但没有给我进一步的线索——所以除非我学到别的东西,否则上述两个位置将是“当前挂钩”。


在您询问之前:不,将“启动脚本”放入/etc/rc.X(或使用 SYS-V 代替的等效脚本)是行不通的 - 因为挂载是在 init 进程启动之前由内核完成的,并且这些挂载需要在系统开始将日志等写入磁盘之前完成。

相关内容