CVSUP(1)

名称
cvsup - CVS リポジトリ用のネットワーク配布パッケージ

書式
cvsup [-1aDeEgksvzZ] [-A addr] [-b base] [-c collDir] [-d delLimit] [-h host] [-i pattern] [-l lockfile] [-L verbosity] [-p port] [-P m|a|port|lo-hi|-] [-r maxRetries] supfile [destDir]

解説
CVSup は、ファイル群の配布と更新をネットワーク上で行うための ソフトウェアパッケージです。 CVSup という名前はパッケージ全体を指します。 CVSup はクライアントプログラムである cvsup とサーバプログラムである cvsupd からできています。 このマニュアルページは、 CVSup パッケージの概要を説明し、クライアントプログラムである cvsup 特有の事項も説明します。 cvsupd の詳しい説明については、 cvsupd(8) をご覧ください。

rdist や sup のような、より伝統的なネットワーク配布パッケージと異なり、 CVSup は特に CVS リポジトリの配布のために作られています。 CVSup は CVS リポジトリとリポジトリに含まれるファイル(特に RCS ファイル)の 特性を生かし、伝統的なシステムよりもずっと高速な更新を可能にしています。

オプション
クライアントプログラム cvsup は、少なくとも一つの引数 supfile を必要とします。 これは、サーバからの転送や更新が行われる 1 つ以上のファイルを記述した ファイルです。 supfile は、 sup で使われる同じ目的のファイルに似た形式です。 ほとんどの場合、 cvsup は既存の sup supfiles を使えます。

省略可能な引数 destDir も指定できます。 指定された場合には、この引数は更新された全てのファイルが置かれる ディレクトリを指定します。 destDir が指定されると、クライアントの元のファイルはそのまま残されます。 この機能は主にテストのためのものです。

cvsup は以下のオプションをサポートしています:

-1  一時的な失敗が起き、かつ GUI が使われていない時の自動リトライを無効に します。このオプションを指定しないと、ネットワーク接続の切断といった 一時的な失敗が起きた時、 cvsup はリトライを繰り返し行います。リトライの際には ランダム化された指数的な一時退避(randomized exponential backoff) アルゴリズムを用いてリトライの間隔を確保します。 このオプションは -r 0 と同等であり、GUI を使う時には暗黙的に指定されたことになります。

-a  クライアントに対して自分自身の認証すること(自分が何であるかを示すこと) をサーバに要求します。サーバの認証が失敗すると、更新はキャンセル されます。 後述の 認証 を見てください。

-A addr
    サーバに接続する時に割り当てるローカルのアドレス (ドット区切りの 4 つの数値、またはホスト名)を指定します。このオプショ ンは、ホストが複数個の IP アドレスを持っている場合に便利です。

-b base
    cvsup が管理する記録ファイルを置くベースディレクトリを指定します。 この際には、 supfile による base の指定は全て上書きされます。

-c collDir
    コレクションに関する情報を管理する、 base のサブディレクトリを指定します。 デフォルト値は sup です。

-d delLimit
    更新を 1 回実行した際に削除できるファイル数の上限を指定します。 この上限を超えるファイル削除の試みは致命的なエラーとなります。 このオプションを使うと、サーバ上の一時的な設定ミスによる被害を、 ある程度防げます。 デフォルトでは無制限です。

-D  cvsup にファイルの削除だけを行わせ、どんな種類の更新も行いません。 このオプションは、クライアントのディスク容量が非常に少ないといった状況 で役に立ちます。ユーザはまず -D オプションを使って cvsup を実行してできる限りの容量を空けます。次にもう一度 cvsup を実行しますが、今度は -D オプションは使いません。サーバ上でファイルやディレクトリの名前が変更さ れた場合は、この方法を取ることにより、クライアント上で新しいファイルが 生成されるよりも前に、全ての古いファイルが削除されることが保証されます。 このオプションは、チェックアウトモードではまだ実装されていません。

-e  サーバから受け取ったシェルコマンドを、 supfile 中の全てのコレクションに execute キーワードが追加されたかのように実行機能を有効にします。

-E  サーバから受け取ったシェルコマンドを、 supfile 中の全てのコレクションに execute キーワードが追加されたかのように実行する機能を無効にします。

-g  GUI を使わないようにします。 DISPLAY 環境変数が設定されていなければ、このオプションが暗黙的に指定されます。

-h host
    接続するサーバホストを指定します。 supfile における host の指定は全て上書きされます。

-i pattern
    pattern にマッチするファイルとディレクトリだけを更新対象にするように cvsup に指定します。ディレクトリがパターンにマッチする場合は、 そのディレクトリをルートとするサブツリー全体が含まれます。 このオプションが複数回指定された場合は、パターンは ‘or’ 操作で結合されます。 -i オプションが指定されない場合のデフォルト動作では、各コレクションに含ま れる全てのファイルが更新されます。

    pattern は標準のファイル名パターンです。 これはコレクションのプレフィックスディレクトリからの相対パスで 解釈されます。 スラッシュ文字は、パターン中に陽にスラッシュが書かれた場合だけ マッチします。 ファイル名の先頭にピリオドがあっても、特別扱いはされません。

    GUI には、パターンを編集できる入力フィールドがあります。

-k  チェックサムの不一致が起きた時、間違って編集されたファイル全ての一時的 なコピーを保存するようにします。 このオプションはデバッグ用のものであり、どうしてファイルが誤って編集さ れたのかを突き止める役に立ちます。 このオプションが指定されているかどうかに関わらず、不正なファイルが ずっと残っているものは、ファイルを丸ごと転送することによって取得した 正しいファイルに置き換えられます。 このような転送はフィックスアップ(fixup, 修理の意味)と言います。

-l lockfile
    lockfile の生成し、更新が行われている間のロックを行います。 lockfile が既にロックされていると、 cvsup は自動的なリトライを行うことなく失敗します。 このオプションが役に立つのは、 cron を使って cvsup を定期的に実行する時です。 これは、あるジョブが、ネットワークの問題で予想以上の時間がかかっている 以前のジョブの邪魔をするのを防ぎます。

    POSIX 形式のファイルロッキングが使われます。これは fcntl(2) で説明されています。 プロセス ID は、ロックファイルが正常に取得できた時に、このファイルに テキスト形式で書き込まれます。 更新の終了時にロックファイルは削除されます。

-L verbosity
    GUI でない出力の詳しさを設定します。 レベル 0 では、エラーが起こらない限り cvsup は何も出力しません。 レベル 1 (デフォルト値)では、更新されたそれぞれのファイルが出力されます。 レベル 2 では、それぞれのファイルに対して行われた更新に関するさらに 詳しい情報が出力されます。 メッセージは全て、標準出力に出力されます。 GUI が使われる場合は、このオプションは無視されます。

-p port
    cvsup が接続を試みるサーバホストの TCP ポートを設定します。 この機能は主にテスト用です。デフォルト値は 5999 です。 passive モード( -P オプションの説明を参照)でなければ、サーバはこれより一つ小さい番号の ポートを使って、クライアント向きの 2 つ目の接続を確立します。

-P m|a|port|lo-hi|-
    クライアントとサーバ間の情報のやりとりに使う補助的な TCP 接続の確立を 制御します。 全体では、クライアントとサーバは通信するために 4 つの片方向のチャネルを 必要とします: 2 つはクライアントからサーバへの接続で、2 つはサーバから クライアントへの接続です。 色々な防火壁の設定に対応するために、これら 4 つの片方向チャネルには色々 な設定ができます。 このために用意されたモードは、multiplexed モード, passive モード、 SOCKS モード、active モードです。 multiplexed モードを除く全てのモードは、古くなっています。 multiplexed モードは、他のモードが扱える全ての状況に対応しています。

    デフォルトでは、サーバが十分新しければチャネルは multiplexed モードで 確立します。 multiplexed モードは、1 つの TCP 接続を用いて 4 つのチャネルを作ります。 組み込みのパケット多重化層は、TCP 接続上にある異なる論理チャネルを 多重化します。これは ssh's のポート転送機能とは異なるやり方で行われます。 これにより、非常に小さい(1% 未満)通信オーバーヘッドとごくわずかの CPU 負荷がかかりますが、ほとんどどんな防火壁の中でも動作するはずです。 防火壁は、クライアントホストがサーバホストの 5999 番ポートへ接続を開始 することを許可していなければなりません。 これ以外には、特殊な許可は全く必要ありません。 明示的に multiplexed モードを指定するには、 -P m オプションを使います。

    multiplexed モードは SOCKS プロキシサーバと組み合わせて使えます。 組み合わせて使うには、単に m3socks コマンドの元で cvsup を実行し、 -P m オプションを指定します。

    active モードは、双方向の TCP 接続を 2 つ使って 4 つの片方向チャネルを 作ります。 クライアントからサーバへの元の接続は 2 つのチャネルを作り、 2 番目の TCP 接続が残りの 2 つのチャネルを作ります。 2 番目の TCP 接続を確立するために、サーバからクライアントへの接続が行 われます。 -P a で、クライアントはオペレーティングシステムが選んだポート上で 接続を待ちます。 多くのオペレーティングシステムは、この目的には 1024-5000 の範囲の ポートを使います。 ユーザは -P port を使って特定のポートを指定できますし、 -P lo-hi を使ってある範囲のポートも指定できます。 これらのポート指定は SOCKS プロキシサーバでは使えません。

    passive モードは、4 つの片方向チャネルを作るために TCP 接続を使うとい う点では似ています。 しかし、passive モードでは 2 番目の TCP 接続を作るための接続は クライアントからサーバに対して行われます。 passive モードは、外向きの接続は許可するけれど内向きの接続は禁止してい る防火壁の中にクライアントがいる場合に便利です。 passive モードを選択するには、 -P - オプションを使います。 passive モードは SOCKS プロキシサーバでは使えません。

    SOCKS プロキシサーバを使うための別モードです。 SOCKS モードでは、4 つの TCP 接続が使われます。これらは全て片方向接続 だけです。 4 つの片方向 TCP 接続を使うことにより、SOCKS プロキシサーバの制限を 回避します。これを行わなければ、デッドロックが起こってしまいます。 (信じるかどうかは別にして、SOCKS サーバはブロッキング I/O コールを使い ます。) SOCKS モードは、 cvsup が m3socks コマンドの元で実行され、かつ -P オプションが指定されていない時に選択されます。 後述の SOCKS と組み合わせての CVSup の利用 もご覧ください。

-r maxRetries
    自動リトライの回数を制限します。自動リトライは、ネットワーク接続が 切れるといった一時的なエラーが起きた時に試みられます。 デフォルトでは、GUI を使っていない時、 cvsup は更新がうまく完了するまで何度でもリトライを行います。 リトライの間隔は、ランダム化された指数的な一時退避アルゴリズムを使って 決められます。 GUI を使うと、暗黙的に -r 0 が指定されます。 -r 0 は -1 オプションと同じ意味である点に注意してください。

-s  リストファイルの記録に対しての各クライアントファイルの状態のチェックを 行いません。チェックをしない代わりに、リストファイルは正確であるものと 仮定します。このオプションはディスクアクセスの量を大幅に減らし、 小さなクライアントホストの負荷で高速に更新を行います。しかし、 このオプションは、クライアントのファイルがローカルで修正されていない場 合に限って使うべきです。ミラーサイトは、このオプションを使うと システムのディスク負荷を減るので利益があるでしょう。安全のために、 ミラーサイトであっても時々(一日一度くらい)は -s オプションなしで cvsup を実行すべきです。

    -s オプションを指定しないと、 cvsup はファイルごとに stat(2) システムコールを実行し、ファイルの属性がリストファイルの記録と一致する かどうかを確認します。これにより、 CVSup 外部でのファイル変更は全て検出・訂正されることが保証されます。

    -s オプションを指定し、かつローカルでファイルが 1 つ以上変更された時の 結果は未定義です。ローカルファイルの損傷が訂正されないまま残ったり、 更新を取りこぼしたり、 cvsup が実行途中で異常終了するかもしれません。

-v  バージョン番号を表示して終了します。サーバへの接続は行いません。

-z  全てのコレクションの圧縮を有効にします。この動作は、 supfile において、 compress キーワードを全てのコレクションに追加した時と同様です。

-Z  全てのコレクションの圧縮を無効にします。この動作は、 supfile において、 compress キーワードを全てのコレクションから削除した時と同様です。

supfile は、更新すべきファイルのコレクションを指定するテキストファイルです。 コメントは ‘#’ で始まり、その行の最後まで続きます。コメントと空白を除くと空である行は 無視されます。残りのそれぞれの行は、サーバ定義のファイルのコレクション で始まります。この行でコレクション名の後に続くのは、0 個以上のキーワード または「キーワード=値」の組です。

デフォルトの設定は、コレクション名が *default である行で指定できます。 このデフォルトは、 supfile 内のそれ以降の行に適用されます。 *default 行は複数個あっても構いません。 新しい値は、 supfile で前に指定されたデフォルト値に追加されるか、デフォルト値を上書きします。 コレクションに対して明示的に指定された値は、全てのデフォルト値を 上書きします。

特によく使われるキーワードを以下に示します:

release=releaseName
    これはコレクション内のファイルのリリースを指定します。 コレクション名と同じく、リリース名もサーバの設定ファイル内で定義されて います。普通は各コレクション内に 1 つのリリースしか含まれていませんが、 何個含んでもかまいません。CVS リポジトリから得たコレクションでは、 慣習的に release=cvs をよく使います。CVS でないコレクションでは、慣習的に release=current を使います。

base=base
    これは cvsup が記録ファイルを置いて管理するディレクトリを指定します。 記録ファイルには、クライアントマシン上にある各コレクションの状態が 書かれます。 base ディレクトリは既に存在していなければなりません。 cvsup がこのディレクトリを作成することはありません。 base ディレクトリのデフォルト値は /usr/local/etc/cvsup です。

prefix=prefix
    これは、更新されたファイルが置かれるディレクトリです。 デフォルトでは、これは base と同じです。 絶対パスで指定しなければ、 base からの相対パスと解釈されます。 prefix ディレクトリは既に存在していなければなりません。 cvsup がこのディレクトリを作成することはありません。

    特殊な場合として、 prefix が ‘SKIP’ という名の存在しないファイルを指すシンボリックリンクである場合は、 cvsup はそのコレクションをスキップします。 この場合でもコレクションに関係するパラメータの正しさはチェックされます が、コレクションのファイルは全く更新されません。 この機能を使うと、一つのサイトの複数のマシンで標準の supfile を使いながら、更新するコレクションをマシンごとに制御することができます。

host=hostname
    このオプションは、全てのファイルを取り寄せる元となるサーバマシンを 指定します。 cvsup は、1 回の実行における全てのコレクションを同じホストから得ることを 必要とします。 異なる複数のホストからコレクションを更新したければ、 cvsup を複数回実行しなければなりません。

delete
    このキーワードがあると、 cvsup はファイルの削除を許可します。 このキーワードがなければ、ファイルは全く削除されません。

    delete キーワードがあると、 cvsup はいわゆる exact モードに入ります。exact モードでは、 CVSup はできるだけクライアント側のファイルをサーバ側のファイルに対応させよう とします。 これは、RCS ファイルから個々の差分とシンボリックなタグを消すことと、 ファイル全体を消すことを含みます。 exact モードでは、 CVSup は編集されたそれぞれのファイルをチェックサムを使って調べ、編集によって サーバ上にあるマスターコピーと同一のファイルができることを保証します。 あるファイルについてチェックサムのテストが失敗したら、 CVSup は最後の手段としてファイル全体を転送します。

    一般的には、 CVSup はサーバが知っているファイルだけを削除します。 クライアントのツリーに入っている追加のファイルは、excact モードであっ てもそのまま残されます。 より正確に述べると、 CVSup が消そうとするファイルは 2 種類です:
    •   過去に CVSup 自身が生成または更新したファイル。
    •   サーバ上で不要の印が付けられたチェックアウト済みバージョンのファイル。

use-rel-suffix
    リリースとタグから作ったサフィックスが cvsup が管理している各ファイルの名前に追加されるようにします。 詳しくは リストファイル を参照してください。

compress
    ネットワーク上で送られるデータが全て圧縮されるようにします。 圧縮は非常に有効であり、圧縮しなかった場合に必要な転送量と比べて 普通は 65% から 75% のバイトデータを削減できます。 しかし、クラアイントとサーバ両方の CPU 時間という点ではコストがかかり ます。 LAN では、圧縮は一般的に生産性を落とします。実際にはファイルの更新が 遅くなってしまいます。 56K ビット/秒あるいはそれ以下の速度の接続では、圧縮はほぼ確実に 得になります。 これら両極端なケースの中間の速度のネットワーク接続では、実験を 行って参考としましょう。

    -z コマンドラインオプションは、全てのコレクションに対して compress キーワードを有効にします。supfile での指定とは無関係です。 同様に -Z コマンドラインオプションは、全てのコレクションに対して compress オプションを無効にします。

norcs
    RCS ファイルの特別扱いをなくします。RCS ファイルは他のファイルと 同じように扱われます。

norsync
    通常の(RCS でない)ファイルの更新の際に、Tridgell と Mackerras の rsync アルゴリズムを使いません。 このアルゴリズムはどんな種類のファイルでも正しく動作しますが、 圧縮された tar アーカイブのようなファイルに対しては、 効率的ではありませんし計算的にもコストが高く付きます。

strictrcs
    更新された RCS ファイルをバイト単位の厳密な MD5 チェックサムで 確認します。通常、 CVSup は RCS ファイルに対してもっと緩いチェックサムを用います。これは、 空白文字による無意味な違いを無視します。異なるバージョンの CVS と RCS は、同じ RCS ファイルに対しても空白が様々に異なります。 したがって厳密なチェックサムを取ると、論理的には同じであるファイルに対 して意味がない不一致を報告するかもしれません。これにより不要な “fixups” が大量に行われ、更新が遅くなることがあります。

nocheckrcs
    更新された RCS ファイルに対して、MD5 チェックサムの比較を行いません。 delete キーワードが指定されていなければ、このオプションが自動的に 有効になります。

execute
    サーバから受け取ったシェルコマンドを実行できるようにします。 このオプションは注意して使うべきです。というのも、セキュリティな危険を 及ぼすかもしれないからです。

preserve
    cvsup に、可能な全ての属性をサーバからクライアントに転送しようと試みさせます。 サポートされる属性はホストのプラットフォームとクライアントのプラットフォーム に依存します。FreeBSD システムでは、以下の属性がサポートされています:
    •   所有者
    •   グループ
    •   パーミッション
    •   フラグ
    •   修正時刻

    これらのうち、最初の 4 つの属性は preserve キーワードで制御します。5 つ目はどんな場合でも保存されます。

    preserve キーワードは、ユーザファイルや CVS リポジトリの更新に使うためのもので はありません。 これは、ホストの全体のファイルツリーを正確に複製するといった特殊な目的 のためだけに使われます。 preserve が指定されていると、サーバホストとクライアントホストの何らかの違いが 問題を起こすかもしれません。 例えば、クライアントマシン上に存在しない所有者が所有するファイルを クライアントが受け取った場合、オーナを保存することはできません。 同様にこれによって意図しないパーミッションが設定されることがあります。 さらに、それ以降の更新では、毎回クライアント上のファイルの所有者を訂正 しようとして失敗し、時間と帯域幅を無駄にしてしまうでしょう。 最後になりますが、 preserve モードはネットワークのトラフィックを増大させ、更新を遅くします。

    preserve モードを正しく機能させるためには、クライアントは root のアクセス権限で 実行しなければなりません。 クライアントが root でなければ、所有者、グループ、フラグの情報を保存し ようとする機能は無効になります。

    preserve キーワードは、checkout モードでは無視されます。

umask=n
    コレクション内のファイルを更新する時、 cvsup に umask 値 n (8 進値)を使わせます。 このオプションは、 preserve が指定されていると無視されます。

いくつかの追加的で、より専門的なキーワードについては後述します。 sup との後方互換性のため、認識できなかったキーワードは黙って無視されます。

操作
cvsup は GUI(グラフィカルユーザインタフェース)を持っており、これを使うとユー ザは更新中の進行状況と処理を監視できます。この GUI は、コマンドライン オプション -g が指定されるか、 DISPLAY 環境変数が設定されていなければ無効になります。 GUI には、 “Filter” 入力フィールドがあります。ここにパターンを入力して、更新するファイルを 制限することができます。 パターンは -i オプションの指定と同様に記述します。 複数のパターンを入力する際には、空白で区切らなければなりません。

現在のところは、 supfile で指定されたパラメータを GUI で変更することはできません。 この点は将来のリリースでの計画になっています。 どちらかというと必要ないものではありますが、GUI は見て楽しいものです。

CVS モード
CVSup は、2 つの主な動作モードをサポートしています。 これらは CVS モードと checkout モードと呼ばれるものです。

CVS モードでは、クライアントはマスターの CVS リポジトリを構成している 実際の RCS ファイルのコピーを受信します。CVS モードはデフォルトの動作 モードです。 このモードは、CVS リポジトリの完全なコピーをクライアントマシン上でメン テナンスしようとユーザが考えている場合には適しています。

CVS モードは、CVS リポジトリベースでないファイルのコレクションに対して もうまく使えます。この場合にはファイルは解釈されることなく、単にそのま ま転送されます。

checkout モード
checkout モードでは、クライアントは特定のリビジョンのファイルを受信し ます。これはサーバの CVS リポジトリから直接チェックアウトされます。 checkout モードを使うと、クライアントは任意のバージョンをリポジトリか ら取得できます。この際、チェックアウトされる時の形で複数個のバージョン をサーバ上に持つ必要はありません。 しかし、checkout モードでは、その基本機能よりもずっと柔軟に動作させる ことができます。 います。 クライアントは CVS のシンボリックタグを指定できますし、任意の日付の指 定もできます。両方を指定することもできます。また CVSup は、この指定に対応するファイルをリポジトリ内からチェックアウト形式で取 り出すことができます。

checkout モードはコレクション別に指定します。指定は、 supfile 内に以下のキーワードの一つあるいは両方を含めることによって行います:

tag=tagname
    シンボリックタグを指定します。このタグは、CVS リポジトリから取り出すリ ビジョンを選択するために使わなければなりません。 このタグはブランチまたは特定のリビジョンを示すことができます。 タグはシンボリックでなければなりません。つまり、数値のリビジョン番号は サポートされていません。

    FreeBSD のソースリポジトリの場合は、以下のタグがよく使われます:

    RELENG_3
        ‘stable’ ブランチ。

    .   メインブランチ( ‘current’ リリース)。 date キーワードだけが指定されると、こちらがデフォルトです。

date=
    [cc] yy.mm.dd.hh.mm.ss これは、CVS リポジトリからチェックアウトするリビジョンの選択に使う日付 を指定します。 クライアントは実際には、指定された日付と時刻のリビジョンを受け取ります。

    現時点では、日付のフォーマットは柔軟ではありません。17 文字あるいは 19 文字の全てを、説明したフォーマットで正確に指定しなければなりません。 2000 年以降の場合は、世紀を cc で指定します。 これより前の年の場合は、最後の 2 桁だけを yy で指定します。 日付と時刻は GMT で扱います。 デフォルトの日付は ‘’. です。これは “できるだけ新しいもの” という意味です。

checkout モードを有効にするためには、少なくともこれらのキーワードの いずれかを指定しなければなりません。 どちらも指定されていなければ、 CVSup はデフォルトの CVS モードで動作します。

ブランチタグと日付が両方とも指定されると、指定されたブランチ上の 指定された日付の時点のリビジョンがチェックアウトされます。 日付を特定のリリースタグに付けて指定することもできますが、あまり役には 立たないでしょう。

checkout モードでは、タグや日付を更新と更新の間に変えられます。 例えば、 ‘tag=.’ という指定を使ってコレクションが転送されたとしましょう。 ユーザは後から指定を ‘tag=RELENG_3’ に変えられます。 これを指定すると、 CVSup はチェックアウトされたファイルを編集し、 ‘current’ バージョンが ‘stable’ バージョンになるようにします。 一般的には、 CVSup はどんなタグ/日付の組合せであっても、他のタグ/日付の組合せに変換してく れます。変換は、両者の間にある RCS の差分を既存のファイルに適用するこ とによって行います。

チェックアウトされたファイルのコレクションを、あるタグから別のタグに 変換するときには、変換の前後で必ず同じリストファイルが使われるようにす るため、 supfile ファイル中で list キーワードを指定することが重要です。 リストファイルは次の リストファイル の節で説明します。 効率のため、 cvsup は各コレクションについての記録ファイルを管理しています。 これをリストファイルと呼びます。 リストファイルには、クライアントが現在持っているファイルとリビジョンに 関する情報が書かれています。 このファイルには、クライアントのツリーに入っている実際のファイルと リストファイルが一致していることを確認するための情報も書かれています。

厳密に言うとリストファイルは必要ではありません。このファイルが削除され るか、クライアントが持っている実際のファイルとの不一致が起こると、 cvsup は最後の手段として少し効率の悪い方法でクライアント側のファイルの識別と 更新を行います。 この際には、 CVSup の動作モードによって、タイムスタンプ、チェックサム、RCS ファイルの 解析結果などが使われます。

リストファイルは不可欠ではないので、 cvsup は FTP や CD-ROM から入手した既存のファイルツリーを「利用」できます。 cvsup はクライアント側のファイルのバージョンを識別し、必要に応じてこれを更新 します。さらに、将来使うためにリストファイルを生成します。 他のシステムが作ったファイルツリーを使う場合の動作は、通常の更新ほど 高速ではありません。 また、サーバにかかる負荷も高くなります。 リストファイルはコレクション固有のディレクトリに保存されます。詳しくは ファイル セクションをご覧ください。 リストファイルの名前は必ず ‘checkouts’ で始まります。 supfile 内でキーワード use-rel-suffix が指定されていると、リリースとタグから作ったサフィックスがファイル名に 追加されます。 デフォルトのサフィックスは、 supfile で明示的にサフィックスを指定することにより上書きされます:

list=suffix
    これはリストファイルの名前に付けるサフィックスの指定です。サフィックス の先頭のドットは自動的に付けられます。 例えば、 ‘list=stable’ とすると、 checkouts.stable という名前のリストファイルが作られます。この場合には、リリース、タグ、 use-rel-suffix キーワードは関係ありません。

refuse ファイル
ユーザは受け取りたくないファイルの集合を指定できます。 こういったファイルは、いわゆる refuse ファイル内でファイル名パターンとして指定されます。 パターンは空白文字で区切られ、各行には複数個のパターンを置くことができます。 パターンにマッチするファイルとディレクトリは、更新も削除もされません。 これらのファイルは単に無視されます。

現在は、refuse ファイル内にコメントに書く方法はありません。

パターンは sh(1) のそれと似ていますが、スラッシュの特別扱いや、ピリオドで始まるファイル の特別扱いがない点が異なります。 例えば、パターン ‘*.c’ は ‘.c’ で終わる全てのファイルにマッチします。これには ‘foo/bar/lam.c’ といったサブディレクトリ内のファイルも含まれます。 全てのパターンはコレクションのプレフィックスディレクトリからの相対パス として解釈されます。

これらファイルが CVS リポジトリから得たものならば——普通はそうなのです が——これらは RCS ファイルとなります。これらのファイルには、 ‘,v’ というサフィックスが付きます。パターンについてはサフィックスも考慮に入 れなければなりません。例えば、FreeBSD の文書ファイルは ‘doc’ という base ディレクトリのサブディレクトリに入っています。 そのディレクトリにある ‘Makefile’ が不要な場合に

doc/Makefile

と指定してもうまく動作しません。なぜなら、サーバ上にあるファイルは ‘Makefile,v’ だからです。 もっとよい解決方法は、

doc/Makefile*

と指定することです。この指定であれば、 ‘Makefile’ が RCS ファイルであろうとなかろうとマッチします。

別の例としては、日本語、ロシア語、中国語の翻訳を避けて FreeBSD 文書 ファイルを取得するには、以下の行を含む refuse ファイルを作ります:

doc/ja*
doc/ru*
doc/zh*

それぞれの supfile 行は、3 つの refuse ファイルによって調べられます。 大域的な refuse ファイルとして base/collDir/refuse があります。これは全てのコレクションとリリースに適用されます。 コレクション別の refuse ファイルとして base/collDir/collection /refuse があります。これは特定のコレクションに適用されます。 最後に、リリースとタグ別の refuse ファイルがあります。これは、 コレクション内の指定されたリリース/タグの組み合わせに対してのみ適用さ れます。 最後の refuse ファイルの名前は、コレクション別の refuse ファイルの名 前にサフィックスを加えることによって付けられます。これは先に説明したリ ストファイルと同じ方法です。 どんな種類の refuse ファイルも存在しなくてもかまいません。

cvsup は、 collDir に対する base と sup の組み込みのデフォルト値を /usr/local/etc/cvsup に持っていますが、どちらの値も上書き可能です。 base の値は -b オプションまたは supfile ファイル中の base=pathname エントリで変更できます。 (両方指定した場合は、 -b オプションの方が supfile のエントリよりも優先されます。) collDir の値は -c オプションでしか変更できません。これを変更する supfile コマンドはありません。

例えば、 base と collDir の両方にデフォルト値が設定されており、コレクションが ‘src-all’ でリリースが ‘cvs’ である場合を考えます。 さらに、 ‘tag=RELENG_3’ に対して checkout モードが使われているものとします。 この場合、refuse ファイルの名前としては以下の 3 つが考えられます:

/usr/local/etc/cvsup/sup/refuse
/usr/local/etc/cvsup/sup/src-all/refuse
/usr/local/etc/cvsup/sup/src-all/refuse.cvs:RELENG_3

supfile がコマンド base=/foo を含んでいる場合、refuse ファイルは以下のようになります:

/foo/sup/refuse
/foo/sup/src-all/refuse
/foo/sup/src-all/refuse.cvs:RELENG_3

-b /bar が使われている場合( supfile ファイル中に base=/foo コマンドがあっても):

/bar/sup/refuse
/bar/sup/src-all/refuse
/bar/sup/src-all/refuse.cvs:RELENG_3

そして -c stool も使われている場合:

/bar/stool/refuse
/bar/stool/src-all/refuse
/bar/stool/src-all/refuse.cvs:RELENG_3

認証
CVSup は認証機構を備えており、これを使ってクライアントとサーバがお互いの身元 を確認することができます。この機構は、パケット盗聴やリプレイ攻撃の影響 を受けない challenge-response プロトコルを用いています。ネットワーク上 では、パスワードはどちらの向きにも流れません。クライアントとサーバのい ずれも、お互いの身元を独立に確認できます。

ファイル $HOME/.cvsup/auth には認証に使われる情報が書かれています。このファイルには、クライアント がアクセス可能な各サーバについてのレコードが入っています。それぞれの レコードは、ファイル中に 1 行で書かれます。 ‘#’ で始まる行は無視されます。空白文字だけの行も同様です。ただし、ファイル 中の他の場所では空白文字も意味を持ちます。フィールドは ‘’: 文字で区切られます。

ファイルの各レコードは以下の形式です:

    serverName:clientName:
    password:comment

たとえ空であっても、全てのフィールドは存在しなければなりません。 ServerName はレコードが適用されるサーバ名です。慣習的に、これはカノニカルかつ完全 にドメイン名が指定されたサーバ名です(例: ‘CVSup177.FreeBSD.ORG’ )。 これはサーバが自分の名前と考えているホスト名でなければなりません。 名前については大文字・小文字は区別されません。

ClientName はクライアントがサーバへのアクセス権を得るときに使う名前です。慣習的に、 クライアント名には全て e-mail アドレスが使われます(例: ‘BillyJoe@FreeBSD.ORG’ )。クライアント名では大文字・小文字は区別されません。

Password は秘密の文字列であり、クライアントが身元を証明するために使います。 パスワード文字列は ‘’: や改行文字を含んではいけません。

Comment はレコードを識別するための付加的な情報を持ちます。プログラムに解釈され ることはありません。

指定されたサーバに対する認証の設定を行うには、以下の手順を実行しなけれ ばなりません:

1.  サーバ管理者または別の情報源から公式な serverName を取得します。

2.  適切な clientName を選びます。 これは有効な電子メールアドレスの形式にすべきです。これは、サーバ管理者 が必要に応じてユーザに連絡しやすくするためです。

3.  秘密の password として任意の文字列を選びます。

4.  cvpasswd ユーティリティを実行し、質問に対して パスワード を入力します。このユーティリティはサーバの管理者に送る行を出力し、 それからユーザの $HOME/.cvsup/auth ファイルの修正手順を示します。この行をサーバ管理者に送るには、安全な 手段を使うべきです。

$HOME/.cvsup/auth にはパスワードが入っているので、必ず自分以外には誰も読めないようにして ください。

認証はそれぞれの向きで独立に動作します。サーバの管理者は、 ユーザが身元を証明しなければならないかどうかを制御します。 ユーザはサーバの身元をチェックするかどうかを制御します。制御には -a コマンドラインオプションを使います。

ミラーリングのための CVSup の使用
CVSup は CVS リポジトリ用に最適化されているので、汎用的なミラーリングとして 非常にうまく動作します。 CVSup はどんな種類のファイルの更新にも使えます。
•   RCS ファイルの更新は、個々のタグと差分の転送および、これらの クライアント側のファイルへのマージによって行われます。
•   通常ファイルは、可能であれば rsync アルゴリズムを使って更新されます。 rsync アルゴリズムが無効にされている場合、追加されたデータを持つサーバ 上のファイル(例: ログファイル)は、新しく加わった末尾の部分だけを受け取 ります。 他の通常ファイルはまるごと置き換えられます。
•   空のディレクトリは残されます。
•   シンボリックリンクは、サーバの設定ファイル内で symlink と rsymlink コマンドが指定されていると更新されます。詳しくは cvsupd(8) をご覧ください。
•   ハードリンクはそれぞれのコレクション内では保存されますが、コレクション 間では保存されません。
•   デバイスノードはメジャー番号とマイナー番号を使って更新されます。 クライアントのホストとサーバのホストで異なるオペレーティングシステムが 動作していると、これは望ましい結果とならないことがあります。

CVSup と防火壁
cvsup は、様々な設定の防火壁を超えるために数多くのモードを用意しています。 これらのモードは -P オプションか、 m3socks コマンドを使って制御できます。 cvsup を使えるようにするには、防火壁はサーバホストの 5999 番ポートへの外向き の接続を最低限許可しなければなりません。 この条件が満たされていれば、SOCKS の有無に関わらず多重モード (-P m) が動作するはずです。

もう少し防火壁の制限が緩ければ、passive モードや他のモードの一つを使っ て、効率を少し上げることができます。 詳しくは -P オプションの説明をご覧ください。

特定の種類の防火壁と CVSup を組み合わせて使う際の情報については、 <http://www.polstra.com/projects/freeware/CVSup/> にある CVSup FAQ をご覧ください。

SOCKS と組み合わせての CVSup の利用
SOCKS プロキシサーバ経由での通信は、現在は FreeBSD 上でしかサポートさ れていません。 これを用いるためには、port として用意されている 修正版の Modula-3 の実行時システム( lang/modula-3-lib )とアドオンの SOCKS ライブラリ( lang/modula-3-socks )が必要です。 また、SOCKS ライブラリは動的リンク技術を使うので、 cvsup の実行ファイルは完全に動的リンクされている必要があります。 FreeBSD の port の net/cvsup は、必要に応じて cvsup を完全に動的にリンクします。

SOCKS の動作を有効にするには、単に lang/modula-3-socks パッケージに含まれる m3socks と組み合わせて cvsup を実行してください。 詳細については m3socks(1) をご覧ください。

ssh を使ったポート転送
防火壁の内側のユーザは、SOCKS の代替品として、Secure Shell パッケージの ssh が持っている TCP ポート転送機能を使って防火壁を通過できます。 これを行うためには、ユーザは CVSup のサーバホストにログインアカウントが必要です。 手順を以下に示します:

1.  以下のようにして、 ssh を使ってサーバホストとの接続を確立します:

        ssh -f -x -L 5999:localhost:5999 serverhost sleep 60

    普通は serverhost を CVSup サーバのホスト名に置き換えるのですが、ここでは ‘localhost’ を入力します。 これにより、ポート転送に必要な設定ができます。 60 秒経って sleep が終わるまでに cvsup を起動しなければなりません。 いったん更新が始まると、 ssh は必要な間、転送チャネルをオープンした状態を保ちます。

2.  ローカルホストで cvsup を実行します。コマンドラインには以下の行を含めます: ‘-h localhost -P m’

ファイル
/usr/local/etc/cvsup
    デフォルトの base ディレクトリ。
sup デフォルトの collDir サブディレクトリ。
base/collDir/collection
    /checkouts* リストファイル。
base/collDir/refuse
    グローバルの refuse ファイル。
base/collDir/collection
    /refuse* コレクション別の refuse ファイルと、リリースとタグ別の refuse ファイル。
$HOME/.cvsup/auth
    認証用のパスワードファイル。

関連項目
ctm(1), cvpasswd(1), cvs(1), cvsupd(8), m3socks(1), rcsintro(1), ssh(1)

    http://www.polstra.com/projects/freeware/CVSup/

作者
John Polstra <jdp@polstra.com>

バグ
RCS ファイルは ‘,v’ で終わっていなければ RCS ファイルと認識されません。

‘Attic’ という名前のディレクトリは CVS Attic として特別扱いされます。

SOCKS ライブラリまたはサーバのバグのため、大部分の形式の -P オプションは SOCKS では使えません。 多重モード (-P m) を使えますが、他の形式の -P オプションは受け付けられません。

GUI と一部のウィンドウマネージャ(特に FVWM)の相性が良くありません。 FVWM のバージョン 1, 2 のどちらでも問題が起こるのですが、バージョン 2 の方がまだましのようです。

    Style "cvsup" ClickToFocus

という行を FVWM2 の .fvwmrc に追加するとかなりよくなります。 この問題はどうやらウィンドウマネージャのバグが原因らしく、GUI が ‘WM_TAKE_FOCUS’ プロトコルを使うと起こるようです。 回避策としては、 -g オプションを使って、GUI を完全に無効にするとよいでしょう。