バックアップ/リストアの基本
バックアップ先は通常は /dev/sa0 デバイス。
ただし書き込むときは rsa0 もしくは nrsa0 を使用。
rsa0 はテープを Close したあとに巻き戻しを行い (Rewind sd0),nrsa0 はテープを Close したあとに巻き戻しを行わない (NoRewind sa0)。
これは dump / restore どちらにも使用され,デフォルトは rsa0 が使われる。
nrsa/rsa は sa0 と同一のデバイス。
使用するコマンドについて
mt
テープデバイスを制御する制御コマンド。
これでテープの巻き戻し、先送り、消去、排出などを行うことが出来る。
ただし連装タイプのテープデバイス (HP DDS 6連装等) は排出コマンドを送信すると、マガジンが排出されずにテープが排出され、次のテープが挿入される。

rewindテープの先頭まで巻き戻し
fsf ** カウント分早送り
bsf ** カウント分巻き戻し
statusテープデバイスのステータスを返す
offlineテープを先頭まで巻き戻して排出する
eraseテープを消去する (恐ろしく時間がかかるので覚悟)
eom最後に記録したデータの最後尾まで早送りする
dump
指定したパーティションをバックアップする。
1つのテープに複数のパーティションをバックアップする場合は、nrsa にバックアップを取り、一番最後になるパーティションのみ rsa でバックアップを取る。
別のホストを使ったリモートバックアップも行うことが出来るが、リモートホスト側で rsh を許可していること、及びバックアップを行うユーザーとホストを .rhosts に登録しておく必要がある。
テープを巻き戻さないで dump を行うと、mt コマンドでいう「カウント」がインクリメントされる。

-[0-9]ダンプレベル。
0 はパーティション全体をバックアップする。
0 より大きなレベル番号はインクリメンタルバックアップを意味し、前回のダンプ (今回指定したものより低いレベルのダンプ) 以降に作られたか修正されたすべてのファイルをコピーする。
0 より大きな数字を指定するときは、計画性を持って指定すること。
-f DEVICEテープデバイスを指定する。
これがなんらかのハードウェアデバイスであれば、そのハードウェアに対してバックアップを行う。
もしファイルであれば、バックアップ対象を単一のファイルという形で保存する。
ハイフン (-) を使うと標準出力 (STDOUT) に出力されるので、パーティションコピーを行うことが出来る。
-uバックアップに成功したら /etc/dumpdates を更新する。

例)
  • Dump Level 0 で / パーティションをローカルマシンのテープデバイスで dump する。Close 後にテープを巻き戻さない。
    # dump -0f /dev/nrsa0 /
  • Dump Level 0 で / パーティションをホストマシン leviathan のテープデバイスで dump する。Close 後にテープを巻き戻さない。
    # dump -0f leviathan:/dev/nrsa0 /
  • Dump Level 0 で /var パーティションをホストマシン leviathan のテープデバイスで dump する。Close 後にテープを巻き戻す。
    # dump -0f leviathan:/dev/rsa0 /var
  • Dump Level 0 で /var パーティションをホストマシン leviathan のファイル /pub1/HOSTNAME.var.dump に dump する。
    ※ホストマシン側であらかじめ 0byte のファイルを作成しておくこと。
    # dump -0f leviathan:/pub1/HOSTNAME.var.dump /var
restore
dump によってバックアップされたパーティションを書き戻す。
書き戻される場所はカレントディレクトリになるので、事前に書き戻すべきパーティションに cd しておく事が必要。
-t オプションと mt コマンドを使用することで、そのデバイスにバックアップされた日付及びパーティションを表示させることが出来る。
別のホストを使ったリモートリストアも行うことが出来るが、リモートホスト側で rsh を許可していること、及びバックアップを行うユーザーとホストを .rhosts に登録しておく必要がある。

-tバックアップされたファイルリストを表示する。
-rリストアを行う。
-f DEVICEテープデバイスを指定する。
これがなんらかのハードウェアデバイスであれば、そのハードウェアからリストアを行う。
もしファイルであれば、リストア元を単一のファイルという形で読み込む。
ハイフン (-) を使うと標準入力 (STDIN) から読み込まれるので、パーティションコピーを行うことが出来る。

例)
  • /usr にリストアする。ただしリストアするデータはテープの先頭に存在するものとする。
    # mt rewind
    # cd /usr
    # restore
  • テープにバックアップされたパーティション及び日付を確認する。ただしリストアするデータはテープの先頭に存在するものとする。
    # mt rewind
    # restore -t | head
  • テープにバックアップされたパーティション及び日付を確認する。リストアするデータはテープの 2カウント目に保存されているものとする。
    # mt rewind
    # mt fsf 1
    # restore -t | head

restore -t | head でバックアップされたパーティション及び日付を確認することが出来るが、テープにバックアップデータがない場合は、以下のようなエラーメッセージが出力される。
# restore -t | head
tape read error: Undefined error: 0
逆に、データがある場合は下記のようなメッセージが表示される。
# restore -t | head
Level 0 dump of / on HOSTNAME:/dev/wd0s1a
Label: none
Dump date: Thu Sep 5 11:15:50 2002
Dumped from: the epoch
fixit でネットワーク経由の dump/restore を実施するときの事前準備
FreeBSD 6.x-RELEASE からはどうやら disk1 でも fixit が使えるようなので、あらかじめ ISO イメージを CD-ROM に焼いておくこと。
また、解説は fixit モードになった直後から行う。

IP アドレスの条件

192.168.1.1 (稼動鯖)
現在稼働中のホスト。
192.168.1.5 (fixit 鯖)
fixit で起動するホスト。
主に環境を構築する対象のホストとなる。
以下のように進めてゆく。

  1. 「2 CDROM/DVD Use the "live" filesystem CDROM/DVD」を選択。

  2. 「CDROM か DVD を入れろ」と尋ねてくるのでそのままリターンキーを押す。

  3. 少しして「切り替えるなら ALT+F4 を押せ」と言ってくるので指示通り ALT+F4 を押す。
    指示がない場合もある。
    するとコマンドラインに落ちるので、今後はここで作業を行う。
    なお、コマンドラインを抜けるには exit で OK。

  4. ifconfig で NIC の設定を行う。
    # ifconfig lo0 inet 127.0.0.1 netmask 255.0.0.0
    # ifconfig fxp0 inet 192.168.1.5 netmask 255.255.255.0
  5. 疎通確認を行う。
    # ping 192.168.1.1
  6. /etc/services の編集を行う。
    fixit デフォルトの services では telnet や ssh などが使えないので、利用するサービスを services に記述しておく。
    登録していない場合は
    # telnet 192.168.1.1
    192.168.1.1: servname not supported for ai_socktype
    というようなエラーになるので注意。
    今回は telnet と ssh を利用するので、以下の行を追加する。
    ssh    22/tcp
    telnet    23/tcp
  7. 疎通確認を行う。
    # telnet 192.168.1.1
    Trying 192.168.1.1...
    Connected to 192.168.1.1.
    Escape character is '^]'.
    Trying RSA secure login:
    User (root):
実際にバックアップとリストアを行ってみる
コマンドの説明だけではわかりにくいので、実際に複数のパーティションをバックアップ・リストアするサンプルを提示する。

条件:
バックアップ
バックアップする順序は特にないが、バックアップした順序はリストアに必要なので「覚えて」おくこと。
  1. 念のためテープを巻き戻しておく。
    ただしリモートマシン上で行うこと。
    leviathan # mt -f /dev/sa0 rewind
  2. / パーティションをフルバックアップし、/etc/dumpdates を更新する。
    このときテープを巻き戻さないこと。
    fenrir # dump -0uf leviathan:/dev/nrsa0 /
  3. /var パーティションをフルバックアップし、/etc/dumpdates を更新する。
    このときテープを巻き戻さないこと。
    fenrir # dump -0uf leviathan:/dev/nrsa0 /var
  4. /usr パーティションをフルバックアップし、/etc/dumpdates を更新する。
    この時点でバックアップが終了するのでテープを巻き戻す。
    fenrir # dump -0uf leviathan:/dev/rsa0 /usr
リストア
リストアされるパーティションはあらかじめ切っておくこと。
パーティションを切るときは、「CD-ROM もしくは FD から起動されたインストーラー」で、バックアップされた容量より大きく切っておく (小さく切ってしまうと入りきらない)。

念のためテープを巻き戻しておく。
ただしリモートマシン上で行うこと。
leviathan # mt -f /dev/sa0 rewind

  1. 1回目にリストアするパーティションを念のため newfs し、fsck もかけておく。
    fenrir # newfs /dev/ad0s1a
    fenrir # fsck /dev/ad0s1a
  2. 1回目にリストアするパーティションをマウントする。
    マウントポイントとなるディレクトリは一番はじめだけ作成する。
    fenrir # mkdir /mnt
    fenrir # mount -t ufs /dev/ad0s1a /mnt
  3. 1回目にリストアするパーティションに cd し、リストアを行う。
    このときテープを巻き戻してはならない。
    fenrir # cd /mnt
    fenrir # restore -rf leviathan:/dev/nrsa0
  4. 2回目にリストアするパーティションを念のため newfs し、fsck もかける。
    基本的には 2-*. と同じプロセスを踏むが、書き戻すデータを間違えないようにすること。
    テープの現在位置は /var になっているはず。
    fenrir # newfs /dev/ad0s1f
    fenrir # fsck /dev/ad0s1f
    fenrir # mount -t ufs /dev/ad0s1f /mnt/var
    fenrir # cd /mnt/var
    fenrir # restore -rf leviathan:/dev/nrsa0
  5. 3回目にリストアするパーティションを念のため newfs し、fsck もかける。
    基本的には 2-*. と同じプロセスを踏むが、書き戻すデータを間違えないようにすること。
    また、最後のリストアとなるため、テープを巻き戻す。
    テープの現在位置は /usr になっているはず。
    fenrir # newfs /dev/ad0s1g
    fenrir # fsck /dev/ad0s1g
    fenrir # mount -t ufs /dev/ad0s1g /mnt
    fenrir # cd /mnt/usr
    fenrir # restore -rf leviathan:/dev/rsa0
  6. 全てのリストアが行ったら、各パーティションの先頭にある restoresymtable ファイルを削除する。
FreeBSD の OS ディスク入れ替え方法
条件:
実作業:
  1. フロッピーもしくは CD からブートして、新 HDD (ad1) に必要なパーティションを作成する。
    このとき、新 HDD (ad1) へは、既存のパーティションより少しばかり大きめにパーティションを切っておくと幸せになれる。
    ここで ad1 には a 〜 のパーティションが切られる。
    (e 〜 になっているとやりなおし)

    非対話式の場合は

    # fdisk -v -BI /dev/ad1
    # bsdlabel -B -e /dev/ad1s1

    とする。

    bsdlabel 使用時の注意など
    • size には K/M/G が使用可能。
      また、* を指定することで残容量を勝手に割り当ててくれるので、「最後のパーティションに全部」をするときに使うと良い。
    • offset は先頭以外は * を設定すれば勝手に計算してくれる。
    • fstype は unused にしておけば newfs で勝手に 4.2BSD にしてくれる。
    • [fsize bsize bps/cpg] は空白にしておく。
    • c: はディスク全体をサスので触らないこと。

  2. 新 HDD をプライマリ - スレーブにつなげて旧 HDD で起動する。
    ※プライマリ - スレーブが無理な場合はセカンダリ (略) でも可。
    その場合は ad1 も ad2、ad3 に読み替えること。

  3. 新 HDD のパーティション (ad1s1*) を newfs しておく。
    # newfs /dev/ad1s1a
    # newfs /dev/ad1s1f
    # newfs /dev/ad1s1g

  4. 新 HDD のパーティションを fsck しておく。
    # fsck /dev/ad1s1a
    # fsck /dev/ad1s1f
    # fsck /dev/ad1s1g

  5. 新 HDD のパーティションをマウントする。
    ここでは全てのパーティションをマウントせず、/ となるパーティションだけマウントする。
    # mount -t ufs /dev/ad1s1a /mnt

  6. dump & restore を実行。
    # dump 0af - / | (cd /mnt ; restore rf -)

  7. ad1s1a へのリストアが終わったら、順次その下のパーティションをマウントして dump & restore でコピーする。
    # mount -t ufs /dev/ad1s1f /mnt/var
    # dump 0af - /var | (cd /mnt/var ; restore rf -)
    # mount -t ufs /dev/ad1s1g /mnt/usr
    # dump 0af - /usr | (cd /mnt/usr ; restore rf -)

  8. 終了したら新 HDD をプライマリ-マスターに繋いで起動してみる。
fixit ディスクを使い、ネットワーク経由で稼働中の鯖のクローンを作成する
今回は、既に稼働中の鯖から OS を丸ごとコピーする方法を採る。

新規に用意した鯖を fixit ディスクでブートする
fixit でネットワーク経由の dump/restore を実施するときの事前準備」を参照して準備を行う。
パーティショニング
インストールメニュー → Configure → Fdisk を選択し、パーティションメニューに入る。
パーティションメニューへの入り方

パーティションを切るディスクを選択する。
まっさらな状態

まっさらなディスクの場合は Desc が unused の 1行しかないはずなので、unused の行にカーソルを当てて A をタイプするとディスク全部を使用するようになる。

この状態で今度は Desc が freebsd (真ん中の行のはず) にカーソルを当てて S をタイプし、ブータブルパーティションとして設定し、Flag が A になることを確認する。
この設定を忘れるとブートマネージャを書き込んでも起動できないので注意。
パーティション切り

設定が終わったら W をタイプして書き込む。
覚悟完了したかを聞いてくるので YES を選択する。
書き込み 覚 悟 完 了

書き込む前にブートマネージャを選択しなければならないので、今回は Standard を選択する。
ブートマネージャの選択

ブートマネージャを選択すればパーティション情報が実際に書き込まれる。
書き込み完了

パーティションの作成が完了したら、パーティション作成メニューに戻るので、Q をタイプして終了する。
また、一旦再起動を行い、もう一度 CD-ROM で起動する。
ラベリング
インストールメニュー → Configure → Label を選択し、ラベル作成メニューに入る。
Partition でインストール先ディスクを選択してパーティションを作成し、そのパーティションに対してラベリングを行う。
ラベリングは極普通に

デバイス名マウントポイントサイズ
ad0s1a/250MB
ad0s1bswap500MB
ad0s1e/tmp700MB
ad0s1f/var1024MB
ad0s1g/usr残り全部

といった感じでよい。
# マウント先なども特に気にすることなく指定。

ブートマネージャーは理由がなければ Standard (ブートマネージャー無し) を選択。

パーティションの作成とラベリングの注意点として、各々のメニュー内で w を押すと書き込みを実行するが、エラーになる場合がある。
その場合は、各々のメニュー内で w を押さずに q で終了し、どちらの設定も終わった段階で Commit する。
Commit するときにインストールメディアやディストリビューションの選択を尋ねられるが、インストールメディアは CD/DVD を選択し、ディストリビューションは何も選択しないでおく。
すると、Commit 時に「CD/DVD 内にディストリビューションが無い」と言われるが、そのままキャンセルして進む。
すると正常にパーティションの作成とラベリングが出来る。

fixit を起動する
コマンドラインを使用する必要があるので、fixit を起動する。

  1. 「2 CDROM/DVD Use the "live" filesystem CDROM/DVD」を選択。
  2. 「CDROM か DVD を入れろ」と尋ねてくるのでそのままリターンキーを押す。
  3. 少しして「切り替えるなら ALT+F4 を押せ」と言ってくるので指示通り ALT+F4 を押す。

するとコマンドラインに落ちるので、今後はここで作業を行う。
なお、コマンドラインを抜けるには exit で OK。

rsh を使えるようにする
fixit 鯖から稼動鯖のパーティション dump を引っ張ってこれるように rsh を使えるようにするため、各鯖で少しばかり設定を行う。

fixit 鯖で以下のような設定を行う。
  1. ifconfig で IP アドレスを設定する。
    同一ネットワーク上で通信できれば良いので、簡単な設定のみで良い。
    # ifconfig fxp0 inet 192.168.1.5 netmask 255.255.255.0
    # ping 192.168.1.1
稼動鯖で以下のような設定を行う。
  1. inetd で shell を使えるように設定する。
    /etc/inetd.conf
    shell    stream    tcp    nowait    root    /usr/libexec/rshd    rshd
  2. /etc/hosts に fixit 鯖のホスト名と IP アドレスを記述する。
    /etc/hosts
    192.168.1.5    fixit ← 適当な名前を使えばよい
  3. ~root/.rhosts に fixit 鯖のホスト名または IP アドレスを記述する。
    /root/.rhosts
    fixit ← /etc/hosts に登録した名前を記述する
テスト方法:
# rsh 稼動鯖のIPアドレス "ls"
これで稼動鯖の ls 結果が出力されれば ok。

デバイスの作成
fixit 鯖でディスクをマウントしようとしてもデバイスがないのでデバイスを作成する。
# ln -s /mnt2/dev/MAKEDEV /dev
# sh MAKEDEV /dev/ad0s1a
稼動鯖から dump / restore
まずはマウント。
# mount /dev/ad0s1a /mnt
マウントできたら正常にマウントできているかを df と mount で確認してから dump/restore する。
# cd /mnt
# rsh -K 192.168.1.1 "dump 0af - /" | restore rf -
/ の dump/restore が終わったら今度は下層ディレクトリに移動してコレを繰り返す。
# cd /mnt/var
# rsh -K 稼動鯖 "dump 0af - /var" | restore rf -
# cd /mnt/usr
# rsh -K 稼動鯖 "dump 0af - /usr" | restore rf -
この時、
/: write failed, filesystem is full
と出た場合は、restore が /tmp もしくは /var/tmp を使っているので、/mnt/ 以下のディスクの空き容量が多いところにディレクトリを掘り、リンクを張ることで対処すること。
# rm -rf /tmp /var/tmp
# mkdir /mnt/usr/tmptmp
# ln -s /mnt/usr/tmptmp ./tmp
# ln -s /mnt/usr/tmptmp ./var/tmp
再起動
dump/restore が終わったら再起動・・・でいけるはず。
補足
FreeBSD 6.1-RELEASE ではそのままだと
rshd[xxx]: root@HOSTNAME as root: permission denied (authentication error). cmd='ls'
となるので、/etc/pam.d/rsh の auth 行を以下のように修正する。
修正したら inetd の kill -HUP を行うこと。
auth     required     pam_rhosts.so     no_warn allow_root
ネットワーク経由での HDD 上への dump & restore 展開方法 - ssh を使う
ダンプ元鯖 # dump -0au -f - [PARTITION] | gzip | ssh [YourAccount]@[HOSTNAME] dd of=[OUTPUT_FILE]
例) # dump -0au -f - /usr | gzip | ssh griffon@HOSTNAME dd of=./var.dump.gz

1. リストア元鯖 # ssh [YourAccount]@[HOSTNAME] dd if=[OUTPUT_FILE] | gzip -dc - | restore -r -f -
2. リストア元鯖 # ssh [YourAccount]@[HOSTNAME] "gzip -dc [OUTPUT_FILE]" | restore -r -f -
※リストアするファイルリストを見るだけならば、-r を -t に変更すること。
※1. で上手く行かない場合は 2. を使用する。

実際には以下のように使用する。
# pwd
/
# ssh griffon@leviathan dd if=/home/griffon/root.dump.gz | gzip -dc - | restore -r -v -f -
# cd /var
# pwd
/var
# ssh griffon@leviathan dd if=/home/griffon/var.dump.gz | gzip -dc - | restore -r -v -f -
# cd /usr
# pwd
/usr
# ssh griffon@leviathan dd if=/home/griffon/usr.dump.gz | gzip -dc - | restore -r -v -f -
システムが起動できない状態で新規ディスクにリストアする場合
バックアップされている FreeBSD のリリースとなるだけ近い (できれば同じ) 起動ディスクと fixit.flp ディスクを用意する。
あとは起動ディスクから起動して fixit.flp を読ませれば restore が使えるはず。

http://www.wakaba.toyonaka.osaka.jp/~oe3/FreeBSD/