Verilerinizin ya da sisteminizin yedeğini almanın ne kadar önemli olduğunu birçok yerde okumuşsunuzdur- böylece veriler ulaşılmaz hale gelirse yedekten geri sararak kaldığınız yerden devam edebilirsiniz. Peki ya son aldığınız yedek ya da sistem imajı 2 ay öncesine aitse?
"O zaman düzenli olarak yedek almalıyız" diye düşünebilirsiniz, ama iki günde bir tüm verileri kopyalayıp harici bir sabit diske yapıştırmak normal insanlar için pek sürdürülebilir değil. Daha eğlenceli ve daha az yorucu bir seçenek ise bilgisayara otomatik yedekleme yaptırmak. Bunun için rsync adlı programı görev zamanlama aracı cron ile birlikte kullanabiliriz.
rsync, bir dosyanın iki kopyasını bulundurmaya yarayan bir program. cp'den ya da herhangi başka bir kopyalama programından farklı olarak rsync söz konusu dosyanın eski bir kopyası elindeyse dosya bloklarını karşılaştırarak sadece değişen bölümleri kopyalar, böylece aktarılan veri miktarını yüksek derecede azaltır.
Tek yedek
Eğer sadece günlük/haftalık/üç ayda bir güncellenen tek bir yedek bulundurmak istiyorsanız basitçe rsync'in arşiv -a ayarı ile cron programını birlikte kullanabilirsiniz.
$ crontab -e
0 2 * * 1 rsync -av /home/cow/onemli/ /home/cow/yedek
Her pazartesi -haftanın 1.günü- 02:00'da çalışacak bir komut. (kolay crontab girdileri için crontab.guru)
Kendi haline bırakıldığında rsync kaynak dizinde silindiğini gördüğü dosyaları hedef dizinde silmez. Eğer yerden tasarruf etmek ya da dosyalarınızı sildiğinizde silindiğinden emin olmak istiyorsanız --delete ayarını kullanmalısınız.
$ rsync -av --delete /home/cow/onemli/ /home/cow/yedek
-v ayarı rsync'in ne yaptığını daha detaylı göstermesini sağlar. Eğer --delete ayarını kullanacaksanız kaynak ile hedef dizinlerini karıştırmamak için ekstra dikkat göstermelisiniz: rsync boş bir dizinle kaynak dizininizi senkronize ederse bu sizin için iyi olmayabilir.
Sabit diskinizin bozulmasına karşı önlem almak istiyorsanız rsync'i SSH üzerinden başka bir makineye yedek almak için kullanabilirsiniz, o zaman şöyle bir şey yapmanız gerekecektir:
$ rsync -avz -e ssh /home/cow/onemli/ cow@144.122.106.107:/home/cow/yedek
-z ayarı gönderilen veriyi sıkıştırmaya yarıyor. Bu komutu otomatik olarak çalıştırmak için SSH anahtarlarına ihtiyacınız olacak.
Birden fazla yedek
cron ve rsync'i ayarlayıp günlük yedekler aldığımızı düşünelim. Oldukça güvenli duruyor ama, yaptığımız bir hatayı çoktan yedeklerin üstüne yazıldıktan sonra fark edebiliriz. Bunu engellemek için birden fazla yedek tutmak mümkün.
Birden fazla yedeği ayrı yerlerde tutmak diskte çok yer kaplayacaktır -ev dizininizin beş kopyasını tuttuğunuzu düşünün- ama bu yedeklerin birçok ortak dosyası olduğunu da biliyoruz. Bu sorunun çözümü için Linux "hard-link"lerine bir göz atalım.
Linux'ta ve diğer Unixvari sistemlerde bir dosyanın adı aslında o dosyaya giden bir bağlantıdır(hard-link). rm a dediğimizde yalnızca a ile dosya bloklarının bağlantısını kesmiş oluruz (unlink()). Eğer a o dosyaya giden son bağlantıysa o dosya silinmiş olur. Bir dosya için birden fazla "hard-link" olabilir, yani aynı dosyaya işaret eden birden fazla dosya adı bulunabilir.
Bu özellikten yedekler arasında değişmeyen dosyaların paylaşımı için yararlanabiliriz- rsync "değişmeyen dosyalar için buraya bağlantı ver" anlamına gelen --link-dest adlı bir ayara sahip. Bunu nasıl kullanacağımızı görelim:
$ rsync -av /home/cow/onemli/ /home/cow/yedek # ilk "tam" yedek
$ rsync -av /home/cow/onemli/ --link-dest=/home/cow/yedek /home/cow/yedek.0
Artık yedek.0 içindeki yedek ile aynı olan dosyalar dosya sisteminde aynı yere işaret ediyor, yani /home/cow/onemli/ dizininin iki farklı versiyonunu çok fazla disk alanı kullanmadan depolamış olduk. Bu özelliği kullanarak "son üç günün" ya da "son beş haftanın" yedeklerini tutmak çok zor değil.
rm -rf yedek.3 # yedek.3 en eski yedek- onu siliyoruz
mv yedek.2 yedek.3
mv yedek.1 yedek.2
mv yedek.0 yedek.1
rsync -av /home/cow/onemli/ --link-dest=yedek.1 yedek.0
Son üç vaktin yedeklerini alan temel bir script.
Bu temel örnek birçok farklı yolla genişletilebilir. Yedekleri -e ssh ile farklı bir makineye alabilirsiniz, eski yedekleri silmek yerine sıkıştırabilirsiniz(tar -cJ), date ile yedekleri tarihe göre işaretleyebilirsiniz. Hatta gzip --rsyncable kullanarak rsync dostu sıkıştırılmış yedekler bile elde edilebilir.
Son olarak, yedeklerinizi olabildiğince salt-okunur yapmayı unutmayın, böylece herhangi bir programın sizin haberiniz olmadan yedeklerinizin üstüne yazmasını ve onları işe yaramaz hale getirmesini önlemiş olursunuz. Bunun için en yaygın yöntem yedekleri root'a ait bir dizinin içine almak, ama diskinizde bir yedek bölümü(partition) oluşturup onu salt-okunur şekilde mount etmek ve sadece rsync çalışırken açmak (mount -o remount,rw) daha etkili bir yol olacaktır. Kendi bilgisayarınızın kullanılmaz hale gelmesine karşı yedeklerinizi başka bir makinede bulundurmak isteyebilirsiniz.
Yedekten kurtarma
$ rsync -av yedek.0/ /home/cow/onemli. Bu kadar.
İleri okuma:
Rsync algoritması(1996): andrew.cmu.edu
lsyncd, Dropbox benzeri, arka planda rsync kullanan senkronizasyon programı: github.com
grsync, rsync için grafik arayüz: opbyte.it
2002 Mike Rubel makalesi: mikerubel.org