mirrordir

名前
書式
説明
セキュリティと暗号化
オプション
FTP のサポート

環境変数
返り値
バグ
ファイル
準拠
入手方法
著者
関連項目

名前

pslogin − 強力なストリーム cipher 暗号化と diffie-hellman 鍵交換を用いた安全なリモート tcp ログイン

forward − 任意の tcp ソケットを安全かつ暗号化されたチャネルにフォワードする

copydir, mirrordir − 変更された最小の部分のみを用いて (ローカル、FTP 経由、安全な tcp 接続経由で) ディレクト リツリーをコピーまたはミラーする

recursdir − ファイルの操作/検索や tar ファイル作成のために、ローカルまたはリモートのディレクトリを再帰的に探索する

書式

mirrordir
[-a, --access-times]
[-m, --strict-mtimes]
[--no-mtimes]
[--ignore-size]
[-A, --mtime-threshold ext]
[--time-offset [[+]|-][H]H[:MM]]
[-A, --always-write]
[-r, --restore-access]
[--no-chown]
[--no-chmod]
[-D, --only-delete]
[-b, -S, --backup-extension, --suffix ext]
[-N, --num-backups num]
[-O, --backup-outdate sec]
[-B, --block-size bytes]
[-M, --max-bytes num[K|M|G]]
[-s, --starting-file path]
[-i, --ignore-next-exclude]
[[-i] -X, --exclude path] [[-i] -X, --exclude path] ...
[[-i] -F, --exclude-from file] ...
[[-i] -G, --exclude-glob expr] [[-i] -G, --exclude-glob expr] ...
[[-i] -R, --exclude-regexp expr] [[-i] -R, --exclude-regexp expr] ...
[-C, --exclude-script [expr|file]] [-C, --exclude-script [expr|file]] ...
[-h, --help]
[-v, --verbose] [-v, --verbose] ...
[-V, --version]
[-k, --keep-files]
[-l, --no-hard-links]
[--follow-symlinks]
[-L, --strict-locking]
[-p, --password password]
[-P, --password-exact password]
[--test-login]
[--no-warn-first-login]
[--read-password-from-stdin]
[--allow-empty-ftp-dirs]
[--no-allow-empty-ftp-dirs]
[--netrc]
[--no-netrc]
[--proxy-host host]
[--secure]
[-z, --gzip]
[--gzip-backups]
[--case-insensitive]
[--to-lower]
[--to-upper]
[--no-use-passive-connections]
[-K, --key-size bits]
[--download-scripts]
[--tar-file filename]
[--tar-block-size N]
[-t, --dry-run, --test-only]
[--nice num] control mirror

mirrordir [-c | --copy-mode | --recurs-mode ] -[abBCdDFGhklMmNOopRrstvVX] src [src ...] dest

copydir -[abBCdeFGhklMmNOopRrstvVX] src [src ...] dest

recursdir -[abBCdeFGhklMmNOopRrstvVX] src [src ...]

pslogin [--key-size bits] [mc://][username@]hostname[:portnumber][/path]

しかし通常は単に:
mirrordir
[--exclude path] control mirror
copydir
src [src ...] dest
recursdir
src [src ...] [-C program]
pslogin
[username@]hostname[:portnumber]

説明

mirrordir は ディ レ クトリを操作したりミラーする際に便利なユーティリティの集まりである。 ssh(1) の代替になるコマンド pslogin や、任意の TCP ソケット接続を暗号化された安全なチャネルにフォワードする forward(1) も含まれている。

mirrordir は 2 つのディレクトリ controlmirror との間で異なるファイルを、 control から mirror へとコピーする。修正時刻 (modificatoin time) またはサイズが異なるファイルがコピーされる。ファイルの許可属性・所有者・修正 時刻・アクセス時刻 (--access-time が用いられた場合のみ)・スティッキービット・デバイスタイプが複製される。シンボリックリンクは リンク先の解決をされずにそのままコピーされる。シンボリックリンクの修正・アクセス時刻 (シンボリック自身のもので、シンボリックが指すファイルの ものではないことに注意) は保存されない。ハードリンクされたファイルは単にコピーされる。生成時刻は、私の知る限り Unix では設定できない。

mirrordir危険なコマンドである。 mirror にあって control にないファイルやディレクトリは削除されるからである。もし control が完全に空の場合には、 mirror のすべてのファイルやディレクトリが削除される。もし mirror が完全に空の場合には、 control のすべてのファイルやディレクトリがコピーされる。

要するに mirrordirmirror をディレクトリツリー control の完全なレプリカにし、またその際にあらゆるものを (定期 的バックアップという目的に合致するなら) 可能な限り複製しようとする。当然 mirrordir はサブディレクトリの一番深いところまで降りてい く。ディレクトリミラーの際には、それに必要な最小の変更のみを調べ、可能な限り効率的に動作しようとする。

アクセス時刻の複製は通常は必要なく、また不要な負荷を与えることになる。よってこれはオプションになっている。

ディレクトリ control には、何の変化も与えない。--restore-access が与えられると、アクセス時刻は読み込みのたびに、元の 時刻に再設定される。

--strict-locking オプションをオンにすると、 control にあるコピー作業中のファイルは「共有読み込 み (shared reading)」にロックされる。これによって、他のプロセスがそのファイルに頻繁に書き込みを行っている場合でも、ファイルが不完全な状態や壊れた 状態ではコピーされないことを保証する。

通常 mirrordir は問題があっても中断せず、問題の報告を stderr へのエラーメッセージとして行い、動作を継続する。

ディレクトリ mirrordest は (たとえ空であっても) 存在していなければならない。

ディレクトリのすべてのファイルを削除する前に、 mirrordir*--keep-me というファイル (ここで * は 0 または 1 つ の文字) をチェックする。このファイルが存在すると、エラーメッセージを出して中断する。よって再帰的に削除されてはまずいディレクトリがあった ら、それぞれにこのようなファイルを作っておけば良い。

copydirmirrordir -ck --no-erase-directories ... と等価である (-c には -k が含 まれるが)。よって copydir は厳密な意味での cp(1) とよく似ているが、ファイル名は URL でも良く、かつ古いファイルだけが置き 換えられる。ファイル転送には、ほとんどの場合 mirrordir ではなく copydir を使うほうがよい。本当に消してよい場合に 限 り、 mirrordir を使うようにすること。

recursdir はまたもう一つのプログラムで、コマンドライン上でディレクトリを降りてゆくだけで何も行わない。これは mirrordir --recures-mode ... と等価である。これは -C オプションが追加される前にできたプログラムで、より厳密な find(1) として、あるいは見つかったすべてのファイルを tar ファイルにパックする目的に、それぞれ利用できる。

pslogin は さ ら に も う 一 つ の プ ロ グラムで、これまでに挙げた 3 つとはほとんど関係がない。 psloginsecure-mcserv を用いて安全なログインセッションを開始する。これは mirrordir --login-mode --secure ... と等価である。 psloginlogindir と呼ぶべきかもしれない。後述の --login-mode を参照のこと。

forward はさらにもう一つのプログラムで、最初の 3 つとはほとんど関係がない。これは任意のサービスを安全なチャネルにフォワードできる。 詳細は forward(1) を参照のこと。

このパッケージの重要な点は、通常のファイル名に替えて URL を使える点にある。よってファイルをネットワーク越しに操作できる。現在サポートされ ている URL のタイプは、 ftp://mc:// である (http:// はファイルシステムではないので、サポートされていない)。 mc://Midnight Commander ファイルシステムで、 secure-mcserv デーモンによってサービスされるものであ る。これには、暗号化された、強く安全なファイル転送およびログインを提供するという長所がある。

recursdir コマンドと copydir コマンドには glob 表現も利用できる。これらは再帰的に展開される。

セキュリティと暗号化

mirrordir は、強力なストリーム cipher 暗号化と、何種類かの鍵サイズでの Diffie-Hellman 鍵交換をサポートしてい る。安全な接続は mc:// の接続で動作する。オプション --secure, --key-size, --download-scripts を参照のこと。デモは の節を、公開鍵・秘密鍵の置場所については ファイルの節を参照のこと。

オプション

--help

詳しいヘルプを出力して終了する。

--verbose

mirror に対してなされたファイル修正に関して、詳しい出力をするよう指定する。このオプションは複数個指定でき、たくさん指定 するほどより詳しく出力する。出力は標準出力に書き出される。

--restore-access

読み込むを行うごとに、 control のアクセス時間を元に戻す。

--access-times

control のアクセス時刻も複製する。

--always-write

同じに見えるかどうかに関らず、すべてのファイルを書き変えるよう強制する。

--recurs-mode

これは recursdir ではデフォルトで有効になる。指定したディレクトリを再帰的に読み、それらに対しては何も行わない。この オプションはファイルを検索したり、 -C と共に指定してシェルコマンドを実行したりするのに便利である。なお C インタープリタ では system(), exec(), popen 関数が利用できる。

--login-mode

このオプションは pslogin ではデフォルトでセットされる。これは secure-mcserv を サー バ に 使 う rlogin とだいたい同じになる。 ssh(1) の代わりに使えるような、安全な暗号化された接続を提供する。 pslogin は暗黙のうちに --secure も指定する。このオプションを指定したり、 pslogin を用いた場合は、コマンドラインには パ ス を 1 つ だ け 指 定 し な け れ ば な ら な い。 指 定 の 形 式 は [mc://][username@]hostname[:portnumber][/path] である。

ログイン後直ちに、シェルプロンプトから cd /path が実行される。 pslogin は文字 #, $, > を調べ、プロ ン プ トが出たかどうか判断する。これらが見つからないと、 pslogin はずっと止まったままになる。この動作を避けるには、 /path/ とすれば良い。するとログインディレクトリに留まったままになる。あるいはシェルプロンプトを変更して、これらの 文字を含めるようにしてもよい。

--copy-mode

こ れは copydir ではデフォルトでセットされる。コピー元・コピー先の各ファイルに対して cp(1) と同じように振る舞 う。このオプションを用いると、暗黙のうちに --keep-files を指定したことになる。コピー先の既存のファイル・ディレク トリのうち、コピー元と同じ名前を持つものはすべて上書きされるが、これ以外の理由でファイルやディレクトリが削除されることはない。 コピー元には複数のファイルやディレクトリを指定できる。コピー先のパスはディレクトリでなければならない。

--no-erase-directories

このオプションを指定すると、コピー先のディレクトリとコピー元のファイルがおなじ名前で、かつそのディレクトリが空でない場合、 エ ラーメッセージを表示して終了する。これは copydir のデフォルトの動作である。

--erase-directories

このオプションを指定すると、コピー先のディレクトリとコピー元のファイルがおなじ名前の場合、コピー先のディレクトリは再帰的に削除 される。これは mirrordir のデフォルトの動作である。

--allow-empty-ftp-dirs

ftp サーバには、 . とか .. といったディレクトリを生成しないものがある。そのような場合、ディレクトリへの読み取り許可 がないように見えてしまう。このオプションを用いると、この動作を変更し、このような完全に空のディレクトリを単に空であるとみなして エラーにしない。 unable to open directory: *: Permission denied というエラーに なった場合は、このオプションを試してみるとよい。このオプションはデフォルトでは有効になっている (次項を参照のこと)。

--no-allow-empty-ftp-dirs

現在はディレクトリに cd してアクセス許可を調べるためにようになったので、デフォルトの動作は空のディレクトリを許可するように した。

--only-delete

mirror に対して、利用しているディスクスペースを増加させるような変更は一切行なわない。これは容量の限られているドライブに 対してバックアップを取る場合、転送の最中に controlmirror を増加させてしまうような変更がなされるときに便利 である。一度このオプションをつけて mirrordir を実行すれば、次にこのオプションをつけて実行したときには、利用できる領 域を越えないことが通常は保証される。

-i, --ignore-next-exclude

このオプションを指定すると、次の --exclude- タイプのオプションは、対象ファイルが mirror ディレクトリにあろ うと無かろうと、それらを完全に無視することになる。これは後述する --exclude-script オプションで IGNORE が 返っ た 場 合 と 同 じ 効 果 を 持 つ。 これは特定のファイルを決して変更しないようにするのに利用できる。例えば /etc/named.boot を決して変更したくない場合には、 mirrordir /mnt/1 /mnt/2 -i --exclude /mnt/1/etc/named.boot と す れ ばよい。mirror ディレクトリではなく、 control ディレクトリのフルパスで指定することに注意。 --exclude /mnt/2/etc/named.boot では動作しない。後者では、ファイルを削除したくない場合にはそのファイルが control ディレクトリに存在しなければならない (たとえサイズ 0 であっても) という馬鹿げた動作となる。

--exclude path

ファイルまたはディレクトリ path を除外する。コマンドラインにたくさんの exclude パスを指定すると、動作が遅くなっ てしまう。除外されたパスは、 mirror ツリーに存在する場合は削除される (そのディレクトリまたはファイルが存在していない 場合と同様である)。これらのファイルを削除せずに無視して保持しておきたい場合は、 --ignore オプションを用いること。

除外するファイルが長いリストになる場合は、 --exclude-from オプションを利用すること。

--exclude-glob glob

glob 形式の表現 glob にマッチするファイルするディレクトリを除外する。ファイルへのマッチではフルパスを用いない。シェ ルにおいては、glob 表現を適切な引用符で括り、解釈されないようにする必要がある。

--exclude-regexp regex

フルパス名が regex にマッチするファイルやディレクトリを除外する。シェルにおいては、正規表現を適切な引用符で括り、解釈さ れないようにする必要がある。

--exclude-script [expr|file]

各ファイルに対する処理を行なう前に、スクリプト expr を実行する。このスクリプトは C 言語スタイルの文ブロック か ら な り、`return expression;´ で終了する。 expression の値は INCLUDE, EXCLUDE, UNKNOWN IGNORE (上述の -ifP を見よ) のいずれかであり、そのファイルに対して成すべき動作を示す。 expr にセミコロン (;) が含まれていない場合は、これはファイル名とみなされ、そのファイルがロードされる。それ以外の場合は、テキスト は高速化のために逆ポーランド形式にコンパイルされる。このオプションは複数指定でき、その場合スクリプトは UNKNOWN 以外の値 が返るまで、順に実行される。 UNKNOWN が返った場合は、コマンドラインにあるその他の --exclude- 形式のオプショ ンが効力を持つ。

インタープリタがおかしなエラーを報告したり、セグメンテーションフォールトを起こした場合は、その原因となったスクリプトを私に送って ほしい。

このスクリプト言語自体は、C プログラミング言語のサブセットである。例えば以下のようなものは正しいスクリプトである。

/* PATH はファイルのフルパス名で、DIR は末尾に
   スラッシュ (/) の無いディレクトリ、CWD は
   カレントワーキングディレクトリ、dpath() は
   フォワードスラッシュ (/) の個数-1 を返す。*/
if (depth (DIR) - depth (CWD) > 3) {
    printf ("%s: excluded\n", PATH);
    return EXCLUDE;
} else
    return INCLUDE;

このスクリプト言語は代入演算子をサポートしない。したがってユーザ定義変数をサポートしない。

以下の定義済みマクロを利用できる。マクロの展開は、ディレクトリにもファイルと等しく同じように適用される。

FILE

現在のファイル (パス無し)

NAME

パス・拡張子の無いファイル名。末尾にドット (.) は付かない。

EXTENSION

ファイルの拡張子。先頭にドット (.) は付かない。

DIR

ファイル名の無いディレクトリ。末尾にスラッシュ (/) は付かない。

PATH

フルパスのファイル名

CWD

カレントワーキングディレクトリ

TIME

現在時刻 (秒単位)

C のすべての論理演算子・算術演算子・ビット演算子がサポートされている。すなわち ( ) >= <= > < != == && || ! - + * / % & ^ で、これらは全て C のものと同じ意味を持つ。

さらに以下に示すマクロも利用できる。各々は整数 (C での long int 型) を返す。これらはそのファイル に 対 す る lstat ( ま たは --follow-symlinks が用いられている場合は stat) を基にしている。詳しい説明は stat(2) を参照のこと。

stat.st_dev - デバイス
stat.st_ino
- i-ノード
stat.st_mode
- 許可属性 (permission)
stat.st_nlink
- ハードリンクの数
stat.st_uid
- 所有者のユーザ id
stat.st_gid
- 所有者のグループ id
stat.st_rdev
- デバイスタイプ
stat.st_size
- ファイルサイズ (バイト単位)
stat.st_blksize
- ファイルシステム I/O のブロックサイズ
stat.st_blocks
- アロケート済みのブロック数
stat.st_atime
- 最後にアクセスされた時刻 (秒単位)
stat.st_mtime
- 最後に変更された時刻 (行単位)
stat.st_ctime
- 作成された時刻

以下の関数はブール値を返す。

strncmp(string1, string2, integer);

string1 が string2 より小さい場合は 0 以下の整数を、マッチする場合は 0 を、大きい場合 は 0 以上の整数を返す。

glob(glob, string);

string が glob 表現 glob にマッチする場合は 0 を返す。下層の実装における効率を良くしたい場 合は、あなたが書くコードでの glob 表現をひとつに限ってみること。

regexp(regexp, string);

string が正規表現 regexp にマッチする場合は 0 を返す。下層の実装における効率を良くしたい場 合 は、あなたが書くコードでの正規表現をひとつに限ってみること。

strstr(string1, string2);

string1 の長さの範囲に最初に現れる string2 の位置を返す。現れない場合は 0 を返す。

以下の関数もブール値を返す。これらは stat(2) で説明されているマクロに対応している。これらは、指定された条件が真の場合に 非ゼロの値を返す。

S_ISLNK(integer); - ファイルはシンボリックリンク
S_ISREG
(integer); - ファイルは通常のファイル
S_ISDIR
(integer); - ファイルはディレクトリ
S_ISCHR
(integer); - ファイルはキャラクタデバイス
S_ISBLK
(integer); - ファイルはブロックデバイス
S_ISFIFO
(integer); - ファイルは fifo
S_ISSOCK
(integer); - ファイルはソケット

以下の関数は文字列を操作する。

strcat(string1, string2);

string1string2 を連結して返す。 + 演算子も文字列を連結することに注意。

depth(string);

string に現れるフォワードスラッシュ (/) の個数から 1 を引いたものを返す。

printf(format, ...);

printf(3) のように動作する。ただし重要な例外がある: long int のフォーマット指定以外は使って はならない。これ以外の指定を行なったときの変換結果は未定義である。例えば、"%d" ではなく "%ld" を用い ること。結果は標準出力に表示される。

以下の関数はシステムコールを実行する。

system(command);

/bin/sh -c command を実行する。しかし C 言語のものとは異なり、コマンドの終了コードを返す。 つまり、一行だけのシェルスクリプト command を実行する。

exec(argv0, argv1, ...);

プロセス argv0 を引数 argv1... で実行する。 argv0 フルパスで指定しなければならない。こ れは sh を経由しないので system より速い。

popen([string, ] shell_command);

system と似ているが、 shell_command の出力を文字列として返す。 string が与えられて いる場合には、その文字列を shell_command の標準入力に与え、成功したら 0 を返す。

以下の整数定数も利用可能で、stat.h で定義されているマクロ (説明は stat(2) にある) に対応する。

S_IFMT S_IFSOCK S_IFLNK S_IFREG S_IFBLK S_IFDIR S_IFCHR S_IFIFO S_ISUID S_ISGID S_ISVTX S_IRWXU S_IRUSR S_IWUSR S_IXUSR S_IRWXG S_IRGRP S_IWGRP S_IXGRP S_IRWXO S_IROTH S_IWOTH S_IXOTH

以 下 の 定 数 の ひ とつを return 文を用いて返し、呼出し元に意図を伝える必要がある。何も返さない場合は、返り値は UNKNOWN であるとみなされる。

UNKNOWN

どうすべきか分からない。引き続き他の --exclude- タイプのオプションを実行する。

INCLUDE

そのファイルを処理に含める。

IGNORE

そのファイルが mirror ディレクトリにあろうと無かろうと、何も行なわない。

EXCLUDE

そのファイルが control ディレクトリに存在しないものとみなす。よって mirror ディレクトリからは削 除される (これは --keep-files オプションよりも優先される)。

以下は C のようなフロー制御を行なう。

以下の if 文は integer が真 (つまり非ゼロ) ならば statement1, statement2 などを実行し、 それ以外の場合は statementA, statementB などを実行する。 else {...} の部分は省略可能である。

    if (integer) {
        statement1;
        statement2;
        .
        .
        .
    } else {
        statementA;
        statementB;
        .
        .
        .
    }

return 文は mirrordir に値を返し、スクリプトを終了させる。

    return expression;

exit 関数は、 mirrordir を指定した終了コードで終了させる。

    exit(integer);

通常 C スクリプトは、特定のファイルを除外するために用いる。これはスクリプト言語の実装としてはやりすぎで、機能のすべてを一般用 途向けに書いたわけではない。典型的なスクリプトは、例えばデバイスファイルを除外する、という程度のことに留まるだろう。

if (S_ISSOCK(stat.st_mode) || S_ISFIFO(stat.st_mode)
         || S_ISBLK(stat.st_mode) || S_ISCHR(stat.st_mode)) {
    return EXCLUDE;
} else
    return INCLUDE;

--recurs-mode オプションとともに用いれば、 C スクリプトはファイルを検索する た め に も 利 用 で き る (recursdir コマンドと同じ):

/* core ファイルを全て削除する */
/* この例は  セクションに移動した。 */

--exclude-from file

ファイル file に書かれているリストに含まれるパスを除外する。空行とコメント行 (行頭の文字が # の行) は無視される。 このファイルのリストはソートされ二分木探索されるので、たくさんのファイル名を除外したい場合には、ここにそれらのファイルを書く方 が性能は良くなる。このオプションは複数指定でき、複数個のファイルを指定できる。 バグ: file の最後に与えたパスは、改行で 終らなければならない。

--backup-extension level

ファイルを削除したり置き換えたりする前に、それらのファイルのバックアップを作る。 extension は C 形式のフォーマッ ト文字列で、例えば .ORIG.%d (% へのシェル代入に注意) のようにする。 level は保存しておくリビジョンの最大 数。 extension がファイル名に追加され、古いファイルほど大きな番号を持つ。

--backup-outdate sec

sec 秒よりも古いバックアップファイルを削除する。

--nice num

時々スリープして、他のプロセスに対して行儀良く振る舞う。 --nice を指定すると、プロセスはアクティブであった 時 間 の num 倍の時間スリープする。したがって 1 を指定すると (非常におおざっぱに言えば) コピーに要する時間は 2 倍になり、 3 を指定すれば 4 倍になる。これは定期的なバックアップを、 CPU 負荷を小さくして行ないたい場合に利用するとよい。システ ムによっては --nice は利用できないかもしれない。

--no-chmod

通常はファイルの許可属性設定が行なわれる。アクセス権限が制限されていて、許可属性を変更できない場合は、このオプションを指定すれ ば許可属性設定を無効にできる。

--no-chown

通常はファイルの所有権設定が行なわれる。アクセス権限が制限されていて、所有者を変更できない場合は、このオプションを指定すれば所 有権設定を無効にできる。

--mtime-threshold sec

mtime の 違いがこの値よりも小さい場合には、ファイルは上書きされない。ftp サイトをミラーした場合、そのミラー中の mtime は分の単位の精度しか持たないので、これを nfs ミラーしようとするとすべてのファイルがコピーされる。これを直すに は --mtime-threshold 60 を用いればよい。

--time-offset [[+]|-][H]H[:MM]

vfs な (つまり ローカルでない) ディレクトリの時刻オフセットを設定する。例えば私は New York より 8 時間東 にいるので、 New York からミラーする場合には --time-offset -8:00 を使っている。

--test-only, --dry-run

実際には変更を行なわない。 --verbose と共に用いると、どのような変更がなされるかを表示できる。これはディレクトリ間の 比較をするのにも効果的な方法である。これはテストされていない。すなわち、このオプションが本当に変更をしないかどうかは、私は保証 できない。

--skip-symlinks

シンボリックリンクは、読み込まれなかったかのように扱われる。よってそれらが mirror ディレクトリにあると、削除される。

--keep-files

ファイルが control に無い場合でも、そのファイルを mirror から削除しない。こうすると mirrordir はあ る意味 cp(1) のようになる。

--no-hard-links

このオプションが指定されない限り、 mirrordir はハードリンク属性を正しくミラーする。指定されると、ハードリンクは通常 ファイルのようにコピーされる。

--follow-symlinks

このオプションが指定されなければ、 mirrordir はシンボリックリンクを適切にミラーする。指定されると、シンボリックリン クは通常ファイルとしてコピーされる。 Debian ツリーをミラーするときに便利である。注意してほしいのは、シンボリックリンク は control と mirror の両方で解決される、という点である。依ってシンボリックリンクが mirror ディレクト リに存在していると、それらはそのままシンボリックリンクのまま残る。 --follow-symlinks を指定すると、暗黙のう ちに --no-hard-links も指定したことになる。

--strict-locking

ファイルを読み込むとき、共有読み込みのロックを作成する。これはファイルコピーの事故を予防する。特にメールディレクトリに対して有 効である (メールプログラムは mirrordir がファイルを読み込もうとしているときに、同時にそれらに書き込みを行なおうと するかもしれない)。このオプションは仮想ファイルシステムに対しては効力を持たない。

--max-bytes [[num[k|M|G]]|num]

このバイト数を越える と ‘filled up all blocks - first file/dir not mirrored: path’ というメッセージが標準出力に表示される。残りのファイルは mirror から削除されるが、これ はリストされた順序で行なわれる。よって mirrordir が走り続けていると、アーカイブの大きさが num を越えることがあ る。 この偶発分のゆとりをとって、 num は利用できるスペースより小さくしておくこと。またファイルシステムによっては、完全に いっぱいになる前に ‘No space left on device’ というメッセージを出すことがある。 mirrordir には --starting-file path オプションがあり、これを用いると別のデバイスで作業を継続できる。こうすれば、複 数のデバイスに対して mirrordir を用いたバックアップができる。 num には k, M, G (大文字小文字を区別す る) のいずれかを後置でき、それぞれキロバイト、メガバイト、ギガバイトを指定する。どれかひとつのファイルがこの数値よりも大きい と、エラーメッセージが表示される。 --block-size も参照のこと。

--password password

FTP 接続・mc:// 接続に対するパスワードを設定する。匿名接続の場合のパスワードは、デフォルトで「ログイン名@ローカルマ シン名」になっている。それ以外のログインパスワードは、プロンプトが出て尋ねられる。いつもの警告だが、パスワードをスクリプトに含 めるのはセキュリティ上のリスクがある。パスワードは ~/.netrc ファイルに入れ、 --no-netrc オプションを指定 しないかたちの方がずっと良い。詳細は man ftp を見よ。

--password-exact password]

匿 名 パ スワードの前に - を前置しない。 ftp の匿名パスワードでは、通常パスワード文字列の前に - が置かれる。私は Midnight Commander vfs がなぜこのようにしていたのか知らないが、あるユーザがこの問題に突き当たったので、 このオプションを設け、パスワードを password に指定した通りに送れるようにしている。

--test-login

--login-modepslogin を用いるとき、非対話的なアクセスをテストしてみたいことがあるだろう (例えばシェ ルスクリプトで用いたいときなど)。これを行なうには、 pslogin をこのオプションとともに実行し、終了ステータスを見ればよ い。 secure-mcserv は、ユーザがパスワードサーバにログインできるかどうかを調べるために、これを用いている。

--no-warn-first-login

あるマシンに対して最初に安全な接続を試みた時は、公開鍵がローカルマシンに存在しない。よって「間に人」攻撃に対して無防備である。 この内容に関する警告が表示され、ユーザにプロンプトが出され、継続したいかどうか尋ねられる。このオプションはこの警告を出さないよ うにし、一切を無視して先に進む。

--read-password-from-stdin

パ スワードをコマンドラインから指定するのではなく、標準入力から与える。これは見えないパスワードをタイプ入力するのと同じではな い。こちらは端末が無い場合にでも使える。これは他のプログラムから、例えば popen(3) などを用いて利用する場合に都合が良 い。 secure-mcserv は、ユーザがパスワードサーバにログインできるかどうかを調べるために、これを用いている。

--netrc

~/.netrc をスキャンする。デフォルトでこのオプションは on になっている。

--no-netrc

~/.netrc ファイルの読み込みを行なわない。

--proxy-host host

ftp ダウンロードのプロキシを設定する。これがどのように動作するのか、あるいは実際に動作するかどうかは私にはわからない。プロ キシのサポートについては mc(1) にあたってほしい。

--secure

(この機能はβ段階である) 私は mirrordir 用に安全なソケット層を実装した。これはこのオプションで有効 と な り、 secure-mcserv の 接続 (すなわち mc:// 形式の URL) に適用される。安全なソケットのライブラリは libdiffie.a とヘッダファイル diffie-socket.h からなる。 sys/socket.h の 後 に diffie-socket.h をインクルードし、そのプログラムを際コンパイルすれば、通常のソケットが全て安全なソケットになる (これは Unix のソケットコールを用いる、あらゆるプログラムに当てはまるが、しかしテストはされていない)。これをサポートす る最初のサービスは secure-mcserv で、デフォルトでコンパイルされ、インストールされる。よって、リモートのホストも secure-mcserv を走らせていれば、 mc:// ファイルシステムは --secure オプションで利用 で き る (secure-mcserv -h とすればヘルプが表示される)。 --secure は、DES などのブロック cipher よりずっと安全で高速なストリーム cipher を、公開鍵サーバ認証 (Diffie-Hellman 及び p-NEW スキー ム) の離散対数鍵交換で用いている。詳細はソース配布の diffie-socket.h を見てほしい。デフォルトの鍵のサイズは 512 ビットである。 gcc を用いている 場 合 は、 mirrordir の コ ン パ イ ル 時 に -O3 -fomit-frame-pointer -s -Wall オプションをつけると、鍵生成が高速化される。

--key-size bits

デフォルトの鍵サイズは 512 ビットである。サイズを変更するには素数を生成して fileld.c に書き込まなければならない ので、 field.c にリストされているサイズだけがサポートされており、現時点ではこれは 512, 768, 1024, 1536 である。遅い計算機を用いている場合には、中程度のセキュリティとなる 768 を奨める。それ以外なら、長い目で見れば 1536 も非合理で偏執的な値、というわけでもない。巨大企業・良くつないでくるハッカー・政府などがあなたの接続を盗聴している心 配がなければ、512 でも構わないだろう。ストリーム cipher は bits/2 の長さを持つので、クラックされる確率は、 宝くじを換金しているあいだに隕石にぶち当たる確率よりは低い。ただしある人間が接続を盗聴し、長い間出力をとり続ければ、破ることは 不可能ではない。 20 年も経てば、1536 ビットの鍵も小さいと考えられるかもしれない。また (ここで用いられている) 離散 対数問題は、素因数分解よりも解くのが難しいと考えられているので、鍵は RSA よりも実効的にやや大きいことになる。これは私 の (どちらかというと無学な) 意見である。

--download-scripts

mirrordir には 2 つの版、International 版と US 版がある (--version を見よ)。US 版は暗号化に類するコードを一切含んでいない。その代わり、必要なアルゴリ ズ ム を ( 南 ア フ リ カ に あ る) encrypt.obsidian.co.za からダウンロードするようになっている。これらは高速かつネイティブな、C 形式のイ ンタープリタ言語で書かれている。これらは 4 つのスクリプトからなる。それぞれ、 Diffie-Hellman 鍵交 換 サー バ、Diffie-Hellman 鍵交換クライアント、ストリーム cipher の初期化、実際にストリーム cipher を用 いた暗号化、のためのものである。 mirrordir は、あなたがセキュリティ機能を用いようとすると、自動的にこれらのスクリプ トをダウンロードする。しかしこの --download-script オプションを用いると、いつでもダウンロードを実行できる。 International 版にはストリーム cipher が組み込まれていて、 2 つのスクリプトだけを用いるが、これらは配 布に含まれているのでダウンロードの必要はない。 Diffie-Hellman 交換をスクリプトで用いても、速度的な劣化は生じな い。しかし暗号化に関しては、スクリプトと組み込みの間の違いが結構大きいかもしれない。

--version

バージョン番号と、この mirrordirInternational 版 か US 版 か を 表 示 す る。 --download-scripts を見よ。

-z, --gzip

mc:// 接続で圧縮を有効にする。実際には符号化よりも低いレベルにある圧縮ソケット層を呼出す。圧縮は gzip(1) の libz ライブラリを用いて行なう。圧縮の程度は、転送時間を最小化するように動的に設定される。高速なイーサネット接続なら無圧縮 にまで低くなりうるし、モデム経由の遅い接続では最大圧縮にまで高くなる。このアルゴリズムは、TCP の write コールが、同 量のデータを deflate する (つまり圧縮する) 時間の 2〜5 % の範囲になるように、圧縮レベルを調整する。

--gzip-backups

バックアップは通常は単にファイルのコピーである。このオプションを指定すると各ファイルは圧縮され、 .gz がデフォルトの拡張子 として付加される。バックアップの拡張として、あなたが自分で --backup-extension の指定を行なった場合は、その 末尾が .gz で終らないと、比較が正しく動作しない。

--case-insensitive, --for-Robert-Seese

ファイル名やリンク名の比較に、大文字小文字の違いを無視する。これは、特定の頭の悪い OS と通信するときに便利だろう。このオプ ションがすべての状況で正しく動作するかどうかは、あまり自信が無い。

--to-lower

--to-upper

すべての新しいファイル名を大文字または小文字に変換する。 --case-insensitive と共に用いると、新しいファイル を作成する場合にのみ適用される。 --case-insensitive なしで指定すると、既存かどうかに関らす、すべてのファイ ル が大文字・小文字に変換される。このときの方法は非効率的なもので、古いファイルを一度消してから、新しいファイルを再度コピーす る。これは、特定の頭の悪い OS と通信するときに便利だろう。このオプションがすべての状況で正しく動作するかどうかは、あまり自 信が無い。

--no-use-passive-connections

could not setup passive mode というエラーメッセージを受け取った場合、このオプションを有効にする必 要があると考えられる。私は ‘passive’ の意味するところを完全には理解していないので、私には聞かないでほしい。

--tar-file filename

これは recursdir と共にのみ用いる。tar アーカイブを GNU tar(1) と同じフォーマット で 作 成 し、 filename に 保 存 す る。 先 頭 の 特 殊 な プ レ フィックスと末尾のスラッシュは削除される。すなわち http://machine/dir/filedir/file になる。ファイル名の先頭文字が | の場合、テキストの残 りは出力がパイプされるコマンドとみなされる。よって gzip 圧縮アーカイブは、例えば以下のようにすれば作成できる。
recursdir ftp://machine/dir --tar-file ’| gzip -d > foo.tar.gz’

--tar-block-size N

tar 出力のブロックサイズを 512 * N にする。これはデータをアーカイブに書き込むときの単位である。デフォ ル ト は 20。これはブロックデバイスに書き込むときに限って意味を持つ。これを --block-size と混同しないこと。

--block-size bytes

デフォルトのブロックサイズは 1024 バイトである。消費されるブロックの総数を計算する際、ファイルサイズは隣接するブロック末 尾に切り上げられる。実際のブロックサイズがこの値よりも大きいと、書き込み時に実際に利用されるブロック数よりも、計算値が小さくな る可能性がある。よって --max-bytes オプションを用いるときには、実際のブロックサイズと同じ、またはより大きな値を指 定することがとても大切である。

--strict-mtimes

通常ファイルをコピーする場合、 mirrordir は通常 mirror のファイルが control のファイルよりも 「古 い」 場合に限って上書きコピーを行なう。このオプションを用いると、ファイル間に修正時刻の「何らかの」差異があれば、コピーを行な う。

--no-mtimes

サイズが違う場合に限ってコピーする。ファイルの修正時刻は無視する。

--ignore-size

ファイルのコピーを mtime に基づいて行ない、サイズの違いは無視する。

--starting-file path

path はファイルまたはディレクトリ。 path が読まれるまでは、ファイルやディレクトリは除外ファイ ル ( つ ま り mirror にある場合は削除される) のように扱われる。 path を含むディレクトリは、存在していなければ作成される。 path が読み込まれると、ファイルやディレクトリは通常にミラーされる。 path そのものもミラーされる。 path または そのサブディレクトリが存在していない場合は、 mirrordir は直ちに終了する。これは mirrordir が作業前に終了 する唯一の場合である。これは path が見つからない場合に、ファイルシステム全体が削除されるのを防ぐためである。

FTP のサポート

ftp 転送が、 Midnight Commander の仮想ファイルシステム (Virtual File System: VFS) を利用す る形でサポートされている。要するにつまり、URL もローカルディレクトリと同じようにサポートされている。以下に例を示そう。

    mirrordir --verbose \

ftp://lava.obsidian.co.za/pub/mirrordir \

/home/mirrordir

あるいは

    mirrordir --verbose /home/mirrordir \

ftp://psheer@lava.obsidian.co.za/home/ftp/pub/mirrordir

も 動作する。ただし後者ではまずパスワードを尋ねられる。 ftp サーバに「アップロード」を行う場合は、 --strict-mtimes オプ ションは on にすべきでない。 ftp では修正時刻の設定はできないので、すべてがコピーされてしまう。

(--verbose を設定すれば) mirrordir が繰り返し ftp で修正時刻とアクセス時刻をセットしようとしていることに気づくだろ う。用いている VFS のタイプにおける制限をユーザに知らせるために、これらのメッセージは残しておくつもりである。これらの試行は、明らかな性能 の劣化としては現われない。しかしこのプロトコルを用いたアップロードの性能が悪い場合は、代わりに mc:// を用いてみるといいだろう。なおダウ ンロードは常にアップロードよりも高速である。

一般に cron ジョブでは ftp アップロードを用いるべきではない。またディレクトリの同期を取る目的にも向いていない。ディレクトリを同期し たい場合は、反対側からのダウンロードを用いること。アップロードは一回きりのアップロードにしか有用でない。

ここでは mirrordir を用いて行える、ちょっと気の効いた作業を紹介する。

ミニマリスト的コピー

ソースツリーが 2 つあり、古い版をパッチを適用するために保管しておきたいとする。これには mkdir tree.OLD して、

      mirrordir -v tree tree.OLD

す るだけでよい。もう一度 mirrordir を実行すれば、最小限の変更のみ (つまり更新されたファイルのみ) がコピーされる (実は cp(1) も同じことをする)。

システムバックアップ

システムによっては、定期的なバックアップをテープアーカイブに行っていることがある。また RAID デバイスを用いて、あるパーティ ショ ンと同一のコピーを恒常的に保持しているシステムもあるだろう。 mirrordir はさらに別の選択肢を提供する。システムに 2 台のドライブを装備する。ひとつは普段用いるもの、もう一つはバックアップするためのものである。そして mirrordircron(8) のテーブルに追加するのだ。変更されたファイルのバックアップには、様々なオプションが利用できる。バックアップディレ クトリはユーザから読み取り可能にしておき、各人のバックアップファイルを閲覧できるようにしておくといいだろう。特定のファイルの古い バージョンを取り戻したいユーザは、バックアップから入手できるようになる。 mirrordir は変更されたファイルの最小限だけを 処理するので、非常に高速である。一日に何回も実行したり、あるいは --nice オプションを付けて途切れることなく実行させること さえ可能である。

マシンが壊れたときに対する備えをさらに強固にしたければ、 FTP を用いてリモートマシンにバックアップを行うこともできる。

2 台のマシンを毎時バックアップする

dar2 というマシン上で、私は次のような cron ジョブを 6 時間ごとに実行している。

#!/bin/sh

# (this is just in case of any bugs I don’t know about,
# but I don’t think it is necessary)
killall -9 tee
killall mirrordir >& /dev/null
sleep 2
killall -9 mirrordir >& /dev/null

(                                                               \
date                                                        ;   \
echo "mirrordir says (if it said nothing it is bad):"       ;   \
    mirrordir mc://dar1:12346/ -p abcdefg /mnt/dar1/            \
    -i --exclude-regexp ’^mc://dar1:12346/var/lock/subsys/atd’  \
    --exclude-regexp ’^mc://dar1:12346/proc/’                   \
    --exclude-regexp ’^mc://dar1:12346/mnt/[^/]*/.*$’           \
    -i --exclude-regexp ’^mc://dar1:12346/boot/’                \
    -i --exclude-regexp ’^mc://dar1:12346/etc/lilo.conf’        \
    -C                                                          \
´
if (S_ISDIR (stat.st_mode)) {
    if (!regexp ("^mc://dar1:12346/[^/]*$", PATH))
        printf ("Backing up: %s0, PATH);
}
´                                                   ;           \
date                                                ;           \
echo "Done"                                         ;           \
) 2>&1                                                          \
| tee --ignore-interrupts --append /var/log/mirrordir.log       \
| mail -s ’dar1 backup results’ psheer@obsidian.co.za

安全な転送とログイン

turing.co.uk において以下のコマンドを実行しておく

    secure-mcserv -p 12345 -d

どこか外部のマシンから

    copydir --secure -K 512 -z \
    mc://alan@turing.co.uk:12345/usr/src/linux/.config .

とすれば、512 ビットの鍵を用いた安全なファイルコピー (圧縮つき) ができる。また

    pslogin mc://alan@turing.co.uk:12345/

とすれば、このマシンに安全にログインできる。

FTP サイトのミラー

ftp サイトでは ls の -R オプションが禁止されていることが多いので、従来用いられてきた mirror (1) は失敗す ることがあった。 mirrordir にはこの制限はない。

    mirrordir -v ftp://metalab.unc.edu/pub /home/ftp/pub

FTP 転送

よくある FTP 転送は、--copy-mode オプションを用いた一行のコマンドで簡単に実現できる。複数のファイルをどちら向き にも、また別々の ftp サイトにすら (間接的にではあるが)、 cp(1) のようにコピーできる。

    copydir -v mirrordir-0.9.15.tar.gz \
    mirrordir.lsm ftp://metalab.unc.edu/incoming/Linux

とすると mirrordir を sunsite にアップロードする。

anonymous で な い ftp 転送のパスワードは、標準的な ftp の慣習に従って ~/.netrc ファイルに置 き、--netrc オプションを用いるのがよい。あるいは ftp://myname@machine/ を用いてもかまわない。

ファイル探索

recursdir / -C

’if (!glob ("*.c", FILE)) printf ("%s\n", PATH);’
とするとシステムにあるすべての C ファイルを表示する。
recursdir / -C
’if (S_ISCHR(stat.st_mode)) printf ("%s\n", PATH);’

とすればシステムにあるすべてのキャラクタデバイスを表示する。

FTP サイトをテープにバックアップする

リモートサイトをテープにバックアップするには

    recursdir ftp://user@remote.machine/ \
    --exclude-regexp ’//[^/]*/proc/’ --tar-file /dev/mt

とすればよい。

core ファイルの削除

これはシステムからすべての core ファイルを削除する:

recursdir / -C ´
long l;
if (strncmp (PATH, "/proc", 5)) {
    if (S_ISREG (stat.st_mode) && !strcmp ("core", FILE)) {
        if (strstr (popen ("file " + PATH), "ELF 32-bit LSB core")) {
            l = l + stat.st_size;
            printf ("removing: %s, cumu. total = %ldkB\n", PATH, l >> 10);
            exec ("rm", "-f", PATH);    /* could also use system() */
        }
    }
}
´

環境変数

TMPDIR

一時的なファイルを保管させたいディレクトリ。 ftp ファイルシステムは、まずファイルをこの一時ディレクトリに ダウンロードし、正しい場所にそのファイルをコピーする。後述の バグ を参照のこと。

TMPDIR が指定されないと、デフォルトでは現在進行中のファイルがあるディレクトリに保存される。

返り値

mirrordir は以下の値を返す:

0

成功。

1

何らかのエラー (書き込みエラー、許可属性エラーなど) が起った。この場合、エラーの詳細は stderr に書き込まれて いるはずである。

2

あるファイルが利用中でコピーできなかったが、それ以外は成功した。こ の 場 合 は ‘unable to open control file for writing’ というエラーが書き込まれているはずである。標準エラーでこのメッセージを grep し、これらのファイルに対してのみもう一度 mirrordir を実行すればよい。 grep(1) を参照のこと。

バグ

atd デーモンのあるバージョンでは、ロックファイル (や pid ファイル?) をそのファイルもロック 付 き で 作 成 す る た め、 secure-mcserv が永遠にブロックする。これを防ぐには、 atd を停止させるか、このファイルを対象から除外しなければならない。

サ マータイムの時間補正があるところと ftp でミラーを行うと、 1 時間の時間のオフセットが生じるように見える。とりあえずの回避策としては --time-offset を用いてほしい。これが mirrordir のせいなのかどうかは私にはわからない。

mirrordir のせいで CPU が食い尽くされ、停止してしまうように見えるバグは修正された。

コマンドラインから多数の --exclude 式を指定すると、処理が遅くなる。たくさんのファイルのリストを除外対象したい人は、そのリストをテキ ストファイルに書いて、 --exclude-from オプションを利用する方がよい。

シンボリックリンク (それが指すファイルではない) の修正時刻とアクセス時刻は複製されない。

以前にあった、ハードリンクファイルが通常ファイルとして扱われてしまうという制限は解決された。--no-hard-links オプションを指定す れば、 0.9.8 以前の動作をエミュレート可能である。

ハードリンクがデバイスをまたいで作成されているかどうかはチェックしていない。この場合はそれに見合ったエラーが報告されることになろう。

ftp ファイルシステムは、まずファイルを一時ディレクトリに *ftpfs* という名前でダウンロードする。これはスペースの無駄だ が、vfs ライブラリのデフォルトの動作なのだ。このディレクトリに十分な容量がないと、おそらく mirrordir はハングする。上述の 環境変数 を参照 のこと。

ファイル除外に用いる C スクリプト言語は、実装のやりすぎである。

ファイル

~/.netrc

マシンとそのパスワードのリスト。オプション --netrc を参照のこと。

/etc/ssocket/accept.cs

このスクリプトは、接続のサーバ側で、鍵交換と署名生成を行う。

/etc/ssocket/connect.cs

このスクリプトは、接続のクライアント側で、鍵交換と署名生成を行う。

/etc/ssocket/arcinit.cs

ストリーム cipher 暗号化を初期化する (国際版では存在しない)。

/etc/ssocket/arcencrypt.cs

ストリーム cipher 暗号化を行う (国際版では存在しない)。

/etc/ssocket/private/

このディレクトリには、ホストの秘密鍵が置かれる。鍵はそれぞれ別々のファイルに保存される。ファイル名は 512, 1024 など である。鍵のデータベースを使うようにすると、鍵管理用のユーティリティが必要になるので、こちらのほうがよい。すぐに Reiser ファイルシステムが標準的になるだろうから、データベースファイルはいずれにしても不要になるだろう。

/etc/ssocket/public/

こちらは公開鍵のもの。後は /etc/ssocket/private/ と同様。

準拠

mirrordir は作成者の発明であり、いかなる OS の標準にも従っていない (そうするべきではあるが!)

入手方法

このプログラムの最 新 版 は、 ftp://metalab.unc.edu/pub/Linux/system/backup ま た は ftp://lava.obsidian.co.za/pub/linux/mirrordir から入手できる。

著者

Paul Sheer <psheer@obsidian.co.za> <psheer@icon.co.za>

関連項目

mirror(1), pavuk(1), cp(1), scp(1), find(1), mc(1), ftp(1), ssh(1), tar(1), rlogin(1), rlogind(8), forward(1)