Linux tabanlı işletim sisteminde /etc dizini, uygulamalar ve hizmetler için genel yapılandırma dosyalarını tutmak için kullanılır. İyi çalışan bir sistem için iyi bir konfigürasyon seti gerçekten önemlidir, bu nedenle bir şeyler ters gittiğinde değişiklikleri takip edebilmek ve hızlı bir şekilde geri dönebilmek çok önemlidir. Etckeeper, yapılandırma dosyalarını sürüm kontrolü altında tutarak bu hedefe ulaşmamıza yardımcı olur.
Bu yazıda, Etckeeper ve git kullanarak /etc dizinindeki yapılandırma dosyalarının sürüm kontrolü altında nasıl tutulacağını göreceğiz.
Kurulum
İlk yapmamız gereken Etckeeper ve onun desteklediği sürüm kontrol araçlarından birini kurmak. Etckeeper çeşitli sürüm kontrol sistemlerini destekler, ancak bu eğitimin iyiliği için zaten varsayılan olan git’i kullanacağız. Etckeeper ve git’i en çok kullanılan bazı Linux dağıtımlarında kurmak için gereken komutları aşağıda bulabilirsiniz:
| Dağıtım | Kurulum komutu |
|---|---|
| Fedora | $ sudo dnf install etckeeper git |
| Debian-based distributions | $ sudo apt-get update && sudo apt-get install etckeeper git |
| Archlinux | $ sudo pacman -Sy etckeeper git |
Etckeeper’ı Yapılandırma
Etckeeper ile çalışmaya başlamadan önce /etc/etckeeper/etckeeper.conf yapılandırma dosyasını düzenleyerek yapılandırmamız gerekiyor. Favori Linux dağıtımınız muhtemelen dosyada uygun değerleri ayarlamayı başardı, ancak buna hızlıca bir göz atalım .
Sürüm Kontrol Sistemini Yapılandırma
Yapılandırma dosyasının ilk bölümünde Etckeeper’ın hangi sürüm kontrol sistemini kullanması gerektiğini seçiyoruz. Burada, görebileceğiniz gibi, varsayılan git’tir. Başka bir tane kullanmak için varsayılanı yorumlayabilir ve uygun seçimden yorumu kaldırabiliriz:
# The VCS to use.
#VCS="hg"
VCS="git"
#VCS="bzr"
#VCS="darcs"
Seçtiğimiz VCS ile taahhütler oluşturulduğunda kullanılacak ek seçenekleri ilgili değişkenler aracılığıyla belirtebiliriz:
# 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"
Son olarak, PUSH_REMOTE değişkeni aracılığıyla değişikliklerin gönderilmesi gereken bir veya daha fazla isteğe bağlı “uzaktan kumanda” yapılandırabiliriz:
# 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=""
Alt ve üst düzey paket yöneticilerini ayarlama
Linux dağıtımları genellikle düşük ve yüksek seviyeli paket yöneticileri kullanır: birincisi, paketlerin gerçek kurulumunu gerçekleştirmek için yaygın olarak kullanılır, ikincisi, öncekinin işlevlerine dayanır ve bağımlılıkların çözümü gibi daha yüksek seviyeli özellikleri yönetir. Etckeeper yapılandırma dosyasında, kullanımda olan düşük ve yüksek seviyeli paket yöneticilerini belirtmemiz gerekiyor. Etckeeper’ın bu bilgileri bilmesi gerekir, çünkü bir paket kurulduğunda veya yükseltildiğinde ve bunun sonucunda yapılandırma dosyaları değiştirildiğinde veya oluşturulduğunda değişiklikleri otomatik olarak depoda taahhüt eder. Yine, doğru değerler muhtemelen seçtiğiniz dağıtım tarafından zaten belirlenmiştir, ancak daha önce bahsettiğimiz dağıtımlarda kullanmak istediğiniz değerler şunlardır:
| Dağıtım | Düşük seviyeli paket yöneticisi | Üst düzey paket yöneticisi |
|---|---|---|
| Fedora | rpm | dnf |
| Debian-based distributions | dpkg | apt |
| Archlinux | pacman | pacman |
Fedora’da değerler şu şekilde ayarlanır:
# 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=rpm
Depoyu başlatma
Etckeeper’ı yapılandırmayı bitirdikten sonra /etc dizinindeki depoyu başlatabiliriz. Aşağıdaki komutu çalıştırarak yapıyoruz:
$ sudo etckeeper init
Bu durumda git’i bir sürüm kontrol sistemi olarak kullanıyoruz, bu nedenle komut /etc altında gizli bir .git dizininin oluşturulmasına neden olacaktır. Her zaman olduğu gibi, dosyaların izlenmesini ve işlenmesini engellemek istersek, bunları otomatik olarak oluşturulması gereken .gitignore dosyası içinde belirterek yapabiliriz. Bu durumda dosya, etckeeper tarafından yönetilen bazı önceden yüklenmiş girdileri içerir:
# 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 etckeeper
Dosyada belirtildiği gibi, etckeeper tarafından yönetilen girişler manuel olarak değiştirilmemelidir (genellikle etckeeper sürümü yükseltilirken, özel update-ignore komutu ile güncellenirler). Ancak özel olanlarımızı ilgili bölümün dışına ekleyebiliriz.
vcs komutlarını çalıştırma ve commit oluşturma
Her VCS’nin kendi komutları vardır. Etckeeper, vcs alt komutu aracılığıyla etraflarında bir tür sarmalayıcı olarak çalışır. Örneğin, depomuzda hazırlanan dosyaları kontrol etmek istediğimizi varsayalım. Git ile çalıştığımız için normalde git status komutunu çalıştırırdık. Burada bunun yerine şunu kullanıyoruz:
$ etckeeper vcs status
Manuel olarak bir commit oluşturmak için, bu stratejiyi kullanabiliriz veya daha uygun bir şekilde, etckeeper’ın özel alt komutunu kullanabiliriz: commit edebilir ve commit mesajını argüman olarak iletebiliriz. İlk commiti şu şekilde gerçekleştiriyoruz:
$ sudo etckeeper commit "first commit"
Şimdi /etc dizini içinde bazı değişiklikler yapmaya çalışalım. Örneğin, GRUB önyükleyicisinin varsayılan girişi başlatmadan önce kullanıcı girişi için beklediği saniye sayısını değiştirmek istediğimizi varsayalım. Bildiğimiz gibi bunu /etc/default/grub dosyası içindeki GRUB_TIMEOUT değişkeninin değerini değiştirerek yapabiliriz. Varsayılan değer 5’tir. Burada 10’a ayarlıyoruz:
GRUB_TIMEOUT=5
Değişikliği etkili kılmak için Grub konfigürasyonunu yeniden oluşturmak için uygun komutu çağırmalıyız, ancak bu bizim örneğimizle ilgili değil. Değişikliği commit etmek için şunu çalıştırırız:
$ sudo etckeeper commit "Changed grub timeout value"
Şimdi, commitleri listelemek için aşağıdaki komutu çalıştırırız:
$ sudo etckeeper vcs log
Komut, en yenisi önce olmak üzere yaptığımız commitlerin bir listesini döndürür:
commit ad3b3f52bd0d7de538f0cae44a6b467b78b6d632 (HEAD -> master)
Author: egdoc <[email protected]>
Date: Thu Oct 27 11:51:50 2022 +0200
Changed grub timeout value
commit bd1169e784acb39f177673364bfe2ce0036d8c4f
Author: egdoc <[email protected]>
Date: Thu Oct 27 11:39:08 2022 +0200
first commit
Git kullandığımız için, iki commit arasında meydana gelen farklara bakmak için diff komutunu kullanabilir ve commitlerin kimliğini argüman olarak sağlayabiliriz:
$ sudo etckeeper vcs diff ad3b3f bd1169
Bu durumda, beklendiği gibi komut aşağıdaki sonucu verir:
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
Etckeeper ayrıca dosyaların meta verilerindeki değişiklikleri izleyebilir ve boş dizinleri işleyebilir. Bu işlevler, sürüm oluşturma sistemleri aracılığıyla doğrudan elde edilemez, çünkü bunlar bu amaç göz önünde bulundurularak oluşturulmamıştır. Etckeeper, ilgili bilgileri ön işleme kancalarını kullanarak kaydeder ve bunları /etc/.etckeeper dosyasında saklar.
Bir önceki commite geri dönme
Konfigürasyon dosyalarını kontrol altında tutmanın avantajlarından biri, bir şeyler ters gittiğinde veya sadece bir tercih meselesi olduğunda, önceki ve çalışılması gereken bir duruma hızla geri dönebilme yeteneğidir. Bu durumda yaptığımız değişikliği geri almak ve varsayılan GRUB_TIMEOUT değerini kullanmak için şunu çalıştırırız:
$ sudo etckeeper vcs checkout bd1169
Burada bd1169, commit kimliğinin ilk altı karakteridir. Bir kontrol veya rebase olarak diğer işlemleri gerçekleştirdikten sonra, doğru izinlerin geri yüklendiğinden emin olmak için etckeeper init’i tekrar çalıştırmamız gerekiyor.
Zamanlanmış Commitler
Etckeeper, günde bir kez otomatik olarak commit oluşturmak için kullanılabilecek bir cron işi ve bir sistem zamanlayıcısı ile birlikte gelir. Cron işi varsayılan olarak etkindir ve /etc/cron.daily/etckeeper dosyasında uygulanır:
#!/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
fiDosyanın içeriğinden de görebileceğiniz gibi “AVOID_DAILY_AUTOCOMMITS” değişkeni 1’e ayarlanmadıysa asıl işlem gerçekleştirilir, bu nedenle cronjob’ı devre dışı bırakmak istiyorsak yapmamız gereken tek şey uygun olandan yorumu kaldırmaktır. /etc/etckeeper/etckeeper.conf dosyasındaki satırı seçin ve istediğiniz değeri ayarlayın. Bunun yerine systemd.timer birimi varsayılan olarak devre dışıdır ve aşağıdaki komut kullanılarak etkinleştirilebilir:
$ sudo systemctl enable etckeeper.timer
Zamanlayıcı, yukarıda gördüğümüz günlük cronjob için kullanılanla aynı dosyayı yürüten etckeeper.service birimi (/usr/lib/systemd/system/etckeeper.service) ile ilişkilidir.
Bir depoyu kaldırma
Herhangi bir nedenle Etckeeper’ı artık kullanmak istemediğimize karar verirsek (belki yeniden başlamak isteriz) ve /etc/ dizininde oluşturulan depoyu kaldırmak istersek, aşağıdaki komutu kullanabiliriz:
$ sudo etckeeper deinit
“deinit” alt komutu çalıştırıldığında, depoya göre dosyaları ve etckeeper tarafından izlenen meta verileri kaldıracak eylemi onaylamamız istenir:
** Warning: This will DESTROY all recorded history for /etc,
** including the git repository.
Are you sure you want to do this? [yN]
Etkileşimli komut isteminden kaçınmak istiyorsak, komuta -f seçeneğini ekleyebiliriz.
Yazının orijinalini buradan okuyabilirsiniz.

Kariyerime 26 yıl önce başladım. Windows ve Linux sistemlerinin kurulumu, yapılandırılması, yönetimi ve bakımı dahil olmak üzere birden fazla sistem üzerinde uzmanlaştım.
Açık kaynak dünyasındaki en son gelişmelerden haberdar olmaktan ve Linux hakkındaki en son araçları, özellikleri ve hizmetleri denemekten hoşlanıyorum.
Son 6 yıldır sistem ve ağ yöneticisi olarak görev yapıyorum ayrıca Pardus Dönüşüm Projesini yönetiyorum ve Pardus İşletim Sisteminin yaygınlaşması adına uğraş gösteriyorum.
Boş zamanlarımda açık kaynaklı uygulamaların Türkçe çevirisine katılıyorum ve The Document Foundation üyesiyim.