続・CVSの使い方  - Over the Network -

Last described 21-Feb-2004

1. 最初に
2. 予備知識
2.1 リポジトリの切り替え方(=シェルの使い方)
2.2 正しい CVSROOT/* ファイルの追加・修正方法
2.3 SSHを利用する際の、RSA認証の必要性
3. CVSサーバの設定(OpenSSH編)
3.1 SSHサーバの起動
3.2 公開鍵の登録
4. CVSクライアントの設定(OpenSSH編)
4.1 公開鍵と秘密鍵の作成
4.2 公開鍵の登録と接続テスト
4.3 環境変数の設定
4.4 Terminal から CVSを使う
4.5 'Project Builder' や Xcode から CVSを使う
5. CVSサーバの設定(pserver編)
5.1 CVSROOT/config ファイルの設定
5.2 /etc/xinetd.d/cvspserver ファイルの新規作成
5.3 ファイアウォールの設定
6. CVSクライアントの設定(pserver編)
6.1 環境変数の設定
6.2 `cvs login` と `cvs logout`
6.3 Terminal から CVSを使う
6.4 'Project Builder' や Xcode から CVSを使う


1. 最初に

本編は「CVSの使い方 - MacOSXで事始め -」の続編です。

「ローカルマシン上に CVSリポジトリを作成して、個人で CVS を利用するための覚え書き」というコンセプトは基本的に変っていません。 今回は、前編で CVSリポジトリを作成したコンピュータ[G4Cube]を CVSサーバに仕立てて、他のコンピュータ[PowerBookG4]からネットワーク越しにアクセスします。

これ以降、以下の条件で作業するものとして話を進めます。

※CVS: Concurrent Versions System
※動作確認したソフトウェアのバージョンは、 MacOSX 10.2.4 + CVS 1.10 + ProjectBuilder 2.1、 および MacOSX 10.3.2 + CVS 1.10 + Xcode 1.0。

2. 予備知識

2.1   リポジトリの切り替え方(=シェルの使い方)

ネットワーク越しに CVSリポジトリにアクセスする様になると、頻繁にリポジトリ(CVSサーバ)を切り替える必要が出てくることがあります。 この様な場合、リポジトリの切り替え手段としては、次のような二通りの方法があるかと思います。

  1. 環境変数 CVSROOT を再設定する。    (例:setenv CVSROOT ~/cvsroot
  2. -d オプションでリポジトリを(毎回)指定する。 (例:cvs -d ~/cvsroot history)

方法 i. は、前編でも紹介しました。

方法 ii. も、リポジトリの指定が必要になるコマンドの利用頻度を考慮すれば、それほど悪くない手です。 前編で紹介したコマンドを例に挙げてみると、コマンドラインでリポジトリを指定する必要があるのは init, checkout, release, history ぐらいで、比較的利用頻度の多い add, remove, update, commit, tag, diff ではリポジトリを指定する必要はありません。
私個人としては、リポジトリを指定するための -d オプション が別の用途にも割り当てられているため、紛らわしくて扱い難いという理由から、方法 i. がお勧めだと思っています。


どちらの方法を選択したとしても問題となるのは、リポジトリを表現する文字列が長いということです。

# リポジトリを表現する文字列(例)の比較
  • ~/cvsroot # リポジトリがローカルマシン上にある時
  • :ext:terra@g4cube:/Users/terra/cvsroot # リポジトリが CVSサーバ上にある時
  • しかも、この文字列を打ち込む時には(標準設定のシェルでは)[TAB]キーによる補完も効かないので、その手間も半端ではありません。 頻繁に切り替えるリポジトリは事前にリストアップしておき、[TAB]キーによる補完が効くようにシェルを設定しておくと楽です。 以下に、.tcshrc ファイルの設定例を示します。


    方法 i. を使う場合は、シェルの補完機能を比較的素直に使うことができます。

    # .tcshrc の設定例1:方法 i. を前提にしたコマンド書式
    complete cvs   'p/1/(add admin commit checkout ..(中略).. update)/'
    complete setenv 'p/1/e/' \                # 次の行に続く(まとめて1行に記述することも可)
        'n;CVSROOT;(/Users/terra/cvsroot :ext:terra@g4cube:/Users/terra/cvsroot);'
    

    方法 ii. を使う場合は、CVSコマンドの -d オプションの多様性が仇になり、シェルの補完機能を巧く設定することができません。 中途半端な補完機能で我慢するとか、下記のように専用コマンドを作成するとか、打開策を思い付かない訳ではありませんが、あまりお勧めできる方法とは言えません。

    # .tcshrc の設定例2:alias で専用コマンド "cvs-d" を作成する.
    alias cvs-d    'cvs -d'
    complete cvs   'p/1/(add commit ..(中略).. update)/'
    complete cvs-d 'p/2/(admin checkout ..(中略).. rtag)/' \     # 次の行に続く
              'p;1;(/Users/terra/cvsroot :ext:terra@g4cube:/Users/terra/cvsroot);'
    

    ※キーの打ち込み回数を減らすだけなら、切り替えるリポジトリ毎に名前の短いコマンドを用意するのが効果的です。 しかし、この方法は使用頻度が極端に高いコマンドでもない限り、新たに覚えるべきコマンド(単語)を増やしたり、コマンドの用法に混乱を招いたりするだけで、あまり良いことはありません。
    ※[TAB]キーによる補完機能は、tcsh だけでなく bash や zsh にもあります。

    2.2   正しい CVSROOT/* ファイルの追加・修正方法

    前編の2.3節、2.4節では、CVSROOT/cvsignore や CVSROOT/cvswrappers といったリポジトリの設定ファイルを直接、追加・更新するという方法を紹介しました。 ここで登場した CVSROOT というディレクトリについてですが、これは、設定ファイルの格納場所であると同時に、"CVSROOT" というモジュール(プロジェクト)の格納場所にもなっています。

    [G4Cube:~] terra% ls -l ${CVSROOT} ¶        # リポジトリ内を表示する
    drwxrwxr-x  41 terra  staff  1394 Feb  6 00:24 CVSROOT
    drwxrwxr-x   8 terra  staff   272 Aug  2 22:26 projectA
    drwxrwxr-x  21 terra  staff   714 Aug  2 23:00 projectB
    # このように表示してみると、なんとなく納得したような気になりませんか・・?
    

    つまり、これらの設定ファイルを追加・更新する方法として、(いかにも CVS らしい)以下のような方法も使えるということです。

    # ↓ "CVSROOT" モジュールのコピーを取り出す。(前節 4.1節で説明)
    [G4Cube:~] terra% cvs export -d CVSR2  CVSROOT ¶
    [G4Cube:~] terra% cd CVSR2
    [G4Cube:~/CVSR2] terra% 
    #### cvsignore ファイルを追加する。(前編 2.3節と同等の作業)
    [G4Cube:~/CVSR2] terra% cp -i /Developer/Tools/cvswrappers  . ¶
    overwrite /Users/terra/cvsroot/CVSROOT/cvswrappers? y ¶
    [G4Cube:~/CVSR2] terra% cvs add cvsignore ¶
    cvs add: scheduling file `cvsignore' for addition
    cvs add: use 'cvs commit' to add this file permanently
    #### cvswrappers ファイルを修正する。(前編 2.4節と同等の作業)
    ・・・
    # ↓ コミットする。(前節 5.3節で説明)
    [G4Cube:~/CVSR2] terra% cvs commit  -m "OK" ¶
    # ↓ 作業用ディレクトリを破棄する。(前節 4.2節で説明)
    [G4Cube:~/CVSR2] terra% cd .. ¶
    [G4Cube:~] terra% cvs release -d CVSR2
    You have [0] altered files in this repository.
    Are you sure you want to release (and delete) directory `CVSR2': y ¶
    

    コミットが完了すると、当然の如く "CVSROOT" モジュールの構成ファイル(CVSROOT/*,v) が更新されます。 それと同時に、リポジトリの設定ファイル(CVSROOT/cvsignore, CVSROOT/cvswrappers 等)も自動的に追加・更新されます(この辺りが、他の一般的なモジュールと動作が異なります)。

    ※前編の方法により cvsignore, cvswrappersファイルを追加・修正した結果は、取り出したモジュールのコピーには反映されません。追加・修正等の作業をもう一度やり直す必要があります。

    2.3   SSHを利用する際の、RSA認証の必要性

    RSA認証というのは SSH(OpenSSH)で使われている認証方式の一つで、パスワードの代りに公開鍵と秘密鍵を使います。 SSHを使ってリポジトリにリモートアクセスする場合は、RSA認証にしておくことをお勧めします。 もし、デフォルトのパスワード認証のまま cvsコマンドを実行したとすると、CVSサーバと接続するために毎回パスワードを入力することになります。 パスワードを毎回入力するのは実用的ではありませんし、何より 'Project Builder' から(cvs コマンドを使い)リポジトリにアクセスする時が問題です。 端末画面(/dev/ttyp*)の割り当てが無いため、cvs から起動された sshコマンドがパスワードをユーザに尋ねることもできないからです。

    同様の問題は、秘密鍵のファイルを暗号化している(パスワードの代りにパスフレーズを入力する)場合にも発生します。 この場合は、パスフレーズの入力を一回で済ませるために ssh-agentを使うことで問題を解決できます。

    ※DSA認証でも同様だと思うのですが、勉強不足のためご勘弁を。

    3. CVSサーバの設定(OpenSSH編)

    ネットワーク接続されている他のコンピュータから、CVSサーバのリポジトリにアクセスする方法には幾つか方法がありますが、 MacOSX の標準機能である SSH(OpenSSH)を利用した方法を最初に紹介します。

    3.1   SSHサーバの起動

    [システム環境設定]を起動した後、[共有]-[サービス]のダイアログ画面で、[リモートログイン]をチェックします。 ファイアウォールを有効にしている場合は、これに連動して自動的に 22番ポートが許可されます。


    3.2   公開鍵の登録

    CVS(SSH)クライアントとなるコンピュータ上で作成した公開鍵を、CVS(SSH)サーバ上の ${HOME}/.ssh/authorized_keys というファイルに登録(追加)します。 ${HOME} は、リポジトリを格納しているユーザ用ディレクトリです。

    この辺の作業は、CVSの話というよりは OpenSSHの話になるので、本編では詳細な説明はしませんが、おおまかな作業は次のようになります。

    # CVSクライアント上で作成した公開鍵を、別名をつけてCVSサーバにコピーしておく.
    [PowerBookG4:~] terra% scp -p  ~/.ssh/id_rsa.pub  terra@g4cube:PBG4-terra.pub
    terra@g4cube's password: PASSWORD_ON_G4Cube
    id_rsa.pub           100% |*********************************|   229       00:00    
    
    # CVSサーバ上のリポジトリを格納しているアカウントで作業する.
    ##  ~/.ssh ディレクトリが存在しない場合は、以下のようにして作成する.
    [G4Cube:~] terra% mkdir ~/.ssh ¶
    [G4Cube:~] terra% chmod go-rwx ~/.ssh ¶
    ##  ~/.ssh ディレクトリができたら、以下のようにして公開鍵を登録(追加)する.
    [G4Cube:~] terra% cat  PBG4-terra.pub  >>  ~/.ssh/authorized_keys ¶
    [G4Cube:~] terra% rm PBG4-terra.pub    # 不要になった公開鍵ファイルを削除
    

    ※公開鍵の作成方法は4章で説明します。

    4. CVSクライアントの設定(OpenSSH編)

    この章でも、OpenSSHに関する話が数多く出てきますが、本編では詳細な説明はしません。 OpenSSHについてのより詳細な情報が必要な方は、他の資料を参考にしてください。

    4.1   公開鍵と秘密鍵の作成

    公開鍵と秘密鍵を作成する作業は必ず、SSHクライアントとなるコンピュータにログインしている状態で行ってください。 鍵の作成時には「パスフレーズ」というパスワードのような単語の入力を求められますが、ここではパスフレーズを使わない方法について説明します。

    [PowerBookG4:~] terra% ssh-keygen -t rsa ¶
    Generating public/private rsa key pair.
    Enter file in which to save the key (/Users/terra/.ssh/id_rsa): 
    Enter passphrase (empty for no passphrase):     # [enter]キーを押す(パスフレーズなし)
    Enter same passphrase again:                    # [enter]キーをもう一度押す
    Your identification has been saved in /Users/terra/.ssh/id_rsa.
    Your public key has been saved in /Users/terra/.ssh/id_rsa.pub.
    The key fingerprint is:
    xx:xx:xx:xx:xx:xx:xx:xx:xx:xx:xx:xx:xx:xx:xx:xx terra@ PowerBookG4.local.
    [PowerBookG4:~] terra% ls -l ~/.ssh ¶    # 公開鍵が作成されているか確認する
    total 16
    -rw-------  1 terra  staff  887 Aug  2 16:27 id_rsa        # 秘密鍵ファイル
    -rw-r--r--  1 terra  staff  229 Aug  2 16:27 id_rsa.pub    # 公開鍵ファイル
    ・・・
    


    4.2   公開鍵の登録と接続テスト

     3.2節の手順に従い、作成した公開鍵を CVSサーバに登録します。 登録が完了したら、以下のようにして接続テストをしてください。
    [PowerBookG4:~] terra% ssh terra@g4cube  ls ¶
    

    CVSサーバへの接続が初めてであれば、以下のようなメッセージが表示されます。 CVSサーバに本当に接続して良いか訪ねてきますので、yes と入力して次のステップに進んでください。 以前に接続したことがあれば、この様なメッセージは表示されず、自動的に次のステップに進みます。

    # CVSサーバに初めて接続する場合
    The authenticity of host 'g4cube (192.168.xx.xx)' can't be established.
    RSA key fingerprint is xx:xx:xx:xx:xx:xx:xx:xx:xx:xx:xx:xx:xx:xx:xx:xx.
    Are you sure you want to continue connecting (yes/no)? yes ¶
    Warning: Permanently added 'localhost' (RSA) to the list of known hosts.
    
    次のステップに進んだところで、CVSサーバのディレクトリが表示されれば成功です。

    もし、以下のようなメッセージが表示された場合には、(本編で言及していないことも含めて)何らかの問題があります。

    # CASE1:パスフレーズを要求されている:失敗(本章の説明範囲外)
    Enter passphrase for key '/Users/terra/.ssh/id_rsa': 
    
    # CASE2:パスワード認証のまま:失敗
    terra@g4cube's password: 
    


    4.3   環境変数の設定

    環境変数 CVSROOT と CVS_RSH の値を以下のように設定します。

    setenv CVS_RSH ssh
    setenv CVSROOT :ext:terra@g4cube:/Users/terra/cvsroot
        #                (1)   (2)     (3)
        # (1): サーバ上でのユーザ名.リポジトリにアクセス可能なアカウント.
        # (2): サーバのホスト名(またはIPアドレス).
        # (3): サーバ上でのリポジトリの格納場所.絶対パスのみ記述可.
    


    4.4   Terminal から CVSを使う

    cvs コマンドの実行は、必ず、4.3節〜4.4節の作業を実施した仮想端末のウィンドウで行います。 他のウィンドウでは CVSサーバ上のリポジトリにはアクセスできません。 使い方は、ローカルマシン上のリポジトリの場合と同じです。 コマンド等の使い方については、前編を参照してください。

    CVS自体の使い方ではありませんが、リポジトリに格納されているモジュールを確認するには以下のようにすれば可能です。

    [PowerBookG4:~] terra% ssh terra@g4cube  ls -l /Users/terra/cvsroot
    drwxrwxr-x  41 terra  staff  1394 Feb  6 00:24 CVSROOT
    drwxrwxr-x   8 terra  staff   272 Aug  2 22:26 projectA
    drwxrwxr-x  21 terra  staff   714 Aug  2 23:00 projectB
    


    4.5   'Project Builder' や Xcode から CVSを使う

    SSHによるリモートアクセスの場合、Dock や Finder から 'Project Builder' や Xcode を起動しただけでは、CVSサーバ上のリポジトリにリモートアクセスすることができません。 ~/.MacOSX/environment.plist という環境変数設定用ファイルを使い、GUIアプリケーション用の環境変数を設定しておきます。

    # ~/.MacOSX/environment.plist の設定
    <?xml version="1.0" encoding="UTF-8"?>
    <!DOCTYPE plist PUBLIC "-//Apple Computer//DTD PLIST 1.0//EN" "http://www.apple.com/...
    ・・・
            <key>CVS_RSH</key>
            <string>ssh</string>
    ・・・
    

    なお、環境変数CVSROOT の設定が含まれていないのは、'Project Builder' や Xcode には CVSROOTを参照する操作が無い(不可能だ)からです。 起動後の使い方は、前編の6章と同様です。

    ※~/.MacOSX/environment.plistの作成・編集方法については、別のページで紹介しています。

    5. CVSサーバの設定(pserver編)

    MacOSX でも、当然 pserverによるリモートアクセスが使えます。 ただし、pserverによる方法は多数のユーザを相手にするのでなければ、(MacOSX に限らず)あまりお勧めできる方法では無いと思います。 最初に紹介した SSH によるリモートアクセスと異なり、セキュリティ的な問題もありますが、管理者レベルでの作業が多いというのがその理由です。

    pserver についても、本編では個人で使うことを前提にした方法を紹介します。 多数のユーザからのアクセスを許可する場合は、リポジトリ格納専用のアカウントを作成するとか、OS上でのログインとは別のパスワードを設けるなど、セキュリティに配慮した設定が必要になります。

    5.1   CVSROOT/config ファイルの設定

    OS上でログインする時のパスワードをそのまま使うことにします。 リポジトリの設定ファイルである ${CVSROOT}/CVSROOT/config ファイルに下記のような記述をしておきます。

    SystemAuth=yes
    


    5.2   /etc/xinetd.d/cvspserver ファイルの新規作成

    CVSクライアントからリモートアクセスされた時に、xinetd が cvs コマンドを起動するように設定します。 管理者権限にて、新規に cvspserver というファイルを作成し、/etc/xinetd.d ディレクトリに格納してください。 cvspserver ファイルの記述例を以下に示します。

    service cvspserver
    {
            disable = no
            socket_type     = stream
            wait            = no
            user            = terra         # MacOSXでのユーザ名
            server          = /usr/bin/cvs
            server_args     = -f --allow-root=/Users/terra/cvsroot  # リポジトリの格納場所
            groups          = yes
            flags           = REUSE
    }
    

    MacOSX の /etc/xinetd.conf ファイルは、/etc/xinetd.d ディレクトリに格納されているファイルを取り込むように設定されており、同ディレクトリには各サービスの設定ファイルが格納されています。

    [G4Cube:/etc] terra% cd /etc/xinetd.d ¶
    [G4Cube:/etc/xinetd.d] terra% ls -l ¶
    total 152
    -rw-r--r--  1 root  wheel  168 Jul 14  2002 auth
    -rw-r--r--  1 root  wheel  145 Jul 14  2002 bootps
    -rw-r--r--  1 root  wheel  155 Jul 14  2002 chargen
    -rw-r--r--  1 root  wheel  158 Jul 14  2002 chargen-udp
    -rw-r--r--  1 root  wheel  145 Jul 14  2002 comsat
    -rw-r--r--  1 root  wheel  201 Feb  8  2003 cvspserver     # ←追加したファイル
    -rw-r--r--  1 root  wheel  155 Jul 14  2002 daytime
    ・・・
    

    設定内容を有効化するには、OSを再起動するか、もしくは以下のようなコマンドを実行します。

    [G4Cube:/etc] terra% sudo kill -HUP `cat /var/run/xinetd.pid` ¶
    Password:           # 管理者のパスワードを入力
    

    ※SIGHUP シグナルでは、xinetd は終了せずに xinetd.conf の再読み込みを行います。

    5.3   ファイアウォールの設定

    /etc/services ファイルの内容を表示し、ポート番号が2401であることと、サービス名やファイル名が一致していることの二点を確認します。

    [G4Cube:~] terra% cd /etc ¶
    [G4Cube:/etc] terra% grep "2401" services ¶
    cvspserver      2401/tcp   #CVS network server
    cvspserver      2401/udp   #CVS network server
    

    間違いが無ければ、ファイアウォールの設定で、ポート番号 2401を許可します。
    MacOSXでは、「システム環境設定」を起動して[共有]-[ファイアウォール]の画面で(新規)ボタンをクリックすれば、設定画面が表示されます。


    6. CVSクライアントの設定(pserver編)

    6.1   環境変数の設定

    環境変数 CVSROOT の値を以下のように設定します。

    setenv CVSROOT :pserver:terra@g4cube:/Users/terra/cvsroot
        #                    (1)   (2)     (3)
        # (1): サーバ上でのユーザ名.リポジトリにアクセス可能なアカウント.
        # (2): サーバのホスト名(またはIPアドレス).
        # (3): サーバ上でのリポジトリの格納場所.絶対パスのみ記述可.
    


    6.2   `cvs login` と `cvs logout`

    pserver では `cvs login` というコマンドを使いCVSサーバにログインします。 このコマンドを実行すると、CVSクライアント側に .cvspass というファイルが作成され、認証済みであることが記録されます。 .cvspass ファイルが存在する限り、リモートアクセス時のパスワードの入力は不要になります。

    [PowerBookG4:~] terra% cvs login ¶
    (Logging in to terra@g4cube)
    CVS password:                   # terra のパスワードを入力
    [PowerBookG4:~] terra% ls -la ~/.cvspass ¶
    -rw-------  1 terra  staff  54 Feb  9 21:05 .cvspass
    

    リモートアクセスの必要が無くなったら、`cvs logout` コマンドを使い、.cvspass ファイルの内容を消去します。

    [PowerBookG4:~] terra% cvs logout ¶
    [PowerBookG4:~] terra% ls -la ~/.cvspass ¶
    -rw-------  1 terra  staff   0 Feb  9 21:38 .cvspass     # サイズが 0(内容の消去)
    

    `cvs login` は、サーバ側のリポジトリには何も影響を与えないようです。 `cvs logout` をしていない状態で、クライアント側で .cvspass ファイルを削除してしまっても、クライアントマシンをシャットダウンしても大丈夫です。


    6.3   Terminal から CVSを使う

    使い方は、ローカルマシン上のリポジトリの場合と同じです。
    なお、pserver による方法では、リポジトリに格納されているモジュールを確認する手段がありません。 リポジトリに格納されているモジュール名の一覧を表示するには、ssh コマンドを利用してください(4.4節)。


    6.4   'Project Builder' や Xcode から CVSを使う

    使い方は、ローカルマシン上のリポジトリの場合と同じです。 SSH と違い、そのまま Dock や Finder から 'Project Builder' や Xcode を起動してもCVSサーバ上のリポジトリにリモートアクセス可能です。



    [HOME] > [INDEX]
    Copyright(c) Kazufumi Terada, 2003-2004