我希望能够将启用systemd
单元的列表从一台机器复制到另一台机器。
根据符号链接的存在(或缺失)来启用或禁用单元systemd
。目前,我能想到的最佳工具是tree
或者可能是find
?因此,理论上,我可以编写一些脚本;但不是已经有工具可以做到这一点了吗?
在理想情况下,它会扫描创建此类符号链接的所有目录(我知道 3 个/etc/systemd /run/systemd ~/.config/systemd/user
:)并呈现一个可读文件,该文件可用于在另一台计算机上重放设置。对于备份也很有用。
答案1
创建已启用列表systemd 服务我们可以用
ENABLED_SERVICES=$(systemctl list-unit-files | grep enabled | cut -d\ -f1)
这将给我们留下变量已启用服务列出已启用的服务,每行一个。
要启用此列表中的所有服务,我们可以使用
echo "${ENABLED_SERVICES}" | xargs -I{} systemctl enable {}
你可能希望在实际执行命令之前检查一下。你可以运行
echo "${ENABLED_SERVICES}" | xargs -I{} echo systemctl enable {}
(注意额外的回声陈述)。
剩下的唯一一件事就是获取变量已启用服务从系统A至系统乙,以便它们可用于启用那里的服务。有几种方法可以做到这一点。例如,您可以将第一个命令的输出重定向到文件,将其传输到系统乙并分配输出猫将此文件中的命令复制到名为已启用服务。
不过,使用第一个命令的修改版本可能会更简单
echo -n "ENABLED_SERVICES=\""; systemctl list-unit-files | grep enabled | cut -d\ -f1; echo -n "\"";
复制输出并将其粘贴到系统上的终端中乙。此命令产生多行输出,这完全没问题。
答案2
你知道老笑话开发人员说“没有错误,它在我的笔记本电脑上工作正常!”,而发现错误的同事回答说“所以我们会寄送您的笔记本电脑”?当您尝试制作生产系统的精确副本时,您就危险地接近了那个深渊。
而不是重复使用(实际上往往是部分无意的)文物未记录的系统状态修改,放置您的故意的状态变成最具表现力、最一致且最免提的可部署语言(ansible 是你的朋友),并将其存储在版本控制中(git是你的朋友)。使用有效状态的快照(对于此,rsync 可能足够好)来验证你至少已经完善过一次该方法(将自动设置的新系统与你手工制作的系统进行比较),否则仅用于诊断和灾难恢复目的。