HDD(ファイルシステム)の管理

上のように各パーティションファイルシステムを配置した上で、ファイルシステムのバックアップは次のように行う。

フルバックアップ

Fedora 8(等)のLiveCDでシステムを立ち上げて行う。
LiveCDはキャラクタコンソールで立ち上げるか、Xウィンドウ環境から「init 3」でキャラクタモードに切り替えてから行う。
その際に、/dev/sda、/dev/sdbの両方の全てのパーティションがマウントされていないことを確認する。
また、/dev/sda2をスワップとして利用しているので、swapoffしておく。

# mount (確認のため)
# swapoff /dev/sda2
# free (確認のため)
# dd if=/dev/sda of=/dev/sdb bs=1316044800

フルバックアップには約4時間かかった。

フルバックアップ終了後、MBRもコピーしてしまっているので、/dev/sdb2のパーティションのシステムIDが「Linux swap / Solaris(82)」となってしまっている。fdiskのtコマンドで83(Linux)に修復しておく。(パーティションの大きさは変わらないのでシステムIDだけを変えておけばいい。)

# fdisk /dev/sdb
Command (m for help): t
Partition number (1-4): 2
Hex code (type L to list codes): 83

Command (m for help): w

リブートして起動後、/dev/sdb1 を /dev/sdb2 にコピーしておく。(/dev/sdb2 を現行ルートファイルシステムの保存用とするため。)

# dd if=/dev/sdb1 of=/dev/sdb2 bs=1316044800

ルートファイルシステムのコピーは約3分。

/dev/sdb1 はgrubのブートメニューで補助用のルートファイルシステムとして使えるように、fstab を書き換えておく。

# mount /dev/sdb1 /secondary/root1
# vi /secondary/root1/etc/fstab

/dev/sdb1               /                              ext3    defaults        1 1
  :
/dev/sda1               /no_mount               ext3    noauto          0 0
  :

# umount /secondary/root1

後は必要に応じて、ルートや/bootのイメージをファイルとして残しておく。

# mount /dev/sdb2 /secondary/root2
# cd /secondary/root2/tmp
# rm -rf .??* *
# dd if=/dev/zero of=zero bs=1316044800
# rm zero
# cd /home/backup
# umount /secondary/root2
# dd if=/dev/sdb2 of=ROOT.img bs=1316044800
# bzip2 ROOT.img


# dd if=/dev/zero of=/boot/zero bs=8225280
# rm /boot/zero
# umount /boot
# dd if=/dev/sda4 of=BOOT.img bs=8225280
# mount /boot
# bzip2 BOOT.img

/bootファイルシステムのコピーは数秒で終わる。

ルートファイルシステムだけのバックアップ

grubで/dev/sdb1をルートファイルシステムとしてブートして、/dev/sda1 を /dev/sdb2 へコピーする。双方のパーティションがマウントされていないことを確認する。

# mount (確認のため)
# dd if=/dev/sda1 of=/dev/sdb2 bs=1316044800 

約3分で終了。リブートして終わり。
必要に応じて、/dev/sdb2 から /dev/sdb1 へ補助用のルートファイルシステムとしてコピーする。(fstabの修正も併せて行う。)

/bootファイルシステムだけのバックアップ

/bootは意識的に変更する以外はシステム起動中は書き換えられることはないので、rsyncでバックアップすれば良い。

# mount /dev/sdb4 /secondary/boot
# rsync -ax --delete /boot/ /secondary/boot/
# umount /secondary/boot

イメージコピーする場合は以下の通り。

# umount /boot
# dd if=/dev/sda4 of=/dev/sdb4 bs=8225280
# mount /boot

数秒で終わるのでイメージバックアップでもいいだろう。

/homeのバックアップ

今回、一番問題なのが/homeファイルシステムのバックアップである。約472GBなのでイメージコピーだと約4時間かかる。フルバックアップはオフラインでも仕方ないが、定期的な(毎日、もしくは1習慣程度の)バックアップで約4時間のオフラインにて一々管理するのも大変だ。tar や dump&restore でファイル単位のバックアップをしても数百ギガもあれば数時間かかってしまう。
最初はLinuxのLVMを使ってスナップショットを使ったオンラインのバックアップを検討したが、数時間のバックアップのためにパフォーマンスの低下させるのもイマイチである。(商用であれば、その分高性能のシステムを導入してLVMを使った方が色々と便利かと思うが、たかだかホームサーバだし、限られた予算でそこそこの性能のPCなので、通常時の性能を重視したい。一度、仮想マシンのようなディスクアクセスのオーバーヘッドが大きいアプリケーションでLVMがその程度影響するのかは比較測定してみたいが。)

そこで、/homeに関しては rsyncコマンドを使った差分バックアップをcronで実行することにする。仮想マシン稼働中は、そのマシンの仮想ディスクは正常にバックアップされない可能性が高いが、そこはトレードオフとする。rsyncを使った差分バックアップ用のシェルスクリプトはこれから作成するが、骨子とすれば次の通り。

# mount /dev/sdb3 /secondary/home
# rsync -ax --delete /home/ /secondary/home/
# umount /secondary/home