在安装和各种自定义配置之后,是否可以使用例如 apt 和一些 shell-fu 来为 /etc/ 中与标准配置不同的每个文件生成一个 diff?这将提供一种在事后生成配置状态简短摘要的方法,而不必依赖于一路上的手动记录,如果有人希望记住后来发生了什么变化。
答案1
你应该看看etckeeper:
etckeeper是一组工具,用于将 /etc 存储在 git、mercurial、darcs 或 bzr 存储库中。它与 apt(以及其他软件包管理器,包括 yum 和 pacman-g2)挂钩,以在软件包升级期间自动提交对 /etc 所做的更改。它跟踪修订控制系统通常不支持但对 /etc 很重要的文件元数据,例如 /etc/shadow 的权限。它非常模块化且可配置,如果您了解使用修订控制的基础知识,它也很容易使用。
答案2
我正在开发针对同一类问题的解决方案。
基本上,我的目标是一个允许以文件级粒度撤消和重做的系统。
从你的问题开始并逆向思考......
- 为了与默认配置进行比较,我们必须先将所有这些文件的原件存储在某个地方。然后我们可以使用类似...的内容来生成您想要的内容
DIFFDIR= ......
ARCDIR=./.archives # see below
function getlastarchive() {
... code to return last archived version ...
}
for FILE in /etc/*
do
ARCFILE="$(getlastarchive $FILE)"
diff $ARCDIR/$ARCFILE /etc/$FILE >$DIFFDIR/$FILE.diff
done
- 为了存储原始文件,我选择采用
.archives
在包含修改文件的任何目录中都只有一个子目录的惯例。它是根据需要由file-archive
脚本创建的。 - 如果只想要一级撤消,则只需将未改变的文件复制到
.archives
改变之前的目录中。 - 对于无限制撤消,我们需要一个版本控制方案。一个明显的选择是将日期时间戳附加到存档版本的名称中。类似于...
Files: /etc/hosts
/etc/resolv.conf
Archived Versions: /etc/.archives/hosts.20121219015459
/etc/.archives/resolv.conf.20121219015459
- 相反,我只使用自动计算的增量版本号,如......
Files: /etc/hosts
/etc/resolv.conf
Archived Versions: /etc/.archives/hosts.00
/etc/.archives/resolv.00.conf
- 版本号为前扩展名,因为我还将其用于图像的编辑版本,这些图像需要其扩展名(.jpg、.png 等)完整无缺,以便被许多软件正确检测到。如果文件没有扩展名,则版本号会附加到末尾。执行此操作的代码更复杂,但可以立即运行,因此没有问题。可以为许多其他方案提供案例,但这对我来说有效。
希望这可以帮助!