## Backup-mini-HOWTO

v0.05, 1998/10/23
菊谷 誠

主として `afio` を使ったバックアップ技法について述べます。 Windows95 のパーティションをバックアップする方法についても触れます。

## このドキュメントの内容

主として `afio` を使ったバックアップ技法について述べます。 Windows95 のパーティションをバックアップする方法についても触れます。

## なぜバックアップを取る？

バックアップの重要性はみんな知っているとは思いますが、 定期的に実施している人は少ないと思います。

ハードディスクは壊れるものである

という命題が真であると知りつつ、なぜバックアップをやらないか？

1. めんどくさい

2. めったにディスクは壊れんよ

3. ストリーマを持ってない

4. 適当なバックアップのツールがない

というところが主な理由でしょうか。まあ 1 と 2 はわからんこともないのですが、 筆者の経験によると、バックアップに関してもマーフィーの法則は成立していて、

バックアップを取っていないときに限ってハードディスクは壊れる

はかなり高い確率で真だと思います。

3 の、バックアップに使う大容量メディアを どうするかは頭の痛い問題で、筆者も何度か清水の舞台から飛び降りるつもりで ストリーマ ( DATでも 8mm でもいいですが)を買おうと思った時があるのですが、 そのたびに思いとどまりました。だって高いくせに買って楽しい機械じゃないん だもの。しょうがないので今だに MO や PD を使ってます。最近の大容量化著しい ハードディスクに対しては 230MB や 600MB 程度のメディアでは 足りなくなることも多いのですが、マルチボリューム対応のバックアップツール を使うことでカバーします。

4 の、ツールに関しては実はあります。 sunsite の `backup` のディレクトリを 探してみてください(日本のミラーでは ここら)。 けっこうあるでしょう？ 筆者はこのうち tbackup を長いこと使ってました。 また、taper もちょっと試してみたことがあり、こちらのほうが洗練された ユーザインターフェースを持っています。 この文書は「mini-HOWTO」なので、これらのツールについては直接言及しませんが、 真剣にバックアップを考えている 人はこれらのツールを持ってきてドキュメントを読んで使いこなしましょう。

## なぜ afio か？

最初の予定では、バックアップ用コマンドとして

1. GNU tar

2. dump

3. cpio

についても書く予定だったのですが、`afio` の一本に絞りました。 GNU tar はバックアップツールとしても意外に強力で、FD へのマルチボリューム・ バックアップやインクリメンタル・バックアップもできます( `man tar` してみましょう)。ただ後述のように、gzip と組み合わせて圧縮バック アップを取るとき難点があるので却下しました。dump は筆者がよく理解していないの と、DOS/Windows パーティションが取れないのでここでは触れません dump に関しては JF ドキュメントで、福島於修さんの 「dump-restore-mini-HOWTO」 という詳細な説明がありますので、ぜひ参照してください。 。cpio は、`afio` が cpio の上位互換のようなものなので わざわざ言及する必要もないだろうと。

## なぜ tar+gzip はよくないか？

`afio` は cpio に似たコマンドです。Debian などの Linux の主要 なディストリビューションには `afio` のパッケージがあると思い ますが、ない場合は ソース (日本のミラーでは こっち) を持ってきて `make` しましょう。いや、 すでにパッケージがあっても、2.4.4 より古いのだと、後述のハードリンクの bug が あるので、最新を使いましょう。

`afio` の特長は「gzip と組み合わせて、圧縮してバックアップを 取れる」という点です。メディアのほうで圧縮をサポートしていない限り、dump は これができませんよね。

「まてまて、tar だって gzip で圧縮バックアップできるじゃないか」 という声は当然予期されます。筆者は tar+gzip でのバックアップはお勧めしません。 以下実例をあげて理由を書きます。

    % cd /usr/X11R6/lib/X11
    % tar cf - app-defaults | gzip -c > ~/app-defaults.tar.gz

などとして、`/usr/X11R6/lib/X11/app-defaults` のバックアップを取るとします ( GNU tarなら「`z`」オプションを付けるだけですが、ここでは普通 の tar での使い方です)。さて、何らかの理由で、バックアップ・メディアが損傷を 受け、上の app-defaults.tar.gz の一部が壊れたとしましょう。実験なので、 バイナリエディタの beav で 200 バイトめを「00」に書き換えてしまいます。

    % beav ~/app-defaults.tar.gz    壊す！
    % cd ~/tmp
    % zcat ~/app-defaults.tar.gz | tar xvf -
    app-defaults/
    app-defaults/Beforelight
    app-defaults/Bitmap
    tar: Skipping to next file header

    zcat: /home/kikutani/app-defaults.tar.gz: invalid compressed data--crc error

御愁傷様です。.tar.gz の途中のデータが壊れると、それ以後の部分もすべてお陀仏に なります。さて、筆者の勧める afio + gzip だとどうでしょう？

    % cd /usr/X11R6/lib/X11
    % find app-defaults | afio -oZ ~/app-defaults.afz
    % beav ~/app-defaults.afz       壊す！
    % cd ~/tmp
    % afio -ivZ ~/app-defaults.afz
    app-defaults -- okay
    app-defaults/Beforelight -- okay

    gzip: stdin: invalid compressed data--crc error
    afio: "inentry xwait()": Exit 1
    app-defaults/Bitmap -- uncompressed
    app-defaults/Bitmap-color -- uncompressed
    app-defaults/Chooser -- uncompressed
    app-defaults/Editres -- uncompressed
    (以下略)

さすがに壊した部分のファイルは戻りませんが、そこ以外は問題なくリストア されます。tar + gzip より afio + gzip のほうが安全なことは理解いただけました ね？

## afio でのバックアップ

`afio` のコマンドオプションはたくさんあって、`man afio` するとうんざりしますが実際に使うオプションは限られたもの です。`afio --help` して出てくるもので十分でしょう。

    % afio --help

    Usage:  [filename generator] | afio -o [options] archive  : write archive
            afio -i [options] archive  : install archive
            afio -t [options] archive  : list table-of-contents of archive
            afio -r [options] archive  : verify archive against filesystem
    Frequently used options:
     General: -v : verbose        -Z : gzip files
     Tape:    -s [volsize]   : size of volume, can have suffix k or m
              -b [blocksize] : block size (default is 5120)
              -c [count]     : buffer count blocks between doing I/O
     Floppy:  -F : device is a floppy drive, -s required    -K : verify floppies
     Install: -n : protect newer files  -k : skip corrupt data at beginning
     Select:  -y [pattern] : only process files matching pattern
              -Y [pattern] : do not process files matching pattern
    Version 2.4.2 dated 21 Jan 1996

### バックアップを取る

例として、全ファイルを 230MB の MO にバックアップすることを考えます。 MO は `/mo` にマウントされています。MO のファイルシステムはなんでもいいのですが、ext2 よりはオーバヘッドの少ない minix や DOS がいいかもしれません。

    cd /
    find . | egrep -v '^\./proc/|^\./mo/' | \
    afio -ovZ -s 210m -L /mo/backup.log /mo/backup.afz \
    2>&1 | tee /mo/backup.lis

`find` の後の `egrep` は、稼働中のシステムの `/proc` 以下が取られてしまうのを防ぐことと、MO 自体が取られ てしまうことを防ぐためです。この「取らない部分」に `lost+found` も含めたほうがいいとは思うのですが、実際にはあま り必要ないみたいですね。

`afio` のオプションの説明です。`o` はバック アップを書く意。`v` はリスティングを取るモード。 `Z` は gzip 圧縮。`L` はログを書く。

`s` は指定した容量 (この場合 210MB ) での マルチボリューム・バックアップを指示。230MB の MO であっても、ここの値は 小さめにしといたほうがいいです。ここで指定した容量以上を書こうとすると メディアの交換を要求してきますので、別の端末で `/mo` を `umount` し、別の MO を入れて `mount` して から `afio` に続行を指示します。`afio` の マルチボリュームはサイズで見てるだけなので単純なのですが、単純さ故の利点もあり ます。メディアの種類によらずに使えることです。

最後の `tee` の部分はなくてもいいのですが、リスティングを 画面とファイルの両方に出したいためです。ファイルのリスティングは終わった後 圧縮しといたほうがいいかも。

本当に重要なバックアップでは、`afio` の `-r` オプションで、取ったバックアップが正しいかチェックしましょう。

### バックアップをリストアする

戻すほうは簡単です。書きこむ場所に行って、

    afio -ivZ -s 210m /mo/backup.afz

としましょう。マルチボリュームで取ったやつは、ひとつのメディアが終われば 自動的にメディアの交換を要求されるでしょう。実際に戻す前に

    afio -tZ /mo/backup.afz

で中身を確認しておいたほうがいいでしょうね。

### インクリメンタル・バックアップを取る

本当はインクリメンタル・バックアップまでやろうとしたら、tbackup などの ツールを使ってシステマティックに管理したほうがいいです。でもコマンドだけ でもできないことはないので一応書いておきます。 インクリメンタル・バックアップとは、要は前回のバックアップ (フル、インクリメンタルを問わず)以後に変更されたファイルをバックアップ とることですよね。そこで、上のように `-L /mo/backup.log` でログを残す習慣にしておけば、

    cd /
    find . -cnewer /mo/backup.log | \
    afio -ovZ -L /mo/incback1.log /mo/incback1.afz

というふうにし、その次のインクリメンタルでは

    cd /
    find . -cnewer /mo/incback1.log | \
    afio -ovZ -L /mo/incback2.log /mo/incback2.afz

という要領で取って行けばいいのです(ここでは egrep によるフィルタは 省略)。ただし、.log の日付けが変わって しまわないよう注意しましょう。厳密にやるなら .log の最後の 「Sun Mar 22 11:36:29 1998」などを、`touch` の理解する 「MMDDhhmmCCYY」の形式に変換し、`touch` でその日付の生成 ファイルを作り、`find` からはそのファイルを `-cnewer` で指定するようにします。まあそこまでめんどくさい ことやるなら、tbackup や taper を使ったほうがいいですけどね。

## Windows95 のパーティションのバックアップ

さて、ここで少し話が変わります。ご存知のように、Linux では Windows95 の パーティションを読めますので、一見 tar や afio を使って Windows95 の バックアップが取れると思うでしょう？ これができれば、Windows95 に 付属している役立たずのバックアップツールよりよほど便利なはず。 しかし、実際にやってみると問題が出ます。日本語 Windows95 で頻繁に使われ ている「日本語のファイル名」でひっかかるのです。バックアップを取るときは 一応取れているみたいなのですが、戻すときエラーになります。

くっそー MS め、日本語ファイル名なんか使うなよなー、とぼやいていたところ いいモノを見つけました。 川口 浩さんのページにある「 VFAT を日本語ファイル名に対応させるパッチ」 です。小柳 雅明さんと川口さんが作られたパッチです(多謝！)。 このパッチをあてたカーネルを使うと、上の問題は起きないのですね。 「半角カナを全角カタカナに変換する」する機能は、バックアップの用途では オフにしといたほうがいいようです。

今この文書を書いてるノート PC は先日ディスクの換装を行なったのですが、 そのとき、この方法を試してみました。以下手順です。

1. Windows95 から Win95 のブートフロッピーを作っておきます。そのフロッピーに `fdisk.exe` をコピーしておきます。念のため `format.com` と `sys.com` もコピー。

2. VFAT パッチをあてた Linux カーネルを立ち上げ、Windows95 のパーティションを `afio` + `gzip` でバック アップを取ります。筆者はバックアップ・メディアとして携帯用の PD を使いました。 もちろん Linux のほうも同時に取っておきます。

3. ディスクを換装する。

4. Windows95 のパーティションを切る。作っておいた Win95 のブートフロッピーで 立ちあげ、`fdisk` でパーティションを切り、`format.com` でフォーマットする... のが普通にやりかたでしょうが、筆者は DOS/Win の `fdisk` を 信頼していないので、Linux でやってしまいました。ただし、Windows95 で拡張 パーティションを使うときは Windows95 の `fdisk` で切らないと だめかもしれません。

5. Linux のほうでパーティションを切るときは、`fdisk` と `mkdosfs` の入った boot/root フロッピーで立ち上げてから (Linux の) fdisk でパーティションを切ったのち、`mkdosfs` で FAT のフォーマットをします(これは FAT16 だよね)。

6. どっちの OS でパーティションを切ったにせよ、バックアップデータをリストア するときは、VFAT パッチをあてたカーネル入りの boot/root フロッピーを使って Linux を起動します。このフロッピーは PCMCIA の SCSI カードや `afio` を使えるようにしてあります。Windows95 パーティションを `vfat` でマウントし、`afio` で PD から Windows95 データを戻します(もちろん Linux のほうも)。

7. これだけでは Windows95 はブートしないので、作っておいた Win95 の ブートフロッピーで立ち上げ、「`fdisk/mbr` 」を実行します。

8. 立ち上げなおすと、こんどは Windows95 がブートします。

立ち上げのとき「 `c:\windows\system\ddem.dll` が修復される 必要がある」というメッセージが出ますが、無視して OK を押して行くと無事立ち上 がります。 実用上問題ないのですが、このメッセージはときどき出るようになったので、 念のため Windows95 の修復インストールをすると出なくなりました。 この現象が、上記のバックアップの方法によるものなのか、私のノート PC (Let's Note) に固有の問題なのか、知らないうちにディスクのジオメトリを変えられる と Win95 はこうなってしまうものなのかは定かではありません。

もっとも、筆者はこの方法で完全に Windows95 のパーティションのバックアップを 取れるかどうか自信があるわけではありません。今のところ支障なく動いている ように見えますが、なにしろ筆者は Windows95 はあまり使っていないので。 こういうやり方もある程度の話として聞いておいてください。

## 追記

その後、野首さんから次のような報告をいただきました。

> 私も結構前から `afio` を使っています。しかし、リストア時に 時々おかしなハードリンクが張られてしまったり、ファイルサイズが 0 のファイルが 作られてしまったりと、不審な挙動にあっています。

いろいろと調べてみたところ、次のような動作に原因があるようです。

1. `afio` が作成するアーカイブファイル中の i-node 情報は、8^6分までしかない

2. `afio` がリストアをするとき、ハードリンクの復元は i-node 情報 を元に行う

すなわち、たまたま unsigned short 化されてしまった i-node 番号が同じ値に なる無関係なファイルがあると、それらがハードリンクされていると誤認して しまうのです。

野首さんが報告したおかげで、`afio` の作者が直す方向で動いてく れて、新バージョンは出ました。必ず新しいのを使いましょう。

以下、野首さんから別のコメントです(多謝！)。

> 1. acct パッケージをいれている時は、accton を引数無しで実行して 記録を止めた方が良い

> 2. ほおっておくと、`/var/account/pacct` が 巨大になることがあります。

> 3. MO を使う場合、フォーマットをせずに `/dev/sd[a-h]` を直接指定することもできる。

>    私はこちらの方法をとっています。`mkfs` する必要がない のと、ディスクをまるまる使えるので `mkfs` したメディアよりも たくさん記録できるというメリットがあります。そのかわり、ディスクのあいた部分 を使うようなことはできません。

> 4. バックアップをとるときに `-l` を付けるとより安全になる。

>    `-l` を付けないと、`afio` はハードリンクされた ファイルをバックアップする際に、実体 1 つ分しかファイルに記録しないので、そこが やられるとハードリンクされたファイル全てが復元できなくなります。

## 免責

この文書は正確に書いたつもりですが、書き間違いや思い違いがあるかも しれません。これら間違い等により、この文書の読者がバックアップに 失敗したり、重要なデータを失なうことになっても、この文書の筆者は 一切責任を負いません。すべて自己の責任において作業してください。 ただし、間違いの指摘は歓迎します。

## 配布条件

Free Software Foundation の GNU General Public License version 2 に準拠するものとします。

`kikutani@sprintmail.com`

Last modified: Mon Feb 12 01:01:09 JST 2001

(SGML conversion: yuji senda)