- 更新日: 2013年8月12日
- CentOS & Linux
ディレクトリ・ファイルのバックアップとリストアの設定 〜 CentOS6
MySQL データベースのバックアップ と同様に、ディレクトリ・ファイルのデータをバックアップします。手元のクライアント側の Mac(または他の CentOS マシンなど)に、 サーバー側のディレクトリを rsync でダウンロードしてバックアップします。cron で自動で定期実行して(午前4時)、世代別バックアップを行います。
このエントリーは、CentOS 6.4 インストール~設定手順の目次 の一部です。
バックアップ用のディレクトリを作成
まずクライアント側 Mac に、バックアップ用のディレクトリを作成して書き込めるようにする。
1 2 3 4 |
$ sudo mkdir -p /var/download/backup/file $ sudo chmod 777 /var/download/backup/file |
ディレクトリの所有者を rsync の実行ユーザーに変更。rsync の実行ユーザーと揃えておかないとエラーになる。
1 2 3 4 |
$ sudo chown localuser:staff /var/download/backup/file $ sudo chown localuser:staff /var/download/backup |
rsync を用いたバックアップようのシェル・スクリプトを作成
クライアント側(Mac または CentOS)で rsync でダウンロードするシェルスクリプトを作成。howm wiki – Pdumpfs のシェルスクリプトを参考に修正する。バックアップ元は、テスト用に /home/username/test/ で作成、実際の運用時には適宜変更します。
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 |
$ vi /usr/local/sbin/file-download.sh #!/bin/bash # SSHユーザー SSHUSER="username@centos" # バックアップ元 SOURCE="$SSHUSER:/home/username/test/" # --include-from= に指定するファイル INCLUDEFROM="/usr/local/sbin/include-from.txt" # バックアップ先(クライアント側) DEST=/var/download/backup/file # $DEST/2013/04/2013-04-24_09:20:35 のディレクトリ以下にバックアップ保存する。 DIR=`date +%Y/%m` CUR="$DIR"/`date +%Y-%m-%d_%H:%M:%S` # 最新のバックアップディレクトリに $DEST/latest からシンボリックを張る LATEST="latest" DLATEST="$DEST/$LATEST" # 既存ファイルにはハードリンクを張るために --link-dest= オプションを使用。 # --link-dest= はバックアップ先 "$DEST/$CUR" からの相対パスで指定。実際には "$DEST/$LATEST" を指す。 LINKDEST="" [ -e "$DLATEST" ] && LINKDEST="--link-dest=../../../$LATEST" # バックアップ用ディレクトリを作成($DEST/2013/04/ の部分) mkdir -p "$DEST/$DIR" # バックアップ実行。 rsync -av $LINKDEST --include-from=$INCLUDEFROM -e ssh $SOURCE "$DEST/$CUR" && [ -e "$DEST/$CUR" ] && ln -snf "$DEST/$CUR" "$DLATEST" |
シェル・スクリプトは以上です。
パーミッション設定。
1 2 3 |
$ sudo chmod 755 /usr/local/sbin/file-download.sh |
バックアップ対象と除外のパスを設定するファイルを作成
次に、include-from.txt ファイルを作成して、バックアップ対象と除外のパスを設定します。バックアップ対象を以下のディレクトリとします。作業は、クライアント側の Mac で行いますが、指定するパスはサーバー機(バックアップ元)のものとなります。
/home/username/test/etc
/home/username/test/home
バックアップから除外が以下のディレクトリとします。
/home/username/test/home/www/cache/
/home/username/test/var
/home/username/test/usr
–include-from= に指定するファイルを作成。+ がバックアップ対象。- が除外。また、パスは $SOURCE(/home/username/test/)からの相対パスで指定する。
1 2 3 4 5 6 7 |
$ vi /usr/local/sbin/include-from.txt - home/www/cache/* + etc/*** + home/*** - * |
また、注意点として、”- home/www/cache/*” の行は先に書かないと期待した動作になりませんでした。以下のように書いたところ、”- home/www/cache/*” もコピーの対象となってしまって失敗。
1 2 3 4 5 6 7 |
$ vi /usr/local/sbin/include-from.txt + etc/*** + home/*** - home/www/cache/* - * |
include-from.txt ファイルも実際の運用時には適宜変更します。rsync の include-from オプションについては情報が少ないし、man もしょぼいのだけど以下が参考になりました。
バックアップのテスト用データを作成
サーバーに SSH ログインしてテスト用のデータを作成後、バックアップをテスト実行してみる。
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 |
# mkdir -p /home/username/test/etc/hoge/fuga # mkdir -p /home/username/test/home/www/html # mkdir -p /home/username/test/home/www/cache/sub # mkdir -p /home/username/test/usr/tarou # mkdir -p /home/username/test/var/backup # mkdir -p /home/username/test/var/log # echo "test1" >> /home/username/test/etc/hoge/fuga/test1.txt # echo "test2" >> /home/username/test/etc/hoge/fuga/test2.txt # echo "readme" >> /home/username/test/etc/hoge/readme.txt # echo "トップページ" >> /home/username/test/home/www/html/index.html # echo "サイトマップ" >> /home/username/test/home/www/html/sitemap.html # echo "キャッシュ1" >> /home/username/test/home/www/cache/cache1 # echo "キャッシュ2" >> /home/username/test/home/www/cache/cache2 # echo "サブキャッシュ1" >> /home/username/test/home/www/cache/sub/subcache1 # echo "サブキャッシュ2" >> /home/username/test/home/www/cache/sub/subcache2 # echo "ログファイル" >> /home/username/test/var/log/log_file.log |
tree コマンドで確認します。入ってなければ tree コマンドをインストール。
1 2 3 |
# yum -y install tree |
作ったディレクトリ・ファイルを確認。
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 |
# tree -a /home/username/test /home/username/test ├── etc │ └── hoge │ ├── fuga │ │ ├── test1.txt │ │ └── test2.txt │ └── readme.txt ├── home │ └── www │ ├── cache │ │ ├── cache1 │ │ ├── cache2 │ │ └── sub │ │ ├── subcache1 │ │ └── subcache2 │ └── html │ ├── index.html │ └── sitemap.html ├── usr │ └── tarou └── var ├── backup └── log └── log_file.log 13 directories, 10 files |
クライアント側からのバックアップの実行テスト
クライアントの Mac 側からバックアップスクリプトを実行。
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 |
$ /usr/local/sbin/file-download.sh receiving file list ... done created directory /var/download/backup/file/2013/04/2013-04-25_17:00:01 ./ etc/ etc/hoge/ etc/hoge/readme.txt etc/hoge/fuga/ etc/hoge/fuga/test1.txt etc/hoge/fuga/test2.txt home/ home/www/ home/www/cache/ home/www/html/ home/www/html/index.html home/www/html/sitemap.html sent 234 bytes received 617 bytes 1702.00 bytes/sec total size is 57 speedup is 0.07 |
バックアップしたファイルを確認します。
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 |
$ tree -a /var/download/backup/file/ /var/download/backup/file/ ├── 2013 │ └── 04 │ └── 2013-04-25_17:00:01 │ ├── etc │ │ └── hoge │ │ ├── fuga │ │ │ ├── test1.txt │ │ │ └── test2.txt │ │ └── readme.txt │ └── home │ └── www │ ├── cache │ └── html │ ├── index.html │ └── sitemap.html └── latest -> /var/download/backup/file/2013/04/2013-04-25_17:00:01 11 directories, 5 files |
狙い通りにバックアップがとれています。もう一回実行。
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 |
$ /usr/local/sbin/file-download.sh receiving file list ... done created directory /var/download/backup/file/2013/04/2013-04-25_17:03:26 ./ etc/ etc/hoge/ etc/hoge/fuga/ home/ home/www/ home/www/cache/ home/www/html/ sent 124 bytes received 330 bytes 908.00 bytes/sec total size is 57 speedup is 0.13 |
今度は、ファイル変更がないので、同一ファイルに対してはハードリンクを作成しています。
1 2 3 4 5 6 7 8 9 10 |
$ ls -li /var/download/backup/file/2013/04/2013-04-25_17:00:01/etc/hoge/fuga total 16 7404476 -rw-r--r-- 2 localuser staff 6 4 25 16:27 test1.txt 7404477 -rw-r--r-- 2 localuser staff 6 4 25 16:27 test2.txt $ ls -li /var/download/backup/file/2013/04/2013-04-25_17:03:26/etc/hoge/fuga total 16 7404476 -rw-r--r-- 2 localuser staff 6 4 25 16:27 test1.txt 7404477 -rw-r--r-- 2 localuser staff 6 4 25 16:27 test2.txt |
iノード番号が同じであることから、ハードリンクが作成されているのを確認できます。では、test1.txt を変更してさらにバックアップをとってみます。サーバーにログイン後、ファイルを変更します。
1 2 3 4 5 |
# vi /home/username/test/etc/hoge/fuga/test1.txt test1 What will happen after changing this file? |
クライアント Mac 側から、バックアップ実行。
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 |
$ /usr/local/sbin/file-download.sh receiving file list ... done created directory /var/download/backup/file/2013/04/2013-04-25_17:13:54 ./ etc/ etc/hoge/ etc/hoge/fuga/ etc/hoge/fuga/test1.txt home/ home/www/ home/www/cache/ home/www/html/ sent 153 bytes received 426 bytes 1158.00 bytes/sec total size is 100 speedup is 0.17 |
etc/hoge/fuga/test1.txt がコピーされています。tree で確認。
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 |
$ tree -a /var/download/backup/file/ /var/download/backup/file/ ├── 2013 │ └── 04 │ ├── 2013-04-25_17:00:01 │ │ ├── etc │ │ │ └── hoge │ │ │ ├── fuga │ │ │ │ ├── test1.txt │ │ │ │ └── test2.txt │ │ │ └── readme.txt │ │ └── home │ │ └── www │ │ ├── cache │ │ └── html │ │ ├── index.html │ │ └── sitemap.html │ ├── 2013-04-25_17:03:26 │ │ ├── etc │ │ │ └── hoge │ │ │ ├── fuga │ │ │ │ ├── test1.txt │ │ │ │ └── test2.txt │ │ │ └── readme.txt │ │ └── home │ │ └── www │ │ ├── cache │ │ └── html │ │ ├── index.html │ │ └── sitemap.html │ └── 2013-04-25_17:13:54 │ ├── etc │ │ └── hoge │ │ ├── fuga │ │ │ ├── test1.txt │ │ │ └── test2.txt │ │ └── readme.txt │ └── home │ └── www │ ├── cache │ └── html │ ├── index.html │ └── sitemap.html └── latest -> /var/download/backup/file/2013/04/2013-04-25_17:13:54 27 directories, 15 files |
ls で確認。
1 2 3 4 5 6 7 8 9 10 11 12 13 14 |
$ ls -li /var/download/backup/file/2013/04/2013-04-25_17:00:01/etc/hoge/fuga total 16 7404476 -rw-r--r-- 2 localuser staff 6 4 25 16:27 test1.txt 7404477 -rw-r--r-- 3 localuser staff 6 4 25 16:27 test2.txt $ ls -li /var/download/backup/file/2013/04/2013-04-25_17:03:26/etc/hoge/fuga total 16 7404476 -rw-r--r-- 2 localuser staff 6 4 25 16:27 test1.txt 7404477 -rw-r--r-- 3 localuser staff 6 4 25 16:27 test2.txt $ ls -li /var/download/backup/file/2013/04/2013-04-25_17:13:54/etc/hoge/fuga total 16 7405147 -rw-r--r-- 1 localuser staff 49 4 25 17:14 test1.txt 7404477 -rw-r--r-- 3 localuser staff 6 4 25 16:27 test2.txt |
変更した test1.txt の iノード番号が 7404476 → 7405147 へと変わっているのを確認できます。これは、ハードリンクではなくて新たにファイルがコピーされたということです。
テスト終了後に、テスト用にバックアップしたファイルをを削除します。
1 2 3 |
$ rm -rf /var/download/backup/file/* |
サーバー側のテスト用バックアップ元も削除します。
1 2 3 |
# rm -rf /home/username/test |
以上でテスト終了です。
実際の運用のためにシェル・スクリプトを編集する
テストが終了したので、実際の運用での設定にします。クライアント側 Mac で作業し、まず $SOURCE を変更します。
また、ここで1つ注意点ですが、一般ユーザーで rsync を実行しようとすると、root 所有のパーミッションが 700 などのファイルがコピーできません。なので sudo rsync を実行する必要があります。よって、rsync 実行時に –rsync-path=”sudo rsync” のオプションを付加します。
したがって、編集箇所は2箇所、$SOURCE の変更と rsync コマンドに –rsync-path=”sudo rsync” を付加する部分。
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 |
$ vi /usr/local/sbin/file-download.sh #!/bin/bash # SSHユーザー SSHUSER="username@centos" # バックアップ元。①ここを編集して、実際のバックアップ元ディレクトリを指定。 SOURCE="$SSHUSER:/" # --include-from= に指定するファイル INCLUDEFROM="/usr/local/sbin/include-from.txt" # バックアップ先(クライアント側) DEST=/var/download/backup/file # $DEST/2013/04/2013-04-24_09:20:35 のディレクトリ以下にバックアップ保存する。 DIR=`date +%Y/%m` CUR="$DIR"/`date +%Y-%m-%d_%H:%M:%S` # 最新のバックアップディレクトリに $DEST/latest からシンボリックを張る LATEST="latest" DLATEST="$DEST/$LATEST" # 既存ファイルにはハードリンクを張るために --link-dest= オプションを使用。 # --link-dest= はバックアップ先 "$DEST/$CUR" からの相対パスで指定。実際には "$DEST/$LATEST" を指す。 LINKDEST="" [ -e "$DLATEST" ] && LINKDEST="--link-dest=../../../$LATEST" # バックアップ用ディレクトリを作成($DEST/2013/04/ の部分) mkdir -p "$DEST/$DIR" # バックアップ実行。②ここを編集して --rsync-path="sudo rsync" オプションを付加。 rsync -av --rsync-path="sudo rsync" $LINKDEST --include-from=$INCLUDEFROM -e ssh $SOURCE "$DEST/$CUR" && [ -e "$DEST/$CUR" ] && ln -snf "$DEST/$CUR" "$DLATEST" |
シェル・スクリプトの編集は以上です。
rsync を実行するユーザーがパスワードなしで sudo rsync できる設定を行う
また、バックアップ元(サーバー側)で SSH 越しに rsync するユーザーが、パスワードなしで sudo rsync を実行できるように設定します。サーバーにログインして visudo から以下を追記。
1 2 3 4 5 6 7 8 9 |
# visudo # %wheel ALL=(ALL) NOPASSWD: ALL username ALL=(ALL) NOPASSWD: /usr/bin/rsync Defaults requiretty # ユーザー username が tty なしで sudo できるようにするため以下の行を追加。 Defaults:username !requiretty |
これで、ユーザー username はパスワードなしで sudo rsync が実行できます。詳しくは以下を参考。
sudo + rsync on CentOS 5 – (・∂/Sheeplogh.
sudo + rsync | きぬろぐ
バックアップ対象と除外のパスを本番用に設定
続いて include-from.txt を本番用に設定します。今回私の場合は、CentOS サーバーの /etc, /home, /root, /usr, /var ディレクトリ以下をバックアップ対象とします。クライアント側 Mac での作業ですが、指定するパスはサーバー機(バックアップ元)のものとなります。
1 2 3 4 5 6 7 8 9 10 |
$ vi /usr/local/sbin/include-from.txt # - home/www/cache/* や var/www/html/cache/* などキャッシュファイルを除外する場合は、先に設定する。 + etc/*** + home/*** + root/*** + usr/*** + var/*** - * |
バックアップを実行して確認
バックアップを実行。
1 2 3 |
$ /usr/local/sbin/file-download.sh |
確認。
1 2 3 4 5 6 7 8 9 |
$ tree -L 1 -a /var/download/backup/file/latest /var/download/backup/file/latest ├── etc ├── home ├── root ├── usr └── var |
2回目は1回目より短時間で終わる。
1 2 3 |
$ /usr/local/sbin/file-download.sh |
サーバー側とクライアント側でちゃんとコピーができているか、バックアップ元とバックアップ先のファイル数を確認してみます。
サーバー側、バックアップ元。
1 2 3 4 5 6 7 8 9 10 11 12 |
# ls /etc/* | wc -l 1655 # ls /home/* | wc -l 5 # ls /root/* | wc -l 72 # ls /usr/* | wc -l 4138 # ls /var/* | wc -l 233 |
クライアント側、バックアップ先。
1 2 3 4 5 6 7 8 9 10 11 12 |
$ ls /var/download/backup/file/latest/etc/* | wc -l 1655 $ ls /var/download/backup/file/latest/home/* | wc -l 5 $ ls /var/download/backup/file/latest/root/* | wc -l 72 $ ls /var/download/backup/file/latest/usr/* | wc -l 4137 $ ls /var/download/backup/file/latest/var/* | wc -l 233 |
ここでちょっとトラブルに遭遇。クライアント側の Mac でバックアップをさらに試した所、2回目以降の rsync バックアップ実行で以下のエラーが出ます。
1 2 3 4 5 |
rsync: failed to hard-link ../../../latest/var/lib/mysql/mysql.sock with var/lib/mysql/mysql.sock: No such file or directory (2) ... rsync error: some files/attrs were not transferred (see previous errors) (code 23) at main.c(1588) [generator=3.0.9] |
ソケットやパイプなどへのハードリンクがうまくできてない模様… まあいいや、解決策が分からないので一旦後回し。【未解決】
続いて、クライアントの Mac 側で cron を設定。午前11時に1日1回実行。
1 2 3 4 |
$ crontab -e 0 11 * * * localuser /usr/local/sbin/file-download.sh |
以上で、ディレクトリ・ファイルのバックアップ設定は終了です。世代管理で、古い世代を削除する場合は、シェルスクリプトをもう少しいじる必要があります
- – rsync 関連の参考リンク –
- UNIXの部屋 コマンド検索:rsync (*BSD/Linux)
- Command Technica:はじめてrsyncを使う方が知っておきたい6つのルール (1/2) – ITmedia エンタープライズ
- Command Technica:rsyncで差分バックアップを行うための「–link-dest」オプション – ITmedia エンタープライズ
- rsyncによるミラーリングバックアップ – GreenLeaf
- – バックアップ用スクリプトなど参考リンク –
- howm wiki – Pdumpfs
- rsync で pdumpfs みたいなことをする – daily dayflower
- NO DIGITAL NO LIFE rsyncによる2世代差分バックアップ
- 自動バックアップ運用(tar+GnuPG+rsync/ftp) – CentOSで自宅サーバー構築
- CentOS & Linux の関連記事
- Job for nginx.service failedのNginxエラー
- upstream sent too big header while reading response header from upstream(Nginx/Rails)
- Can’t get information about user clamav(clamdエラー)
- STDERR: Exception in thread “main” java.lang.InternalErrorエラー
- Linuxサーバー容量を確認するコマンドdf,duをマスターする!
- rmでファイル削除後にdf -hで容量が減らない時の対処(Linux)
- Apacheをローカルネットワークのみに公開にする
- logwatchからのメールが来ないと思ったら…
- Linuxサーバの負荷や使用率を調査するコマンドと手順
- Bashの脆弱性もう一件CVE-2014-7169に対するパッチ適用
Leave Your Message!