FreeSBIEでバックアップ/リストア

VMware上で動作している影舞用FreeBSDをPC上に移動することを想定して、システムをバックアップ→リストアする方法を考えた。
FreeBSDのドキュメントによれば、dumpコマンドでバックアップし、restoreコマンドでリストアするのが最も推奨する方法らしい。
また、多くのサイトでdumpとrestoreを使用してバックアップ/リストアする方法を紹介している。
そこで、バックアップは既存のFreeBSD上で行い、リストアはLive CD*1で起動したFreeBSD上で行うことを考えたが、問題はLive CDをどうやって準備するかである。
"FreeBSD Live CD"をgoogle検索したところ、Wikipediaへのリンクが目に止まり、FreeSBIE(フリスビー)FreeBSDの代表的なLive CDとして紹介されていた。
自分でLive CDを作成する方法もあるのだが、目的から外れるので今回はこれを使用することにした。
dumpとrestoreの使い方はFreeBSD QandA 1859「Q. FreeBSDのインストールが終った HDD を まるごとコピーしたいのですが、具体的な手順を教えてください。」を参考にした。


バックアップ先として会社のTeraStationsambaマウントして使用した。

# mkdir /mnt/tera
# mount_smbfs -I 192.168.xxx.xxx //user@server/share /mnt/tera

バックアップしたデータは以下の通りである。

マウント情報

マウント情報はどのパーティションをどのディレクトリに割り当てるのかを定義したもので、/etc/fstabがそうである。

# mkdir /mnt/tera/kagemai/
# cp /etc/fstab /mnt/tera/kagemai/
# cat /mnt/tera/kagemai/fatab

# Device    Mountpoint FStype Options   Dump Pa ss#
/dev/da0s1b none       swap   sw        0    0
/dev/da0s1a /          ufs    rw,async  1    1
/dev/da0s1e /tmp       ufs    rw,async  2    2
/dev/da0s1f /usr       ufs    rw,async  2    2
/dev/da0s1d /var       ufs    rw,async  2    2
/dev/acd0   /cdrom     cd9660 ro,noauto 0    0

影舞用FreeBSDでは安全性よりもアクセス速度を優先し、Optionsにasyncを追加してライトキャッシュを有効にしている。
念のため、mountコマンドやdfコマンドで現在のマウント状況も保存して置く。

# mount > /mnt/tera/mount.txt
# cat /mnt/tera/mount.txt

/dev/da0s1a on / (ufs, asynchronous, local)
devfs on /dev (devfs, local)
/dev/da0s1e on /tmp (ufs, local, soft-updates)
/dev/da0s1f on /usr (ufs, local, soft-updates)
/dev/da0s1d on /var (ufs, local, soft-updates)

# df > /mnt/tera/df.txt
# cat /mnt/tera/df.txt

Filesystem  1K-blocks   Used   Avail Capacity Mounted on
/dev/da0s1a    253678  35832  197552    15%   /
devfs               1      1       0   100%   /dev
/dev/da0s1e    253678    782  232602     0%   /tmp
/dev/da0s1f  11254484 778884 9575242     8%   /usr
/dev/da0s1d    253678  91506  141878    39%   /var

ディスクラベル情報

VMware上では12GBの仮想HDDを作成し、それが一杯となる物理パーティションを作成した。
ディスクラベルは物理パーティション内の論理パーティションを定義するものである。

# disklabel /dev/da0s1 > /mnt/tera/kagemai/da0s1.label
# cat /mnt/tera/kagemai/da0s1.label

# /dev/da0s1:
6 partitions:
#        size  offset fstype [fsize bsize bps/cpg]
  a:   524288       0 4.2BSD   2048 16384 32776
  b:   341648  524288   swap
  c: 25157727       0 unused      0     0 # "raw" part, don't edit
  d:   524288  865936 4.2BSD   2048 16384 32776
  e:   524288 1390224 4.2BSD   2048 16384 32776
  f: 23243215 1914512 4.2BSD   2048 16384 28552

VMware上でSCSI HDDを作成したので/dev/da...となる。
これがIDE HDDならば/dev/ad...である。

パーティションイメージ

パーティションの中身はdumpコマンドでバックアップする。

# dump 0af /mnt/tera/kagemai/da0s1a.dump /
# dump 0af /mnt/tera/kagemai/da0s1d.dump /var
# dump 0af /mnt/tera/kagemai/da0s1e.dump /tmp
# dump 0af /mnt/tera/kagemai/da0s1f.dump /usr

これでバックアップは完了である。


次はリストアする手順である。

物理パーティション(スライス)の作成

新しいHDD(今回はIDE)をPCに接続し、FreeSBIE CDでブートする。
キーボードの選択ではJapanese 106、キーボードレイアウトの選択ではjp、ユーザインターフェースの選択ではconsole tcshを選択する。
コンソールでsysinstall→Configure→Fdiskで物理パーティションを作成する。
実際には、接続したHDDは80GB、搭載メモりは384MBなので、スワップ領域の拡張を考えて20GBの物理パーティション(UFSタイプ)を作成した。
このとき、物理パーティションのブロックサイズ(41929587)をメモして置く。

ディスクラベルの編集と反映

バックアップ時と同様にTeraStationをマウントする。

# mkdir /mnt/tera
# mount_smbfs -I 192.168.xxx.xxx //user@server/share /mnt/tera

ディスクラベルをコピーして編集する。
ポイントは物理パーティションの拡大、スワップ領域の拡張とこれらに伴うオフセットの変更である。

# cp /mnt/tera/kagemai/da0s1.label /mnt/tera/kagemai/ad0s1.label
# vim /mnt/tera/kagemai/ad0s1.label

# /dev/ad0s1:
6 partitions:
#        size  offset fstype [fsize bsize bps/cpg]
  a:   524288       0 4.2BSD   2048 16384 32776
  b:  8388608  524288   swap
  c: 41929587       0 unused      0     0 # "raw" part, don't edit
  d:   524288 8912896 4.2BSD   2048 16384 32776
  e:   524288 9437184 4.2BSD   2048 16384 32776
  f: 23243215 9961472 4.2BSD   2048 16384 28552

b:のスワップ領域は、今後2GBのメモリを搭載しても拡張する必要がないように、4GBに拡張する。

ブロック(セクタ)サイズは512バイ
スワップ領域は 4 * 1024 * 1024 * 1024 / 512 = 8388608

c:は物理パーティション全体を意味するので、先にメモして置いた値を入れる。
このc:を除いて、オフセットには1つ前の論理パーティションのサイズとオフセットを加えた値を入れる。
値の計算にはEXCELなどの表計算ソフトを使用すると楽である。
出来上がったディスクラベルをHDDに書き込む。

# disklabel -R -B /dev/ad0s1 /mnt/tera/kagemai/ad0s1.label

ファイルシステムの作成

作成した論理パーティションファイルシステムを書き込んでフォーマットを行う。

# newfs /dev/ad0s1a
# newfs /dev/ad0s1d
# newfs /dev/ad0s1e
# newfs /dev/ad0s1f

スワップ領域の/dev/ad0s1bや、物理パーティション全体を指す/dev/ad0s1cはフォーマットをする必要がない。
それにしてもWindowsと比較すると驚くほど速い。
オペレータが望まない限り、余計な処理*2を行わない意識があるからだ。

ルートパーティションのリストア

先ずはルートパーティションのリストアを行う。

# mkdir /hd
# mount /dev/ad0s1a /hd
# cd /hd
# restore rf /mnt/tera/kagemai/da0s1a.dump
# rm restoresymtable

それ以外のパーティションのリストア

次にルート以外のパーティションのリストアを行う。
どこにマウントすべきかは、バックアップ時に保存して置いたマウント情報が役に立つ。

# mount /dev/ad0s1d /hd/var
# cd /hd/var
 restore rf /mnt/tera/kagemai/da0s1d.dump
# rm restoresymtable
# mount /dev/ad0s1e /hd/tmp
# cd /hd/tmp
# restore rf /mnt/tera/kagemai/da0s1e.dump
# rm restoresymtable
# mount /dev/ad0s1f /hd/usr
# cd /hd/usr
# restore rf /mnt/tera/kagemai/da0s1f.dump
# rm restoresymtable

マウント情報の変更

最後にマウント情報の変更を行う。
HDDのインターフェースを変更した場合、これを行わないとルートファイルシステムが見つからない旨のメッセージが表示され、起動しなくなってしまうので注意が必要だ。

# vim /etc/fstab

# Device    Mountpoint FStype Options   Dump Pa ss#
/dev/ad0s1b none       swap   sw        0    0
/dev/ad0s1a /          ufs    rw,async  1    1
/dev/ad0s1e /tmp       ufs    rw,async  2    2
/dev/ad0s1f /usr       ufs    rw,async  2    2
/dev/ad0s1d /var       ufs    rw,async  2    2
/dev/acd0   /cdrom     cd9660 ro,noauto 0    0

もし、この手順を忘れてしまっても、慌てずにFreeSBIE CDで起動し直し、次のコマンドを入力してから、マウント情報の変更を行えば良い。

# mkdir /hd
# mount /dev/ad0s1a /hd
# cd /hd


さあ、これで終わりだ。
リブートして見よう。


*1:OSがインストールされているCDのこと。

*2:論理フォーマットの場合はディスクチェックなど。別途fsckを使用すれば良い。