FreeBSD ハンドブック
Prev | Chapter 15. ストレージ | Next

# 15.9. バックアップの基本

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

## 15.9.1. ダンプとリストア

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

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

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

`rdump` と `rrestore` を用いて他のコンピュータに接続されているテープドライブにネットワーク経由でデータをバックアップすることも可能です。 どちらのプログラムもリモートのテープドライブにアクセスするために `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` 越しに `dump` と `restore` をより安全な形で使うこともできます。

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` はファイルシステムと協調して動作し、 ファイルとディレクトリをテープに書き込みます。`tar` は cpio(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) は `tar` と `cpio` に対する IEEE/POSIX® の回答です。長年の間、さまざまな版の `tar` と `cpio` は互いにわずかに非互換になってきていました。 それらをしらみ潰しに標準化する代わりに、POSIX は新しいアーカイブユーティリティを作りました。 `pax` は、いくつもの `cpio` や `tar` のフォーマットの読み書きに対応しようと試みているほか、 専用に新しいフォーマットを開発しました。 コマンド群は `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.flp` と `fixit.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.flp` と `fixit.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`)。 障害を受けたファイルシステムそれぞれについて繰り返してください。

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

Prev | Home | Next
フロッピーディスクへのバックアップ | Up | ネットワーク、メモリ、そしてファイルベースのファイルシステム