etckeeper
Etckeeper 是一系列工具,用于在仓库中跟踪 /etc/
目录(支持 Git、Mercurial、Bazaar 或 Darcs)。pacman 钩子会在系统升级前自动提交更改,并跟踪文件权限,这是版本控制通常不支持的,但对于像 /etc/shadow 这样的文件来说非常重要。
安装
配置
首选的版本控制系统(默认为 git)和其他选项需要在 /etc/etckeeper/etckeeper.conf
中配置。
Etckeeper 支持在 etckeeper.conf
中使用 pacman 作为 LOWLEVEL_PACKAGE_MANAGER
和 HIGHLEVEL_PACKAGE_MANAGER
。
用法
配置完成后,必须初始化 /etc
路径的仓库
# etckeeper init
并执行首次提交以跟踪更改,这是 etckeeper 能够自动工作的必要步骤
# etckeeper commit "first commit"
/etc/passwd
中,root 用户必须将其注释字段(第 5 个字段)填充为 root
,以使提交不会失败从 etckeeper 版本 1.18.3-1 开始,预安装和后安装 pacman 钩子会在软件包安装、更新和删除时自动执行。不再需要手动 #包装脚本。
要跟踪对 /etc
路径的其他更改,您需要手动提交更改(请参阅 etckeeper(8) 手册页了解命令)或使用以下临时解决方案之一。
git 无法直接存储文件权限,因此由 etckeeper 处理,您需要再次运行 etckeeper init 以在检出后恢复它们。或者,您可以使用 Systemd#systemd-tmpfiles - 临时文件 来保留权限。
systemd
软件包中包含服务和定时器单元。只需启用 etckeeper.timer
即可。
有关更多信息,请参阅 Systemd/Timers,如果您希望编辑提供的单元,请参阅 Systemd#编辑提供的单元。
Cron
源代码发行版中有一个 cron 脚本
。您可以使用此脚本在计划的时间自动提交更改。
例如,使其每天运行
- 安装并启用 cron。
- 将脚本放在
/etc/cron.daily/script_name
。 - 允许 root 用户执行文件(以 root 用户身份运行
chmod u+x /etc/cron.daily/script_name
)。
有关更多信息,请参阅 cron#Cronie、cron。
Incron
要在 /etc/
内部的每次文件修改时自动创建提交,请使用 incron。它利用通过 inotify(7) 的原生文件系统信号。
安装 incron 并初始化 etckeeper 后,将 root 添加到允许运行 incron 脚本的用户
# echo root | tee -a /etc/incron.allow
然后使用以下命令编辑 incrontab
# incrontab -e
在文本中添加
# /etc IN_MODIFY,IN_NO_LOOP /bin/etckeeper commit "[message]"
IN_NO_LOOP 是一个标志,它等待提交完成后再运行下一个命令,并防止无限循环。
其中 [message] 可以是类似 "modified $#"
的内容,其中 $# 是一个特殊的 incrontab 通配符,扩展为已修改文件的名称。
请注意,Incron 无法监视子目录。仅监视路径内的文件。如果您需要监视子目录,则必须为它们提供自己的条目。但是,修改顶级文件时提交仍将提交所有更改。
参见:[1]、incrond(8)
自动推送到远程仓库
虽然在 /etc/.git
中进行本地备份是很好的第一步,但 etckeeper 可以自动将您的更改在每次提交时推送到远程仓库,例如 Github。
首先,以 root 身份登录,然后从 /etc/.git
目录中,添加您的远程 Github 仓库
# git remote add origin https://github.com/user/repo.git
接下来,必须使用或配置以下两个钩子之一来推送
使用 etckeeper 提供的钩子
编辑 /etc/etckeeper/etckeeper.conf
中的 PUSH_REMOTE
选项,使用您希望 etckeeper 推送到的远程仓库的名称。例如
PUSH_REMOTE="origin"
可以使用空格分隔添加多个远程仓库。
通过自定义钩子
创建一个可执行文件 /etc/etckeeper/commit.d/40github-push
#!/bin/sh set -e if [ "$VCS" = git ] && [ -d .git ]; then cd /etc/ git push origin master fi
包装脚本
如果您想跟踪频繁执行的命令(例如 command
)的更改,一个简单的包装脚本可以帮助实现自动化。例如,创建
/usr/local/bin/checketc.sh
#!/bin/bash etckeeper pre-install command etckeeper post-install
并使其可执行。或者,您可以调用 Etckeeper 命令通过 bash 别名或函数,请参阅 Bash#Aliases 了解更多信息。
Reflector
要在每次 Reflector 调用后自动提交更改,请通过在 reflector.service
上创建 drop-in 文件,使 reflector.service
依赖于 etckeeper.service
,内容如下
[Unit] Before=etckeeper.service Wants=etckeeper.service