在我的公司,我们使用装有 Ubuntu(呃……Xubuntu)18.04 的 USB 可启动 Live 棒进行工作面试。它有一堆工具(三四个 IDE、几个数据库 GUI 查看器……)和一个可以提问的玩具项目。
该 USB 记忆棒有一个 Casper-RW 覆盖分区,用于持久存储(使用韓國)。该分区主要用于存储Docker 镜像和保存一些启动值,这些启动值可能会根据插入的机器而略有变化。
该分区已安装“手动”通过在文件中/media/overlay
添加以下行(谢谢mkdir --parents /media/overlay/ && mount -L casper-rw /media/overlay/
rc.local
@sudodus为了回答我之前的问题)。
现在,casper-rw
持久层运行良好……也许太好了。我们希望在关闭测试环境(测试环境……意思是:被面试者一直在做事情的笔记本电脑)时删除存储/home/<user>
被面试者所做的更改的目录.bash_history
,以便为下一位候选人做好准备。
感谢这些答案(Unix和Linux,询问Ubuntu)我创建了一个 systemd 服务,它……可以做我想做的事,只是当系统靴子,而不是在下降的时候。这不是什么大问题,只是......这让我有点烦:-D
这是我创建的 systemd 服务/etc/systemd/system/clear-stick.service
:
[Unit]
Description=Cleans-up interview sticker
RequiresMountsFor=/media/overlay/
DefaultDependencies=no
Before=shutdown.target reboot.target halt.target umount.target casper.service
[Service]
Type=oneshot
ExecStart=/usr/local/bin/clear_interview_stick.sh
ExecStop=/usr/local/bin/clear_interview_stick.sh
RemainAfterExit=true
[Install]
WantedBy=multi-user.target
我怀疑它只ExecStart
在启动时运行该行,而不是在关机时运行该ExecStop
行。如果我更改目录/home/
,关闭计算机并将该棒安装在其他地方,更改仍然存在。另外,如果我查看日志,journalctl
我只会看到对清理采访贴纸被其他服务的启动序列所包围。
我不能 100% 确定发生这种情况是否是因为定义.service
错误(非常有可能)或者因为我不完全了解casper-rw
覆盖的工作原理,即使.service
在关机时运行,也无法清除/media/overlay/home/interviewee
目录?
正如我之前提到的,这不是什么大事,巨大的处理,因为它似乎/home/
在启动时删除目录,但我宁愿这样做“““正确的”””并在关机时将其删除。
为了便于理解,以下是相关内容/usr/local/bin/clear_interview_stick.sh
:
#!/bin/bash
had_to_mount="false";
if [[ ! -d "/media/overlay/upper/" ]]; then
mount -L casper-rw /media/overlay/
had_to_mount="true";
fi
if [[ -d "/media/overlay/upper/home/interviewee/" ]]; then
echo "Removing interviewee /home";
rm -rf "/media/overlay/upper/home/interviewee/";
else
echo "interviewee /home/ not found"
fi
if [[ -f /root/.bash_history ]]; then
rm /root/.bash_history;
fi
if [[ "${had_to_mount}" == "true" ]]; then
umount /media/overlay;
fi
答案1
终于!!我明白了!!!非常感谢@Rinzwind他在这个问题的评论中给了我关键的线索。
(!!)如果有人读到这些话,请:不要以为这是这 正确的这样做的方式,因为这可能不是。我对 SystemD 还很陌生,而且我几乎……嗯……对它一无所知。
我使用以下服务让它工作执行官开始(重要的是,我已经尝试了很多次,但ExecStop
都没有用)之后shutdown.target
,这是想要的final.target
。
/etc/systemd/system/clear-stick.service
:[Unit] Description=Cleans-up interview sticker DefaultDependencies=no Before=final.target umount.target After=shutdown.target [Service] Type=oneshot ExecStart=/usr/local/bin/clear_interview_stick.sh RemainAfterExit=true [Install] WantedBy=final.target
这也有助于了解casper-rw覆盖做到了(我的意思是:看着实际/etc/systemd/system/final.target.wants/casper.service
文件)以及它如何使用ExecStart
,使其在之后运行umount
(虽然我希望我的服务运行前卸载)......诸如此类的事情。
另外,在我的多次测试中,我删除了以下行:RequiresMountsFor=/media/overlay/
它可能仍然没问题(我没有尝试所有可能的排列),但由于当时是mount /media/overlay
通过进行的/etc/rc.local
,(韓國接管了/etc/fstab
),而我所做的工作在没有它的情况下也能工作,我把它排除在外。
在上一段中,我提到“但是由于当时那mount
...”这是因为,万一 SystemD 没有“看见”一个没有列出/etc/fstab
但通过创建的坐骑rc.local
,我还创建了一个.mount
单元文件这里解释,尝试让 SystemD 知道这一点。另外,我觉得这样更简洁。
以下是具体方法:
/etc/systemd/system/media-overlay.mount
:[Unit] Description=Mount Overlay in /media/ [Mount] What=/dev/disk/by-label/casper-rw Where=/media/overlay Type=ext4 Options=defaults [Install] WantedBy=multi-user.target
这对擦除没有帮助。我猜测也许???(大猜测,大可能)那是因为我还在使用执行官停止?我真的不知道。尽管如此,该.mount
文件确实成功创建了mount
,所以我保留了它。
我相信.service
可以写一个更干净、更可靠的,但由于每个测试因为我需要重建可启动的 USB 棒,所以我花了半个多小时,所以我决定保持原样。(如果编译成功,就可以发货,对吧?)
值得注意的是list-dependencies
命令(如systemctl list-dependencies --after final.target
)对于了解正在发生的事情也非常有帮助。