注意:我不是询问在启动完成时运行服务(或其他任何内容)(我知道如何做到这一点)。
背景
系统从 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/*
提供有关如何挂钩的详细信息。发出find
formountall
为我找到了更多文件,但没有给我进一步的线索——所以除非我学到别的东西,否则上述两个位置将是“当前挂钩”。
在您询问之前:不,将“启动脚本”放入/etc/rc.X
(或使用 SYS-V 代替的等效脚本)是行不通的 - 因为挂载是在 init 进程启动之前由内核完成的,并且这些挂载需要在系统开始将日志等写入磁盘之前完成。