定期的に dump(8)
しましょう. Elizabeth
D. Zwicky はここで検討したプログラムすべてについて拷問的なテストを
おこないました. すべてのデータと Unixファイルシステムの状態すべてを
保存するには明らかに dump(8)
でしょう. Elizabethは大きく変化
に富んだ異常な状態 (いくつかはあまり異常でもない状態のものもあります)
になっているファイルシステムで, それぞれのプログラムで
ファイルシステムのバックアップとリストアを行ってテストしました.
特色のある状態には, ホールを持つファイル, ホールとヌルブロックを持つ
ファイル, 奇妙な文字をファイル名に持つファイル, 読み出し不可,
書き込み不可のファイル, デバイスファイル, バックアップ中にファイルの
サイズを変更する, バックアップ中にファイルの作成/削除をおこなうなどが
あります. 彼女は1991年10月の LISA Vで結果の発表をしています.
torture-testing Backup and Archive Programs
を参照してください.
起き得るどのような災難に対しても以下の 4ステップだけが必要な 準備です.
ステップ 1では, ファイルシステムテーブル(/etc/fstab
)
やブートメッセージで示されるすべてのディスクの disklabelをそれぞれ2コピー
づつプリント (例えば disklabel sd0 | lpr を実行します
) します.
ステップ 2では, boot と fixitフロッピーにそのシステムの すべてのデバイスドライバが含まれているか確認します. 最も簡単な確認の 方法は, フロッピーをドライブに入れてリブートし, ブートメッセージを 確認することです. あなたのシステムのデバイスがすべて含まれ, 機能していれば, step 3へ飛んでください.
そうでないなら, そのシステムのすべてのディスクをマウントでき,
テープドライブにもアクセスできる 2種類のカスタムブート
フロッピーディスクを作る必要があります. これらのフロッピーには
fdisk(8)
,
disklabel(8)
, newfs(8)
, mount(8)
, と利用したい
バックアッププログラムが入っていなければなりません. これらのプログラム
はスタティックリンクされたプログラムである必要があります.
dump(8)
を使うのであればフロッピーに restore(8)
を
入れる必要があります.
ステップ 3では, 通常の方法でバックアップを作ります. 最新のバックアップの後でおこなわれた変更は回復することはできません. バックアップテープにライトプロテクトをしてください.
ステップ 4では, フロッピー (boot.flp と fixit.flp あるいは
ステップ 2で作った2枚のカスタムブートフロッピーディスクです) と
バックアップテープのテストをします.
手順のノートを作りましょう. このノートはブートフロッピーディスク,
バックアップテープに入れておきプリントアウトしておきます. あなたが
リストアをおこなうような時はおそらく錯乱状態でしょうからこのノートは
バックアップを破壊してしまうようなことを防ぐのに役立つでしょう
(どのようにして破壊するって?
tar xvf /dev/rst0
とする替りに偶然 tar cvf /dev/rst0
とタイプしてバックアップテープに上書きしてしまうかもしれません).
訳注: 上書きはライトプロテクトをしておけば防げますが, なんらかの原因で プロテクトがはずれているかもしれません. ちなみに訳者の経験から言えば上のようなミスタイプは結構起きます.
安全性を増すために, 毎回ブートフロッピーディスクを作り, 2巻のバックアップテープを取ります. 一方を離れた場所に保管します. 離れた場所は同じ建物の地下室ではいけません. 世界貿易センタービルに あった数多くの会社は苦い経験よりこの教訓を得ました. 離れた場所とはコンピュータやディスクドライブからかなり離れていて 物理的に分離されていなければなりません.
ブートフロッピーディスクを作るスクリプトの一例
#!/bin/sh
#
# create a restore floppy リストアフロッピーの作成
#
# format the floppy フロッピーのフォーマット
#
PATH=/bin:/sbin:/usr/sbin:/usr/bin
fdformat -q fd0
if [ $? -ne 0 ]
then
echo "Bad floppy, please use a new one"
exit 1
fi
# place boot blocks on the floppy フロッピーにブートブロックを書く
#
disklabel -w -B -b /usr/mdec/fdboot -s /usr/mdec/bootfd /dev/rfd0c fd1440
#
# newfs the one and only partition ただ1つのパーティションを newfs
#
newfs -t 2 -u 18 -l 1 -c 40 -i 5120 -m 5 -o space /dev/rfd0a
#
# mount the new floppy 新しいフロッピーをマウント
#
mount /dev/fd0a /mnt
#
# create required directories 必要なディレクトリの作成
#
mkdir /mnt/dev
mkdir /mnt/bin
mkdir /mnt/sbin
mkdir /mnt/etc
mkdir /mnt/root
mkdir /mnt/mnt # for the root partition
mkdir /mnt/tmp
mkdir /mnt/var
#
# populate the directories
#
# MINIカーネルがない場合は作ります
if [ ! -x /sys/compile/MINI/kernel ]
then
cat << EOM
The MINI kernel does not exist, please create one.
Here is an example config file:
# MINIカーネルの config fileの例
# MINI -- A kernel to get FreeBSD on onto a disk.
#
machine "i386"
cpu "I486_CPU"
ident MINI
maxusers 5
options INET # needed for _tcp _icmpstat _ip
stat
# _udpstat _tcpstat _udb
options FFS #Berkeley Fast File System
options FAT_CURSOR #block cursor in syscons or pcc
ons
options SCSI_DELAY=15 #Be pessimistic about Joe SCSI
device
options NCONS=2 #1 virtual consoles
options USERCONFIG #Allow user configuration with
-c XXX
config kernel root on sd0 swap on sd0 and sd1 dumps on sd0
controller isa0
controller pci0
controller fdc0 at isa? port "IO_FD1" bio irq 6 drq 2 vector fdintr
disk fd0 at fdc0 drive 0
controller ncr0
controller scbus0
device sc0 at isa? port "IO_KBD" tty irq 1 vector scintr
device npx0 at isa? port "IO_NPX" irq 13 vector npxintr
device sd0
device sd1
device sd2
device st0
pseudo-device loop # required by INET
pseudo-device gzip # Exec gzipped a.out's
EOM
exit 1
fi
cp -f /sys/compile/MINI/kernel /mnt
gzip -c -best /sbin/init > /mnt/sbin/init
gzip -c -best /sbin/fsck > /mnt/sbin/fsck
gzip -c -best /sbin/mount > /mnt/sbin/mount
gzip -c -best /sbin/halt > /mnt/sbin/halt
gzip -c -best /sbin/restore > /mnt/sbin/restore
gzip -c -best /bin/sh > /mnt/bin/sh
gzip -c -best /bin/sync > /mnt/bin/sync
cp /root/.profile /mnt/root
cp -f /dev/MAKEDEV /mnt/dev
chmod 755 /mnt/dev/MAKEDEV
chmod 500 /mnt/sbin/init
chmod 555 /mnt/sbin/fsck /mnt/sbin/mount /mnt/sbin/halt
chmod 555 /mnt/bin/sh /mnt/bin/sync
chmod 6555 /mnt/sbin/restore
#
# create the devices nodes デバイスノードを作る
#
cd /mnt/dev
./MAKEDEV std
./MAKEDEV sd0
./MAKEDEV sd1
./MAKEDEV sd2
./MAKEDEV st0
./MAKEDEV pty0
cd /
#
# create minimum filesystem table 最小限のファイルシステムテーブル
#
cat > /mnt/etc/fstab <<EOM
/dev/fd0a / ufs rw 1 1
EOM
#
# create minimum passwd file 最小限のパスワードファイル
#
cat > /mnt/etc/passwd <<EOM
root:*:0:0:Charlie &:/root:/bin/sh
EOM
cat > /mnt/etc/master.passwd <<EOM
root::0:0::0:0:Charlie &:/root:/bin/sh
EOM
chmod 600 /mnt/etc/master.passwd
chmod 644 /mnt/etc/passwd
/usr/sbin/pwd_mkdb -d/mnt/etc /mnt/etc/master.passwd
#
# umount the floppy and inform the user フロッピーを unmount
#
/sbin/umount /mnt
重要な問題は, ハードウェアが生き残ったかどうかです. 定期的なバックアップを取っていればソフトウェアについて心配する必要はあ りません.
ハードウェアがダメージを受けていたら, 最初にそのダメージを 受けた部品を交換してください.
ハードウェアに問題がなければ, フロッピーをチェックしてくださ い.カスタムブートフロッピーディスクを使っているのであればシングルユーザ ("boot:"プロンプトの出た時に "-s" とタイプしてください) でブートしてくださ い. それから次の「ファイルシステムを1つずつ回復する」を読んでください.
boot.flp と fixit.flp を使っているのであればこのまま読み続けてくださ
い. boot.flp を入れてブートしてください. 本来のインストールメニューが表
示されるはずです. (ここで) "fixit XXX"オプションを選びます. 指示の通り
fixit.flp を入れてください. restore
とその他の必要なプログラムは
/mnt2/stand
に置かれています.
ファイルシステムを一つずつ回復する
最初のディスクのrootパーティションをmount(8) (例えば mount
/dev/sd0a /mntのように)
マウントして見てください. ディスクラベルが
破壊されている場合は disklabel(8)
を使ってあらかじめプリントし
ておいた通りにパーティションを作り直しラベルをつけてセーブしてください.
newfs(8)
を使いファイルシステムを作り直します. ルー
トパーティションを読み書き可能にマウント ("mount -u -o rw
/mnt
") しなおします. バックアッププログラムとバックアップテープを
使ってこのファイルシステムのデータを回復します (例えば restore vrf
/dev/st0
とします). ファイルシステムをアンマウント (umount /mnt
など) して, 障害を受けたファイルシステムそれぞれについて繰り返
してください.
システムが動き出したら, 新しいテープにデータをバックアップ してください. どのような理由で再び事故が起きたりデータが失われるかはわか りません. これに時間を費す事で, 後々の災難から救われる事になります.