SVX日記
2005-11-08(Tue) 電車でBind!!
coLinuxをノートPCにインストールしてからというもの、電車の中では快適三昧である。Cygwinも悪くないが、どうしたってある意味では本物のLinux環境にはかなわない。しかもディストリビューションはWBEL。仕事で慣れ親しんでいる環境とほぼ同じであるし、rpmも使えるし、コンパイルもできるし、manページもすべて揃っている。ハードウェア関係以外は完璧。まったくもってcoLinux万歳である。
しかしながら、調子が悪いのがネームサーバのBind。別に必ずしもBindが動かなくても困らないのだが、仕事で軽い動作検証くらいには使いたいし、やっぱりイジり回したいのである。前回インストールした時は、nslookupやdigを打った瞬間にセグメント例外で落っこちる現象が出ていて、どうにも根が深そうなトコロ(UDP?)に問題がありそうだったのでアキらめたが、なぜか今回インストールしなおしたら、シスログにやたらとエラーが出るだけで動いているっぽいので、そのやたらと出るシスログだけは、なんとかしようと思い立ったのである。
Nov 10 23:18:22 colinux named[5877]: gettimeofday returned bad tv_usec: corrected
Nov 10 23:18:35 colinux last message repeated 151273 times
秒間一万数千というレベルで出ている……笑ってしまうような状況だ。これだけ出ると、事実上messagesが使い物にならなくなる。とりあえず、問題の根を探るために、Bindソースを確認し、このメッセージを出している部分を見てみよう。もしかしたら、最新版のBindでは直っているかもしれないと淡い期待を抱きつつ、某所からBindの最新版のsrpmを持ってくる。
[root@colinux root]# wget ftp://ftp.redhat.com/pub/redhat/linux/updates/enterprise/3ES/en/os/SRPMS/bind-9.2.4-7_EL3.src.rpm
[root@colinux root]# rpm -ivh bind-9.2.4-7_EL3.src.rpm
[root@colinux root]# rpmbuild -bp /usr/src/redhat/SPECS/bind.spec
[root@colinux root]# cd /usr/src/redhat/BUILD/bind*
[root@colinux bind-9.2.4]# grep -r 'gettimeofday returned bad tv_usec: corrected' *
lib/isc/unix/stdtime.c: syslog(LOG_ERR, "gettimeofday returned bad tv_usec: corrected");
lib/isc/unix/time.c: syslog(LOG_ERR, "gettimeofday returned bad tv_usec: corrected");
[root@colinux bind-9.2.4]# vi lib/isc/unix/stdtime.c +/gettimeofday
ソースを読む。2箇所ともコードは同じ構造で、tv_usecが負だったり、上限値であるUS_PER_S(1000000)を超えていたりすると出るらしい。tv_usecとはカーネル関数のgettimeofdayを呼び出したときに返る、現時刻の秒以下の時刻成分のことである。単位はマイクロ秒だから、通常は0〜999999までが返るハズである。このコードにからは、明らかにヘンな値を読んでいるとしか考えられない。coLinuxカーネルのバグか? しかし、Bind側ではちゃんと補正らしきことをしているし、特に重要な処理部分でもなさそうだ。イチイチ、こんなメッセージを出力しなくたっていいのになぁ。
[root@colinux SOURCES]# man gettimeofday
GETTIMEOFDAY(2) Linux Programmer's Manual GETTIMEOFDAY(2)
名前
gettimeofday, settimeofday - 時間を取得/設定する
書式
#include
int gettimeofday(struct timeval *tv, struct timezone *tz);
int settimeofday(const struct timeval *tv , const struct timezone *tz);
説明
関数 gettimeofday と settimeofday は時間とタイムゾーン (timezone) を 取
得または設定する。 tv 引き数は /usr/include/sys/time.h に定義されている
timeval 構造体である:
struct timeval {
long tv_sec; /* seconds */
long tv_usec; /* microseconds */
};
これにより紀元 (the Epoch: time(2) を参照) からの秒とマイクロ秒が取得で
きる。 tz 引き数は timezone 構造体である:
<以下略>
1 #include
2 #include
3
4 main() {
5 int ret;
6 struct timeval tv;
7 struct timezone tz;
8
9 ret = gettimeofday(&tv, &tz);
10
11 printf("%d, %d, %d, %x\n", ret, tv.tv_sec, tv.tv_usec, tv.tv_usec);
12 }
[root@colinux furuta]# cc gettime.c
[root@colinux furuta]# ./a.out
0, 1131740415, -27341712, fe5ecc70
[root@colinux furuta]# ./a.out
0, 1131740416, -27489711, fe5c8a51
[root@colinux furuta]# ./a.out
0, 1131740417, -28040701, fe542203
[root@colinux furuta]# ./a.out
0, 1131740417, -27594655, fe5af061
[root@colinux furuta]# ./a.out
0, 1131740417, -27213469, fe60c163
……なんと!! ホントに負の値が出ている!! 大バグではないか。機種依存かなぁ。家の骨董デスクトップ上のcoLinuxでも試してみないといかんなぁ。そっちにはcoLinuxの0.6.2が入っているし。
なんにしても、coLinuxのカーネルに手を入れることはできないので、Bind側のメッセージ出力をコメントアウトしてしまおう。せっかくsrpmパッケージを入手しているので、コードを直して、自分のrpmをrebuildし、それをインストールすることにする。
[root@colinux root]# rpmbuild -ba /usr/src/redhat/SPECS/bind.spec
このrebuild、電車の中で行ったのだが、30分以上かかった気がする。職場のサーバでコンパイルすれば5分もかからないのになぁ。仕方ないので、フリーセルしたり、Rubyで別のお仕事コード書いたりして待つ。うーん、でも、マルチタスクっていいねぇ……と、できた。
[root@colinux root]# ls -lrt /usr/src/redhat/RPMS/i386
合計 5264
-rw-r--r-- 1 root root 470258 11月 10 23:38 bind-9.2.4-7_EL3.i386.rpm
-rw-r--r-- 1 root root 558046 11月 10 23:38 bind-libs-9.2.4-7_EL3.i386.rpm
-rw-r--r-- 1 root root 134058 11月 10 23:38 bind-utils-9.2.4-7_EL3.i386.rpm
-rw-r--r-- 1 root root 2250325 11月 10 23:39 bind-devel-9.2.4-7_EL3.i386.rpm
-rw-r--r-- 1 root root 32640 11月 10 23:39 bind-chroot-9.2.4-7_EL3.i386.rpm
-rw-r--r-- 1 root root 1914506 11月 10 23:39 bind-debuginfo-9.2.4-7_EL3.i386.rpm
-ba Build binary and source packages (after doing the %prep, %build,
and %install stages).
という記述があり、ソース展開とパッチ当てをする「%prep」コンパイルする「%build」インストールする「%install」の段階を踏んでからバイナリ及びソースパッケージを作る、とあるが、実際のインストールはされないっぽい。どうやら、tmpディレクトリに対して空インストールを行い、パッケージを作っているようだ。
[root@colinux root]# cd /usr/src/redhat/RPMS/i386
[root@colinux i386]# rpm -Uvh bind*
[root@colinux i386]# service named start
一応、最新パッケージではあるが、今回の問題はバグとしては扱われていないようだ。現象は再現してしまう。まぁ、カーネル側がロクな時間を返さないのがそもそもの原因だから、Bindを責めるには無理があるよな。でも、対処はBind側でするしかない。やはり、予定通り、Bind側のメッセージ出力部のコードをコメントアウトし、自分オリジナルのrpmパッケージをrebuildし、それをインストールして解決を図ることにしよう。まずは、rpmbuildコマンドと使って「%prep」処理を行わせる。これにより、修正パッチが当たった、最新バージョンのソースが「/usr/src/redhat/BUILD/bind*」の下に生成される。
[root@colinux root]# rpmbuild -bp /usr/src/redhat/SPECS/bind.spec
[root@colinux bind-xxxx]# vi lib/isc/unix/stdtime.c
[root@colinux bind-xxxx]# vi lib/isc/unix/time.c
/* if (fixed)
syslog(LOG_ERR, "gettimeofday returned bad tv_usec: corrected"); */
[root@colinux root]# rpmbuild -bc --short-circuit /usr/src/redhat/SPECS/bind.spec
[root@colinux root]# rpmbuild -bi --short-circuit /usr/src/redhat/SPECS/bind.spec
[root@colinux root]# rpmbuild -ba --short-circuit /usr/src/redhat/SPECS/bind.spec
これすると、また頭からソースが展開されてしまうので、先ほどの修正が作業が無駄になってしまう。失敗……仕方ない「/usr/src/redhat/SOURCES」の下のアーカイブを直接修正してしまおう。この方法だと、不幸にも修正部分にパッチが当たった場合、ややこしいコトになるかもしれない。まぁ、ややこしいコトになったら、パッチ当てに失敗するだろうし、とりあえずやってみる。
[root@colinux SOURCES]# tar xvfz bind-9.2.4.tar.gz
[root@colinux SOURCES]# vi lib/isc/unix/stdtime.c
[root@colinux SOURCES]# vi lib/isc/unix/time.c
[root@colinux SOURCES]# tar cvfz bind-9.2.4.tar.gz bind-9.2.4
[root@colinux root]# rpmbuild -ba /usr/src/redhat/SPECS/bind.spec
[root@colinux i386]# rpm -Uvh --force *
[root@colinux i386]# service named start
2005-11-09(Wed) NonCooperative Linux for Bind
昨日、直ったと思ったBindだが、実はぜんぜん直ってなかった。怒涛のシスログ攻撃はなくなったが、相変わらずBindのCPU使用率は100%を割らない。怒涛のシスログ攻撃は暴走の副産物に過ぎなかったみたいだ。そりゃ、よく考えたら、gettimeofdayの百連打が収まらなければ、問題の解決になるわけがないよな。やっぱり、gettimeofdayがムチャな値を返すのが原因か?
gettimeofday({1131896487, 3949351405}, NULL) = 0
rt_sigprocmask(SIG_SETMASK, [HUP INT TERM RTMIN], NULL, 8) = 0
gettimeofday({1131896487, 3949351701}, NULL) = 0
rt_sigprocmask(SIG_BLOCK, NULL, [HUP INT TERM RTMIN], 8) = 0
rt_sigprocmask(SIG_UNBLOCK, [RTMIN], [HUP INT TERM RTMIN], 8) = 0
gettimeofday({1131896487, 3949352340}, NULL) = 0
rt_sigprocmask(SIG_SETMASK, [HUP INT TERM RTMIN], NULL, 8) = 0
gettimeofday({1131896487, 3949352635}, NULL) = 0
rt_sigprocmask(SIG_BLOCK, NULL, [HUP INT TERM RTMIN], 8) = 0
rt_sigprocmask(SIG_UNBLOCK, [RTMIN], [HUP INT TERM RTMIN], 8) = 0
gettimeofday({1131896487, 3949353278}, NULL) = 0
rt_sigprocmask(SIG_SETMASK, [HUP INT TERM RTMIN], NULL, 8) = 0
gettimeofday({1131896487, 3949353571}, NULL) = 0
rt_sigprocmask(SIG_BLOCK, NULL, [HUP INT TERM RTMIN], 8) = 0
rt_sigprocmask(SIG_UNBLOCK, [RTMIN], [HUP INT TERM RTMIN], 8) = 0
gettimeofday({1131896487, 3949354214}, NULL) = 0
rt_sigprocmask(SIG_SETMASK, [HUP INT TERM RTMIN], NULL, 8) = 0
gettimeofday({1131896487, 3949354508}, NULL) = 0
rt_sigprocmask(SIG_BLOCK, NULL, [HUP INT TERM RTMIN], 8) = 0
rt_sigprocmask(SIG_UNBLOCK, [RTMIN], [HUP INT TERM RTMIN], 8) = 0
やはり、怒涛のgettimeofday攻撃である。ちなみに、coLinuxというものはインストールしたディストリビューションのカーネルを使わない。WBEL3をインストールしても、WBEL3のカーネルは使われないのである。coLinuxはWindows上で動くためのカスタムカーネルを使うことで、LinuxをWindows上で動かしている。当然ながら、カーネルに依存するモジュールもcoLinux側に添付されている。VMwareとはそのヘンがちがうのである。しかし、アレだ。2.4、2.6の違いがあっても、カーネル以外の部分はそのままで動くというのは意外だったなぁ。つまり、WBEL3は2.4カーネルとの組み合わせられているが、カーネルだけを2.6にしても、ほとんど何の問題もなく動くということである。まぁ、システムコールの動作に互換性があれば、不思議でもなんでもないが……
……などというコトを考えながら、なんとなくググっていたら、こんなカキコミを見つけた。そういえば、最近は、仕事の時間中、英語の文章を読まざるをえないコトが多いから、苦がなくなったなぁ……なるほど、やっぱりカーネルのバグっぽい。既知の問題だったのね。coLinux上でBindを使う人は少ないのか?
ココには最新のスナップショットで、やっとこさ直ったようなことが書いてあるが、家のゴミにインストールしたcoLinuxの0.6.2では、この現象は発生しなかった。どこで直っているのかは知らないが、0.6.2に上げるかなぁ……。でも、coLinuxの0.6.1のカーネルベースは2.4.26、0.6.2のカーネルベースは2.6.10なんだよなぁ。WBEL3のカーネルは2.4.21、どうしたって0.6.1と組み合わせてる方が相性が良いと思うんだよねぇ。それに職場のXPではcoLinuxのインストールに失敗しまくっているから、せめて手元のcoLinux環境を壊すことだけはしたくないんだよなぁ。
2005-11-10(Thu) Linux Kernel Conference 2005
今日はLinux Kernel Conference 2005の日である。青山でLinuxのカーネルに対する講義みたいなのを聴講しに行く。本来は1セッション8,000円という御大臣な講義なのだが、オイラの会社はスポンサー。モロに仕事の一部なので、個人負担はなしである。我ながら、なんとウラやましい。
第1セッションは「Linuxカーネル入門−ブロックI/OとI/Oスケジューラ」。前半は軽くカーネルの役割に触れた後、後半ではブロックI/Oをスケジュールする機構についてのネットリした解説だ。簡単に言えば、ランダムに発生する読み書き要求を、ハードディスクのヘッドが効率よく読み書きできるように並べ替えるのがI/Oスケジューラである、という話。4タイプほどの方式を次々と説明し、なるほどと納得しながら聴き入っていたが、最後の最後で「フラッシュメモリや高度なRAIDなどでは、デバイスに任せたほうが効率がいい」なんて説明が入ってゲンナリ。そんなん言い始めたら、最近はIDEのハードディスクでもたんまりとキャッシュが載っているじゃん。なんだか、すべてが無駄な努力のような気がしてきた。
第2セッションは「組込みLinuxにおけるカーネル2.6の開発とデバッグ」。Linuxは各種のCPUに対応するマルチプラットフォームOSである、なんていう話から始まって、ICEなどを使ったデバッグ方法の話なんかを聞く。ところが、このセッションの後半になって、カーネルソースに含まれているMips用などのIA-32用以外のコードは、まともにコンパイルすらできないということを言い出してガックシ。本人すら「カーネルパッケージに含まれているコードはトカゲのシッポ程度の意味しかない」なんて言い出してズッコケてしまった。つまり、組み込み用途に使われるような、小規模のCPU向けのカーネルコードは、手を入れずにはマトモに動かないってコトだ。なんてこったい。
第3セッションは「Xenによる仮想マシン環境構築」。Xenという仮想OSプラットホームについての特徴説明から始まるが、何しろ話が冗長だ。インストール方法なんてイチイチ説明する必要なんてないだろ。だいたい、coLinuxにハマっているオイラにはLinux on Linuxの意図がいまいち理解できない。特長として1台のマシンを複数台にみせたり、メモリやCPUを効率的に割り当てるなどの流動的な運用が可能であることはわかるが、デモの時に「あー、うまくいってよかった、よくコケるんだね」なんていわれた日には、これまたひっくり返ってしまう。いくら流動的な運用ができても、そんなもん使い物になるかよ!! まぁ、未来に期待するのは悪いことじゃないから、それは否定しないけどさ。
第4セッションは「スピンロックから始めるLinuxカーネル入門」。若手向けのセッションであるため、オイラには参加権がない。ココだけは無料セッションだし、内容がかなりオモシロそうなだけに、参加したい……というか、参加できるものと思って、会場に資料を置いてきてしまった。席に戻る段になって気がついたので「会場に忘れ物をしまして……」なんていいつつ、そのまま聴講してしまった。あひゃひゃ。でも、内容は一番有意義だったかな。CPUのキャッシュの話から始まって、CPU間のロックの例を交えつつ、カーネルのスピンロックのコードをその場で仕上げていくかのような構成。ロックをトイレの個室のカギに例えたりして笑いを取りつつ、この構成力には舌を巻いた。すげぇ、オモシロかった。しかし、複数のCPUのキャッシュって、ハード的に排他機能が付いているのね。今まで、他のCPUのキャッシュの内容を知らずにどうやってマルチCPUで動いているのかとても不思議だったんだよね。そりゃ、ハード的な排他機構が必要だよな。もしかしたら、排他機構が付いている=マルチプロセッサ対応CPUというコトなのかな。別途、最近になって知ったMMUのページングの仕組みと合わせて、ちょっと近代CPUに詳しくなって嬉しいぞ。なにせ、この仕事を始めるまで、オイラの中の最新CPUはMC680EC30だったからねぇ……。
2005-11-20(Sun) Let's思いとどまる
先日から電車の中でビシビシとカーネルソースを読んだりなんだりしているオイラである。以前にも書いたが、そんなオイラの獲物は2000円で買ったPC。PenIIIの600MHz、RAMが320MB、HDDは12Gと不足気味ながら、バッテリーは2時間持つし……あぁ、でも、Let'sNoteが欲しい!! 別に重量は重くても差し支えないが、12時間もバッテリーの持つT4が魅力的である。無線LANが内蔵というのもいい。
しかし、ひとつ言わせてもらってよいか? 「Let'sNote」って名前、もはやブランドであるとはいっても、いくらなんでもダサすぎはしないか? 英語の文法には詳しくないから、そもそも正しい英語なのかも知らないが、和製英語の「マイカー」に次ぐダサさではないかと思う。このノートPCはアメリカで売ってたりはしていないのだろうか? まさか、アメリカでもこの名前で売っている? まぁ、どーでもイイけどさ。
名前のダサさには目をツブりつつ、どうせ買うならコダわるオイラである。なにせ、パナの直販サイトから購入すれば「ノートPCの天板の色」が選べるのである。初めて手に入れたPCが「ローズレッド」のシャープのX1だったオイラであるから、PCといえば「ローズレッド」なのである。
しかしながら、直販サイトの色見本を、液晶パネルに穴があくほど見つめても、ホントの色がわかるワケもない。キールロワイヤルというタイプがイメージに近いような気もするが、ちょっと地味っぽい感じも受ける……にしても、TタイプとRタイプで色のラインナップが違うというのはどういうコトだ? Rタイプのワインレッドなんて、かなりイイ色のような気がするが、Tタイプには用意されていない……なんでだ!? 用意しろよ!!
サイトを読むと、なんでも天板の色見本が「秋葉のWillcomプラザ」に置いてあるらしい。パナとWillcomの関係はよくわからないが、オイラはWillcomユーザであるし、そこにも行ったことがある。ちょっくら出掛けて実物を見てみるコトにしよう。
Willcomプラザに着いて辺りを見回す。が、Let's Noteは置いてあるものの、各種天板が置いてある感じではない……と、あった。インフォメーションカウンターのお姉さんの後ろ側、床の上にパネルが置いてある。なんつー扱いだよ……仕方なく、ちょっと横から覗き込むように……してたら、お姉さんが気づいて出してくれた。なるほど……え? まだあるって? わ!! ダンボールの箱にゴッソリと天板の見本が入っている。これまた、なんつー扱いだよ……まーいーけど。
ノートPCの天板だけを単品で見るというのは初めての経験だが、こりゃ軽い。そして丈夫。おまけにダンボールの中で天板同士がコスれまくっているのに、さして塗装にダメージがあるようにも見えない。なかなかの品質ではないだろうか……と、感心するのもつかの間、キールロワイヤルという色は地味すぎだ。暗いエンジといった色。色の好みは人それぞれだが、もうちょっとハデな赤がいいんだが……そして、Rタイプに用意されている赤……赤すぎ!! 朱色の直前のように明るい赤だ。まだ、こっちのがいいけどなぁ、ローズレッドはないんかいな……場合によってはそのためにRタイプをチョイスするのもやむをえない……ない。ガックシ。ゴールドもちょっと悪くないと思いつつ、しかしどうせゴールドならもう少しネットリとしたゴールドがいい。シャンパンゴールドよりちょっと濃いくらいではオイラのイメージではないのだ。お姉さんにお礼を言って返す。
つーわけで、色の好みがないという理由でLet'sNoteの購入は却下!! である。なまじっか、色を選べるだけに、購入を思いとどまってしまうという、松下には皮肉な結果に終わってしまった。まぁ、そんなユーザはオイラを含めて超少数派だろうが。
仕方なく、秋葉をブラつく。Let'sNoteがダメなら、現在のゴミノートPCの延命を図るのである。HDDだけ交換してやれば、とりあえず電車の中で快適にPCを使うことはできるだろう。ホントは電車の中でカーネルのコンパイルをできるくらい、タフなPCが欲しいが、無理を言ってはいけない。
問題は持ってきたHDDのマウンタが、なぜかトルクス止めになっているコトだ。メビウスのACアダプタといい、携帯のベンツネジといい、なんでこういうイケズなコトをするのか。そんなにオイラのような分解野郎の財布を直撃したいのか。いちいちネジ回しを買わなきゃいけないではないか……などといいつつ、ヒロセテクニカルへ向かう。HDDを出して、どのドライバが合うか試す。あ、これが合うな。ちゃんと回るかな? 回るね。外せるかな? 外せるね。念のため、反対側のネジも外せるかな? 外せるね……すまんッ!! 今度はドライバーを買うから!! ありがとう!! ヒロセテクニカル!!
若干能力がプア目のノートPCのHDDのチョイスはチョイと難しい。バッテリーをガンガンと削るほどのハイパフォーマンスHDDは困るし、あまり遅くても処理能力に影響が出る。容量は20Gもあればいいのだが、容量が上がるにつれて、情報密度が上がるため、読み書き速度も上がるという傾向もあると考えられる……結果、チョイスしたHDDは「MK4026GAX」。40Gバイト回転速度5400rpmと一見フツーのスペックながら、16MBという巨大なキャッシュが載っている。しかもコレで7,680円ナリ。これで少しは処理速度が改善されるといいが。あとは、ちょろちょろと秋月で買い物して帰宅。
2005-11-21(Mon) USBメモリでモバイルcvs!!
今日はちょっとメモ書き。ノートPCのHDDを慎重に新調して伸張したので、改めていろいろと環境を構築してみたいと思う。今日は、職場と家と、CygwinとcoLinuxとで、グッチャングッチャンになってしまっている、文書やプログラムを一括管理するため、cvsを導入するという話。
cvsを導入するといっても、職場と家とを一括で管理する必要があるから、リポジトリはUSBメモリを活用することにする。先日、iPodシャッフル替わりに購入してはみたものの、電源を切る度に1曲目から演奏という恐るべき仕様のために、256Mという大容量がサッパリ活用できないスットボケアイテムを活用するのである。
コイツをCygwinからcvsリポジトリに使うならなんの工夫もいらないが、coLinuxから使うには、通常とは逆にWindows上のドライブをcoLinuxから読み書きできるようにする必要がある。確かsmbmountというLinux上からWindows上のドライブをマウントするアプリを利用すればできるであろう。さてトライ。
まずは、USBドライブのドライブレターを決めておく必要がある。USBだから「U」にしよう(安直)。マイコンピュータ、管理、ディスクの管理、ドライブ文字とパスの変更から、ドライブレターを変更してやる。そしたら、マイコンピュータ上のリムーバブルディスク(U:)、共有、新しい共有から、共有名を「usb」にしてやる(さらに安直)。でもって、マイネットワーク、近くのコンピュータから自分のPC(オイラのPCの名前はJyokusyuだ)を開いてやる。「usb」という共有ドライブができていればオッケーだ。
# mkdir /mnt/smbusb
# smbmount //Jyokusyu/usb /mnt/smbusb -o username=Administrator workgroup=MYGROUP
Password:
# export CVSROOT=/mnt/smbusb/cvs
# cvs init
# mkdir test
# cd test
# vi test.txt
This is CVS test.
# cvs import test itline initial
This is CVS test initial check in.
CVS: ----------------------------------------------------------------------
CVS: Enter Log. Lines beginning with `CVS:' are removed automatically
CVS:
CVS: ----------------------------------------------------------------------
# cd ..
# rm -rf test
# cvs checkout test
# ls -lrt test
合計 8
-rwxr-xr-x 1 root root 18 11月 22 10:56 test.txt
drwxr-xr-x 2 root root 4096 11月 22 10:58 CVS
今度はcvsの機能を活用してみる。cvsの真骨頂は常に差分を意識しながらプログラムが組めることだ。これにより、コミット直前に不要な修正が含まれていないか確認することができる。さっきのテスト用ドキュメントに修正、追加してみる。
# cd test
# vi test.txt
This is CVS change test.
This is CVS add test.
# cvs update
cvs update: Updating .
M test.txt
# cvs diff
cvs diff: Diffing .
Index: test.txt
===================================================================
RCS file: /mnt/smbusb/cvs/test/test.txt,v
retrieving revision 1.1.1.1
diff -r1.1.1.1 test.txt
1c1,2
< This is CVS test.
---
> This is CVS change test.
> This is CVS add test.
# cvs commit
This is CVS commit test.
CVS: ----------------------------------------------------------------------
CVS: Enter Log. Lines beginning with `CVS:' are removed automatically
CVS:
CVS: Committing in .
CVS:
CVS: Modified Files:
CVS: test.txt
CVS: ----------------------------------------------------------------------
# cvs update
cvs update: Updating .
2005-11-22(Tue) モバイルcvs環境・改
Windows側の権限やら、coLinux側のパーミッションやらが絡まって、coLinuxの一般ユーザからマトモにcvsを使うことができない。うぅ……coLinuxの中だから常にrootで作業してもいいけど、常にrootで開発するのはチョット気持ち悪い。いやね、そりゃLinuxのサポートやりだす前は、rootでの作業率は3%くらいだったけど、最近は一般ユーザでの作業率が3%と逆転してますよ。でも、トラブルシューティングの時は特別だと思うのよ、やっぱ。
で、結局、どのユーザでもcvsを手軽に使えるようにするには、sshを通すのがいい。sshを使うということは、どういうことか。coLinux側をcvsクライアント、Cygwin側をcvsサーバにするというコトだ。なんだ、昨日せっかく設定したsmbmountはいらなくなっちゃうのか。まぁ、いいけど。
まずは、Cygwing側でsshdを立ち上げてみよう。えーっと、よく考えたら、今までCygwin側はsshクライアントでしか使ったことがない。どうやんだ? service……ない? /etc/init.d/sshd……ない? /usr/sbin/sshdで起動。なんだ? sshd_configがない? touch /etc/sshd_config。ダメだ……rsaキーがないとかいわれる。
/usr/bin/ssh-keygen -q -t rsa1 -f /etc/ssh/ssh_host_key -C '' -N ''
chmod 600 /etc/ssh/ssh_host_key
chmod 644 /etc/ssh/ssh_host_key.pub
……ちがう!! こんなに面倒な作業が必要な状態になっているワケがない!! なんか、設定するためのスクリプトとかあるに違いない。ふと、/etc/setupの下にopenssh.lst.gzというファイルを見つけた。読む。なんだか、中にそれっぽいスクリプトが入ってるじゃん。/usr/bin/ssh-host-configってヤツ。fileしたらシェルスクリプトと判明。中を確認する……これだ!! これに違いない!! 実行!!
$ /usr/bin/ssh-host-config
Generating /etc/ssh_host_key
Generating /etc/ssh_host_rsa_key
Generating /etc/ssh_host_dsa_key
Generating /etc/ssh_config file
Privilege separation is set to yes by default since OpenSSH 3.3.
However, this requires a non-privileged account called 'sshd'.
For more info on privilege separation read /usr/share/doc/openssh/README.privsep.
Should privilege separation be used? (yes/no)
なんだ? privilege separationを使うかって? 特権分離? 指示されたドキュメントを読むがよくわからない。ググるが、表面的には今までと変化なさそうだ。スクリプトでインストールしてるんだし、お任せしてみるか。yes!!
Warning: The following function requires administrator privileges!
Should this script create a local user 'sshd' on this machine? (yes/no) yes
Generating /etc/sshd_config file
Added ssh to C:\WINNT\system32\drivers\etc\services
Added ssh to /etc/inetd.conf
Warning: The following functions require administrator privileges!
Do you want to install sshd as service?
(Say "no" if it's already installed as service) (yes/no) yes
Which value should the environment variable CYGWIN have when
sshd starts? It's recommended to set at least "ntsec" to be
able to change user context without password.
Default is "ntsec". CYGWIN=
The service has been installed under LocalSystem account.
To start the service, call `net start sshd' or `cygrunsrv -S sshd'.
Host configuration finished. Have fun!
[furuta@colinux furuta]$ ssh-keygen -t rsa
Generating public/private rsa key pair.
Enter file in which to save the key (/home/furuta/.ssh/id_rsa):
Enter passphrase (empty for no passphrase):
Enter same passphrase again:
Your identification has been saved in /home/furuta/.ssh/id_rsa.
Your public key has been saved in /home/furuta/.ssh/id_rsa.pub.
The key fingerprint is:
35:0e:01:f2:92:3f:8e:a7:df:84:35:87:ef:e4:bf:b5 furuta@colinux
[furuta@colinux furuta]$ cat .ssh/id_rsa.pub
ssh-rsa AAAAB3NzaC1yc2EAAAABIwAAAIEA7QpG1JtPtlBuoygHdKK8N+SWf/ab2pM9hYOlPaBzNRn9slkjkrz7kW8+ptQUZfQn/aYsOtjAIDfiICA9SmeojLd5FELxeXb7/LWu0s3Cni9TaltflKasuALtMtXK8RPzGRtQh4DNX7MIedZhjBKlM5GY14uAOTnWZkpJNA0nVWU= furuta@colinux
[furuta@colinux furuta]$ ssh jyokusyu -l Administrator
The authenticity of host 'jyokusyu (192.168.0.1)' can't be established.
RSA key fingerprint is 21:63:89:39:6b:56:64:55:a2:91:2c:d2:d4:ec:1c:a4.
Are you sure you want to continue connecting (yes/no)? yes
Warning: Permanently added 'jyokusyu,192.168.0.1' (RSA) to the list of known hosts.
Administrator@jyokusyu's password:
Last login: Tue Nov 22 09:05:57 2005 from jyokusyu
Fanfare!!!
You are successfully logged in to this server!!!
$ vi .ssh/authorized_keys
[furuta@colinux furuta]$ ssh jyokusyu -l Administrator
[furuta@colinux furuta]$ export CVSROOT=:ext:Administrator@jyokusyu:/cygdrive/u/cvs
[furuta@colinux furuta]$ export CVS_RSH=/usr/bin/ssh
Administrator@jyokusyu ~
$ mkdir /cygdrive/u/cvs
$ export CVSROOT=/cygdrive/u/cvs
$ cvs init
あとは職場のPCの設定。こっちもダイレクト書き込みでもよかったが、自分のPCをcvsサーバに設定しておくと、接続先ホストで開発を行う時にも使えて便利である。自分のPCがWindowsXPの場合、ファイアウォールの22番ポートに穴をあけておくことも忘れずに。
m-furuta@1TL1NE ~
$ export CVSROOT=:ext:Administrator@localhost:/cygdrive/u/cvs
$ export CVS_RSH=/usr/bin/ssh
2005-11-23(Wed) coLinuxをブラッシュアップ
coLinuxにWHEL3をインストールしてしばらく経つ。1台のノートPCの中にWindowsとLinuxを入れ、電車の中でも「ほぼ本物」のLinux環境を使えるようになってとても満足している。そのうち、coLinuxでWHEL3を使う方法についてまとめようと思いつつ放置してあるが、そんな中、とうとう怒りが爆発させるオイラであった。
すでにバックナンバーになっているので、いまさらではあるが、2005年7月号。特集は「独自coLinux作成術-お気に入りディストリビューションで挑む-」というもの。オイラは試行錯誤しながら、一部、不可解な作業を伴いつつ、苦労してWHEL3をインストールした。それをスマートに記事としてまとめているかと思ったら、特集の頭から一般論が始まり、途中から「独自のイメージはこう作る」という題目のもと、フツーにダウンロードできるDebianの中身を少しずつFedoraに置換していく作業を9ページもダラダラと並べ「如何にDebianの中身を入れ替えようがFedoraにはならない」などというギャグをかましたかと思ったら、最後の1ページで「インストーラを配布しているサイト」を紹介して終了である。
今月の特集は「独自coLinux作成術-お気に入りディストリビューションで挑む-」じゃねーのかよ!? こんなのサギじゃねーか!! 特集の根幹を「サイト紹介」で済ます神経も、すっかりイッちゃってる精神状態としか思えないが、そのサイトでもVineとFedoraほかRedhat系を中心とした数ディストリビューションにしか対応してないのだ。まったくのサギ、いやゴミ記事である。どこが「お気に入りディストリビューションで挑む」なんだ!?
だいたい、以前からオイラは「日経○○」に対して、疑問を感じていた。日経ソフトウェアなんて、非常に「そそる特集」を組みつつ、中身は毎度スッカラカンである。そんなこと、その辺に転がっている野良プログラマにだって書ける、というレベルの特集ばかりである。記事じゃないぞ「特集」だぞ。オイラは、1度は買って、2度目は立ち読みして、3度目からはパラパラするだけ、4度目からは特集のタイトルを見るだけ、それ以降は目にも入れないようにしている。
というワケで「やたらと本を並べまくっている技術者の技量は疑ったほうがいい」と、以前に書いたが「日経Linuxほか日経○○をありがたがって購読している技術者の技量も深く疑ったほうがいい」と断言しておく。貴重な紙資源をこれ以上ゴミにするのはヤメていただきたいと思うオイラである。
……と、独自のディストリビューションではないものの、coLinuxにWHEL3をインストールする方法についてはそのうち触れる予定であるが、とりあえず、今日の作業のメモ書きである。最近、忘れっぽくて、自分で自分の日記を参考にすることが多いので……。
以下、coLinux用にswapパーティションを追加する方法である。まずは、Windows側でCygwinのddコマンドを利用して、swapパーティションとなるイメージファイルを作る。ウチのPCは320MB。coLinuxには64Mしか割いてないが、HDDも増設したことだし、軽く256Mバイトでも割り当ててみる。
$ dd if=/dev/zero of=wb3r2_swap_256m bs=1M count=256
<block_device index="1" path="\DosDevices\d:\wb3r2_swap_256m"
enabled="true" />
あとはcoLinuxを起動してswapを足してやる。基本的にコマンドなんてガンバって覚えるものではないが、swap関係のコマンドなんて、ことさら使用することのないコマンドであるから「くれぐれも覚えない」ようにしていただきたい。こういうのをチマチマ覚えないといけないLPICという資格も、かなり××な資格であるとツッコんでおこう。
[root@colinux root]# mkswap /dev/cobd1
Setting up swapspace version 1, size = 268431 kB
[root@colinux root]# swapon /dev/cobd1
[root@colinux root]# swapon -s
Filename Type Size Used Priority
/dev/cobd1 partition 262136 0 -1
[root@colinux root]# free
total used free shared buffers cached
Mem: 62172 40512 21660 0 4028 22044
-/+ buffers/cache: 14440 47732
Swap: 262136 0 262136
swaponなんて、覚えなくていいったら、覚えなくていい。そんなもの覚えるくらいなら、また/etc/fstabの書式でも覚えたほうが役に立つ。ちなみに末尾の「0 0」は前者が意味のない数値、後者がもっと意味のない数値である。
[root@colinux root]# vi /etc/fstab
/dev/cobd1 swap swap defaults 0 0
さて、swapの設定が終わったところで、HDDにも余裕があることであるし、ソース一式を持ち歩くように環境設定してみよう。なんのことはない。WBEL3の3枚のソースCDをcoLinuxにマウントするように設定するだけである。まずは3枚のソースCDのISOイメージ3つを、Windows上のDドライブのルートに置き、default.colinux.xmlに以下の記述を加える。
<block_device index="5" path="\DosDevices\d:\liberation-respin2-source-1.iso"
enabled="true" />
<block_device index="6" path="\DosDevices\d:\liberation-respin2-source-2.iso"
enabled="true" />
<block_device index="7" path="\DosDevices\d:\liberation-respin2-source-3.iso"
enabled="true" />
index="x"という設定で、/dev/cobdxに接続されるかが決定される。オイラの配布(予定)のWHEL3イメージは/dev/cobd3までしか用意してないので、coLinux側から/dev/cobd4〜7を足してやる。
[root@colinux root]# ls -lrt /dev | grep cobd
brw-r--r-- 1 root root 117, 0 11月 5 21:19 cobd0
brw-r--r-- 1 root root 117, 1 11月 5 21:19 cobd1
brw-r--r-- 1 root root 117, 2 11月 5 21:19 cobd2
brw-r--r-- 1 root root 117, 3 11月 5 21:19 cobd3
[root@colinux root]# mknod /dev/cobd4 b 117 4
[root@colinux root]# mknod /dev/cobd5 b 117 5
[root@colinux root]# mknod /dev/cobd6 b 117 6
[root@colinux root]# mknod /dev/cobd7 b 117 7
[root@colinux root]# ls -lrt /dev | grep cobd
brw-r--r-- 1 root root 117, 0 11月 5 21:19 cobd0
brw-r--r-- 1 root root 117, 1 11月 5 21:19 cobd1
brw-r--r-- 1 root root 117, 2 11月 5 21:19 cobd2
brw-r--r-- 1 root root 117, 3 11月 5 21:19 cobd3
brw-r--r-- 1 root root 117, 4 11月 23 07:35 cobd4
brw-r--r-- 1 root root 117, 5 11月 23 07:35 cobd5
brw-r--r-- 1 root root 117, 6 11月 23 07:35 cobd6
brw-r--r-- 1 root root 117, 7 11月 23 07:35 cobd7
[root@colinux mnt]# mkdir /mnt/cdrom1
[root@colinux mnt]# mkdir /mnt/cdrom2
[root@colinux mnt]# mkdir /mnt/cdrom3
[root@colinux mnt]# vi /etc/fstab
/dev/cobd5 /mnt/cdrom1 iso9660 ro 0 0
/dev/cobd6 /mnt/cdrom2 iso9660 ro 0 0
/dev/cobd7 /mnt/cdrom3 iso9660 ro 0 0
[root@colinux root]# mount /dev/cobd2 /mnt/cdrom1 -t iso9660
[root@colinux root]# mount /dev/cobd2 /mnt/cdrom1 -t iso9696
mount: ファイルシステムタイプ iso9696 はカーネルがサポートしていません
mount: 多分あなたは iso9660 を指定したかったのでは?
$ dd if=/dev/zero of=wb3r2_ext2_work_4g bs=1M count=4096
<block_device index="2" path="\DosDevices\d:\wb3r2_ext2_work_4g"
enabled="true" />
swapと違うのは、mkswapでなく、mkfs.ext2を使うことだ。ちなみに、いまさらではあるがcoLinuxではイメージファイルはパーティションと同義である。つまり、直接/dev/cobdxになるのでfdiskは不要である。
[root@colinux root]# mkfs.ext2 /dev/cobd2
[root@colinux /]# mkdir home2
[root@colinux mnt]# vi /etc/fstab
6 /dev/cobd2 /home2 ext3 defaults,noatime 0 2
[root@colinux root]# tune2fs -j /dev/cobd2
[root@colinux root]# mount /home2
[root@colinux root]# df -h
Filesystem サイズ 使用 残り 使用% マウント位置
/dev/cobd0 2.0G 1.6G 281M 85% /
none 31M 0 31M 0% /dev/shm
/dev/cobd5 535M 535M 0 100% /mnt/cdrom1
/dev/cobd6 535M 535M 0 100% /mnt/cdrom2
/dev/cobd7 535M 535M 0 100% /mnt/cdrom3
/dev/cobd2 4.0G 33M 3.8G 1% /home2