FreeBSDマシンをフルコピーで作る

概要

マシンがクラッシュした時のために同じマシンを作ったり、 ほとんど同じ機能を持つマシンがもう一台欲しいときに、 すでにインストール済みのFreeBSDマシンのコピーを作りたい場合があります。 これを行う方法としては以下のものが考えられます しかし dd を使うと、ファイルシステム全体をコピーするために 使っていないディスクの部分もすべてコピーするので無駄が多いし、 全く同じサイズのパーティションを作る必要があります。 また / パーティションを dd で書き出すと、 マウントしようとしても Operation not permitted と言われ /etc/fstabなどの編集ができませn。 (restore の場合もリブート後は同じようにマウントできないが、 書き出した直後はマウントしており編集可能)

これらの理由から dd でなく dump + restore を使うことにします

ここでは、ネットワーク経由でファイルをコピーする方法を紹介しますが、 元ファイルの内容をMOやCDなどで移しても考え方は同じです。

以下の内容は FreeBSD 4.1.1 で確認しています。

手順

コピー元マシンでの dump

original# df
Filesystem  1K-blocks     Used    Avail Capacity  Mounted on
/dev/wd0s1a    110127    28250    73067    28%    /
/dev/wd0s1f   2977982  2442503   297241    89%    /usr
/dev/da0s1e   8617423  3229753  4698277    41%    /usr/local
/dev/wd0s1e    496111    12865   443558     3%    /var
procfs              4        4        0   100%    /proc
original# dump -0 -f /usr/tmp/root.dump /
original# dump -0 -f /usr/tmp/var.dump /var
original# cd /usr
original# tar cvf /usr/tmp/usr.tar bin include lib libdata libexec sbin
ここでは /usr は最小限のみ、/usr/local はコピーしない場合を 想定しています。すべてコピーする場合は dump して、 コピーするマシンでそれらも restore してください

これから先は以下は新しく作るマシンで行う処理です。 まずインストール用のFD (kern.flp, mfsroot.flp)でブートします。 できるだけコピーするOSと同じバージョンの FD を使って下さい。 違うバージョンの物を使う場合は、デバイス名の確認や デバイスファイルの作成などの余分な処理が必要となる場合があります。 (バージョンが異なるFDを用いた場合 を参照してください)

パーティションとディスクラベルの設定

まず、パーティションを切り、ディスクラベルを書きます。 (ここで言うパーティションとはMBRに書き込まれるもので、 FreeBSDではスライスと読んでいるようです。またディスクラベルとは 各パーティション(スライス)内の切り分けを定義するものです)

パーティション(スライス)の設定

インストール用のFDでブートして、インストーラが起動したら、 [Configure]->[Fdisk] を選択して、FreeBSD のパーティション を作成して、FreeBSDのパーティションをアクティブにしてください。 設定したらキーボードの "w" を押して書き込みます。 ("w"のメニューは存在しなくても書き込める(隠しコマンド?))

"q"で終了すると、BootMgr のインストールするか聞いてきますので、 入れて置いた方が便利だと思います。入れたくない場合は、 パーティションをアクティブにする設定をしてください。

書き込んだら一度リブートして下さい。 MBRのパーティションテーブルを書き直したら、それを有効にするために リブートが必要です。もう一度 FreeBSD のインストールディスクで 再起動してください。

ディスクラベルの設定

Fdiskの後FDで再度ブートして、インストーラが起動したら、 今度は、[Configure]->[Label] を選択して、コピーするのに十分な 容量を設定して "w" をキーボードから入力し書き込み、qで終了してください

ここで設定したディスクラベルの内容と、 ファイルシステムの名前を以下のように記録しておいてください。
Part      Mount           Size Newfs
----      -----           ---- -----
ad0s1     <none>          35MB DOS
ad0s2a    /              128MB UFS Y
ad0s2b    swap            64MB SWAP
ad0s2e    /var            64MB UFS Y
ad0s2f    /usr           405MB UFS Y

restore

次にインストーラのトップメニューから [Fixit] -> [Floppy] を選択して fixit.flp の FD を挿入してシェルを起動します。 起動したら Alt-F4 でスクリーンを切り替えてから、 以下の処理を行います。

この時点ですでに /mnt 以下に先ほどディスクラベルを書き込んだ ファイルシステムはマウントされています

まずネットワークインターフェースの設定をして、 コピー元マシンからファイルを取得します
# ifconfig ep0 192.168.1.7
# mkdir /mnt/usr/tmp
# cd /mnt/usr/tmp
# ftp 192.168.1.3
ftp> cd /usr/tmp
ftp> bin
ftp> get root.dump
ftp> get var.dump
ftp> get usr.tar
ftp> quit
これで、/mnt/usr/tmp にコピー元マシンのダンプファイルが 容易できました。ここではネットワーク経由でコピーしましたが、 コピー元のマシンで CD に書き込んで持ってきたり、 直接コピー元のマシンにインストールするディスクをつけて、 以下のリストアをすることもできます。 以下に、/mnt/usr/tmp/以下にファイルがある場合の restore の 例をあげます。
# cd /mnt
# restore -x -f /mnt/usr/tmp/root.dump
Specify next volue #: 1
	:
# cd var
# restore -x -f /mnt/usr/tmp/var.dump
Specify next volue #: 1
	:
# cd /mnt/usr
# tar xf /mnt/usr/tmp/usr.tar

/etc/fstabの編集

/mnt/etc/fstabを編集します。コピーしたOSで立ち上げたときに /etc/fstabになるファイルなので /etc/fstabではなく /mnt/etc/fstabである点に注意してください。

ディスクラベルを切った時に記録しておいた情報を使います。 記録するのを忘れたら df コマンドで確認して /mnt 以下に マウントされている内容を確認してください。
# vi /mnt/etc/fstab
(/mnt/etc/fstabを編集)
以下は編集した内容です。
/dev/ad0s2b	none	swap	sw	0	0
/dev/ad0s2a	/	ufs	rw	1	1
/dev/ad0s2e	/var	ufs	rw	2	2
/dev/ad0s3e	/usr	ufs	rw	2	2
proc		/proc	procfs	rw	0	0

ブートローダのインストール

ブートストラップboot1とboot2を書き込む
# disklabel -B ad0s2
必要ならリブートしてHDからブートした後で boot0cfgコマンドでboot0をインストールおよび設定を行ってください。

ブートの手順 (参考)

boot0
MBRにインストールされるローダ。以前、使われていた booteasyに変わるもの。boot0cfgコマンドで設定する
boot1
起動スライスの起動セクタに存在しboot2を起動するために 存在するブートストラップ。 起動スライスの起動プログラムは 512 バイトの 大きさでなければならないという制限があるためにこれが存在する。 ここにはディスクラベルの情報もある。
boot2
FreeBSDファイルシステムを認識できるブートストラップ。 これがファイルシステム上の/boot/loaderを呼び出す
参考サイト: FreeBSD ハンドブック - 起動ブロック: 起動ステージ 1 および 2

バージョンが異なるFDを用いた場合

コピーするOSと、コピーするのに用いるFreeBSDのFD (kern.flp,mfsroot.flp,fixit.flp)のバージョンが異なる場合 以下の点に注意してください

デバイスファイル名が異なる場合がある。 例えば以前 ATA のディスクは wd という名前だったが、 新しいバージョンでは ad となっている。

それで、/etc/fstab (インストール時は/mnt/etc/fstab) に記述する内容は、フロッピーで起動したときにデバイス名でなく コピーしたHDDに入っているOSで起動したときのデバイス名で あることに注意する。 さらに、新たに/dev以下にデバイスファイルを作る必要がある らないといけない。

デバイスファイルの作成

上記のデバイスファイルが /mnt/dev/ 以下に存在するか確認します。 存在しなければ以下のようにして作成してください
# cd /mnt/dev
# ls -l wd0s2*
brw-r-----  1  root  5    0, 0x0003000002 Nov   7  1999  wd0s2
# mknod wd0s2a b 0 0x00030000
# mknod wd0s2e b 0 0x00030004
# mknod wd0s3e b 0 0x00040004
# ls -l rwd0s2*
crw-r-----  1  root  5    0, 0x0003000002 Nov   7  1999  wd0s2
# mknod rwd0s2a c 0 0x00030000
# mknod rwd0s2e c 0 0x00030004
# mknod rwd0s3e c 0 0x00040004

コピー元のマシンにディスクをつけてコピーする方法

また、新しいマシンにつけるHDを元のマシンに接続してコピーする場合には、 新しく起動するマシンでの/etc/fstabの内容を気をつければあとは同じです。

pipeを使って以下のようにコピーできます。
# cd /mnt
# dump -0 -f - / | restore xf -
# dump -0 -f - /dev/ad0s1a | restore xf -