Uygulama

Linux’ta Snapper ile anlık görüntüler nasıl yönetilir?

Snapper, Linux’ta anlık görüntüleri yönetmek için kullanabileceğimiz ücretsiz ve açık kaynaklı bir uygulamadır. Başlangıçta BTRFS anlık görüntüleri ile çalışacak şekilde tasarlandı, ancak LVM ince provizyonlu mantıksal birimleri de destekleyecek şekilde genişletildi. Bu eğitimde Snapper’ı en çok kullanılan Linux dağıtımlarına nasıl kuracağımızı ve Linux’ta anlık görüntüleri yönetmek için nasıl kullanacağımızı öğreniyoruz.

Kurulum

Başlangıçta OpenSUSE geliştiricisi Arvin Schnell tarafından oluşturulan Snapper, artık en çok kullanılan Linux dağıtımlarının resmi depolarında mevcut. Uygulamayı Fedora’ya kurmak için dnf paket yöneticisini kullanabiliriz:

$ sudo dnf install snapper

Snapper’ı Debian ve Debian tabanlı dağıtımlara kurmak için bunun yerine aşağıdaki komutu kullanıyoruz:

$ sudo apt install snapper

Snapper ayrıca Archlinux’un “Ekstra” deposunda da mevcuttur. Uygulamayı pacman ile kurabiliriz:

$ sudo pacman -S snapper

Son olarak Snapper’ı OpenSUSE’ye kurmak için zypper paket yöneticisini kullanıyoruz:

$ sudo zypper in snapper

Snapper yapılandırması oluşturma

Snapper’ı kullanmadan önce, create-config komutunu kullanarak anlık görüntüsünü almak istediğimiz her dosya sistemi için bir yapılandırma oluşturmalıyız. “/“ konumuna monte edilmiş bir BTRFS alt hacmimiz olduğunu varsayalım. Bunun için bir Snapper yapılandırması oluşturmak için şunu çalıştırırız:

$ sudo snapper -c myconfig create-config -f btrfs /

 



Yukarıdaki komutu analiz edelim. Snapper’ı -c seçeneğiyle çağırdık: bu –config’in kısaltmasıdır: bu seçeneği bir konfigürasyon adı belirtmek için kullanırız. Örnekte, seçeneğin argümanı olarak “myconfig”i kullanıyoruz; bu zorunlu değildir: eğer bunu atlarsak, varsayılan ad kullanılacaktır (“root”). Anlık görüntü arka ucunu belirtmek için create-config komutunu -f seçeneğiyle (-fstype’nin kısaltması) çağırdık. Bu durumda BTRFS dosya sistemiyle çalıştığımızdan dolayı argüman olarak “btrfs”yi geçtik. LVM ölçülü provizyonlu anlık görüntüsü için yapılandırma oluşturuyor olsaydık, aşağıdakileri çalıştırarak dosya sistemini mantıksal birimin üstünde belirtirdik: 

$ sudo snapper -c myconfig create-config -f "lvm(ext4)" /

Snapper yapılandırmaları /etc/snapper/configs dizini altına kaydedilir.

Bir konfigürasyon için oluşturulan anlık görüntülerin listesini alma

Snapper ile oluşturulan anlık görüntülere genel bir bakış için ls komutunu kullanabiliriz. Bir kez daha, -c seçeneğiyle bir konfigürasyon adı belirtmezsek, varsayılan olan varsayılır, bu nedenle özel bir isimle bir konfigürasyon oluşturduysak, tüm Snapper komutlarında bunu açıkça işaret etmemiz gerekir. Önceki örnekte konfigürasyon adı olarak “myconfig”i kullandık; onunla ilişkili anlık görüntülerin listesini almak için şunu çalıştırırız:

$ sudo snapper -c myconfig ls

Henüz herhangi bir anlık görüntü oluşturmadık, bu nedenle komutun çıktısı aşağıdaki gibidir:

 # | Type   | Pre # | Date | User | Cleanup | Description | Userdata
---+--------+-------+------+------+---------+-------------+---------
0  | single |       |      | root |         | current     |

 



ID 0’a sahip anlık görüntü “gerçek” bir anlık görüntü değildir: yalnızca sistemin mevcut durumuna işaret eder. Varsayılan olarak komutun çıktısı aşağıdaki bilgileri bildirir: 

  • Anlık görüntü kimliği
  • Anlık görüntü türü (tekli, ön veya son – aşağıya bakın)
  • Anlık görüntü “sonraki” türündeyse ilgili “ön” anlık görüntünün kimliği (yine aşağıya bakın)
  • Anlık görüntünün oluşturulduğu tarih
  • Anlık görüntüyü oluşturan kullanıcı
  • Temizleme algoritması (sayı, zaman çizelgesi veya boş-ön-sonra)
  • Anlık görüntü için sağlanan isteğe bağlı açıklama
  • Anlık görüntü için sağlanan anahtar/değer çiftlerinin listesi

Snapper ile anlık görüntüler oluşturma

Snapper, anlık görüntüleri üç kategoride düzenler: “önceki”, “sonraki” ve “tekli” anlık görüntüler. Bu tür anlık görüntüler arasında yapısal bir fark yoktur, yalnızca ilişkiseldir: “önceki” ve “sonraki” anlık görüntüler her zaman ilişkilidir: her “sonraki” anlık görüntünün kendisiyle ilişkilendirilmiş karşılık gelen bir “önceki” anlık görüntüsü vardır. Bir eylem veya komuttan önce ve sonra dosya sistemi durumunu işaretlemek için oluşturulurlar. Bunun yerine “tek” anlık görüntüler, adından da anlaşılacağı gibi “yalıtılmıştır”: başka herhangi bir anlık görüntüyle ilişkili değildirler.

 



Snapper ile anlık görüntü oluşturmak için create komutunu kullanıyoruz. Başka bir seçenek olmadan kullanıldığında komut “tek” bir anlık görüntü oluşturur: 

$ sudo snapper -c myconfig create

Oluşturmak istediğimiz anlık görüntülerin türünü -t (–type) seçeneğini kullanarak belirtebiliriz. Örnek olarak, bir “ön” anlık görüntü oluşturmak için şunu çalıştırırız:

$ sudo snapper -c myconfig create -t pre

Bir “post” anlık görüntü oluştururken ilgili “ön” anlık görüntü kimliğini belirtmeliyiz; bunu –pre-number seçeneğine argüman olarak ileterek yapabiliriz, örneğin:

$ sudo snapper -c myconfig create -t post --pre-number 1

İlgili “ön” ve “sonraki” anlık görüntülerin manuel olarak oluşturulmasını önlemek için –command seçeneğini kullanabiliriz. Bu seçenek bir komutu değer olarak alır: Snapper, komutu yürütmeden önce otomatik olarak bir “ön” anlık görüntü ve komut yürütüldükten sonra bir “sonraki” anlık görüntü oluşturur. Örnek olarak, sistemi güncellemeden önce ve sistem güncellendikten hemen sonra bir anlık görüntü oluşturmak için şunu çalıştırırız:

$ sudo snapper -c myconfig create --command “dnf update”

Anlık görüntü meta verileri sağlama

Snapper ile bir anlık görüntü oluştururken, isteğe bağlı bir açıklama ve rolünü tanımlamamıza yardımcı olabilecek bir dizi anahtar/değer çifti sağlayabiliriz. Anlık görüntü açıklamasını oluşturma sırasında sağlamak için -d seçeneğini (–description) kullanırız ve açıklamayı argüman olarak iletiriz. Aşağıdaki örnekte, yapay bir açıklama içeren “tek” bir anlık görüntü oluşturuyoruz (açıklama boşluk içeriyorsa tek tırnak içine alınmalıdır):

$ sudo snapper -c myconfig create -d 'This is a dummy description'

-u (–userdata) seçeneği aracılığıyla virgülle ayrılmış anahtar/değer çiftlerinin bir listesini de sağlayabiliriz:

$ sudo snapper -c myconfig create -u important=yes

Anlık görüntü için bir temizleme algoritması belirtme

Anlık görüntü oluştururken onu mevcut temizleme algoritmalarından biriyle ilişkilendirebiliriz. Bir temizleme algoritması belirtmek için -c veya –cleanup-algorithm seçeneğini kullanırız. Aşağıdaki örnekte bir anlık görüntü oluşturuyoruz ve onu “sayı” algoritmasıyla ilişkilendiriyoruz:

$ sudo snapper -c myconfig create -c number

 



Mevcut temizleme algoritmalarının nasıl çalıştığı ve bunların nasıl yapılandırılacağı hakkında daha fazla bilgi edinmek için okumaya devam edin. Anlık görüntüyle ilişkili temizleme algoritması, meta verileri gibi, anlık görüntü oluşturulduktan sonra değiştir komutu ve ilgili seçenekler kullanılarak değiştirilebilir. 

Otomatik olarak saatlik anlık görüntüler oluşturma

Saatlik anlık görüntüyü otomatik olarak oluşturmak için tek yapmamız gereken, Snapper yapılandırma dosyasında TIMELINE_CREATE değişkenini “evet” olarak ayarlamak ve ardından systemd snapper-timeline.timer’ı etkinleştirmektir. Her sistemd zamanlayıcısı aynı adı taşıyan bir sistemd hizmetiyle ilişkilendirilir. Bu durumda zamanlayıcı, snapper-timeline.service’i saatte bir kez çalıştıracaktır. Zamanlayıcıyı etkinleştirmek için şunu çalıştırıyoruz:

$ sudo systemctl enable snapper-timeline.timer

Temizleme algoritmaları

Temizleme algoritmaları, anlık görüntüleri “döndürmek” ve bunların süresiz olarak birikmesini önlemek için kullanılır. Şu anda mevcut olan algoritmalar şunlardır: “sayı”, “zaman çizelgesi” ve “boş ön-posta”; nasıl çalıştıklarını görelim.

“Sayı” algoritması

“Sayı” algoritması basitçe izin verilen maksimum anlık görüntü sayısına dayanmaktadır. Bir yapılandırma dosyasında belirtilen aşağıdaki değişkenler aracılığıyla yapılandırılabilir:

  • NUMBER_CLEANUP
  • NUMBER_MIN_AGE
  • NUMBER_LIMIT
  • NUMBER_LIMIT_IMPORTANT

NUMBER_CLEANUP değişkeni bir boole değeri alır ve yapılandırma için “sayı” temizleme algoritmasının çalıştırılıp çalıştırılmayacağını belirler. Bunun yerine NUMBER_MIN_AGE değişkeni, temizleme algoritmasının uygulanması için anlık görüntülerin sahip olması gereken minimum yaş değerini kabul eder; değer saniye cinsinden belirtilir. NUMBER_LIMIT değişkeni ile aynı anda saklamak istediğimiz maksimum anlık görüntü sayısını belirtiyoruz. Son olarak, izin verilen maksimum önemli anlık görüntü sayısını ayarlamak için NUMBER_LIMIT_IMPORTANT değişkeni kullanılır. Bir snapshot’ı oluştururken yukarıda gördüğümüz gibi “önemli=evet” anahtar/değer çiftini -u seçeneğinin argümanı olarak belirterek “önemli” olarak işaretleyebiliriz.

“Zaman çizelgesi” algoritması

“Zaman çizelgesi” algoritması, saklanması gereken saatlik, günlük, haftalık, aylık ve yıllık anlık görüntülerin sayısına dayanmaktadır. “Zaman çizelgesi” algoritmasının ayarları aşağıdaki değişkenler aracılığıyla belirlenir:

  • TIMELINE_CLEANUP
  • TIMELINE_MIN_AGE
  • TIMELINE_HOURLY
  • TIMELINE_DAILY
  • TIMELINE_WEEKLY
  • TIMELINE_MONTHLY
  • TIMELINE_YEARLY

TIMELINE_CLEANUP değişkeni bir boole değeri alır: “zaman çizelgesi” algoritmasının belirli bir yapılandırma için çalışıp çalışmayacağını belirlemek için kullanılır. TIMELINE_MIN_AGE değişkeni, bir anlık görüntünün algoritma tarafından dikkate alınması gereken minimum yaşı (saniye cinsinden) belirlemek için kullanılır. Son olarak TIMELINE_HOURLY, TIMELINE_DAILY, TIMELINE_WEEKLY, TIMELINE_MONTHLY ve TIMELINE_YEARLY değişkeni, kaç saatlik, günlük, haftalık, aylık ve yıllık anlık görüntünün tutulması gerektiğini belirtmek için kullanılır.

“empty-pre-post” algoritması

“empty-pre-post” algoritması, boş farklara sahip anlık görüntü öncesi/sonrası çiftlerini silmek için kullanılır (farklı olmayan ilişkili anlık görüntüler). Aşağıdaki iki değişkeni kullanarak algoritmanın davranışını ayarlayabiliriz:

  • EMPTY_PRE_POST_CLEANUP
  • EMPTY_PRE_POST_MIN_AGE

EMPTY_PRE_POST değişkeni, temel olarak bir konfigürasyon için temizleme algoritmasını açıp kapatan bir boolean değeri alır; Bunun yerine EMPTY_PRE_POST_MIN_AGE değişkeni, bir anlık görüntünün algoritma tarafından dikkate alınması için sahip olması gereken minimum yaşı saniye cinsinden belirler.

Running a cleanup algorithm

Cleanup algorithms can be run manually via the Snapper cleanup command. When running the command, we specify the cleanup algorithm we want to run as first argument. To apply the “number” algorithm for the “myconfig” configuration, for example, we would run:

$ sudo snapper -c myconfig cleanup number

 



Snapper genellikle bir sistem temizleme zamanlayıcısı ve ilgili hizmetiyle birlikte kurulu olarak gelir. Zamanlayıcı, sistem başlatıldıktan sonra 10 dakika çalışacak şekilde yapılandırılmıştır (OnBootSec=10m) ve varsayılan olarak devre dışıdır. Etkinleştirmek için şunu çalıştırıyoruz: 

$ sudo systemctl enable snapper-cleanup.timer

Snapper-cleanup.service, etkinleştirilmiş tüm temizleme algoritmalarını mevcut yapılandırma dosyalarına uygular.

Anlık görüntüleri silme

Snapper ile bir anlık görüntüyü veya bir dizi anlık görüntüyü manuel olarak silmek için silme komutunu kullanabiliriz. Tek yapmamız gereken silmek istediğimiz anlık görüntülerin kimliklerini iletmektir. Örneğin ID 1’e sahip anlık görüntüyü kaldırmak için şunu çalıştırırız:

$ sudo snapper -c myconfig delete 1

Bunun yerine 1’den 3’e kadar anlık görüntüleri silmek için:

$ sudo snapper -c myconfig delete 1-3

Backend-specific komutlar

Daha önce de söylediğimiz gibi Snapper, arka uç olarak hem BTRFS’yi hem de ince provizyonlu LVM anlık görüntülerini destekler. Bu tür anlık görüntülerin çok farklı doğasından dolayı, belirli komutlar yalnızca belirli bir arka uçla çalışırken uygulanır.

 


Örneğin, snapper mount komutu yalnızca LVM anlık görüntüleriyle çalışırken anlamlıdır. Bu komutun yaptığı, belirtilen ince anlık görüntüyü etkinleştirmek (LVM ince anlık görüntüleri varsayılan olarak etkinleştirilmez) ve onu uygun dizine monte etmektir. Geri alma gibi diğer komutlar yalnızca BTRFS’nin arka uç olarak kullanılması durumunda çalışır. Bu komutlar hakkında daha fazla bilgi edinmek için lütfen Snapper kılavuzuna bakın.


 

 

Yazının orijinalini pper okuyabilirsiniz.