Rsnapshot ile Uzak Linux Hostların Backuplarını Almak
Warning: mysqli_query(): (HY000/3): Error writing file '/tmp/MY6YZGSN' (Errcode: 28 - No space left on device) in /usr/share/nginx/html/syslogs/wp-includes/class-wpdb.php on line 2349
Sunucularınızın network üzerinden düzenli backuplarını almak istemeniz durumunda tercih edebileceğiniz bir çok yazılım bulunuyor. Bu tip uygulamalardan birisi de rsnapshot isimli uygulamadır. Perl ile yazılmış ve lokal ya da uzaktaki sistemlerin snapshot backuplarını almaya yarayan rsnapshot, rsync kullanıyor. Yani aslında rsnapshot'ın yaptığı herşeyi aslında rsync ile yapmak mümkün, fakat rsnapshot kullanım kolaylığı sağladığı için faydalı bir araçtır.
Bu yazıda, FreeBSD ve GNU/linux sistemler için rsnapshot kurulumu, yapılandırması ve kullanımından bahsetmek istiyorum.
Çalışma Prensibi
Sisteminize rsnapshot, kurduğunuz zaman uygulama “rsnapshot.conf” isimli öntanımlı bir yapılandırma dosyası ile birlikte gelir. Yapılandırma kısmında detayına değineceğim bu dosyasının içinde tüm temel yapılandırma ayarları ve backupları alınacak sistemler için tanımlamalar yapılmaktadır. Örnek olarak uzaktaki bir sunucunun /etc dizinini backuplamak üzere bir tanım girdiğiniz zaman, rsnapshot ssh üzerinden uzaktaki sistemde belirtilen dizinlerin backup'ını alarak öntanımlı olarak ./snapshots/ dizininin altına kaydeder. (Bu dizini rsnapshot.conf dosyasından değiştirebilirsiniz.)
Rsnapshot otomatik olarak backup almak üzere (yapılandırma ayarlarından sonra) crondan çalıştırılmaktadır. Öntanımlı olarak saatlik, günlük, haftalık ve aylık olmak üzere dört adet interval'i bulunmaktadır. backup alınacak her bir aralık için ayrı bir cron görevi oluşturulur ve her interval farklı davranmaktadır.
Mesela, rsnapshot ilk defa “hourly” komutu ile saatlik intervalde çalıştırılınca, uzaktaki hosttan SSH ile alınan backup ./snapshots dizini altında hourly.0 dizinin altına kaydedilir, hourly intervalde ikinci çalışmasından sonra öncelikle hourly.0 dizini hourly.1 dizinine kopyalanır. Intervallerin kaç adet olacağı yapılandırma dosyasında belirtilir; ön tanımlı olarak daily 6, daily 7, weekly 4'tür. Yani hourly.x dizini en çok 6 adet tutulur. Rsnapshot'ı saatlik ve günlük intervallerde backup alacak şekilde cron'a eklerseniz, bir hafta sonra /.snapshots dizininin içeriği aşağıdaki gibi görünür:
[root@rsnap-host /.snapshots]# tree -L 1 . |-- daily.0 |-- daily.1 |-- daily.2 |-- daily.3 |-- daily.4 |-- daily.5 |-- daily.6 |-- hourly.0 |-- hourly.1 |-- hourly.2 |-- hourly.3 |-- hourly.4 `-- hourly.5
Görüldüğü gibi öntanımlı ayarlar nedeni ile 6 adet saatlik ve 7 adet günlük snapshot dizini bulunuyor. Bu örnekten yola çıkarak çalışma prensibini biraz daha açarsak rsnapshot hourly interval'de her çalıştığında şu işlemler gerçekleşir:
- Varsa, /.snapshots/hourly.5 dizini silinir.
- /.snapshots/hourly.{1,2,3,4} dizinleri +1 olacak şekilde döndürülür (rotate).
- /.snapshots/hourly.0/ dizini, hard link ile /.snapshots/hourly.1/dizinine kopyalanır.
- Saatlik backup /.snapshots/hourly.0/ dizinine alınır.
Sonuç olarak, en güncel backup her zaman hourly.0 dizini altında bulunur. Haftalık backup'lar için ise en güncel veri daily.6 dizininde bulunacaktır.
Genel olarak çalışma prensibine değindiktan sonra kurulum ve yapılandırma ile ilgili bölümlere geçebilirizini.
Gereksinimler
Daha önce de söylediğim gibi rsnapshot perl ile yazılmıştır ve rsync'e ihtiyaç duymaktadır. Rsnapshot'ı burada anlatıldığı şekilde sisteminizin paket yöneticisini kullanarak yapacaksanız gereksinim duyulan paketleri sisteme ayrıca yüklemenize gerek yok; fakat kurulumu kaynak koddan yapmak isterseniz perl ve rsync paketlerinin kurulu olduğuna emin olun.
Bunun dışında biz uzak sunuculardan backup alacağımız için uzak sunucularda da rsync ve OpenSSH'a ihtiyaç duyulacaktır. Backup işlemleri SSH üzerinden otomatik olarak yapılacağı için, rsnapshot host'tan uzak sunuculara şifresiz (key-based) ssh login'i olunabilmesi gerekmektedir. Bu konuya rsnapshot kurulumundan sonraki yapılandırma bölümünde değineceğim.
Kurulum
rsnapshot hemen tüm dağıtımların paket yöneticilerince kurulabilmektedir. Bu nedenle kaynak koddan derlemek yerine kolayca sisteminize ait paket yöneticisinden kurulumunu yapabiliyorsunuz. Ben burada FreeBSD, Debian ve CentOS sistemler için kurulumun nasıl yapılacağından bahsedeceğim.
FreeBSD Üzerine Rsnapshot Kurulumu
rsnapshot FreeBSD sistemlere port edilmiştir. Dolayısı ile port ağacından klasik olarak kurmak mümkündür:
# cd /usr/ports/sysutils/rsnapshot/ # make install clean
rsnapshot, çalışabilmek için perl ve rsync paketlerine ihtiyaç duyduğu için, sisteminizde yüklü değilse bu paketler de rsnapshot ile birlikte kurulacaktır.
Debian Üzerine Rsnapshot Kurulumu
Debian sistemlerde de apt-get kullanarak kolayca kurulumu yapabilirsiniz:
# apt-get install rsnapshot
Bu şekilde rsnapshot bağımlılık duyduğu tüm diğer paketlerle birlikte sisteme yüklenecektir.
CentOS Üzerine Rsnapshot Kurulumu
CentOS sistemlerin öntanımlı yum depolarında rsnapshot bulunmamaktadır. Yum kullanarak rsnapshot yüklemek için öncesinde sisteminize rpmforge isimli yum deposunu kurabilirsiniz.
Bu depo aşağıdaki şekilde kolayca kurulabilir:
CentOS 4 (i386) kullanıyorsanız:
# rpm -Uhv http://apt.sw.be/redhat/el4/en/i386/rpmforge/RPMS/rpmforge-release-0.3.6-1.el4.rf.i386.rpm
CentOS 5 (i386) kullanıyorsanız:
# rpm -Uhv http://apt.sw.be/redhat/el5/en/i386/rpmforge/RPMS/rpmforge-release-0.3.6-1.el5.rf.i386.rpm
Sisteminizin mimarisi yukarıdakilerden farklı ise şu linkten yararlanabilirsiniz:
http://dag.wieers.com/rpm/FAQ.php
rsnapshot'ın rpm'lerini de içeren yum deposunu kurduktan sonra uygulamanın kendisini herzamanki gibi yükleyebilirsiniz:
# yum install rsnapshot
Uygulamayı sisteminize kurduysanız yapılandırma işlemlerine geçebiliriz.
Yapılandırma
Bu bölümde rsnapshot yapılandırması ve uzak sistemler için backup tanımlamasından bahsedeceğim. Söylediğim gibi uzak sunuculardan SSH üzerinden bakcup alınacağı ve bu iş otomatik olarak gerçekleştirileceği için uzak sistemlere şifresiz (key-based) authentication yapabiliyor olmanız gerekir. Bu nedenle öncelikle bu adımı tamamlamalıyız.
Key-Based SSH Authentication
Bu işlem için rsnapshot çalışan sistemde bir anahtar oluşturmak ve oluşturulan anahtarın public versiyonunu backup alınacak uzak sunuculara kopyalamaktan ibaret.
Anahtar üretmek için aşağıdaki gibi ssh-keygen aracını kullanarak 2048 bitlik bir rsa key oluşturuyoruz. (passphrase kısımlarını şifresiz login olmak istediğimiz için boş geçmelisiniz.):
# ssh-keygen -t rsa
Komutun çıktısı şu şekilde olacaktır.
Generating public/private rsa key pair. Enter file in which to save the key (/root/.ssh/id_rsa): Enter passphrase (empty for no passphrase): Enter same passphrase again: Your identification has been saved in /root/.ssh/id_rsa. Your public key has been saved in /root/.ssh/id_rsa.pub. The key fingerprint is: 99:bf:cd:4a:e9:c9:4e:9b:7c:7e:ee:79:ef:d3:b0:99 root@homelab-2 The key's randomart image is: +--[ RSA 2048]----+ | | | | | | | . | | . X . | | E = S | | = X = | | = = T | | .o o o..o | +-----------------+ #
Böylece hem private hem de public key'ler oluşturularak ilgili kullanıcıya ait dizinin altındaki .ssh dizinine yerleştiriliyor. Dikkat ettiğiniz üzere key oluştururken sisteme root ile bağlı bulunuyorduk bu nedenle key, root kullanıcısı için oluşturuldu. Herhangi bir non-root kullanıcı ile de aynı işlemi yapabilirsiniz ama çoğu backup işlemi için root yetkisi gerekeceği için biz root kullanıcısına ait bir key oluşturduk.
UYARI: Herhangi bir güvenlik sorunu yaşamamanız için ssh anahtarlarını iyi muhafaza etmeniz gerekir. Private key'iniz çalınırsa, public key'inizin bulunduğu sunucularınıza -bir firewall kontrolü yoksa- şifresiz olarak erişebilirler. |
Şimdi root kullanıcısı için oluşturulmuş anahtarın public versiyonunu şifresiz olarak erişilecek sistemlere scp kullanarak ssh üzerinden kopyalayacağız.
# scp /root/.ssh/id_rsa.pub [email protected]:/root/.ssh/authorized_keys2
Bu şekilde /root/.ssh/ dizini altında bulunan id_rsa.pub isimli public anahtar uzak sunucunun aynı dizinin altına authorized_keys2 ismi ile kopyalanacaktır. Ancak burada dikkat edilmesi gereken iki konu vardır.
Uzaktaki sistemde /root dizininin altında .ssh isimli dizin bulunmuyorsa scp komutu bu yönde bir hata verecektir. Bu durumda uzaktaki sistemde aşağıda görüldüğü gibi .ssh dizinini oluşturmanız ve yetki düzenlemesi yapmanız gerekir:
# mkdir ~/.ssh # chmod 700 ~/.ssh
Bir diğer konu da backup'ını alacağınız sistemin FreeBSD olması durumunda, FreeBSD'lerin öntanımlı olarak root ile ssh erişimine izin vermemelerinden dolayı anahtarı scp ile kopayalayamacağınızdır. Bu durumda da FreeBSD üzerindeki ssh servisinin root ile ssh erişimine izin vermesi için aşağıdaki gibi tanımlama yapmanız gerekir.
Ben genellikle root ile direk ssh'a hiç bir zaman izin vermemekteyim, ancak bazen zorunlu durumlarda sadece belirli IP'in root ile login olabilmelerini sağlıyorum. Bunu için /etc/ssh/sshd_config dosyasında şu değişiklikleri yapabilirsiniz:
PermitRootLogin yes AllowUsers [email protected] kullanici1
Böylece 192.168.12.20 ip'si ile root logine izin verilecektir. Ayrıca kullanici1 isimli kullanıcı da herzamanki gibi SSH üzerinden login olabilecektir.
Key işlemleri bu kadar. Artık normal şartlarda public anahtarınızın bulunduğu hostlara şifresiz olarak bağlanabilmeniz gerekir. Kısaca root@host-ip-adresi komutuyla test edebilirsiniz.
Bu aşamadan sonra rsnapshot yapılandırması işlemine geçebiliriz.
Temel Rsnapshot Yapılandırması
Daha öncede belirttiğim gibi tüm yapılandırma işlemi rsnapshot.conf isimli dosyada yapılmaktadır.
Yapılandırma konusunda FreeBSD sistemler ile GNU/linux dağıtımları arasında çok küçük iki farklılık bulunuyor. Fakat bu farklılıklar dışında geri kalan herşey tüm sistemlerde aynıdır. Bu nedenle önce temel yapılandırma ile ilgili farklılıklara değineceğim, kullandığınız sisteme göre bu bilgilere dikkat ediniz.
FreeBSD kullanıyorsanız, rsnapshot.conf dosyası /usr/local/etc/ dizini altında rsnapshot.conf.default ismi ile bulunur. Öncelike dosyanın ismini rsnapshot.conf olarak değiştirmeniz gerekir:
cp /usr/local/etc/rsnapshot.conf.default /usr/local/etc/rsnapshot.conf
GNU/linux dağıtımlarında ise /etc dizini altında rsnapshot.conf ismi ile bulunmaktadır. Linux kullanıyorsanız, bu dosya içerisindeki cmd_cp satırının başındaki (#) işaretini kaldırarak aşağıda da görüldüğü gibi uncomment out edin.
cmd_cp /bin/cp
Bu aşamadan sonraki diğer yapılandırma işlemleri tüm sistemler için aynıdır.
Uzaktaki sistemlerden SSH üzerinden backup alacağımız için rsnapshot.conf dosyası içcerisinden cmd_ssh satırını aşağıdaki şekilde uncomment out etmeniz gerekir:
cmd_ssh /usr/bin/ssh
Ayrıca, ssh'ı 22. port dışında herhangi bir porttan çalıştırıyorsanız, bu durumu da aşağıdaki satırdan düzenleyebilirsiniz.
ssh_args -p 22
Bu ayarlar dışında daha bir çok düzenleme yapabilirsiniz. Ben özellikle hepsine değinmeyeceğim; yapılandırma dosyasını inceleyip kendi isteklerinize göre düzenlemeler yapabilirsiniz.
Son olarak, aynı dosyanın en sonunda backup tanımlamaları yapılmaktadır. Aşağıda görüldüğü gibi örnek olarak bir kaç tanımlama bulunmaktadır.
############################### ### BACKUP POINTS / SCRIPTS ### ############################### # LOCALHOST backup /home/ localhost/ backup /etc/ localhost/ backup /usr/local/ localhost/ #backup /var/log/rsnapshot localhost/ #backup /etc/passwd localhost/ #backup /home/foo/My Documents/ localhost/ #backup /foo/bar/ localhost/ one_fs=1, rsync_short_args=-urltvpog #backup_script /usr/local/bin/backup_pgsql.sh localhost/postgres/ # EXAMPLE.COM #backup_script /bin/date "+ backup of example.com started at %c" unused1 #backup [email protected]:/home/ example.com/ +rsync_long_args=--bwlimit=16,exclude=core #backup [email protected]:/etc/ example.com/ exclude=mtab,exclude=core #backup_script ssh [email protected] "mysqldump -A > /var/db/dump/mysql.sql" unused2 #backup [email protected]:/var/db/dump/ example.com/ #backup_script /bin/date "+ backup of example.com ended at %c" unused9 # CVS.SOURCEFORGE.NET #backup_script /usr/local/bin/backup_rsnapshot_cvsroot.sh rsnapshot.cvs.sourceforge.net/ # RSYNC.SAMBA.ORG #backup rsync://rsync.samba.org/rsyncftp/ rsync.samba.org/rsyncftp/
Gördüğünüz üzere hem localhost için hem de uzak sunucularla ilgili örnek satırlar bulunuyor. Local makinanın snapshot'larının alınmasını istemiyorsanız bu satırları comment out edebilirsiniz.
Biz kendi örneğimizi yapacak olursak, mesela 192.168.12.24 ip adresli sistemin /etc dizininin backup alınması için conf dosyasına şu şekilde bir tanımlama girmem gerekiyor.
backup [email protected]:/etc/ host1/ exclude=/etc/ssh,exclude=core
Yukarıdaki örneğe göre 192.168.12.24 ipli makinanın /etc dizini /etc/ssh ve core dosyalar hariç tutularak yedeklenecek ve /.snapshots/[interval.X]/host1 dizinine konulacaktır. Yapılandırma dosyasına bir ekleme yaparken dosya içerisinde boşluk yerine [tab] kullanmanız gerekmektedir. Aksi halde conf dosyası hata vermektedir.
Tanımlamalardan sonra, yapılandırmanın düzgün olup olmadığını kontrol etmek için aşağıdaki komutu kullanabilirsiniz:
# /usr/bin/rsnapshot configtest
Not: FreeBSD sistemlerde rsnapshot binary'si /usr/local/bin/ altında bulunmaktadır.
Herhangi bir sorun olmaması durumunda Syntax OK ibaresi verilecektir.
Manual olarak bir kerelik backup alıp herşeyin yolunda gittiğini tespit etmek içinse aşağıdaki komutu verebilirsiniz:
# /usr/local/bin/rsnapshot hourly
Bu komut ile saatlik intervalde bir backup alınacak ve /.snapshots/hourly.0/host1 dizinine atılacaktır.
Herşey yolunda gitti ve backup düzgün bir şekilde alındıysa, saatlik ve günlük intervalde backup alınması üzere cron'a aşağıdaki gibi bir giriş yapabilirsiniz.
# crontab -e 0 */4 * * * /usr/local/bin/rsnapshot hourly 30 23 * * * /usr/local/bin/rsnapshot daily
Yukarıdaki örneğe göre, her 4 saatte bir, saatlik, her gece 23:30'da da günlük backup alınacaktır.
Yapılandırma kısmında değinmediğim herşey için aşağıdaki linklerden yararlanabilirsiniz.
http://rsnapshot.org/howto/
http://rsnapshot.org/rsnapshot.html
Bu yazılar da ilginizi çekebilir:
- Rsync ile Senkronizasyon ve Incremental Backup İşlemleri
- Mysql – Backup to FTP (PHP Script)
- BandwidthD ile Birden Fazla Interface’i Monitor Etmek | FreeBSD
- FreeBSD – Sendmail Smart Host Configuration
- Mysql Backup to FTP (Shell Script)
Yorumlar
Trackbacks
Yorumda bulunun.
Merhaba, rsnapshot ile günlük ve haftalık backup alıyorum.Ancak her cron işleminden sonra sonuçların mail olarak atılmasını nasıl sağlayabilirim.
Teşekkürler.
[Cevapla]
Debian listelerinde yaptığım aramalarda email ile ilgili bir script buldum,tüm backup detayları disk kullanımları v.s içeren detaylı bir rapor oluşturuyor.Tek yapmanız gereken dosyayı cron’a eklemek örneğin ben günlük gece 12:00 da oluşturduğum backuplar için aynı gün içerisinde öğlen 12:00 da çalışacak şekilde mail scriptini cron’a ekledim,aradaki zamanı kendi sisteminize göre ayarlayabilirsiniz.
Script içerisi şöyle;
#!/bin/bash
#send report to:
MAILTO=”[email protected]”
MAIL=”/usr/bin/mail”
logfile=”/var/log/rsnapshot.log”
# tmp files
mailfile=”/tmp/rsmailfile”
tmplog=”/tmp/tmprslog”
# extract todays log ( format 30/Mar/2006 )
fgrep `date +”%d/%b/%Y”` $logfile >$tmplog
echo “Backup Report from on `date`” >$mailfile
echo >>$mailfile
# pick out lines with completed or error.
egrep “completed|ERROR” $tmplog >>$mailfile
echo >>$mailfile
echo “Disk Usage:” >>$mailfile
echo >>$mailfile
/usr/bin/rsnapshot du >>$mailfile
echo >>$mailfile
/bin/df -h >>$mailfile
echo >>$mailfile
echo “Info:” >>$mailfile
/usr/bin/w >>$mailfile
echo >>$mailfile
echo >>$mailfile
echo >>$mailfile
echo >>$mailfile
# Uncomment below to send full days log
#echo “Appended full days log:” >>$mailfile
#echo >>$mailfile
#cat $tmplog >>$mailfile
#Mail report file
$MAIL -s “Backup report” $MAILTO < $mailfile
#remove tmp stuff
rm -f $tmplog
rm -f $mailfile
[Cevapla]