ファイルをバックアップしよう

ハードディスクはかなり壊れやすい装置です (SSD はどうだか知りません…)。なので、ファイルというかディスク全体のバックアップを取っとかないと、恐ろしいことになります。ということで、 Slackware マシンのディスクを外付けディスクにバックアップしましょう、という想定です。

バックアップソリューションは色々ありますが、マシン単体のバックアップをするなら、dump か rsnapshot でしょうか。

dump は Linux 標準のバックアップシステムといっていい代物です。ファイルシステム全体のイメージをダンプします。リストアには専用の restore コマンドを使います。何故か Slackware 14.1 には dump コマンドが入っておらず、SlackBuilds に頼らないといけません。あんまり使ったこともないし、ダンプしたイメージが破損してたという素敵な思い出もあります。

rsnapshot は rsync を使ったバックアップシステムです。Mac OS X の Time Machine みたいなものです。これはただのファイルコピーなので、特定のファイルだけを復旧したい、という時も迅速に対応できます。外付けのディスクだけでなく、リ モートホストに/リモートホストからバックアップすることもできます (dump にも rdump というのがあります)。

ということで、rsnapshot をインストールしましょう。SlackBuilds.org からパッケージをダウンロードします。http://slackbuilds.org/repository/14.1/misc/rsnapshot/. ビルドのやり方はソースコードをらくらくコンパイルを参考にしてください。

インストールが終わったら、/etc/rsnapshot.conf を編集します。

cd /etc
# オリジナルファイルをコピーしておきます
sudo cp rsnapshot.conf rsnapshot.conf.default
sudo vim rsnapshot.conf

血迷って日本語訳しました。小一時間かかったので、誰かの役に立てば良いんですが。微妙に設定がデフォルトと違うので注意してください。

#################################################
# rsnapshot.conf - rsnapshot の設定ファイル     #
#################################################
#                                               #
# 以下のルールに注意してください:              #
#                                               #
# このファイルは要素間にタブが必要です          #
#                                               #
# ディレクトリ名の末尾にスラッシュが必要です:  #
#   正解 : /home/                              #
#   不正解: /home                               #
#                                               #
#################################################

###############################
# CONFIG ファイルのバージョン #
###############################

config_version  1.2

#################################
# SNAPSHOT のルートディレクトリ #
#################################

# 全てのスナップショットはこのルートディレクトリ以下に保存されます。
#
snapshot_root   /.snapshots/

# no_create_root が有効だと、rsnapshot はsnapshot_root ディレクトリを自動
# 的には作成しません。これは FireWire や USB 等のリムーバブルメディアに
# バックアップする時に特に便利です。
#
#no_create_root 1

#################################
# 外部プログラムとの依存関係    #
#################################

# LINUX ユーザー: "cmd_cp" をアンコメントして下さい。追加機能が利用可能になり
#                 ます。
# それ以外の人:   互換性のため、"cmd_cp" をコメントアウトしたままにして下さい。
#
# 詳細は README ファイルか man ページを見て下さい。
#
cmd_cp          /usr/bin/cp

# 内蔵の perl ルーチンの代わりに rm プログラムを使うには、これをアンコメント
# して下さい。
#
cmd_rm          /usr/bin/rm

# 何をするにも rsync は必須です。これが唯一の必須コマンドです。
#
cmd_rsync       /usr/bin/rsync

# rsync を使ってリモートに ssh でバックアップするには、これをアンコメント
# して下さい。
#
#cmd_ssh        /usr/bin/ssh

# syslog サポートを無効にするには、これをコメントアウトして下さい。
#
cmd_logger      /usr/bin/logger

# ディスク使用状況の確認に使う "du" へのパスを指定するには、これをアン
# コメントして下さい。古いバージョンの "du" を使う場合、下の "du_args" 
# パラメータも確認した方がいいかも知れません。
#
cmd_du          /usr/bin/du

# rsnapshot-diff へのパスを指定するには、これをアンコメントして下さい。
#
cmd_rsnapshot_diff      /usr/bin/rsnapshot-diff

# rsnapshot がファイルを同期する直前に実行するスクリプト (および
# オプションの引数) へのパスを指定子て下さい。
#
#cmd_preexec    /path/to/preexec/script

# rsnapshot がファイルを同期した直後に実行するスクリプト (および
# オプションの引数) へのパスを指定子て下さい。
#
#cmd_postexec   /path/to/postexec/script

#########################################
#           バックアップ間隔            #
# ユニークかつ昇順でなければなりません  #
# つまり、hourly, daily, weekly 等々。  #
#########################################

#interval       hourly  6
interval        daily   7
interval        weekly  4
#interval       monthly 3

#################################################
#             グローバルオプション              #
# 全てオプション。適切なデフォルト値を持ちます。#
#################################################

# 冗長さの度合い、 1 から 5.
# 1     静か            致命的エラーのみ
# 2     デフォルト      エラーと警告のみ
# 3     冗長            実行されたシェルコマンドを表示
# 4     更に冗長        より冗長な情報を表示
# 5     デバッグモード  全て
#
verbose         2

# 上の "verbose" と同じですが、これを使うとログファイルに送られるデータ
# の量を制御できます。デフォルトは 3 です。
#
loglevel        3

# これを有効にすると、指定したファイルにデータが書き込まれます。書かれる
# データの量は "loglevel" パラメータで制御します。
#
logfile /var/log/rsnapshot

# 有効にすると、2つのインスタンスが同時に実行する (そして snapshot_root を
# めちゃくちゃにする) ことを防ぐためのロックファイルを書き込みます。
# 有効にする場合、ロックファイルディレクトリを無関係なユーザーからは書き
# 込みできないようにして下さい。さもないと、プログラムの実行を邪魔すること
# が可能になってしまいます。
#
lockfile        /var/run/rsnapshot.pid

# デフォルトの rsync 引数。全ての rsync コマンドは最低でもこれらの
# オプションがセットされます。
#
#rsync_short_args       -a
#rsync_long_args        --delete --numeric-ids --relative --delete-excluded

# デフォルトでは ssh に渡される引数はありませんが、ここで指定することが
# できます。
#
#ssh_args       -p 22

# "du" プログラム (ディスク使用状況の報告) のデフォルトの引数。GNU 版の "du"
# が望ましいです。詳細は man ページを見て下さい。もし利用中の "du" が -h
# フラグに非対応の場合は、-k フラグを試して下さい。
#
#du_args        -csh

# 有効にすると、rsync がバックアップポイント内でファイルシステムの
# パーティションをまたがなくなります。これは rsync に -x オプションを渡すと
# いうことです。
# デフォルトは 0 (オフ) です。
#
one_fs          1

# include と exclude パラメータは rsync に直接渡されます。複数の include/
# exclude パラメータを使う場合、それぞれで行を分けて下さい。ファイル名の
# パターンの指定方法については rsync の man ページの --include と --exclude
# オプションを見て下さい。
#
# 
exclude /.snapshots/
#include        ???
#include        ???
#exclude        ???
#exclude        ???

# include_file と exclude_file パラメータは rsync に直接渡されます。詳細は
# rsync の man ページの --include-from と --exclude-from オプションを見て
# 下さい。
#
#include_file   /path/to/include/file
#exclude_file   /path/to/exclude/file

# 使用する rsync が --link-dest に対応しているなら、これを有効にしても良い
# でしょう。これが特殊ファイル (FIFO 等) をクロスプラットフォームでサポート
# する最善の方法です。
# デフォルトは 0 (off) です。
#
link_dest       1

# sync_first を有効にすると、rsnapshot のデフォルトの挙動が変わります。通常、
# rsnapshot が最短の間隔 (つまり "rsnapshot hourly") で呼び出されると、
# ファイルを同期「してから」ローテートします。sync_first を有効にすると、
# "rsnapshot sync" がファイルの同期を行った後、全てのインターバルがファイル
# のローテートを呼び出します。詳細は man ページを見て下さい。デフォルトは
# 0 (オフ) です。
#
sync_first      0

# 有効にすると、rsnapshot は各インターバルの一番古いディレクトリを
# [interval_name].delete に移動し、終了間際にロックファイルとその
# ディレクトリを削除します。デフォルトは 0 (オフ) です。
#
#use_lazy_deletes       0

# rsync のリトライ回数。ネットワークの問題や、例えば、ssh で
# "Corrupted MAC on input" エラーを起こすようなネットワークカードの
# 問題を経験した場合、これを非ゼロの値に設定して rsync を再実行させて
# 下さい。
#
#rsync_numtries 0

########################################
### バックアップポイントとスクリプト ###
########################################

# LOCALHOST
backup  /       localhost/
backup  /boot   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 root@example.com:/home/ example.com/    +rsync_long_args=--bwlimit=16,exclude=core
#backup root@example.com:/etc/  example.com/    exclude=mtab,exclude=core
#backup_script  ssh root@example.com "mysqldump -A > /var/db/dump/mysql.sql" unused2
#backup root@example.com:/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/

上のコンフィグですが、/ と /boot の2つのパーティションを /.snapshots にバックアップします。実用する時は /.snapshots に外部のディスクのマウントしておいて下さい。今回はただのテストなので、外部ディスクを使いません (バックアップ元と先のディスクが同じ)。なので、 /.snapshots ディレクトリのバックアップを取らないように exclude で除外してます。日別バックアップを7個まで、週別バックアップを4個まで保存します。バックアップ先のディスクの容量の様子を見ながら調節しましょう。

コンフィグファイルを作ったらテストします。

rsnapshot -t daily
# 実行結果
#echo 32595 > /var/run/rsnapshot.pid 
#mkdir -m 0700 -p /.snapshots/

-t はテストの t です。

実際にバックアップを取るには、以下のように cron ジョブを設定します。

0 2 * * * root rsnapshot daily
0 4 * * 0 root rsnapshot weekly

上の rsnapshot.conf でログファイルを書くように設定したので、logrotate で定期的にローテートさせます。

/var/log/rsnapshot {
        notifempty
        weekly
}

すると、こういう感じに日々バックアップが作成されます。

sudo find /.snapshots -maxdepth 2
# 実行結果
#/.snapshots
#/.snapshots/daily.0
#/.snapshots/daily.0/localhost</pre>
daily.0/localhost 内に / の内容がコピーされるわけですが、各バックアップで全く同じ内容のファイルはハードリンクしてくれるので、ディスク容量はそれほど食わない…はずです。

(コウヅ)

広告

コメントを残す

以下に詳細を記入するか、アイコンをクリックしてログインしてください。

WordPress.com ロゴ

WordPress.com アカウントを使ってコメントしています。 ログアウト / 変更 )

Twitter 画像

Twitter アカウントを使ってコメントしています。 ログアウト / 変更 )

Facebook の写真

Facebook アカウントを使ってコメントしています。 ログアウト / 変更 )

Google+ フォト

Google+ アカウントを使ってコメントしています。 ログアウト / 変更 )

%s と連携中