Wie man Konfigurationsdateien mit Etckeeper unter Versionskontrolle hält
Auf Linux-basierten Betriebssystemen wird das Verzeichnis /etc verwendet, um globale Konfigurationsdateien für Anwendungen und Dienste zu speichern. Ein guter Satz von Konfigurationen ist wirklich wichtig für ein gut funktionierendes System, daher ist es von entscheidender Bedeutung, Änderungen im Auge zu behalten und sie schnell rückgängig zu machen, falls etwas schief geht. Etckeeper hilft uns, dieses Ziel zu erreichen, indem es Konfigurationsdateien unter Versionskontrolle hält.
In diesem Tutorial sehen wir, wie man Konfigurationsdateien im Verzeichnis /etc mit Etckeeper und git unter Versionskontrolle hält.
In diesem Tutorial lernen Sie:
- So installieren Sie Etckeeper in einigen der am häufigsten verwendeten Linux-Distributionen
- So konfigurieren Sie Etckeeper
- So initialisieren Sie ein Git-Repository in /etc mit Etckeeper
- So verwenden Sie Etckeeper, um Commits zu erstellen
- So verwenden Sie Etckeeper zum Ausführen von Git-Befehlen
- Aktivieren oder Deaktivieren geplanter Commits
- So zerstören Sie ein Repository
Installation
Das erste, was wir tun müssen, ist, Etckeeper und eines der von ihm unterstützten Versionskontrolltools zu installieren. Etckeeper unterstützt eine Vielzahl von Versionskontrollsystemen, aber für dieses Tutorial werden wir git verwenden, das sowieso die Standardeinstellung ist. Nachfolgend finden Sie die Befehle, die zur Installation von Etckeeper und Git in einigen der am häufigsten verwendeten Linux-Distributionen erforderlich sind:
| Verteilung | Installationsbefehl |
|---|---|
| Fedor | |
| Debian-basierte Distributionen | |
| Archlinux | |
Etckeeper konfigurieren
Bevor wir mit Etckeeper arbeiten, müssen wir es konfigurieren, indem wir die Konfigurationsdatei /etc/etckeeper/etckeeper.conf bearbeiten. Ihre Lieblings-Linux-Distribution hat es wahrscheinlich bereits geschafft, die entsprechenden Werte in der Datei festzulegen, aber werfen wir einen kurzen Blick darauf (ich verwende derzeit Fedora; wenn Sie eine andere Distribution verwenden, können die Standardwerte und -details von den unten gezeigten abweichen).
Konfigurieren des Versionskontrollsystems
Im ersten Abschnitt der Konfigurationsdatei können wir auswählen, welches Versionskontrollsystem Etckeeper verwenden soll. Hier ist die Standardeinstellung, wie Sie sehen können, git. Um eine andere zu verwenden, können wir einfach die Standardeinstellung kommentieren und den Kommentar aus der entsprechenden Auswahl entfernen:
The VCS to use.
#VCS="hg"
VCS="git"
#VCS="bzr"
#VCS="darcs"Wir können zusätzliche Optionen angeben, die verwendet werden sollen, wenn Commits mit dem VCS unserer Wahl erstellt werden, und zwar über die entsprechenden Variablen:
Options passed to git commit when run by etckeeper.
GIT_COMMIT_OPTIONS=""
Options passed to hg commit when run by etckeeper.
HG_COMMIT_OPTIONS=""
Options passed to bzr commit when run by etckeeper.
BZR_COMMIT_OPTIONS=""
Options passed to darcs record when run by etckeeper.
DARCS_COMMIT_OPTIONS="-a"Schließlich können wir eine oder mehrere optionale "Fernbedienungen" konfigurieren, auf die Änderungen über die Variable PUSH_REMOTE übertragen werden sollen:
To push each commit to a remote, put the name of the remote here.
(eg, "origin" for git). Space-separated lists of multiple remotes
also work (eg, "origin gitlab github" for git).
PUSH_REMOTE=""Festlegen des Paketmanagers auf niedriger und hoher Ebene
Linux-Distributionen verwenden in der Regel Paketmanager auf niedriger und hoher Ebene: Erstere werden häufig verwendet, um die eigentliche Installation von Paketen durchzuführen, letztere verlassen sich auf die Funktionalitäten der ersteren und verwalten Funktionen auf höherer Ebene, wie z. B. die Auflösung von Abhängigkeiten. In der Etckeeper-Konfigurationsdatei müssen wir die verwendeten Paketmanager auf niedriger und hoher Ebene angeben. Etckeeper muss diese Informationen kennen, da es automatisch Änderungen an das Projektarchiv überträgt, wenn ein Paket installiert oder aktualisiert wird und Konfigurationsdateien als Folge davon geändert oder erstellt werden. Auch hier sind die korrekten Werte wahrscheinlich bereits durch die von Ihnen gewählte Verteilung festgelegt, aber hier sind die Werte, die Sie für die zuvor erwähnten Verteilungen verwenden möchten:
| Verteilung | Paketmanager auf niedriger Ebene | Paketmanager auf hoher Ebene |
|---|---|---|
| Fedor | Rpm | dnf |
| Debian-basierte Distributionen | dpkg | passend |
| Archlinux | Pacman | Pacman |
So werden die Werte in Fedora festgelegt:
The high-level package manager that's being used.
(apt, pacman, pacman-g2, yum, dnf, zypper, apk etc)
HIGHLEVEL_PACKAGE_MANAGER=dnf
The low-level package manager that's being used.
(dpkg, rpm, pacman, pacmatic, pacman-g2, apk etc)
LOWLEVEL_PACKAGE_MANAGER=rpmInitialisieren des Repositorys
Sobald wir mit der Konfiguration von Etckeeper fertig sind, können wir das Repository im Verzeichnis /etc initialisieren. Wir tun dies, indem wir den folgenden Befehl ausführen:
sudo etckeeper initIn diesem Fall verwenden wir git als Versionskontrollsystem, daher bewirkt der Befehl, dass ein verstecktes .git-Verzeichnis unter /etc erstellt wird. Falls wir Dateien von der Verfolgung und dem Commit ausschließen möchten, können wir dies wie üblich tun, indem wir sie in der .gitignore-Datei angeben, die automatisch erstellt werden sollte. In diesem Fall enthält die Datei einige vorinstallierte Einträge, die von etckeeper verwaltet werden:
begin section managed by etckeeper (do not edit this section by hand)
new and old versions of conffiles, stored by apt/rpm
*.rpmnew
*.rpmorig
*.rpmsave
old versions of files
*.old
mount(8) records system state here, no need to store these
blkid.tab
blkid.tab.old
some other files in /etc that typically do not need to be tracked
nologin
ld.so.cache
prelink.cache
mtab
mtab.fuselock
.pwd.lock
*.LOCK
network/run
adjtime
udev/hwdb.bin
lvm/cache
lvm/archive
X11/xdm/authdir/authfiles/*
ntp.conf.dhcp
.initctl
webmin/fsdump/*.status
webmin/webmin/oscache
apparmor.d/cache/*
service/*/supervise/*
service/*/log/supervise/*
sv/*/supervise/*
sv/*/log/supervise/*
*.elc
*.pyc
*.pyo
init.d/.depend.*
openvpn/openvpn-status.log
cups/subscriptions.conf
cups/subscriptions.conf.O
fake-hwclock.data
check_mk/logwatch.state
editor temp files
*~
.*.sw?
.sw?
\#*\#
DEADJOE
end section managed by etckeeperWie in der Datei angegeben, sollten Einträge, die von etckeeper verwaltet werden, nicht manuell geändert werden (sie werden normalerweise aktualisiert, wenn die etckeeper-Version über den speziellen Befehl update-ignore aktualisiert wird). Wir können jedoch unsere benutzerdefinierten außerhalb des entsprechenden Abschnitts hinzufügen.
Ausführen von vcs-Befehlen und Erstellen von Commits
Jedes VCS hat seine eigenen Befehle. Etckeeper fungiert als eine Art Wrapper um sie herum über den Unterbefehl vcs. Nehmen wir zum Beispiel an, wir möchten die Dateien überprüfen, die in unserem Repository bereitgestellt werden. Da wir mit git arbeiten, würden wir normalerweise den Befehl git status ausführen. Hier verwenden wir stattdessen:
etckeeper vcs status
Um einen Commit manuell zu erstellen, können wir diese Strategie verwenden, oder, bequemer, wir können den dedizierten Unterbefehl etckeeper: commit verwenden und die Commit-Nachricht als Argument übergeben. So führen wir unseren ersten Commit durch:
sudo etckeeper commit "first commit"Versuchen wir nun, einige Änderungen im Verzeichnis /etc vorzunehmen. Nehmen wir zum Beispiel an, wir möchten die Anzahl der Sekunden ändern, die der GRUB-Bootloader auf die Benutzereingabe wartet, bevor er den Standardeintrag bootet. Wie wir wissen, können wir dies tun, indem wir den Wert der Variablen GRUB_TIMEOUT in der Datei /etc/default/grub ändern. Der Standardwert ist 5. Hier haben wir es auf 10 gesetzt:
GRUB_TIMEOUT=5Um die Änderung wirksam zu machen, sollten wir den entsprechenden Befehl aufrufen, um die Grub-Konfiguration neu zu generieren, aber das ist für unser Beispiel nicht relevant. Um die Änderung zu übernehmen, würden wir Folgendes ausführen:
sudo etckeeper commit "Changed grub timeout value"Um nun unsere Commits aufzulisten, würden wir Folgendes ausführen:
sudo etckeeper vcs logDer Befehl gibt eine Liste der Commits zurück, die wir gemacht haben, die neuesten zuerst:
commit ad3b3f52bd0d7de538f0cae44a6b467b78b6d632 (HEAD -> master)
Author: egdoc <egdoc@users.noreply.github.com>
Date: Thu Oct 27 11:51:50 2022 +0200
Changed grub timeout value
commit bd1169e784acb39f177673364bfe2ce0036d8c4f
Author: egdoc <egdoc@users.noreply.github.com>
Date: Thu Oct 27 11:39:08 2022 +0200
first commitDa wir git verwenden, können wir, um einen Blick auf die Unterschiede zwischen den beiden Commits zu werfen, den Befehl diff verwenden und die Commit-ID als Argumente angeben:
sudo etckeeper vcs diff ad3b3f bd1169In diesem Fall gibt der Befehl erwartungsgemäß das folgende Ergebnis zurück:
diff --git a/default/grub b/default/grub
index 5c695ec..d37c897 100644
--- a/default/grub
+++ b/default/grub
@@ -1,4 +1,4 @@
-GRUB_TIMEOUT=10
+GRUB_TIMEOUT=5
GRUB_DISTRIBUTOR="$(sed 's, release .*$,,g' /etc/system-release)"
GRUB_DEFAULT=saved
GRUB_DISABLE_SUBMENU=trueÜbrigens, Sie können sich unser Tutorial zum Vergleichen von Dateien mit diff ansehen, wenn Sie mit der Ausgabe dieses Tools nicht vertraut sind.
Etckeeper ist auch in der Lage, Änderungen in den Metadaten von Dateien zu verfolgen und leere Verzeichnisse zu verarbeiten. Diese Funktionalitäten können nicht direkt über die Versionierungssysteme erreicht werden, da sie nicht mit diesem Ziel im Hinterkopf entwickelt wurden. Etckeeper speichert die relevanten Informationen mit Hilfe von Pre-Commit-Hooks und speichert sie in der Datei /etc/.etckeeper.
Zurücksetzen auf einen vorherigen Commit
Einer der Vorteile, Konfigurationsdateien unter Kontrolle zu halten, ist die Möglichkeit, schnell zu einem früheren und bekannten Arbeitsstatus zurückzukehren, falls etwas schief geht oder einfach nur eine Frage der Vorliebe. In diesem Fall würden wir Folgendes ausführen, um die von uns vorgenommene Änderung rückgängig zu machen und den standardmäßigen GRUB_TIMEOUT Wert zu verwenden:
sudo etckeeper vcs checkout bd1169
Dabei sind bd1169 die ersten sechs Zeichen der Commit-ID. Nachdem wir einen Checkout oder andere Vorgänge als Rebase durchgeführt haben, müssen wir etckeeper init erneut ausführen, um sicherzustellen, dass die korrekten Berechtigungen wiederhergestellt werden.
Geplante Commits
Etckeeper wird mit einem Cron-Job und einem systemd-Timer geliefert, der verwendet werden kann, um einmal pro Tag automatisch Commits zu erstellen. Der Cron-Job ist standardmäßig aktiv und wird in der Datei /etc/cron.daily/etckeeper implementiert:
#!/usr/bin/sh
set -e
if [ -e /etc/etckeeper/daily ] && [ -e /etc/etckeeper/etckeeper.conf ]; then
. /etc/etckeeper/etckeeper.conf
if [ "$AVOID_DAILY_AUTOCOMMITS" != "1" ]; then
/etc/etckeeper/daily
fi
fiWie Sie am Inhalt der Datei sehen können, wird die eigentliche Aktion ausgeführt, wenn die Variable "AVOID_DAILY_AUTOCOMMITS" nicht auf 1 gesetzt ist, wenn wir also den Cronjob deaktivieren wollen, müssen wir nur den Kommentar aus der entsprechenden Zeile in der Datei /etc/etckeeper/etckeeper.conf entfernen, und stellen Sie den gewünschten Wert ein. Stattdessen ist die Unit systemd.timer standardmäßig deaktiviert und kann mit dem folgenden Befehl aktiviert werden:
sudo systemctl enable etckeeper.timerDer Timer ist mit der Unit etckeeper.service (/usr/lib/systemd/system/etckeeper.service) verknüpft, die die gleiche Datei ausführt, die wir für den täglichen Cronjob oben gesehen haben. Übrigens, schauen Sie sich unser Tutorial zu systemd-Timern an, wenn Sie wissen möchten, wie sie im Detail funktionieren.
De-initiieren eines Repositorys
Wenn wir aus irgendeinem Grund entscheiden, dass wir Etckeeper nicht mehr verwenden wollen (vielleicht wollen wir neu anfangen) und wir das im /etc/-Verzeichnis erstellte Repository entfernen wollen, können wir den folgenden Befehl verwenden:
sudo etckeeper deinit Wenn der Unterbefehl "deinit" aufgerufen wird, werden wir aufgefordert, die Aktion zu bestätigen, die die Dateien relativ zum Repository und die von etckeeper verfolgten Metadaten entfernt:
** Warning: This will DESTROY all recorded history for /etc,
** including the git repository.
Are you sure you want to do this? [yN] Wenn wir die interaktive Eingabeaufforderung vermeiden möchten, können wir dem Befehl einfach die Option -f hinzufügen.
Schlüsse
In diesem Tutorial haben wir gelernt, wie man das Etckeeper-Tool auf einigen der am häufigsten verwendeten Linux-Distributionen installiert und verwendet. Etckeeper verlässt sich auf die unterstützten Versionskontrollsysteme, um das /etc-Verzeichnis in ein Repository umzuwandeln, um die Änderungen zu verfolgen, die an den darin enthaltenen Dateien und Verzeichnissen vorgenommen werden, so dass wir leicht zu bestimmten Commits zurückkehren können, falls sich etwas unerwartet verhält. Wenn Sie mehr über Etckeeper erfahren möchten, werfen Sie bitte einen Blick in das Handbuch oder die Online-Dokumentation.
