Differences
This shows you the differences between two versions of the page.
| coreartikel:backupdenganrsync [2005/10/19 01:51] – created bang | coreartikel:backupdenganrsync [2025/10/25 17:09] (current) – external edit 127.0.0.1 | ||
|---|---|---|---|
| Line 1: | Line 1: | ||
| + | ====== Backup filesystem dengan rsync(1) ====== | ||
| + | |||
| + | '' | ||
| + | |||
| + | Catatan singkat ini berisikan informasi konfigurasi snapshot backup menggunakan rsync, catatan ini dibuat agar backup dapat dilakukan dengan cepat dan lebih mudah untuk mengantisipasi beberapa hal yang tidak diinginkan (eg. hardware failure, dsb) | ||
| + | |||
| + | Setidaknya dibutuhkan 1 host backup tersendiri dan 1 atau lebih host yang akan dibackup. | ||
| + | |||
| + | Pada kedua host tersebut harus terinstall rsync, pastikan versi tersebut lebih besar dari 2.5.6 (untuk mengantisipasi adanya bugfixes). | ||
| + | |||
| + | Sedikit pengetahuan mengenai ssh, pembuatan passwordless public-key, dan konfigurasinya akan sedikit membantu, silahkan baca manual dari sshd(8) dan ssh_config(5). | ||
| + | |||
| + | Dari filesystem yang akan dibackup dari remote-host, | ||
| + | |||
| + | Konfigurasi pertama kali akan dilakukan di backup-host, | ||
| + | |||
| + | Buat direktori khusus backup untuk per-remote-hosts-nya, | ||
| + | |||
| + | Buat file yang berisikan daftar-daftar file/ | ||
| + | |||
| + | < | ||
| + | + / | ||
| + | + /etc/ | ||
| + | + /etc/** | ||
| + | + /usr/ | ||
| + | + /usr/local/ | ||
| + | + / | ||
| + | + /root/ | ||
| + | + /root/** | ||
| + | + /home/ | ||
| + | + /home/** | ||
| + | - * | ||
| + | </ | ||
| + | |||
| + | Sekarang pada remote-host (yang akan dibackup), buat user dan group rsync (home direktori dan shell dibuat layaknya user biasa). | ||
| + | |||
| + | Modifikasi binari dari rsync di remote-host (di backup host hal ini tidak perlu dilakukan) supaya ownernya (root: | ||
| + | |||
| + | Kopikan public-key user root di backup-host ke ~rsync/ | ||
| + | |||
| + | < | ||
| + | from=" | ||
| + | |||
| + | Buat file / | ||
| + | konfigurasi rsync: | ||
| + | |||
| + | uid = root | ||
| + | gid = root | ||
| + | use chroot = no | ||
| + | [root] | ||
| + | path = / | ||
| + | comment = speak friend and enter | ||
| + | </ | ||
| + | |||
| + | Dari backup-host, | ||
| + | |||
| + | < | ||
| + | $ cd / | ||
| + | $ sudo rsync -av -e ssh --exclude-from=hostA.rsync.list rsync@hostA:: | ||
| + | </ | ||
| + | |||
| + | Rotating backup dapat dilakukan untuk mengarsipkan backup sesuai dengan waktu yang ditentukan, untuk lebih jelasnya, silahkan baca artikel yang ada di referensi bawah (Mike Rubel) | ||
| + | |||
| + | |||
| + | < | ||
| + | == potongan script backup == | ||
| + | #!/bin/sh | ||
| + | # Wed Feb 25 16:49:01 WIT 2004 oblek | ||
| + | # | ||
| + | # Rotating backup script, based on | ||
| + | # http:// | ||
| + | # | ||
| + | # scripts will take 3 arguments, | ||
| + | # hostname, backup instruction | ||
| + | # (hourly, daily, weekly or monthly | ||
| + | # backups) and how many backup archives to keep | ||
| + | # | ||
| + | |||
| + | |||
| + | PATH=/ | ||
| + | |||
| + | _backup_path=/ | ||
| + | |||
| + | _hostname_fqdn=$1 | ||
| + | _instruction=$2 | ||
| + | _keep=$3 | ||
| + | _remote_user=rsync | ||
| + | _rsync_module=root | ||
| + | |||
| + | show_usage () { | ||
| + | echo " | ||
| + | echo "where hostname is in fqdn format, eg. foo.bar.org" | ||
| + | echo "and instruction is: hourly, daily, weekly, monthly" | ||
| + | echo "while keep is how many archives you want to keep" | ||
| + | exit 25 | ||
| + | } | ||
| + | |||
| + | # FIXME: at the moment only root can do this | ||
| + | check_uid () { | ||
| + | if [ `id -u` != 0 ]; then | ||
| + | echo "Only root can do this" | ||
| + | exit | ||
| + | fi | ||
| + | } | ||
| + | |||
| + | # check if backup directory exist | ||
| + | check_backup_path () { | ||
| + | if [ ! -d ${_backup_path} ]; then mkdir -p ${_backup_path}; | ||
| + | } | ||
| + | |||
| + | # test valid arguments | ||
| + | check_valid_args () { | ||
| + | case ${_instruction} in | ||
| + | hourly) _how_many=`seq ${_keep} 0`;; | ||
| + | daily) _how_many=`seq ${_keep} 0`;; | ||
| + | weekly) _how_many=`seq ${_keep} 0`;; | ||
| + | monthly) _how_many=`seq ${_keep} 0`;; | ||
| + | *) echo " | ||
| + | show_usage;; | ||
| + | esac | ||
| + | } | ||
| + | |||
| + | # check if hostname directory exist | ||
| + | check_host_path () { | ||
| + | # strip fqdn to leading hostname only | ||
| + | _hostname=`echo ${_hostname_fqdn} | cut -d. -f1` | ||
| + | |||
| + | if [ ! -d ${_backup_path}/ | ||
| + | echo " | ||
| + | echo " | ||
| + | for i in ${_how_many} | ||
| + | do mkdir -p ${_backup_path}/ | ||
| + | done | ||
| + | fi | ||
| + | } | ||
| + | |||
| + | # check if hostname.rsync.list is already exist, if not make a default one | ||
| + | check_rsync_exclude_list () { | ||
| + | if [ ! -f ${_backup_path}/ | ||
| + | echo " | ||
| + | cat<< | ||
| + | + / | ||
| + | + /etc/ | ||
| + | + /etc/** | ||
| + | + /usr/ | ||
| + | + /usr/local/ | ||
| + | + / | ||
| + | + /root/ | ||
| + | + /root/** | ||
| + | + /home/ | ||
| + | + /home/** | ||
| + | - * | ||
| + | EOF | ||
| + | fi | ||
| + | } | ||
| + | |||
| + | # | ||
| + | rotate_snapshot () { | ||
| + | rm -rf ${_backup_path}/ | ||
| + | |||
| + | for i in ${_how_many} | ||
| + | do mv ${_backup_path}/ | ||
| + | ${_backup_path}/ | ||
| + | done | ||
| + | } | ||
| + | |||
| + | # | ||
| + | make_snapshot () { | ||
| + | rsync \ | ||
| + | -a \ | ||
| + | -e ssh \ | ||
| + | --delete \ | ||
| + | --exclude-from=${_backup_path}/ | ||
| + | --link-dest=${_backup_path}/ | ||
| + | ${_remote_user}@${_hostname_fqdn}:: | ||
| + | } | ||
| + | |||
| + | # | ||
| + | snapshot () { | ||
| + | case ${_instruction} in | ||
| + | hourly) | ||
| + | rotate_snapshot | ||
| + | make_snapshot | ||
| + | ;; | ||
| + | daily) | ||
| + | if [ -d ${_backup_path}/ | ||
| + | rotate_snapshot | ||
| + | cp -al ${_backup_path}/ | ||
| + | else | ||
| + | rotate_snapshot | ||
| + | make_snapshot | ||
| + | fi | ||
| + | ;; | ||
| + | weekly) | ||
| + | if [ -d ${_backup_path}/ | ||
| + | rotate_snapshot | ||
| + | cp -al ${_backup_path}/ | ||
| + | else | ||
| + | rotate_snapshot | ||
| + | make_snapshot | ||
| + | fi | ||
| + | ;; | ||
| + | monthly) | ||
| + | if [ -d ${_backup_path}/ | ||
| + | rotate_snapshot | ||
| + | cp -al ${_backup_path}/ | ||
| + | else | ||
| + | rotate_snapshot | ||
| + | make_snapshot | ||
| + | fi | ||
| + | ;; | ||
| + | esac | ||
| + | } | ||
| + | |||
| + | # main | ||
| + | check_uid | ||
| + | check_backup_path | ||
| + | check_valid_args | ||
| + | check_host_path | ||
| + | check_rsync_exclude_list | ||
| + | snapshot | ||
| + | </ | ||
| + | |||
| + | ===== Referensi: ===== | ||
| + | |||
| + | * [[http:// | ||
| + | * [[http:// | ||
| + | * [[http:// | ||
| + | |||