我有一个 btrfs 设置,其中多个子卷安装到文件系统的不同位置。每个子卷都有一个 snapper 的配置:
猫 /etc/conf.d/snapper
[...]
SNAPPER_CONFIGS="root home [...]"
文件中定义了启动时创建快照的服务
猫 /usr/lib/systemd/system/snapper-boot.service
[...]
ExecStart=/usr/bin/snapper --config root --cleanup-algorithm number --description "boot"
ExecStart=/usr/bin/snapper --config home --cleanup-algorithm number --description "boot"
[...]
而不是每个子卷添加一行,这很容易出错,我想读取 snapper 配置列表并迭代。
这可能吗?
可取吗?
答案1
是的,这是可以实现的。
一种简单的方法是使用 shell 脚本,该脚本会snapper
重复调用,每个配置调用一次。看来,一个for
循环就足以做到这一点。
您甚至可以在 systemd 单元文件中内联执行此操作:
ExecStart=/bin/sh -e -c '. /etc/conf.d/snapper; for conf in $$SNAPPER_CONFIGS; do /usr/bin/snapper --config "$$conf" --cleanup-algorithm number --description "boot"; done'
请注意,您需要转义$
s,以便 systemd 不会尝试将它们解释为 systemd 变量,而是让 shell 解释它们。 (在我看来,使用您调用的外部 shell 脚本ExecStart=
是一种更简洁的方法,这样您就不需要处理转义,也不需要将所有内容都塞进一行中。)
另一种选择是修改snapper
自身,以便它可以在本机处理该问题。比如说,让它读取该配置文件并在不带任何参数的情况下调用时处理这些配置--config
。这将是一种更干净的方法。
无论是否建议......我想这取决于。如果您从发行版的软件包中获取此snapper-boot.sevice
单元,那么每当有软件包升级会触及该文件时,您都可能会遇到麻烦。因此,在某种程度上,这取决于您的具体情况。
如果此单元文件确实随 Linux 发行版的软件包一起提供,您可能需要考虑向他们打开错误报告,要求他们避免在单元文件中硬编码配置名称。
如果它不属于您的发行版,请考虑将其存储在/etc/systemd/system
其中,因为它/usr/lib
通常是为 Linux 发行版提供和管理的文件保留的。