マシンがクラッシュした時のために同じマシンを作ったり、 ほとんど同じ機能を持つマシンがもう一台欲しいときに、 すでにインストール済みのFreeBSDマシンのコピーを作りたい場合があります。 これを行う方法としては以下のものが考えられますしかし dd を使うと、ファイルシステム全体をコピーするために 使っていないディスクの部分もすべてコピーするので無駄が多いし、 全く同じサイズのパーティションを作る必要があります。 また / パーティションを dd で書き出すと、 マウントしようとしても Operation not permitted と言われ /etc/fstabなどの編集ができませn。 (restore の場合もリブート後は同じようにマウントできないが、 書き出した直後はマウントしており編集可能)
- dd を使う方法
- dump と restore を使う方法
これらの理由から dd でなく dump + restore を使うことにします
ここでは、ネットワーク経由でファイルをコピーする方法を紹介しますが、 元ファイルの内容をMOやCDなどで移しても考え方は同じです。
以下の内容は FreeBSD 4.1.1 で確認しています。
コピー元マシンでの dump
ここでは /usr は最小限のみ、/usr/local はコピーしない場合を 想定しています。すべてコピーする場合は dump して、 コピーするマシンでそれらも restore してください
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
これから先は以下は新しく作るマシンで行う処理です。 まずインストール用の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 Yrestore
次にインストーラのトップメニューから [Fixit] -> [Floppy] を選択して fixit.flp の FD を挿入してシェルを起動します。 起動したら Alt-F4 でスクリーンを切り替えてから、 以下の処理を行います。この時点ですでに /mnt 以下に先ほどディスクラベルを書き込んだ ファイルシステムはマウントされています
まずネットワークインターフェースの設定をして、 コピー元マシンからファイルを取得します
これで、/mnt/usr/tmp にコピー元マシンのダンプファイルが 容易できました。ここではネットワーク経由でコピーしましたが、 コピー元のマシンで CD に書き込んで持ってきたり、 直接コピー元のマシンにインストールするディスクをつけて、 以下のリストアをすることもできます。 以下に、/mnt/usr/tmp/以下にファイルがある場合の restore の 例をあげます。
# 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
# 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を書き込む必要ならリブートしてHDからブートした後で boot0cfgコマンドでboot0をインストールおよび設定を行ってください。
# disklabel -B ad0s2ブートの手順 (参考)
参考サイト: FreeBSD ハンドブック - 起動ブロック: 起動ステージ 1 および 2
- boot0
- MBRにインストールされるローダ。以前、使われていた booteasyに変わるもの。boot0cfgコマンドで設定する
- boot1
- 起動スライスの起動セクタに存在しboot2を起動するために 存在するブートストラップ。 起動スライスの起動プログラムは 512 バイトの 大きさでなければならないという制限があるためにこれが存在する。 ここにはディスクラベルの情報もある。
- boot2
- FreeBSDファイルシステムを認識できるブートストラップ。 これがファイルシステム上の/boot/loaderを呼び出す
コピーする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 -