Backup-mini-HOWTO version 0.05 (by 菊谷 誠)

このドキュメントの内容

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

なぜバックアップを取る?

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

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

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

  1. めんどくさい
  2. めったにディスクは壊れんよ
  3. ストリーマを持ってない
  4. 適当なバックアップのツールがない

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

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

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

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

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

なぜafioか?

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

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

(*) dumpに関してはJFドキュメントで、福島於修さんの 「dump-restore-mini-HOWTO」 という詳細な説明がありますので、ぜひ参照してください。

なぜ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'sNote) に固有の問題なのか、知らないうちにディスクのジオメトリを変えられると Win95はこうなってしまうものなのかは定かではありません。

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

追記

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


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

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

  1. afioが作成するアーカイブファイル中のi-node情報は、8^6分までしかない
  2. afioがリストアをするとき、ハードリンクの復元はi-node情報を元に行う

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


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

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


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

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

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

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

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

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


免責

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

配布条件

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


kikutani@sprintmail.com

Last modified: 23-OCT-1998