こうした訳で、信頼性と効率のバランスをとったバックアップツールを作成した。
この最初の版が 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
にメールで知らせてほしい。