我即将做一些系统更改,我想logging一下我目前的开心系统状态。 有没有一个方便的方法来创build这个logging? 我想跟踪信息
/etc/apt/sources.list ) 总之,我想尽可能多地保留能力数据库。 什么是最好的方法来做到这一点? 如果结果logging易于阅读,这将是很好的,尽pipe这不是必须的。 如果通过像git这样的SCM工具可以很容易地进行版本化,那将是非常好的。
有一个超级用户的问题部分解决了这个问题,但它只提供了当前安装的软件包列表。
基于@ ptman的回答,我确定了以下内容:
/etc/apt和/var/lib/...将完成aptitude-create-state-bundle一个子集。 apt-cache policy似乎给了优先级信息,所以我需要更全面的东西; aptitude-create-state-bundle似乎是票据。 但是,有一些方法可以分析bundle以获取诸如apt-cache policy提供的信息。 我已经开始了一个git setgitperms.perl (使用setgitperms.perl hook util),它包含了aptitude-create-state-bundle的提取内容,例如我
sudo aptitude-create-state-bundle --force-gzip /dev/stdout | sudo tar xzv
在运行git add . && git add -u .之前创build目录内容git add . && git add -u . git add . && git add -u . 。 这是一种缓慢,因为它压缩和解压所有的东西,我可能会改变它只是用--print-inputs选项获取文件列表,然后将这些文件复制或硬链接到git仓库。
这种方法工作得很好:在运行git gc --aggressive ,我得到一个.git目录,它的大小是原始tarball的2/3。 这是在安装puppet及其依赖关系之后logging了状态的第二次提交之后完成的。 通过查看diff可以很容易地看到改变了什么,这是一个很好的方法来找出执行操作时aptitude实际aptitude 。 我认为有一些方法可以在apt(a la etckeeper)中设置钩子,所以我最终可能会使用这个设备来保持每个apt操作的repo更新。
一个小问题是,即使启用了setgitperms钩子,时间戳也不会被这个系统logging下来。 所以我在预提交钩子中添加了第二个命令,将长目录列表转储到repo根目录中名为.ls的文件中:
find * | xargs -d \\n ls -ld >.ls
我不确定这是否真的有必要,我只是在aptitude-run-state-bundle以某种相关方式使用时间戳的情况下才这样做。 任何人都知道这是真的吗? 即使这样,似乎也不太可能有必要,因为签出文件的时间戳总是至less与提交时文件的原始时间戳一样新。
至less在我有机会弄清楚什么是puppet ,以及如何使用它的情况下,我会继续这样做。
我一直在使用这个系统,但是它似乎变得有些笨拙,因为.git回购正在迅速增长。 经过12次提交之后,.git目录(使用git gc --aggressive进行压缩之后)的大小从(IIRC)15-20 MB的初始大小增加到大约60 MB。
似乎大部分的大部分似乎是由于两个大的(〜15MB)二进制文件的差异,我想知道这些文件是否需要保存系统的包装状态。 这些文件是:
var/cache/apt/pkgcache.bin var/cache/apt/srcpkgcache.bin
如果这些文件不存在于tarball中,是否可以使用aptitude-run-state-bundle来恢复repo? 是否有可能将当前系统版本添加到tar包中,以便aptitude-run-state-bundle使用tarball(假设当前的系统版本没有损坏)?
看看下面的工具:
dpkg --get-selections aptitude-create-state-bundle dpkg -l dpkg -l |tail -n +6 | awk '{ print $2 }' | xargs apt-cache policy
备份/etc/apt和/var/lib/{apt,dpkg,aptitude} 。
使用木偶 。 使用该工具,您可以查询系统并列出当前状态。 这个列表可以用来克隆系统。 这就像build立,除了服务器。