文房具としての 図 1 CVS によるソースの取得 ・ current を取得する場合 # cd /usr # cvs —d :pserver: anoncvs@anoncvs.NetBSD.org//cvsroot login ( パスワードを訊かれるので、 anoncvs " と入力 ) # cvs —d :pserver: anoncvs@anoncvs . NetBSD. org: /cvsroot checkout ・ 2.0 ブランチを取得する場合 # cd /usr # cvs —d :pserver: anoncvs@anoncvs. NetBSD. 0てg: /cvsroot 10gin ( パスワードを訊かれるので、 anoncvs " と入力 ) # cvs —d : pserver : anoncvs@anoncvs . NetBSD. 0 て g : /cvsroot checkout 連載ニ 06 —p —r netbsd—2—0—P src 図 2 cvs checkout の実行画面 ー s r / d i S ー / b い一 d / 仁 0 れ一「一 b / i d い / ⅱい 1 k ー t ・ 1 -. 日 ~ - S r C / ー 00 lS / r u n ⅱーい / r 03 い一 ve 「 . C ー src/distzbind/contribzidn/idnkit-l . B—src/tools/runidn/res01ver . ー src/dist/bind/contrib/idn?idnkit—l. aーSrC/f00ーS/rⅡれiはれイrれれーれれ・ 1 ー S 「 C / i S t / b i n d /c 0 れ t r i b / i れ / i れ k i わュ、 B ・・・ s rc/t 00 ー s / ru い i 面 1 / 「鱸れ i d れ . ーれ src/dist/bind/contrib/idn/idnkit"t . g—srcztools/runidn/stub . C src/distzbind/contrib/idn/idnkit ・ "1,Wsrc/tools/runidn/stub . h •vs C 日 CkO 収ー : updat ing src/distzbind/contrib/idn/idnkit—l.g—src/uti ー s rc /d i s ー /b ⅱ 1 ZC 0 t r i b / i d n/ i れ k ーを・・ 1 . 9 —s r c/u t ーー /Ha k 「 i ー 0 ー src/dist/bind/contrib/idn/idnkit—t.g-src/ut il/SparseHap 、 、「 c / d ー、一 / 物 i " d れユ " ⅱ rib / id れ / id " k ーー 1.9 ー、ロ : / t ーー / UCD. p src/dist/bind/contribzidn/idnkit—l .6ーSrC/村SOCを/C0浦療川/物00k . c s 「 c / dis ま / b ⅱ / CO れ「 ib / id れ / i れ k ⅱー 1.9 ー src / “ sock / co 津“川 / e れ co ⅱ . C 」 src/dist/bind/contrib/idn/idnkit—t . B-src/wsock/cormonzdurqp.c src/dist'bind/contrib'idn/idnkit—l . ø—src/wsockzcommon/convert . C src/dist/bind/contrib/idn/idnkit—l . B—src/Nsock/cOHHon/Checkdl I.C :vs checkout : Updating src/dist/bind/contrib/idn/idnkit- ・ 1 . g-srC/WSOCk/COHH0n ー srczdist/bind/contrib/idn'idnkit--t. B--src/Nsock/make. wnt ー src/dist/bind/contribzidn/idnkit ・ -1 、 g—src/wsock/RERUHE j 、 txt src/d ist/bind/contrib/idn/idnkit—l. 8—src/Nsock/REfil)ME . txt ・ vs ch 日に kO ーけ : lJpddting src/dist/bind/cnntrib/idn/idnkit- ・ 1 . g—src/wsock src•'d ist/bind/contrib/idn/idnkit—t.ø—src/win/RERDMF..L.llN :vs checkout : リ pdat ⅱ src みい st / bind / じ 0 ” t 「 ib / ⅱ新レー山ⅱー 1 . 9 ー s ロ : / w ーれ 」ロ : / d ist/bint レ contrib/idn/idnkit-t.ø-src/util/genei ・“t日ーm1r"社いZ”メねt0 、 pl 」 src / dist / もい 1 / CO ー「一物 / ーれ / ー 0 k ー t 一 1 . 9 ー src / ー i ー / 9 円 ier•a を日一れれ He リ re リーは ta 、 p ー FTP を利用する FTP を利用する場合は、下記のサイトから表 1 のファ イルを取得します。 こでは / usr 以ード ) に伸長します。 1 つ 1 っ伸長してもかま 取得したすべてのファイルを、ソースを置きたい場所に NetBSD-current/tar-files/src/ ・ ftp://ftp.NetBSD.org/pub/NetBSD/ しまいましよう。 いませんが、 こでは sh の for を使って一発ですませて Cd somewhere 表 1 暑するファイル bin. tar. gz contrib. tar. gz dist. tar. gz doc. tar. gz games. tar. gz include. tar. gz libexec. tar. gz rescue. tar. gz share. tar. gz t001S. tar. gz usr. bin. tar. gz config. tar ・ gz crypto. tar. gz distrib. tar. gz etc. tar. gz gnu ・ tar ・ gz lib. tar. gz regress. tar. gz sbin. tar. gz sys. tar. gz top-level.tar. gz usr. Sbin. tar. gz sh # f or f in > echo $f tar zxvf done exit *.tar $f -C ・ gz ; d0 これで、 somewhere ディレクトリ以下にあり *. tar. gz にマッチするファイルが、すべて /usr 以下に伸長されま とめるタイミングの問題で CVS よりやや旧いこともあり したファイルは同じはずです (FTP の場合、 tarball にま 本来であれば、 CVS で取得したファイルと FTP で取得 ソースコードが十内されます。 す。 /usr の下に src というディレクトリができ、そこに 136 ます ) 。しかし、執筆時点で、 FTP サーバーでは src/xll 以下のディレクトリのアーカイプが提供されていないよう です。彳するように、このディレクトリには X ウインド ウ・システムを構築するための環境が置かれています。し たがって、 X ウインドウ・システムを利用する場合は CVS でのソースの取得をお勧めします。 CVS を利用すれば、 2 回目以降のファイルの取得が簡単 におこなえます。すでにローカルにあるファイル群と最新 のファイル群を比較して、変更されたファイルだけをとっ てきてくれるからです。 FTP を利用した場合は、そのつど すべての tarball を取り寄せて伸長しなければなりません。 トラフィック量と手間を考えれば、 CVS のほうが簡単と いえるのではないでしようか。なお、私はいつも CVS を 使って手許のソースを更新しています 1 0 1 ます FTP でソースを取得し、そのディレクトリで前述の cvs 10g ⅲと 最近の NetBSD では、カーネルやユーザーランドの構築 カーネルの構築 意できました。次は新しいカーネルを作りましよう。 いずれにせよ、これで最新のソースを /usr/src 以下に用 cvs update を実行するというように、併用することも可能です。 UNIX MAGAZ 工 NE 2004.9
■ SFU の活用 [ 02 ] 図 22 ~/. bashrc と ~/. cshrc の言聢例 ( 下線部分を追言 LD-LIBRARY-PATH の言のみを抜粋 ) ・ /. bashrc LD—LIBRARY_PATH=/usr/10ca1/pgsq1/1ib: /usr/local/ssl/lib: /usr/1ib:/usr/X11R6/1ib: /usr/local/lib: - /usr/local/canna/lib export LD-LIBRARY—PATH ( 再読込みの操作 ) ~ / . bashrc ・ /. CShrc setenv LD—LIBRARY—PATH /usr/local/pgsql/lib: /usr/local/ssl/lib:/usr/lib : /usr/X11R6/1ib: /usr/local/lib: /usr/local/canna/lib ( 再読込みの操作 ) % source ~ / . cshrc 図 23 PostgreSQL の設疋 $ mkdir /usr/local/pgsql/data $ /usr/local/pgsql/bin/initdb —D /usr/local/pgsql/data The files belonging to this database system i11 be owned by use " f00 " ThiS user must alSO own the server process . Fixing permissions on existing directory /usr/local/pgsql/data/. creating directory /usr/local/pgsql/data//base . ok creating directory /usr/local/pgsql/data//global. ok creating directory /usr/local/pgsql/data//pg-xlog ・ ok creating directory /usr/local/pgsql/data//pg-clog ・ ok creating directory /usr/local/pgsql/data//base/l . ok creating templatel database in /usr/local/pgsql/data//base/l . creating confguration files . ok initializeing pg—shadow. ok enabling unlimited ro size for system tables . creating system views . ok loading pg—description. ok vacuuming database templatel . copying templatel t0 templateO . ok Success . You can now Start the database server using : /usr/local/pgsql/bin/postmaster —D /usr/local/pgsql/data/ /usr/local/pgsql/bin/pg-ctl —D /usr/local/pgsql/data/ ー 1 logfile start $ /usr/local/pgsql/bin/pg—ctl —D /usr/local/pgsql/data ー 1 /var/adm/log/postgres ・ 10g start ( データベース・サーバーを起動する ) postmaster successfully started. $ /usr/local/pgsql/bin/createdb foo ( データベースを作成する ) CREATE DATABSE $ /usr/local/pgsql/bin/psql f00 ( データベースにアクセスを試みる ) WeIcome tO psql , the PostgreSQL interactive terminal ・ Type : \copyright for distribution terms \h for help with SQL commands \ ? for help 0 Ⅱ internal slash commands \g or terminate with semicolon tO execute query \q t0 quit f00 = # ( データベースのスーパユーザーはプロンプトが、 # " 、一般ユーザーは、〉 " になる ) ok ok ok ok 166 UNIX MAGAZINE 2004.9
58 : 59 : 60 : 61 : 図 20 403 : 404 : 405 : 406 : 407 図 19 src/bin/psql/Makefile 窈修正点下線部を削除 ) psql : $ (OBJS) $(libpq_builddir)/libpq ・ a $(CC) -static $(CFLAGS) $(OBJS) $(libpq) $(LDFLAGS) $(LIBS) ー 0 $@ help . 0 : $(srcdir)/sql—help. h src/backend/libpq/pqcomm. c 窈修正点 ( 404 行目を下線部のように変更 ) #ifdef SCO_ACCEPT_BUG ↓ ( 変更 ) #if defined(SCO—ACCEPT_BUG) Ⅱ defined(--INTERIX) * UnixWare 7 十 and OpenServer 5 . 0.4 are known tO have this bug , but i t 404 行目の ifdef に、 --INTERIX の場合を j 助日します。直後のコメントにあるような SCO UnixWare のバグは lnterix 3. x にもあります。ソケット関 連のいくっカバグ ( というより仕様 ) は UnixWare と lnterix では似ています。ここを修正しないと pg-hba. conf カ症しく機能しません。 図 21 src/interfaces/libpq/fe-misc. c びメ修正点 ( 下線部 おロ ) 249 : } 250 : #ifdef _INTERIX # include く bind/arpa/inet . れ > #endif / * INTERIX * / 251 : / * 252 : * pgGetInt /usr/local/include/bind/arpa/inet. h にある ntohs/ntohl の定 義を取り込まないと pgGetInt() カ澗違ったデータサイズを返し、通信カ皸 綻します。 はそのままでビルドすらできません ( いったい誰が検証し ているのでしよう・ ) 。動かなくては話にならないので、 せっせとバグを探しました。 バグは 3 カ所にあります。 1 つはビルド時のもので、 psql をビルドできないというものです。 libdl を使うので すが、 SFU には libdl.a がありません。 psql を—static でビルドすることはできないのに、 Makefile は—static でビルドするようになっています。この問題を図 19 のよ うに修正して回避すればビルドできます。 ビルドはできても、このままではデータベースカ駛いも のになりません。図 20 ~ 21 のように、サーバー側とフロ ントエンド側でバグを修正しなければなりません。バック 工ンド側では、 UNIX ドメインソケットの使用時に、 ac- cept() が sockaddr 構造体の sa-family に AF-UNIX を正しく設定せずに 0 を返すので、これを本来あるべき AF-UNIX に置き換えるように修正します ( 同様の問題は UnixWare にもあるらしく、その対策コードがあるのでこ れを利用します ) 。 pg-hba. conf によるアクセス制御では、 AF ー UNIX が返らないとローカルからのアクセスとみなさ れません。そのためローカルに関するアクセス制御が働か UN 工 X MAGAZINE 2004.9 なくなり、結果としてアクセス不能になります。 また、フロントエンド側では、サーバーとデータ交換をす る部分で、メッセージの長さなどを取得する pgGetInt() が利用する ntohs() 関数のプロトタイプが正しく読み込 まれないことが分かりました。そのため、コンパイル時 に正しいキャストが挿入されず、結果として誤ったデー タ長を返し、くるはずのないデータを延々と待ち続ける という状態に陥ってしまいます。これは、図 21 のように /usr/local/include/bind/arpa/inet. h を読み込ませる ことで対処できます。 なお、 postmaster や psql などのコマンドを動作させる には、 LD-LIBRARY-PATH に /usr/local/pgsql/lib が含まれている必要があります。 . bashrc や . cshrc に修正 を加えておきましよう。修正したら、再読込みを忘れない でください ( 図 22 ) 。 以上の修正を加えることで、 PostgreSQL か動作するよ うになります。 PostgreSQL の設定 ■ SSH と同様に、 PostgreSQL はインストールしただ けでは利用できません。データベースを初期化して、実際 に使うデータベースを作成しなければならないからです。 とりあえず、データベースの置き場所として /usr/local/ pgsql/data を使用することにします 8 。ここにデータベ ースを置くように初期化し、次にサーバーを起動して、最 後にデータベースを作成します ( 図 23 ) 。 8 /var/lib/pgsql/data や /var/spool/pgsql/data などでもかま いません。 165
■ SFU の活用 [ 02 ] 自ーさせるサービス SFU はいちおう、、 UNIX もどき " なので、デーモンを動作さ せることができます。デーモンは、 init か起動されるタイミング で、 /etc/rc2. d の下をみて起動されます。 rc2. d だけがあるこ とから、 SFU はつねにランレベルが 2 扱いなのだということカ貘 然と想像できます。それはさておき、 rc2. d の下にあるファイル は、すべて /etc/init. d の下にあるスクリプトへのシンポリック・ リンクです。 init の走」時には S で始まる名前のファイルを、終 了時には K で始まる名前のファイルをそれぞれ start と stop という引数電乎び出し、デーモンの走力と終了をおこないます。 今回導入したもののうち、 sshd はⅲ etd 経由で明」させること にしたので、とくに何かをする必要はありませんが、 PostgreSQL と Apache は自動的に起動してくれないと不便です。 ・ PostgreSQL 走カ用スクリプト # ! /bin/sh if [ $ # —lt 1 ] ; then echO "usage : $ 0 start ー stop exit 0 /usr/local/pgsql/bin/pg—ctl 号ー -D /usr/local/pgsql/data ー 1 /var/adm/log/postgres .10g $ 1 & & echo "PostgreSQL $ 1 " exit 0 図 30 データベースのイ乍成 $ createuser bar そこで、簡単なスクリプトを作ってⅲ it. d に置き、 rc2. d から シンポリック・リンクを張って自動起動のイ中間に入れてしまいま しよう。どちらも起動用のコマンドが用意されているので、やる ことは単純です。 start/stop を受け取ったら、それをコマンド に渡すだけです。 PostgreSQL 用のスクリプトと、 Apache 用のスクリプトを 以下に示します。 あとは、それぞれ S40postgresql 、 K52postgresql 、 S42 httpd 、 K50httpd などという名前で /etc/rc2. d からシンポ リック・リンクを張れば完了です。もちろん、スクリプトの本体 は chmod a 十 x で実行ビットを立てておくことを忘れないでく ださい。 ・ Apache 走カ用スクリプト # ! /bin/sh if [ $ # -lt 1 ] ; then echO "usage : $ 0 start ー stop' exit 0 /usr/local/apache/bin/apachectl $ 1 - & & echo "httpd $ 1 " exit 0 S a11 the new user be allowed to create database? (y/n) y ShaII the new user be allowed to create more new users? (y/n) n CREATE USER $ /usr/local/pgsql/bin/createdb —U bar barmt CREATE DATABASE 図 31 /usr/local/apache/mt/. htaccess の内容 く FiIes mt . cfg> く Limit GET> Deny from a11 く /Limit> く /Fi1es> こまでの作業が完了したら、プラウザから http:// localhost/mt/mt-load. cgi にアクセスして、システムを 初期化します。 何も問題がなければ、図 33 のような画面になります。問 題があれば図 34 のようにエラーが表示されるので対処し てください。工ラーの原因は、 mt. cfg の記述ミスや、必 要な Perl モジュールの欠如、データベースカ在しない 170 などではないかと思います。 図 32 534 : 535 : 536 : /usr/local/apache/conf/httpd.conf の修下点 下線部おロ ) く IfModu1e mod_alias . c> A1ias /mt/ /usr/local/apache/mt く Location /mt> Options ExecCGI AIIowOverride None く /Location> 初期化がすんだら、 /usr/local/apache/mt/mt-load. cgi を削除して、今度は http://localhost/mt/mt.cgi に アクセスします。すると、図 35 のような画面が表示される はずです。 こで、ユーザー名に MeIody 、パスワードに Nelson UNIX MAGAZINE 2004.9
文房具としての 図 4 ビルドの終了メッセージ BuiId started at : Tue Ju1 Bui1d finished at : Tue Ju1 = > Successfu1 make build = > build . sh started: Tue = > build . sh ended: Tue = > Summary Of results : 、。 00 6 11 : 07 : 17 JST 2004 6 17 : 20 : 24 JST 2004 Ju1 6 11 : 06 : 44 JST 2004 Ju1 6 17 : 20 : 24 JST 2004 build . sh command: . /build. sh build build . sh started: Tue Ju1 6 11 : 06 : 44 JST 2004 NO nonexistent/bin/nbmake , needs building ・ B00tstrapping nbmake MACHINE : MACHINE_ARCH : TOOLDIR path: DESTDIR path : RELEASEDIR path : i386 i386 /usr/src/obj/tooldir. NetBSD—2.0Gーi386 /usr/src/obj/destdir. i386 /usr/src/obj /releasedir Created /usr/src/obj/tooldir. NetBSD—2. OG-i386/bin/nbmake /usr/src/obj/tooldir. NetBSD—2. OG—i386/bin/nbmake—i386 makewrapper : Updated /usr/src/obj/tooldir. NetBSD—2.0G-i386/bin/nbmake—i386 Successfu1 make build build . sh started: Tue Ju1 6 11 : 06 : 44 JST 2004 build . sh ended : Tue Ju1 6 17 : 20 : 24 JST 2004 図 5 etcupdate の実行画面 Fi1e : /etc/rc . conf (modified) PIease select one Of the following operations : d 1 m v What Don't install the new file Insta11 the new fi1e (overwrites your modifications ! ) Merge the currently installed and new files Show the differences between the currently installed and new files d0 you want t0 d0? [Leave it for later] ロ Show the new file 表 3 etcupdate のオプション オプション効果 表 4 etcupdate のファイル更辛扉寺のコマンド コマンド効果 1 1 ローカルで変更されていないファイルを自動的に 置き換える ヘルプメッセージの表示 RCS ID が変更されていないファイルはスキッ プする PAGER の孑帛 新しいファイルをインストールしない 新しいファイルを上書きインストールする 現在のファイルと新しいファイルをマージする 現在のファイルと新しいファイルの差分を表示する 新しいファイルを表小する etcupdate を実行すると、新しい /etc 以下のファイル 群と現在のファイル群のなかで異なるものカ俵示されます。 必要に応じて新しいファイルのインストール、現在のファ イルの維持や修正がおこなえます。 etcupdate のおもなオプションを表 3 にまとめます。 それでは、 etcupdate を実行してみましよう。 UN 工 X MAGAZINE 2004.9 オプションとして a と 1 を指定しています。この場合、 # etcupdate —a1 ローカルで変更されていないファイルは自動的に置き換え られ、 RCS ID カ畯更されていないファイルは、ソース自 体は変わっていないので変更の有無にかかわらずそのまま 保存されます。 etcupdate の実行画面は図 5 のようにな ります。 次に、差分の生じたファイルをどうするか考えていきま しよう。この選択には表 4 のコマンドを利用します。 現在のシステム上のファイルをそのまま使うときは d を、新しいファイルをインストールするときには i を入力 139
ed によるバッチー 今回は、 Movable Type の *. cgi ファイルの修正に ed を 使いました。 ed はラインエデイタですが、ラインエデイタなんて いまどき使わないと考える人も多いと思います。しかし、既存の ファイルに対して機械的に修正を加えるときなどは、図 28 のよ うにかなり強力です。今回の作業は、 13 個ある *. cgi から 1 つ (mt-db-pass. cgi) を除き、 : 頁行の Perl のパスを変更すると 図 28 Movable Type の展開 ( 下線部が入力 ) 1 引 /usr/bin/perl l/usr/local/bin/perll cat > /tmp/perl . patch inflating: Iib/MT/118N. pm $ unzip &/118N. zip cd MT—3.0D—fu11—1ib-ja—b3 $ unzip -/MT-3.0D-fu11-1ib—ja—b3. ZIP cd /tmp/compile > ed ${cgi} く /tmp/perl ・ patch $ fo て cgi in ( ls * . cgi ( ; do AD ( Ctrl 十 D で終了 ) 742 > done 9 : Defau1tLanguage ja ( デフォルトでこうなっている ) 図 29 mt. cfg の最 ( 邸艮おこなうべき言下線部のように編集 ) いうものです。そのような作業も、正規表現による置換の指定で 簡単にできるのです。 ed を対話的に使う場面はたしかにほとんどありませんし、・麦 もそうあるとは思えませんが、このように何かを一括して処理する 場合には強力なツールだと思います。、 man ed" とすれば使える 編集コマンドの角が見られます。参考にしてください。 言 748 8287 8293 777 783 18 744 750 ( 上記の数字は滝 3 の場合。正式版と同じとはかぎらない ) ( csh / tcsh の場合は f 。 r の部分を以下のようにする ) % foreach cgi ('ls * . cgi') foreach> ed ${cgi} く /tmp/perl. patch foreach> end 18 : CGIPath http://localhost/mt/ ( mt にアクセスする URL を書く ) ObjectDriver DBI : :postgres Database barmt DBUser bar DBHost localhost などを使って展開します ( 図 28 ) 。 にのまま追記する ) ( データベース名を指定する ) ( ューザー名を指定する ) ( localhost でよければこのままでよい ) 展開したら、 mt. cfg という定義ファイルに修正を加えま す。最低限おこなうべき設定を図 29 に示します。設定が 完了したら、適当なインストールバスに移動します。 $ cd /tmp/compi1e/MT—3.0D—fu11¯1ib-ja—b3 $ mkdir /usr/local/apache/mt $ mv * /usr/local/apache/mt こでは、 /usr/local/apache/mt を使用することにし ます (http://localhost/mt/mt.cgi でアクセスできるよ うにします ) 。また、データベースにアクセスするユーザー は bar 、データベースの名前は barmt だと仮定します。名 前はなんでもかまいませんが、それを mt. cfg に記述して ください。データベースは図 30 のように作成します。 mt. cfg には Movable Type の設定力第生されているた UNIX MAGAZINE 2004.9 め、外部から参照されるとシステムの構成が漏れ、思わぬセ キュリティ・ホールになる可能性があります。そこで、外部 から取得されないように、図 31 のような内容の . htaccess を作成します。こうしておけば、 mt. cfg にアクセスしても 拒否されるようになります。ほかにも取得されるべきでは ないファイルがあれば追記しておきましよう。 usr/local/apache/mt が http://localhost/mt/に マッピングされるように、 httpd.conf に図 32 のように設 定を追加します。 httpd.conf を修正したら、 httpd に設疋を再読込みさ せます。コマンドラインから、 $ /usr/local/apache/bin/apachectl reload とします。 169
■ SFU の活用 [ 02 ] 図 18 GNU make と PostgreSQL の取得から導入までの手偵 $ make check $ make . /configure cd make—3.80 tar —zxf -/make—3.80—interix ・ tar. gz cd /tmp/compile $ wget ftp://ftp.interopsystems.com/src/gmake/make—3.80-interix.tar ・ gz —with—libraries=/usr/local/lib ——with—openssl=/usr/local/ssl ——with—CXX ——with—gnu—ld \ —enable—locale —enable—multibyte —with—includes=/usr/local/include \ $ . /configure ( 図 21 のように追記する ) $ ng src/interfaces/libpq/fe—misc . c ( 図 20 のように 404 行目を変更する ) $ ng src/backend/libpq/pqcomm. c ( 図 19 のように一 static を削除する ) $ ng src/bin/psq1/Makefi1e $ cd postgresq1-7.2.2 $ tar —zxf -/postgresq1—7.2.2—interix. tar. gz $ cd /tmp/compile $ wget ftp: //ftp. interopsystems . com/src/postgresq1/postgresq1-7.2.2—interix. tar ・ gz $ cd $ make install ( ロードアベレージの取得には失敗するが問題はない ) Regressin PASSED: GNU Make 3.80 (i386—pc-interix3) build with gcc [check—loadavg] E てて or 1 (ignored) make [ 2 ] : Error getting load average : Undefined error : 0 . /loadavg The GNU load average checking code thinks : [check—loadavg] Error 127 (ignored) make [ 2 ] : make [ 2 ] : uptime : Command not found uptime The system uptime program believes the 10ad avarage tO be : No Fai1ures 78 Tests Comp1ete —enable—syslog $ make (GNU rnake (/usr/local/bin/make) を使用する ) $ make install 態がありますが、 こではバックエンドのデータベースに PostgreSQL を使用することにします (MySQL やファ イルを用いた簡易 DB も使用できます ) 。 PostgreSQL の導入 ■ PostgreSQL は、フリーの強力な RDB サーバーです。 これも移植版が Tool Warehouse に公開されているので、 そこから取得してください。 PostgreSQL をビルドする 164 には、 SFU に添付されている make ではなく、 GNU make が必要になります。これも Tool Warehouse で公開され ているのであわせて入手します。導入は、 GNU make 、 PostgreSQL の順になります ( 図 18 ) 。 ただし、 Tool Warehouse で公開されている Post- greSQL は、バイナリ・パッケージをインストールしてサー バーを動作させることはできても、データベースに接続で きません。移植カ坏完全なのです。それどころか、ソース UNIX MAGAZINE 2004.9
図 4 csh プロセスのアドレス 4G B 0xFFFFFFFF スタック 共有ライブラリ ( テータ ) 共有ライブラリ ( テキスト ) 共有ライブラリ ( テキスト ) 共有ライブラリ ( テータ ) 共有ライブラリ ( データ ) 共有ライブラリ ( テキスト ) 共有ライブラリ ( データ ) 共有ライプラリ ( テータ ) 共有ライブラリ ( テキスト ) 共有ライブラリ ( テキスト ) 共有ライブラリ ( データ ) 共有ライブラリ ( テキスト ) 共有ライブラリ ( テータ ) 共有ライブラリ ( テキスト ) ヒープ テータセグメント テキストセグメント 0X00000000 /usr/lib/ld. so. 1 ん sr / ⅱ b / 旧 . so. 1 /usr/lib/libdl.so. 1 /usr/lib/libcurses. so. 1 /usr/lib/libcurses. so. 1 /usr/lib/libcurses. so. 1 /usr/lib/libc. so. 1 /usr/lib/libc. so. 1 /usr/lib/libc. so. 1 /usr/platform/sun4u/lib/libc_psr. SO. 1 /usr/Iib/IocaIe/ja_JP. eucJPTJa_JP. eucJP. so. 2 /usr/Iib/IocaIe/ja_JP. eucJP/ja_JP. eucJP. so. 2 /usr/Iib/IocaIe/Ja_JP. eucJP/methods_ja_JP. eucJP. so. 2 /usr/Iib/IocaIe/ja_JP. eucJP/methods_ja_JP. eucJP. so. 2 /usr/bin/csh /usr/bin/csh ヒーフ。領域はこのアドレスから割り当てられるのではなく、 データ領域に続くアドレスから確保されるため、ヒープ領 域の先頭がちょうど 0X00048000 になるとはかぎりませ ん ) 。そこからしばらくアドレスが飛んで、 0XFF200000 からは csh にリンクされている共有ライプラリカ売いてい ます。共有ライプラリもプログラムの一部なので、それぞ れテキスト領域とデータ領域があり、それらが川頁番に割り 当てられています。 csh では、全部で 7 種類の共有ライプ ラリがリンクされていることが分かります。そして、アド レスの一番最後の部分にスタックカ保されています。 28 prnap の出力の 2 列目には、各領域のサイズが表示さ れています。これらの値から、 csh のテキスト領域には 144KB 、データ領域には 16KB が割り当てられているこ とカ吩かります。 次の列には、その領域がどのような属性で保護されて いるのかが表示されています。テキスト領域のところは、 " となっています。これは、言囚みは可能だが書込 r—x— みは不可、そして、この領域のコードが実行可能であるこ とを表しています。一方、データ領域は、、 rwx " ですか ら、言ムみ、書込み、実行が可能ということになります。ス UNIX MAGAZINE 2004.9
特集プログラミンクの次の一歩 図 3 pmap で csh のプロセスをる砡忍 144K r x 16K rwx 1184K r——s— ることで実行していましたが、そのぶん、プログラム自体 T IME CMD PID TTY csh 4160 : % pmap 4160 00010000 00044000 00048000 FF080000 FF200000 FF214000 FF220000 FF252000 FF260000 FF280000 FF33C000 FF342000 FF350000 FF360000 FF39A000 FF3A2000 FF3B0000 FF3C0000 FF3F6000 FFBEEOOO tota1 176K 24K 8K 144K 16K 16K 688K 24K 8K 8K 168K 32K 8K 8K 160K 16K 72K 2920K rWX— rWX— rWX— rWX ー rWX ー rWX ー rWX ー rWX ー rWX— /usr/bin/csh /usr/bin/csh [ heap ] dev: 85 , 30 ino : 665692 /usr/1ib/10ca1e/ja-JP. eucJP/meth0ds-ja—JP . eucJP . so . 2 /usr/1ib/10ca1e/ja-JP. eucJP/methods—ja—JP . eucJP . so . 2 /usr/1ib/10ca1e/ja-JP. eucJP/ja-JP. eucJP . so . 2 /usr/1ib/10ca1e/ja-JP. eucJP/ja—JP. eucJP . so . 2 /usr/p1atform/sun4u/1ib/1ibc—psr. so. 1 [ stack ] /usr/lib/ld. so . 1 /usr/lib/ld. so . 1 /usr/lib/libdl . so . 1 /usr/lib/libcurses . SO . 1 /usr/lib/libcurses . so . 1 /usr/lib/libcurses . so . 1 [ 。Ⅱ ] /usr/lib/libc . so . 1 /usr/lib/libc . so . 1 /usr/lib/libc . SO . 1 がいくっか用意されていますが、現在動いているプロセス はネ礬隹になっていました。もちろん、、、工夫 " をしたぶんの よけいな処理が増えるわけですから、処理時間にも大きく 影響します。これが、 64bit のコンピュータ環境になると、 18EB ( 工クサバイト ) のアドレス空間にひろがります。 れなら、データをひとまとめにして ( イ反想的な ) メモリ上に 置いておくこともできますし、プログラミングもかなり楽 になり、もちろん高速な処理も可能になります。このよう に、 64bit のアドレス空間を使うと大きなプログラムも作 りやすくなります。ただし、アドレス空間の基本的な構造 は 32bit の環境ととくに変わりありません。 pmap によるアドレスマップの確認 UNIX のプロセスは、実行されるとこのような空間内 のアドレスマップをみるには pmap を使います。 pmap コマンドの引数にプロセスの番号を指定すると、そのプロ セスのアドレスマップを確認することができます。 まず、プロセス番号を調べるために ps コマンドを実行 します。 % ps 4212 4160 4188 4189 pts/3 pts/3 pts/3 pts/3 0 : 00 0 : 00 0 : 00 more 0 : 00 diff a . c b . c csh PS に配置されて動くことになります。 ・・と言葉で説明した だけでは、いまひとっ具体的なイメージが思い浮かばない かもしれないので、実際に動いているプロセスのアドレス マップをみてみましよう。アドレスマップとは、プロセス がアドレス空間にどのように配置されているかを示すもの です。 最近の SoIaris には、実行中のプロセスのアドレスマッ プを簡単に見られるコマンドがあるので、これを使います。 SoIaris には、プロセスのた態を確認するためのコマンド UN 工 X MAGAZ 工 NE 2004.9 どのプロセスを確認してもかまいませんが、ここでは csh プロセスについてみてみましよう。プロセス番号は、 ps コ マンドの出力の、、 PID " の欄を見れば分かります。 csh の プロセス番号は 4160 ですから、これを引数にして pmap コマンドを実行します ( 図 3 ) 。 pmap コマンドでは、図 1 とは逆にアドレスは小さいほ うから表示されています。これを図 1 と同じアドレス順で 示すと、図 4 のようになります。 アドレスのもっとも先頭に近い部分 0X00010000 から の領域が /usr/bin/csh のテキスト領域、次の 0X000440 00 からの領域がデータ領域です。その次に続く領域 0X00 048000 には、ヒープが割り当てられています ( 実際には、 27
SFU 上のユーザー名 SFU 上では、ユーザー名は、ユーザー名 " あるいは、十ユーザ ー名 " になるようです。両者の違いは、前者が NT ドメインある いは ActiveDirectory 上のユーザー、後者がローカルのユー ザーということのようです。 SSH を使って SFU にアクセスする場合は、このユーザー名を 意識しないとうまくいかない場合があります。たとえは私の場合 は、 Windows XP にローカルマシン上のアカウントの、、 araki でアクセスしているのですが、 SFU 上では、十 araki" になりま す。このため、外部から SSH で接続する場合は、 図 14 Apache の取得と導入の手川頁 % ssh + araki@sfu. localdomain あるいは、 % ssh ー 1 + araki sfu. localdomain のようにしないとうまくいきません。もしも、、、 ssh sfu. local- domain" と実行して、、 Connection closed by 192.168.0.1 " のようなエラーカ咄たら、原因はユーザー名にあるのかもしれま せん。 $ wget ftp://ftp. interopsystems.com/src/apache/l .3/apache-1.3.29—interix. tar ・ gz cd /tmp/compile tar —zxf -/apache—l . 3 .29—interix. tar ・ gz cd apache-l . 3.29 CFLAGS=—D_ALL_SOURCES LDFLAGS="—L/usr/10ca1/1ib —L/usr/10ca1/ss1/1ib" . /configure \ -with—perl=/usr/local/bin/perl \ —server—gid=' 十 administrators' —server—uid=' 十 administrator' $ make insta11 $ make —enab1e—ru1e=SHARED_CORE —enable—module=so もし動いていなければ、 /usr/bin/syslogd を起動してく ださい。引数などは不要です。この状態で ssh を実行す れば、メッセージが出力されるようになるはすです。それ でも不十分な場合は、 inetd の設疋をコメントアウトして、 inetd に kill -HUP を送ってから、 $ /usr/local/sbin/sshd -d として、 sshd をデバッグモードで起動してから接続してみ てください。詳しい情報が得られます ( うまくいかない理 由としては、コラム「つながらない ・・・」「 SFU 上のユー ザー名」で挙げたような原因も考えられます ) 。 0 Web サーバー Windows 上の Web サーバーとしては Microsoft の Ⅱ S がありますが、もっとも広範に利用されているのはやは り Apache5 でしよう。ひろく使われているため、モジュー ルやノウハウが充実しています。また、 IIS には脆弱性を 狙ったワームが多いのですが、これによる被害を受けない という副次的なメリットもあります (Apache の脆弱性に 5 http://www.apache.org/ UNIX MAGAZINE 2004.9 対する攻撃もあるので、それには別途注意する必要があり ます ) 。 現在、 Apache にはバージョン 1.3 系列と 2.0 系列があ ります。 2.0 は標準で WebDAV をサポートするなど隹 的な機能をもつ半面、モジュール API カ畯更されたため に 1.3 系列の豊富なモジュール資産がすべて移植されてい ないという問題があります。 こでは、ある程度枯れているバージョン 1.3 を使用す ることにします。 Apache のソースは、これも Tool Warehouse から入手 します。モジュールを mod-*. so のような独立したかたち にする場合は、やはりリビルドカ必要になります。図 14 の ようにビルドしてください。 導入できたら、最低限の設定をおこないます。設定ファ イルは、 /usr/local/apache/conf/httpd.conf にありま す。とくに何もいじらなくてもテストはできますが、本格 的に運用するには ServerName や ServerAdmin といっ たパラメータを適切に設定する必要があります。また、デ フォルトでは 8080 番のポートを利用するようになってい 161