CVSサーバーを立ててみた
ちょうどいい機会なので自宅でもCVSサーバーを立ち上げてみました。
環境はdebian + kernel 2.4.32 + cvs 1.11.1p1debian-11 で行いました。
まずはdebian なので以下のコマンドでサクっとインストール
$ sudo apt-get install cvs
デフォルト設定のまま了解を押す。
個人で使用するサーバーなので「いいえ」を選択しました。
業務で使用する場合には「はい」を選んだほうがいいかもしれません。
ここで「はい」を押すと、inetdからの起動となります。
※inetdはセキュリティ上のリスクが大きく、
1.クラッカーなどにinetd.confを書き換えられてから起動、
2.inetd.confを元に戻す。
などのことにより管理者が気が付かないまま、何かのサービスが動いていることがあります。
とは言え、色々と調べてた結果、inetdからの起動が一番簡単だとのことなので、
渋々inetdから起動とした。
cvs を利用するユーザの作成
% sudo useradd -d /home/cvsroot cvs
% chmod 777 /home/cvsroot
cvsの作業ディリクトリを指定、初期化
% su cvs
% cvs -d /home/cvsroot init
% cd /home/cvsroot
% chmod 777 /home/cvsroot/CVSROOT
/etc/inetd.conf に以下の行を追加
cvspserver stream tcp nowait root /usr/bin/cvs cvs -f --allow-root=/home/cvsroot pserver
※複数のレポジトリを作成する場合には以下のように複数書きます
cvspserver stream tcp nowait root /usr/bin/cvs cvs -f --allow-root=/home/lfll/cvs/yourfilecache --allow-root=/home/lfll/cvs/ivrmaker pserver
パスワードの作成
$ sudo htpasswd -c passwd cvs
New password:
Re-type new password:
Adding password for user cvs
htpasswd はapache に含まれているパスワード管理ツールです。
-c passwd はpasswdというファイルを作成する。という意味です。
上記のコマンドを/CVSROOT 以下のディレクトリで実行すると、カレントディレクトリにpasswdというファイルが作成されます。
ファイルの中身は暗号化されていて、以下の様になります。
$ cat passwd
cvs:8OTHCBj4a5X8k
編集し、ユーザー名を追加します。
cvs:8OTHCBj4a5X8k:cvs
あとはinetdを再起動すればCVSサーバの構築完了です。
$ sudo /etc/init.d/inetd restart
CVSの入門書ならこれがお勧め。
※2009/08/01 追記
Debian5でのCVSサーバー構築は、以前書いた内容とは手順がかなり異なっている。
・chroot jailで動くようになったため、より安全になった。
・inetdでの動作ではなく、インストール段階でcvsdとして動作するようになった。
これに伴いinetd.confの変更は不要となった。
新たな手順としてはcvsdでのインストール時に
chroot jailの場所を決める。私の場合、/home/cvsroot/ とした。
chroot jail内でディレクトリを作成する。
# mkdir yourfilecache
ディレクトリの初期化
# cvs -d /home/cvsroot/yourfilecache/ init
パスワードの設定
# cvsd-passwd /home/cvsroot/yourfilecache/ cvs
/usr/sbin/cvsd-passwd: adding user 'cvs' to '/home/cvsroot/yourfilecache/CVSROOT/passwd'
Enter new password:
Retype new password:
/etc/cvsd/cvsd.conf ファイルにレポジトリの登録
最後の行あたりに、chroot jailから見たディレクトリの場所を追記する。
Repos /yourfilecache
これだけで、cvsの新たなレポジトリが完成する。
以前よりもパスワードの生成などで若干手順が楽になったようだ。
今更ながらMakefileを勉強してみた。
今更ながらMakefile について勉強してみました。
まずは以下のMakefileを見てください。
makefile | 読み方 |
1 a.out : main.o utils.o 2 g++ main.o utils.o 3 4 main.o : main.c utils.h 5 g++ -c main.c 6 7 utils.o : utils.c 8 g++ -c utils.c | 1 a.outはmain.o utils.o に依存している。 2 main.oとutils.oをg++ でビルドしたものがa.outである。 3 4 main.o はmain.c utils.hに依存している。 5 main.cをg++ -c でコンパイルしたものがmain.oである。 6 7 utils.o は utils.cに依存している。 8 utils.cをg++ -c でコンパイルしたものがutils.oである。 |
Makefileの基本はこんな感じである。それぞれ : で区切られた依存するモノがあれば、処理を行っている。
Cに慣れた人には記載順などでオヤ?と思うかもしれない。私も最初に1,2 の行は最後に書かなくていいのか?
と思ったがC言語と違い、結構記載する順番は適当でもうまくmakeが探してくれる。
が、しかし、実際には上記のようなMakefileの書き方をしている人はいない。
それはなぜか? オープンソースのプロジェクトのMakefileを見ると、分岐など複雑な処理がありそんなに簡単に読み解くことができません。でも大丈夫。C言語が理解できているあなたにはMakefileを読むことは簡単です。
ちょっと難しそうにみえるmakefile |
CFLAGS = -O -Wall CPPFLAGS = -c OBJECTS = main.o utils.o sample: $(OBJECTS) $(CC) $(CFLAGS) $^ -o $@ main.o: main.c utils.h $(CC) $(CFLAGS) $(CPPFLAGS) $< -o $@ utils.o: utils.c main.h $(CC) $(CFLAGS) $(CPPFLAGS) $< -o $@ clean: $(RM) $(OBJECTS) |
上記makefileを読んでみてください。熟読すると大文字で書かれている部分が実はC言語で言う マクロ(#define )と大差ないことに気がつくと思います。そう、つまり展開すると以下のようになります。
ちょっと難しそうにみえるmakefile | ちょっと難しそうにみえるmakefileの展開後 |
CFLAGS = -O -Wall CPPFLAGS = -c OBJECTS = main.o utils.o sample: $(OBJECTS) $(CC) $(CFLAGS) $^ -o $@ main.o: main.c utils.h $(CC) $(CFLAGS) $(CPPFLAGS) $< -o $@ utils.o: utils.c main.h $(CC) $(CFLAGS) $(CPPFLAGS) $< -o $@ clean: $(RM) $(OBJECTS) | CFLAGS = -O -Wall CPPFLAGS = -c OBJECTS = main.o utils.o sample: main.o utils.o $(CC) -O -Wall $^ -o $@ main.o: main.c utils.h $(CC) -O -Wall -c $< -o $@ utils.o: utils.c main.h $(CC) -O -Wall -c $< -o $@ clean: $(RM) main.o utils.o |
展開するとこんな感じになり、わからない箇所は$(CC) と$^ , $@ , $< , $(RM) でしょうか。
それでは $(CC) と$(RM)のマクロ(#define )はどこにあるのでしょうか?
その答えは実は単なるデフォルト設定値です。
デフォルト設定値は make -p とすることで出力することができます。
デフォルト設定値 |
$ make -p # GNU Make 3.80 # Copyright (C) 2002 Free Software Foundation, Inc. # This is free software; see the source for copying conditions. # There is NO warranty; not even for MERCHANTABILITY or FITNESS FOR A # PARTICULAR PURPOSE. make: *** ターゲットが指定されておらず、makefile も見つかりません。中止。 # Make データベース出力 Fri Apr 28 21:35:02 2006 # 変数 # makefile 変数 SHELL = /bin/sh # デフォルト RM = rm -f # デフォルト CO = co # デフォルト COMPILE.mod = $(M2C) $(M2FLAGS) $(MODFLAGS) $(TARGET_ARCH) # 環境変数 _ = /usr/bin/make # デフォルト PREPROCESS.F = $(FC) $(FFLAGS) $(CPPFLAGS) $(TARGET_ARCH) -F # デフォルト LINK.o = $(CC) $(LDFLAGS) $(TARGET_ARCH) # デフォルト OUTPUT_OPTION = -o $@ # デフォルト COMPILE.cpp = $(COMPILE.cc) # makefile 変数 MAKEFILE_LIST := # デフォルト LINK.p = $(PC) $(PFLAGS) $(CPPFLAGS) $(LDFLAGS) $(TARGET_ARCH) # デフォルト CC = cc # デフォルト CPP = $(CC) -E # デフォルト LINK.cc = $(CXX) $(CXXFLAGS) $(CPPFLAGS) $(LDFLAGS) $(TARGET_ARCH) # 環境変数 PATH = /home/lfll/.dist/bin:/sbin:/bin:/usr/sbin:/usr/bin:/usr/X11R6/bin:/usr/lo cal/sbin:/usr/local/bin:/usr/games:. # デフォルト LD = ld # デフォルト MAKE = $(MAKE_COMMAND) # デフォルト MAKE_VERSION := 3.80 # 環境変数 USER = lfll # デフォルト FC = f77 # 自動変数 %D = $(patsubst %/,%,$(dir $%)) # makefile 変数 MAKEFLAGS = p |
そう。つまり、$(CC) はcc, $(RM)は rm -f となるわけです。
残りの$^ , $@ , $< は何になるかといいますと、
$@ は : の手前に記載されている部分になります。
$^ は : の後ろに記載されている部分です。
$< は ターゲットが依存しているファイルに置き換えられる。
ちょっと難しそうにみえるmakefileの展開後 | さらに展開 |
sample: main.o utils.o
| つまりこういうことです。 sample: main.o utils.o #main.o utils.o をビルドし、実行ファイルsampleを作成
main.o: main.c utils.h
|
その他、$マークで始まるものには以下があります。
$* ターゲット名から拡張子を除いたものに展開される。
例: sample.exe: main.o utils.o | sample.exe: main.o utils.o |
$? 依存ファイルの中から更新されたものに展開される。
例: sample.exe: main.o utils.o | utils.o がsample.exeよりも新しかった場合には sample.exe: main.o utils.o |
Makefileの説明はこんなところです。
Makefileとはちょっと話がそれますが、C言語の#ifdefに関しては通常 gcc -D NANIKA main.c と記述するので
-D NANIKA を何かマクロで記載してしまうと楽ですね。
まだまだ色々なテクニックがありますが、それは使いながら覚えて言ってください。
最後に一つ注意点を。
注意点 |
CFLAGS = -O -Wall CPPFLAGS = -c OBJECTS = main.o utils.o test : test1.c test2.c
|
さて上記をmakeした場合には一体何がビルドされるのでしょうか?
正解は一番上のtest のみがビルドされます。
sampleをmakeしたい場合には $make sampleとしなければいけません。
引数なしでmakeした場合には一番上のものしかmakeされないことに注意してください。
以下参考:
AutoMakeが面白そうなので、今度やってみようと思う。
w-zero3をsambaに接続してみた。
なんだけれど、すんなりはうまくいかずに、結構悩んでしまった。
というのも私のsamba環境は私以外が使うことは無いので、/ 以下はフルで公開していて、特にユーザー管理などはしていなかったためである。
たぶん同様の問題を抱えている人も数人はいると思うのでメモ程度に残しておこうと思う。
私のsmb.confの設定は以下です。
smb.conf
zero3から\\Lfll と
接続すると以下の画面が表示されます。
ところが私はユーザlfllでしかログインすることを想定していないので、この2つのフォルダにはアクセスすることができません。なぜか?
それはzero3->sambaではユーザー名を入力する事ができないからです。
これを回避するためにはセクションに[homes]を追加して、ユーザー名のフォルダでログインすることにより回避することができます。
このフォルダ名がユーザー名のかわりとなります。
あとはパスワードを入れるだけでログイン可能です。
ぐらいんだぁ