Linux /etc/ 目录的版本控制

507 位读者喜欢这篇文章。
Penguins on beach

原创照片由 Rikki Endsley 拍摄。 CC BY-SA 4.0

Linux、UNIX 和类似操作系统的一个主要优势是一切皆文件,并且您的大部分配置都是通过文本文件完成的,这使您可以使用您选择的任何工具轻松读取和写入它们。为了监控您的配置,您可以使用许多工具来自动化配置,从而为您提供对系统配置方式的详细控制。您可以轻松比较不同版本的配置文件以查看任何更改。随着时间的推移跟踪特定配置和更改使您能够

  • 当收到唤醒页面时,查看最近发生了哪些更改
  • 当软件包管理覆盖您精心制作的配置时,恢复更改
  • 当意外的 rm 命令击中生产环境而不是您认为的测试服务器时,恢复文件
  • 查看当多个人(和工具)在系统上工作时发生了哪些更改
  • 调查脚本小子入侵后的更改

几十年来,我们一直使用版本控制系统 (VCS) 跟踪文本文件中的更改。我们拥有这些工具,并且一直在使用它们。源代码的版本控制为您提供诸如跟踪文件历史记录、比较版本、恢复到旧版本和分支等功能。

您的 /etc/ 目录是大多数 Linux 发行版存储系统配置文件的位置,并且跟踪 /etc/ 除了版本控制系统跟踪的内容之外,还有一些额外的挑战。Etckeeper 帮助我们应对这些额外的要求。Etckeeper 偏好使用 git,但也适用于其他几个版本控制系统:mercurial、bazaar 或 darcs。

诸如配置管理和发行版的软件包管理之类的其他工具也控制配置,但它们不会在版本控制中跟踪所有文件。

配置管理系统 (CMS),例如 Puppet、Chef 和 Ansible,不会跟踪 /etc/ 中的每个文件。对于许多文件,它们只验证某些内容是否到位,而忽略文件的其余部分。例如,Puppet 将验证用户是否存在于 /etc/passwd 中,但会忽略对其未管理的帐户的更改。

软件包文件具有基本配置文件,也可能包含用于自动配置的脚本,但它们不跟踪修改。实际上,它们可能会在软件包升级期间覆盖本地配置。它们不应该这样做,但有时它们确实会这样做。

Etckeeper 将跟踪除 repo 目录(例如,/etc/.git)之外的所有内容,如果它未配置为忽略某些文件。默认配置会忽略一些不需要跟踪的文件,例如临时文件(如 /etc/mtab)和缓存文件(如 /etc/ld.so.cache)。Etckeeper 使用版本控制系统的本机忽略文件,并且该文件在版本控制 repo 中被跟踪。例如,/etc/.gitignore 预先填充了 etckeeper 将忽略的文件,但 /etc/.gitignoregit 跟踪。

某些服务对配置文件所有权和权限甚至空目录有点挑剔,所有这些传统上版本控制系统都无法很好地跟踪。Etckeeper 通过在 /etc/.etckeeper 中跟踪此重要元数据来增强底层版本控制系统。再次强调,此文件在版本控制系统中被跟踪。

Etckeeper 还具有与软件包管理系统配合使用的钩子,并在软件包安装和升级后签入更改。

Etckeeper 入门

安装后,使用 init 初始化 repo,然后签入当前状态。

$ sudo etckeeper init
$ sudo etckeeper commit -m "Initial checkin"

初始化后,/etc/ 是版本控制系统中的一个 repo。可以使用本机版本控制工具来管理文件。

$ sudo touch /etc/testfile
$ sudo git -C /etc add testfile
$ sudo git -C /etc commit -m "A test file"
$ echo "10.10.10.1111 nextcloud" | sudo tee -a /etc/hosts >> /dev/null
$ sudo git -C /etc/ diff -U0 hosts
$ diff --git a/hosts b/hosts
index 97f1792..ecc187a 100644
--- a/hosts
+++ b/hosts
@@ -9,0 +10 @@ ff02::2 ip6-allrouters
+10.10.10.1111  nextcloud
$ sudo git -C /etc/ commit hosts -m "Added nextcloud box"
$ sudo git -C /etc/ revert HEAD -m "oops, wrong IP"
$ echo "10.10.10.111    nextcloud" | sudo tee -a /etc/hosts >> /dev/null
$ sudo git -C /etc/ commit hosts -m "Correctly added nextcloud box"

Etckeeper 还提供了一个版本控制系统包装器。使用包装器的一个优点是 sudo etckeeper commit 将记录使用 sudo 的帐户而不是 root。

$ sudo etckeeper commit
$ sudo etckeeper vcs status
$ sudo etckeeper vcs -C apache2 status

想查看升级做了哪些配置更改?查看您的版本控制系统日志。

commit 327f09703be712aab263b9565fede5c21f378732
Author: der.hans <etckeeper@example.com>
Date:   Wed Feb 15 07:24:24 2017 -0700

    committing changes in /etc after apt run
    
    Package changes:
    +vim-addon-manager 0.5.3
    +software-properties-kde 0.92.25debian1
    +vim-fugitive 2.1-2

Etckeeper 是一个用于捕获系统配置随时间变化的强大工具。它通过包装器来跟踪重要的元数据(例如权限和所有权)并与软件包管理系统协同工作,从而补充了本机版本控制系统的功能。请参阅 etckeeper 文档,了解更多使用示例,例如如何将 /etc/ repo 从一个系统克隆到另一个系统。

标签
Avatar
der.hans 是一位技术和创业资深人士。作为一名志愿者,der.hans 致力于通过用户组和会议领导来帮助建立社区。他是南加州 Linux 展 (SCaLE) 上的开源职业日 (OSCD) 的联合主席,也是 SeaGL 财务和合作伙伴委员会的主席。

7 条评论

好文章;另一个有助于监视更改的产品类似于 Tripwire。

值得注意的是,这里的大部分好处已经由使用 BtrFS 作为根文件系统的系统管理。查看更改、向前/向后回滚这些更改(以及其他重要文件(如内核、系统库等)所在的目录结构)都可以通过 BtrFS 快照神奇地处理。将其与系统软件包管理器集成,您将拥有一个强大的解决方案。这在 openSUSE 和 SUSE Linux Enterprise 产品中已成为一两年的常态。我们在我们的组织中使用了它们,这些功能确实为我们提供了很大的灵活性,既可以跟踪 /etc 更改,也可以跟踪其余重要的目录。

是的,tripwire 会监视您想要的一切。我上次使用它是在很多年前,它是否有一个选项可以保留修订并能够查看以前的内容?

我将不得不考虑像 BtrFS 那样的快照。也许我可以将其添加到我周六的演示文稿中。

我认为它没有涵盖我想要的所有功能,但它可能提供足够的功能来涵盖一般用例。像 tripwire 一样,它也将覆盖比 /etc/ 更多的系统。

无论如何,我真的很喜欢带有快照的 etckeeper :)。

或者只是使用配置管理 (CM) 工具(例如 Ansible、Puppet 等)并将您的所有更改提交到 CM 工具的存储库。

或者只是使用 rsnapshot (http://rsnapshot.org/) 来备份您需要的任何内容,不同的版本等等,而无需花费太多磁盘空间。

好文章。使用版本控制系统来跟踪系统文件中的更改始终是一个绝佳的主意。甚至更令人感兴趣的是考虑以这种方式管理整个系统。十多年来,我一直在设计和工程一套工具、流程和工作流程,这些工具、流程和工作流程与软件包管理系统(rpm 和 deb)协同工作,以允许软件包用于配置管理、配置覆盖、通过软件包管理系统(即:rpm -V)进行验证和自我管理。我知道软件包管理系统可以大规模工作。而关于覆盖本地更改的担忧正是真正的 CM 系统应该做的,因为所有更改都应该通过软件包管理系统进行。没有例外。我鼓励作者和读者将版本控制概念提升到一个新的水平,并研究编写本机操作系统软件包。然后,所需要的只是使用版本控制系统来管理软件包构建树(或者,即:SRPM)。这种方法的好处在于,所有 Linux 系统(甚至包括传统的 Unix 系统)都具有本机软件包管理系统。客户端不需要额外的软件来管理数百、数千甚至数百万个节点。Ansible 等工具可用于部署软件包,但也可以与 CM 分离,因此无需与 Ansible、Puppet 或 Chef 等系统结合。无论风向如何,无论公司想要使用什么进行生命周期管理,软件包管理系统始终是唯一的真理。发人深省,我很高兴听到人们正在这样思考。

Utku - 诸如 puppet、ansible 和 chef 之类的配置管理系统 (CMS) 非常棒,并且提供了我在文章中描述的部分内容。专业环境应使用 CMS 或其他可重现、自动化、可扩展的工具进行部署。在大多数情况下,CMS 不会跟踪 /etc/ 中的所有文件,因此我建议在 CMS 管理的服务器上,除了 CMS 之外,还要将 /etc/ 保留在 etckeeper 中。

我承认这在虚拟化环境中可能很难做到,因此请考虑缺少的功能以及它们是否对您的环境很重要。

Andreas - 我喜欢 rsnapshot,并且有一些备份非常依赖它。我觉得它没有提供 etckeeper 的所有功能。具体来说,它通常不保留所有更改,并且它不会在软件包管理更改后自动启动。

rsnapshot 确实提供了一个重要的附加功能,即异地备份。您可以使用 git 来获取异地备份,但 rsnapshot 也是一个很好的选择。

Creative Commons License本作品根据 Creative Commons Attribution-Share Alike 4.0 International License 获得许可。
© . All rights reserved.