バックアップ/リストアの基本
バックアップ先は通常は /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 で起動するホスト。
主に環境を構築する対象のホストとなる。
以下のように進めてゆく。
- 「2 CDROM/DVD Use the "live" filesystem CDROM/DVD」を選択。
- 「CDROM か DVD を入れろ」と尋ねてくるのでそのままリターンキーを押す。
- 少しして「切り替えるなら ALT+F4 を押せ」と言ってくるので指示通り ALT+F4 を押す。
指示がない場合もある。
するとコマンドラインに落ちるので、今後はここで作業を行う。
なお、コマンドラインを抜けるには exit で OK。
- 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
- 疎通確認を行う。
# ping 192.168.1.1
- /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
- 疎通確認を行う。
# 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):
実際にバックアップとリストアを行ってみる
コマンドの説明だけではわかりにくいので、実際に複数のパーティションをバックアップ・リストアするサンプルを提示する。
条件:
- バックアップ・リストアするパーティションは以下の通り。
/dev/ad0s1a /
/dev/ad0s1f /var
/dev/ad0s1g /usr
- バックアップデバイスはリモートマシン leviathan に繋がっている DDS ドライブ (sa0)。
- バックアップ
- バックアップする順序は特にないが、バックアップした順序はリストアに必要なので「覚えて」おくこと。
- 念のためテープを巻き戻しておく。
ただしリモートマシン上で行うこと。
leviathan # mt -f /dev/sa0 rewind
- / パーティションをフルバックアップし、/etc/dumpdates を更新する。
このときテープを巻き戻さないこと。
fenrir # dump -0uf leviathan:/dev/nrsa0 /
- /var パーティションをフルバックアップし、/etc/dumpdates を更新する。
このときテープを巻き戻さないこと。
fenrir # dump -0uf leviathan:/dev/nrsa0 /var
- /usr パーティションをフルバックアップし、/etc/dumpdates を更新する。
この時点でバックアップが終了するのでテープを巻き戻す。
fenrir # dump -0uf leviathan:/dev/rsa0 /usr
- リストア
- リストアされるパーティションはあらかじめ切っておくこと。
パーティションを切るときは、「CD-ROM もしくは FD から起動されたインストーラー」で、バックアップされた容量より大きく切っておく (小さく切ってしまうと入りきらない)。
念のためテープを巻き戻しておく。
ただしリモートマシン上で行うこと。
leviathan # mt -f /dev/sa0 rewind
- 1回目にリストアするパーティションを念のため newfs し、fsck もかけておく。
fenrir # newfs /dev/ad0s1a
fenrir # fsck /dev/ad0s1a
- 1回目にリストアするパーティションをマウントする。
マウントポイントとなるディレクトリは一番はじめだけ作成する。
fenrir # mkdir /mnt
fenrir # mount -t ufs /dev/ad0s1a /mnt
- 1回目にリストアするパーティションに cd し、リストアを行う。
このときテープを巻き戻してはならない。
fenrir # cd /mnt
fenrir # restore -rf leviathan:/dev/nrsa0
- 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
- 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
- 全てのリストアが行ったら、各パーティションの先頭にある restoresymtable ファイルを削除する。
FreeBSD の OS ディスク入れ替え方法
条件:
- コピー元パーティションは以下の通り。
/dev/ad0s1a /
/dev/ad0s1f /var
/dev/ad0s1g /usr
- ディスク構成
旧 HDD:ad0s1
新 HDD:ad1s1
- 使用するシェルは tcsh。もし sh 系を使うならば、コマンドを続けて実行させる場合は、セミコロン (;) をアンパサンド x2 (&&) にする。
- 新 HDD はあらかじめパーティションを切ってあることが前提。
もちろんブートブロックには FreeBSD で起動できるブートブロックをあらかじめ書き込んでおくこと。
実作業:
- フロッピーもしくは 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: はディスク全体をサスので触らないこと。
- 新 HDD をプライマリ - スレーブにつなげて旧 HDD で起動する。
※プライマリ - スレーブが無理な場合はセカンダリ (略) でも可。
その場合は ad1 も ad2、ad3 に読み替えること。
- 新 HDD のパーティション (ad1s1*) を newfs しておく。
# newfs /dev/ad1s1a
# newfs /dev/ad1s1f
# newfs /dev/ad1s1g
- 新 HDD のパーティションを fsck しておく。
# fsck /dev/ad1s1a
# fsck /dev/ad1s1f
# fsck /dev/ad1s1g
- 新 HDD のパーティションをマウントする。
ここでは全てのパーティションをマウントせず、/ となるパーティションだけマウントする。
# mount -t ufs /dev/ad1s1a /mnt
- dump & restore を実行。
# dump 0af - / | (cd /mnt ; restore rf -)
- 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 -)
- 終了したら新 HDD をプライマリ-マスターに繋いで起動してみる。
fixit ディスクを使い、ネットワーク経由で稼働中の鯖のクローンを作成する
ネットワーク経由での 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 -
システムが起動できない状態で新規ディスクにリストアする場合