Ana Sayfa » *nix » Rsnapshot ile Uzak Linux Hostların Backuplarını Almak

Rsnapshot ile Uzak Linux Hostların Backuplarını Almak


BerbatKötüİdare EderGüzelHarika (Toplam 1 oy. 5 puan üzerinden ortalama 5,00 || Oy vererek siz de katkıda bulunabilirsiniz.)
Loading...

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:

  1. Varsa, /.snapshots/hourly.5 dizini silinir.
  2. /.snapshots/hourly.{1,2,3,4} dizinleri +1 olacak şekilde döndürülür (rotate).
  3. /.snapshots/hourly.0/ dizini, hard link ile /.snapshots/hourly.1/dizinine kopyalanır.
  4. 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 edilmiştir. Dolayısı ile 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ı depolarında rsnapshot bulunmamaktadır. kullanarak rsnapshot yüklemek için öncesinde sisteminize rpmforge isimli 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) yapabiliyor olmanız gerekir.  Bu nedenle öncelikle bu adımı tamamlamalıyız.

Key-Based SSH

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.

Warning 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. 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.
#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 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

Visited 1.039 times, 1 visit(s) today
Kategoriler: *nix |

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


  1. Hakan | (Şubat 4th, 2010 2:19 am)

    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]

  2. Hakan | (Şubat 6th, 2010 3:09 am)

    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]

Trackbacks

Yorumda bulunun.