删除 /home/从关闭时的 casper-rw 覆盖(systemd 服务)

删除 /home/从关闭时的 casper-rw 覆盖(systemd 服务)

在我的公司,我们使用装有 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)对于了解正在发生的事情也非常有帮助。

相关内容