15.9. バックアップの基本

主なバックアッププログラムは dump(8), tar(1), cpio(1) の三つです。

15.9.1. ダンプとリストア

伝統的な UNIX® のバックアッププログラムは dumprestore です。 これらはファイルシステムによって作成されるファイル、リンク、 ディレクトリといった抽象の下位にある、 ディスクブロックの集合としてドライブを操作します。 dump はデバイス上のファイルシステム全体をバックアップします。 ファイルシステムの一部分だけ、 または二つ以上のファイルシステムにわたるディレクトリツリーをバックアップすることはできません。 dump はファイルおよびディレクトリをテープに書き込まずに、 ファイルおよびディレクトリを含んだ raw データブロックを書き込みます。

Note: ルートディレクトリで dump を使った場合、 /home, /usr など、他の多くのディレクトリはバックアップされません。 これらのディレクトリは通常、 他のファイルシステムへのマウントポイントであったり、 シンボリックリンクとなっているためです。

dump には AT&T UNIX のバージョン 6 (およそ 1975 年) の初期から残っている癖があります。 デフォルトのパラメタは、現在利用可能な高密度メディア (最大 62,182 ftpi) ではなく、9 トラックテープ (6250 bpi) に最適な値となっています。 現在のテープドライブの容量を利用するために、 これらのデフォルト値をコマンドラインで上書きしなければなりません。

rdumprrestore を用いて他のコンピュータに接続されているテープドライブにネットワーク経由でデータをバックアップすることも可能です。 どちらのプログラムもリモートのテープドライブにアクセスするために rcmd および ruserok に依存しています。 したがって、バックアップを実行するユーザがリモートコンピュータの .rhosts ファイルに書かれていなければなりません。 rdump および rrestore の引数はリモートコンピュータに適切なものを用いなければなりません。 FreeBSD コンピュータから komodo と呼ばれる Sun に接続されている Exabyte テープへ rdump するには以下のようにします。

# /sbin/rdump 0dsbfu 54000 13000 126 komodo:/dev/nsa8 /dev/da0a 2>&1

注意: .rhosts 認証を許可することには、セキュリティに関する暗黙の仮定があります。 あなたの状況を注意深く調べてください。

ssh 越しに dumprestore をより安全な形で使うこともできます。

Example 15-1. ssh 越しの dump の利用

# /sbin/dump -0uan -f - /usr | gzip -2 | ssh1 -c blowfish \
          targetuser@targetmachine.example.com dd of=/mybigfiles/dump-usr-l0.gz

または、環境変数 RSH を設定して、 dump の組み込み機能を利用する。

Example 15-2. RSH を設定した ssh 越しの dump を利用

# RSH=/usr/bin/ssh /sbin/dump -0uan -f targetuser@targetmachine.example.com:/dev/sa0

15.9.2. tar

tar(1) は AT&T UNIX の バージョン 6 (1975 年ごろ) にまで遡ることができます。tar はファイルシステムと協調して動作し、 ファイルとディレクトリをテープに書き込みます。tarcpio(1) で使用可能なフルレンジのオプションには対応していませんが、 tar には cpio が使用するような奇妙なコマンドパイプラインは必要ありません。

tar の多くの版はネットワーク経由のバックアップには対応していません。 FreeBSD が使用している GNU 版の tar は、 rdump と同じ構文でリモートデバイスに対応しています。 komodo と呼ばれる Sun に接続された Exabyte テープドライブに対して tar を実行するには以下のようにします。

# /usr/bin/tar cf komodo:/dev/nsa8 . 2>&1

リモートデバイスに対応していない版に対しては、パイプラインと rsh を使用してリモートテープドライブにデータを送ることができます。

# tar cf - . | rsh hostname dd of=tape-device obs=20b

ネットワークを越えたバックアップのセキュリティを懸念しているなら、 rsh の代わりに ssh を使うべきです。

15.9.3. cpio

cpio(1) は本来 UNIX ファイルを磁気メディアで交換するためのプログラムです。 cpio はバイトスワッピング、 多くの異なるアーカイブフォーマットの書き込みオプション (それ以外にも多数のオプションがあります) があり、 パイプで他のプログラムにデータを渡すこともできます。 この最後にあげた特徴が、cpio をインストールメディアとしては優れた選択肢にしています。 cpio はディレクトリツリーの探索の機能はなく、ファイルリストは stdin からの入力でなくてはなりません。

cpio はネットワーク経由のバックアップには対応していません。 以下のようにパイプラインと rsh を用いてリモートテープドライブにデータを送ることができます。

# for f in directory_list; do
find $f >> backup.list
done
# cpio -v -o --format=newc < backup.list | ssh user@host "cat > backup_device"

directory_list はバックアップしたいディレクトリのリストで、 user@host はバックアップを実行したいユーザとホスト名の組であり、 backup_device はバックアップを書き込みたいデバイスです (たとえば /dev/nsa0)。

15.9.4. pax

pax(1)tarcpio に対する IEEE/POSIX® の回答です。長年の間、さまざまな版の tarcpio は互いにわずかに非互換になってきていました。 それらをしらみ潰しに標準化する代わりに、POSIX は新しいアーカイブユーティリティを作りました。 pax は、いくつもの cpiotar のフォーマットの読み書きに対応しようと試みているほか、 専用に新しいフォーマットを開発しました。 コマンド群は tar よりも cpio の方にいくぶん似ています。

15.9.5. Amanda

Amanda (Advanced Maryland Network Disk Archiver) は単一のプログラムではなく、 クライアント/サーバ型のバックアップシステムです。 Amanda サーバは、 Amanda クライアントを有する ネットワークに接続されたコンピュータからデータを受け取り、 備え付けられたテープドライブにバックアップします。 いくつもの大容量ディスクを備えたサイトでの共通の問題は、 データディレクトリをテープにバックアップするのに時間がかかりすぎることです。 Amanda はこの問題を解決します。 Amanda は “ホールディングディスク” を使用して、 同時に複数のファイルシステムのバックアップを行うことができます。 Amanda の設定ファイルにかかれたすべてのファイルシステムのフルバックアップを特定の間隔でとるために “アーカイブセット” と呼ばれるテープグループを作成します。 “アーカイブセット” には 夜間に作成されるすべてのファイルシステムの増分 (または差分) のバックアップも含まれます。 障害が起きたファイルシステムのリストアには、 最も新しいフルバックアップと増分のバックアップが必要です。

設定ファイルでは、バックアップの制御と Amanda によるネットワークトラフィック量を設定します。 Amanda は上記のバックアッププログラムのいずれかを使ってデータをテープに書き込みます。 Amanda は port または package として利用可能です。デフォルトではインストールされていません。

15.9.6. 何もしない

“何もしない” というのはコンピュータのプログラムではありませんが、 バックアップの戦略として最も広く採用されています。 これには初期投資が必要ありません。 従わなければならないバックアップスケジュールもありません。 ただ何もしないだけです。データに何か起きたら苦笑いして耐えてください!

あなたにとって時間やデータの価値が少ないか、 あるいはまったくないのであれば “何もしない” のはあなたのコンピュータに最も適したバックアッププログラムでしょう。 しかし注意してください。UNIX は便利なツールです。 6 ヶ月も使用していれば、 あなたにとって価値のあるファイルの山が出来上がっているでしょう。

“何もしない” ことはコンピュータが同じものをもう一度作り直すことのできる /usr/obj やその他のディレクトリツリーについては適切なバックアップ方法です。 一例として、このハンドブックの HTML 版 または PostScript® 版を構成するファイルがあります。 これらの文書形式は SGML ファイルから作成されたものです。 HTML または PostScript ファイルのバックアップは必要ありません。 SGML ファイルは定期的にバックアップされています。

15.9.7. どのバックアッププログラムが最適ですか?

dump(8) です。以上。 Elizabeth D. Zwicky はここで検討したプログラムすべてについて拷問的なテストを行いました。 すべてのデータと UNIX ファイルシステムの状態すべてを保存するのに最適なのは、明らかに dump です。 Elizabeth は多種多様の特異な状態 (いくつかはあまり珍しくないものもあります) を含むファイルシステムを作成し、 それらのファイルシステムのバックアップとリストアを行って、 それぞれのプログラムのテストを行いました。特異な状態とは、 ホールがあるファイル、ホールとヌルブロックがあるファイル、 奇妙な文字をファイル名に持つファイル、読み取り不可、 書き込み不可のファイル、デバイスファイル、 バックアップ中のファイルのサイズ変更、 バックアップ中のファイルの作成および削除、などです。 彼女は 1991 年 10 月の LISA V で結果を発表しています。 torture-testing Backup and Archive Programs を参照してください。

15.9.8. 緊急時のリストア手順

15.9.8.1. 惨事が起きる前に

発生する可能性があるどのような惨事に対しても、 備えるのに必要な手順は以下の 4 ステップだけです。

最初に、 各ディスクのディスクラベルとファイルシステムテーブル (/etc/fstab)、 ブートメッセージ全体をそれぞれ 2 枚ずつ印刷します (たとえば disklabel da0 | lpr)。

2 番目に、ブートフロッピーと fix-it フロッピー (boot.flp および fixit.flp) にそのシステムのデバイスがすべて含まれているか確認します。 最も簡単に確認する方法は、フロッピーをドライブに入れてマシンをリブートしてブートメッセージを確認することです。 あなたのシステムのデバイスのすべてが含まれ、 機能していれば 3 番目の手順に進んでください。

さもなければ、 そのシステムのすべてのディスクをマウントでき、 テープドライブにもアクセスできるカーネルを備えた カスタムブートフロッピーを 2 枚作成する必要があります。 これらのフロッピーディスクには fdisk, disklabel, newfs, mount と、利用するバックアッププログラムが入っていなければなりません。 これらのプログラムはスタティックリンクされていなければなりません。 dump を使用するのなら、このフロッピーには restore も含まれていなければなりません。

3 番目に、定期的にバックアップテープを作成します。 最後のバックアップの後で行われた変更は、回復できずに失われます。 バックアップテープにライトプロテクトを施してください。

4 番目に、フロッピーディスク (boot.flpfixit.flp、 か、第 2 段階で作成した 2 枚のカスタムブートフロッピーディスクのどちらか) およびバックアップテープのテストをします。 手順のメモを作りましょう。 このメモはブートフロッピー、印刷した紙、 バックアップテープと一緒に保存しておきます。 リストアを行うときには、 このメモがバックアップテープを壊すのを防ぐくらい取り乱しているかもしれません (どのように? tar xvf /dev/sa0 の代わりに、うっかり tar cvf /dev/sa0 と入力してバックアップテープを上書きしてしまうかもしれません)。

訳注: 上書きはライトプロテクトをしておけば防げますが、 何らかの原因でプロテクトがはずれているかもしれません。 ちなみに訳者の経験から言えば、 上のようなミスタイプは結構起きます。

安全性を増すために、毎回、 ブートフロッピーを作成し、 2 巻のバックアップテープを取ります。 一方を離れた場所に保管します。 離れた場所は同じ事務所の建物の地下室ではいけません。 世界貿易センタービルにあった数多くの会社は、 苦い経験によりこの教訓を得ました。離れた場所とは、 コンピュータやディスクドライブから十分な距離を取って 物理的に分離されていなければなりません。

Example 15-3. ブートフロッピーを作成するスクリプト

#!/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 /dev/fd0c fd1440

#
# newfs the one and only partition
#
newfs -t 2 -u 18 -l 1 -c 40 -i 5120 -m 5 -o space /dev/fd0a

#
# 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
#
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 -- A kernel to get FreeBSD onto a disk.
#
machine         "i386"
cpu             "I486_CPU"
ident           MINI
maxusers        5

options         INET                    # needed for _tcp _icmpstat _ipstat
                                        #            _udpstat _tcpstat _udb
options         FFS                     #Berkeley Fast File System
options         FAT_CURSOR              #block cursor in syscons or pccons
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 da0 swap on da0 and da1 dumps on da0

device          isa0
device          pci0

device          fdc0    at isa? port "IO_FD1" bio irq 6 drq 2 vector fdintr
device          fd0 at fdc0 drive 0

device          ncr0

device          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          da0
device          da1
device          da2

device          sa0

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 da0
./MAKEDEV da1
./MAKEDEV da2
./MAKEDEV sa0
./MAKEDEV pty0
cd /

#
# create minimum file system 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
#
/sbin/umount /mnt
echo "The floppy has been unmounted and is now ready."

15.9.8.2. 惨事の後は

重要な問題は、ハードウェアが生き残ったかどうかです。 定期的にバックアップを取っていれば、 ソフトウェアについて心配する必要はありません。

ハードウェアに障害があれば、 コンピュータを使用する前にその部品を交換してください。

ハードウェアに問題が無ければ、フロッピーを確認してください。 カスタムブートフロッピーディスクを使用しているのであれば、 シングルユーザモードでブートして (boot: プロンプトで -s を入力します)、 次の段落は飛ばしてください。

boot.flpfixit.flp を使用しているのであればこのまま読み進めてください。 boot.flp フロッピーをフロッピードライブに入れて、 コンピュータを起動してください。 本来のインストールメニューが画面に表示されます。 Fixit--Repair mode with CDROM or floppy. オプションを選択します。指示された通り fixit.flp をいれてください。 restore とその他必要となるプログラムは /mnt2/stand にあります。

そして、ファイルシステムを一つずつ回復します。

最初のディスクのルートパーティションを mount してみてください (たとえば mount /dev/da0a /mnt)。 ディスクラベルが破壊されている場合は、disklabel を用いてあらかじめ印刷して保存しておいた通りにパーティションを作り直し、ディスクラベルを作成してください。 newfs を使用してファイルシステムを作り直します。 ルートパーティションを読み書き可能にマウントし直します (mount -u -o rw /mnt)。 バックアッププログラムとバックアップテープを使用して、 このファイルシステムのデータを回復します (たとえば restore vrf /dev/sa0)。 ファイルシステムをアンマウントします (たとえば umount /mnt)。 障害を受けたファイルシステムそれぞれについて繰り返してください。

システムが動き出したら、 新しいテープにデータをバックアップしてください。 どのような理由で再び事故が起きたり、データが失われるかわかりません。 これに数時間を費すことで、後々の災難から救われます。