etckeeper

来自 ArchWiki

Etckeeper 是一系列工具,用于在仓库中跟踪 /etc/ 目录(支持 GitMercurialBazaarDarcs)。pacman 钩子会在系统升级前自动提交更改,并跟踪文件权限,这是版本控制通常不支持的,但对于像 /etc/shadow 这样的文件来说非常重要。

安装

安装 etckeeper 软件包。

配置

首选的版本控制系统(默认为 git)和其他选项需要在 /etc/etckeeper/etckeeper.conf 中配置。

Etckeeper 支持在 etckeeper.conf 中使用 pacman 作为 LOWLEVEL_PACKAGE_MANAGERHIGHLEVEL_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 checkout/rebase/merge/cherry-pick/... 可能会导致文件权限损坏,从而导致例如 SSH/sudo 登录被拒绝。

git 无法直接存储文件权限,因此由 etckeeper 处理,您需要再次运行 etckeeper init 以在检出后恢复它们。或者,您可以使用 Systemd#systemd-tmpfiles - 临时文件 来保留权限。

systemd

软件包中包含服务和定时器单元。只需启用 etckeeper.timer 即可。

有关更多信息,请参阅 Systemd/Timers,如果您希望编辑提供的单元,请参阅 Systemd#编辑提供的单元

Cron

源代码发行版中有一个 cron 脚本。您可以使用此脚本在计划的时间自动提交更改。

例如,使其每天运行

  1. 安装并启用 cron
  2. 将脚本放在 /etc/cron.daily/script_name
  3. 允许 root 用户执行文件(以 root 用户身份运行 chmod u+x /etc/cron.daily/script_name)。

有关更多信息,请参阅 cron#Croniecron

Incron

注意: 本节仅适用于 incron 版本 5.10。

要在 /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)

自动推送到远程仓库

警告: 将您的 etckeeper 仓库推送到公共可访问的远程仓库可能会暴露敏感数据,例如密码哈希或私钥。请谨慎操作。

虽然在 /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 了解更多信息。

注意: 在 Etckeeper 版本 1.18.3-1 之前,Pacman 集成需要这种手动包装脚本。现在,Pacman 钩子会自动执行命令。

Reflector

要在每次 Reflector 调用后自动提交更改,请通过在 reflector.service 上创建 drop-in 文件,使 reflector.service 依赖于 etckeeper.service,内容如下

[Unit]
Before=etckeeper.service
Wants=etckeeper.service
注意: 自动更改的提交消息将为 “daily autocommit”,因为重用了 #systemd 提供的单元。要更改该消息,请创建一个新脚本和 systemd 服务。