こうした訳で、信頼性と効率のバランスをとったバックアップツールを作成した。
この最初の版が backup である。
backup を作ってみると、これがディレクトリのコピーや、ディレクトリのバックアップに使える事がわかった。そして backup を廃止して、cpdir に変更した。
Plan9 には、これとよく似たツールが存在する。mkfs である。ファイルシステムのメンテナンスや配布に使われているようだ。大掛かりな仕掛けであり、手軽にと言う訳にはいかない。cpdir は手軽なツールとして、役に立つだろう。
なお他に dircp もある。これは簡単なシェルスクリプトで、cpdir の一部の機能がサポートされている。
注: 古い記事に最小限の修正を加えました(2021-10-13)
cpdir の使い方foo を既に存在するディレクトリとせよ。bar はまだ存在しないとせよ。その下で、term% cpdir foo bar
foo のコピーが bar にできる。この場合、ファイルの修正日が保存される。bar が既に存在する場合にはterm% cpdir -m foo bar
-m はマージオプションである。bar があればマージに決まっているからいらないのでは…とも考えられようが、マージは危険な作業である。従ってその事を自覚して貰うために -m オプションを要求する事とした。foo の中の幾つかのファイルを修正し、あるいはいくつかを foo に追加し、cpdir を実行してみればわかるように、cpdir は変更されていないファイルのコピーを行わない。
マージを巡る諸問題に関する考察は後回しにする事とし、まずは cpdir のオプションを紹介する事とする。
term% cpdir cpdir: usage: cpdir [-mugvR] [-l file] [-x file] srcdir dstdir [path ....] -m: マージ -u: オーナーをコピー元に合わせる。(可能ならば) -g: グループをコピー元に合わせる。(可能ならば) -v: verbose (メッセージをくどくどと出力させる -R: コピー元に存在しないコピー先のファイルを消す -l file: コピーするファイルやディレクトリの一覧を与える -x file: コピーしないファイルやディレクトリのパターンの一覧を与える srcdir: コピー元のディレクトリ dstdir: コピー先のディレクトリ path ... : srcdir 内のコピーするファイルとディレクトリ
cpdir を使ったファイルシステムのバックアップ/n/9fs /n/kfs
/n/9fs の完全なコピーを効率よく /n/kfs に作成する事になる。
Plan9 には mkfs が存在し、バックアップにある程度使えるが次の欠陥を持っている2。
/n/9fs で削除されたファイルやディレクトリを /n/kfs から削除しない。/n/9fs で変更されたパーミッションやグループ、オーナー情報を /n/kfs で変更しない。cpdir)はこうした問題を解消し、効率よくバックアップを採ることを目指している。
バックアップをとるディレクトリは cpdir の引数として与えてもよいが -x オプションによってファイルの中に一覧を書くこともできる。
後者の場合にはファイルは例えば次のように書く。
# each line is trimmed before evaluation # lines starting with `#' are comments # one path per line 386 cron dist rc lib sys lp acme mail/lib adm dist usrコピーしないファイルやディレクトリパターンの一覧を
-x オプションによって与えることができる。例えば次のように書く。adm/users */tmp/* */_*ここにおける
* は、シェルにおけるパターンマッチングと似ているが、次の点で異なる。すなわち、/ にもマッチする。従って*/tmp/*
/usr/arisawa/tmp/*
/usr/arisawa/tmp/T/foo
cpdir は当然 Plan9 のアクセス制限の影響を受ける。
/n/9fs がファイルサーバであれば、アクセス制限を回避するよい手段は存在しない。
(バックアップ中にシステムの運用を止めたいとは誰も思わないであろう。)
他方 /n/kfs の方は kfs のオーナー(hostowner)であればアクセス制限を無効にでき、オーナー情報を含めて自由に設定できる。
従って cpdir は基本的にはサーバのオーナーである bootes が実行することによって有効に機能する。
エンドユーザは bootes が読み取れない /n/9fs のファイルのバックアップをとる必要がある。そのようなファイルとしては例えば
/mail/box/arisawa
kfs は Plan9 の簡易ファイルシステムである。9front 版ではサポートされていない。usb disk に構築するのに手頃だからサポートはして欲しいが...
cpdir とどのように振る舞うか?src dst DIR DIR # さらに下位のディレクトリを調べる DIR FILE # なにもしない FILE DIR # なにもしない FILE FILE # なにもしない
src dst DIR DIR # さらに下位のディレクトリを調べる DIR FILE # dst を src に合わせる FILE DIR # dst を src に合わせる FILE FILE # dst を src に合わせる
src dst DIR DIR # さらに下位のディレクトリを調べる DIR FILE # dstの fstat を srcの fstat に合わせる FILE DIR # dstの fstat を srcの fstat に合わせる FILE FILE # dstの fstat を srcの fstat に合わせる
fstat と変更時刻情報やファイルパーミッションなどである。
cpdir の目標はコピー元の情報をコピー先に反映させる事である。cpdir はファイルシステムのバックアップツールとして生まれたのだから、コピー元を優先している。しかしながら、コピー先のディレクトリが一挙に削除される事もあるので注意して使用すべきであろう。
cpdir はどこに?cpdir はhttp:/netlib/cmd/
バグを見つけたら、あるいは改善の提案があれば
arisawa@aichi-u.ac.jp
にメールで知らせてほしい。