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 を まるごとコピーしたいのですが、具体的な手順を教えてください。」を参考にした。
バックアップ先として会社のTeraStationをsambaマウントして使用した。
# 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
さあ、これで終わりだ。
リブートして見よう。