mirrordir(1) mirrordir(1)
名前
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 ] -[abBCdDFGhklMm-
NOopRrstvVX] src [src ...] dest
copydir -[abBCdeFGhklMmNOopRrstvVX] src [src ...] dest
recursdir -[abBCdeFGhklMmNOopRrstvVX] src [src ...]
pslogin [--key-size bits] [mc://][username@]hostname[:portnum-
ber][/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 つのディレクトリ control と mirror との間で異なるファイ
ルを、 control から mirror へとコピーする。修正時刻 (modification time)
ま たはサイズが異なるファイルがコピーされる。ファイルの許可属性・所有者
・修正時刻・アクセス時刻 (--access-time が用いられた場合のみ)・スティッ
キ ービット・デバイスタイプが複製される。シンボリックリンクはリンク先の
解決をされずにそのままコピーされる。シンボリックリンクの修正・アクセ ス
時 刻 (シンボリック自身のもので、シンボリックが指すファイルのものではな
いことに注意) は保存されない。ハードリンクされたファイルは単にコピー さ
れる。生成時刻は、私の知る限り Unix では設定できない。
mirrordir は危険なコマンドである。 mirror にあって control にないファイ
ルやディレクトリは削除されるからである。もし control が完全に空の場合に
は 、 mirror のすべてのファイルやディレクトリが削除される。もし mirror
が完全に空の場合には、 control のすべてのファイルやディレクトリがコピー
される。
要 するに mirrordir は mirror をディレクトリツリー control の完全なレプ
リカにし、またその際にあらゆるものを (定期的バックアップという目的に 合
致するなら) 可能な限り複製しようとする。当然 mirrordir はサブディレクト
リの一番深いところまで降りていく。ディレクトリミラーの際には、それに 必
要な最小の変更のみを調べ、可能な限り効率的に動作しようとする。
ア クセス時刻の複製は通常は必要なく、また不要な負荷を与えることになる。
よってこれはオプションになっている。
ディレクトリ control には、何の変化も与えない。--restore-access が与 え
られると、アクセス時刻は読み込みのたびに、元の時刻に再設定される。
--strict-locking オプションをオンにすると、 control にあるコピー作業中
のファイルは「共有読み込み (shared reading)」にロックされる。これによっ
て 、他のプロセスがそのファイルに頻繁に書き込みを行っている場合でも、フ
ァイルが不完全な状態や壊れた状態ではコピーされないことを保証する。
通常 mirrordir は問題があっても中断せず、問題の報告を stderr へのエラー
メッセージとして行い、動作を継続する。
デ ィレクトリ mirror や dest は (たとえ空であっても) 存在していなければ
ならない。
ディレクトリのすべてのファイルを削除する前に、 mirrordir は *--keep-me
というファイル (ここで * は 0 または 1 つの文字) をチェックする。このフ
ァイルが存在すると、エラーメッセージを出して中断する。よって再帰的に 削
除 されてはまずいディレクトリがあったら、それぞれにこのようなファイルを
作っておけば良い。
copydir は mirrordir -ck --no-erase-directories ... と等価であ る (-c
には -k が含まれるが)。よって copydir は厳密な意味での cp(1) とよく似て
いるが、ファイル名は URL でも良く、かつ古いファイルだけが置き換えられる
。 ファイル転送には、ほとんどの場合 mirrordir ではなく copydir を使うほ
うがよい。本当に消してよい場合に限り、 mirrordir を使うようにすること。
recursdir はまたもう一つのプログラムで、コマンドライン上でディレクトリ
を降りてゆくだけで何も行わない。これは mirrordir --recures-mode ... と
等 価である。これは -C オプションが追加される前にできたプログラムで、よ
り厳密な find(1) として、あるいは見つかったすべてのファイルを tar フ ァ
イルにパックする目的に、それぞれ利用できる。
pslogin はさらにもう一つのプログラムで、これまでに挙げた 3 つとはほとん
ど関係がない。 pslogin は secure-mcserv を用いて安全なログインセッシ ョ
ン を開始する。これは mirrordir --login-mode --secure ... と等価である
。 pslogin は logindir と呼ぶべきかもしれない。後述の --login-mode を参
照のこと。
forward はさらにもう一つのプログラムで、最初の 3 つとはほとんど関係がな
い。これは任意のサービスを安全なチャネルにフォワードできる。詳細は for-
ward(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://][user-
name@]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 に対して、利用しているディスクスペースを増加させるよう な
変更は一切行なわない。これは容量の限られているドライブに対してバ
ックアップを取る場合、転送の最中に control に mirror を増加さ せ
てしまうような変更がなされるときに便利である。一度このオプション
をつけて 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);
string1 に string2 を連結して返す。 + 演算子も文字列を連
結することに注意。
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-mode や pslogin を用いるとき、非対話的なアクセスをテスト
してみたいことがあるだろう (例えばシェルスクリプトで用いたいとき
など)。これを行なうには、 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 版がある (--ver-
sion を見よ)。US 版は暗号化に類するコードを一切含んでいない。 そ
の 代 わ り 、 必 要 な ア ル ゴ リ ズ ム を (南アフリカ にある)
encrypt.obsidian.co.za からダウンロードするようになっている。 こ
れらは高速かつネイティブな、C 形式のインタープリタ言語で書かれて
いる。これらは 4 つのスクリプトからなる。それぞれ、 Diffie-Hell-
man 鍵交換サーバ、Diffie-Hellman 鍵交換クライアント、ストリーム
cipher の初期化、実際にストリーム cipher を用いた暗号化、のた め
の ものである。 mirrordir は、あなたがセキュリティ機能を用いよう
とすると、自動的にこれらのスクリプトをダウンロードする。しかしこ
の --download-script オプションを用いると、いつでもダウンロード
を実行できる。 International 版にはストリーム cipher が組み込 ま
れ ていて、 2 つのスクリプトだけを用いるが、これらは配布に含まれ
ているのでダウンロードの必要はない。 Diffie-Hellman 交換をスクリ
プトで用いても、速度的な劣化は生じない。しかし暗号化に関しては、
スクリプトと組み込みの間の違いが結構大きいかもしれない。
--version
バージョン番号と、この mirrordir が International 版か 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/file は dir/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 デバイスを用いて、あるパーティション
と同一のコピーを恒常的に保持しているシステムもあるだろう。 mir-
rordir はさらに別の選択肢を提供する。システムに 2 台のドライブを
装備する。ひとつは普段用いるもの、もう一つはバックアップするため
のものである。そして mirrordir を cron(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) は失敗することがあった。 mir-
rordir にはこの制限はない。
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 ライブラリのデフ
ォルトの動作なのだ。このディレクトリに十分な容量がないと、おそらく mir-
rordir はハングする。上述の 環境変数 を参照のこと。
ファイル除外に用いる 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/sys-
tem/backup または ftp://lava.obsidian.co.za/pub/linux/mirrordir から 入
手できる。
著者
Paul Sheer
コロナウイルスの日ごとの感染者数・死者数をグラフ化してみました。どの国が増加傾向にあり、どの国が終息に向かっているかを視覚化しています。
Copyright(C) linux-cmd.com All Rights Reserved. Author Takayuki Yukawa