実行 - みる会図書館


検索対象: UNIX MAGAZINE 2005年3月号
70件見つかりました。

1. UNIX MAGAZINE 2005年3月号

文房具としての えるべき変更点をまとめたものです。パッチはパッケージ のディレクトリにある patches に収められており、 patch- XX ( XX はアルファベット 2 文字 ) という名前のファイ ルです。このターゲットは、展開したファイルにこれらの パッチを適用します ( 当て布だけに、パッチを適用するこ とを、、パッチを当てる " ともいいます ) 。 なお、 pkgsrc で配布されているパッチのほかに、ローカ ルで別のパッチを当てたくなる場合があります。このよう なときは、 patches のなかに patch-local-XX というフ ァイルを置くことで、 patch-XX と同様に処理されるので 便利です。 configure 一昔前は、コンバイルといえば、まず環境に合わせて Makefile を書き換えるところから始めたものでした。い までは、 autoconf や automake などの登場によって、環 境を自動的に検出して適切な MakefiIe を生成するような アプリケーションがほとんどです。まったく、便利な世の 中になりました・ おっと、 pkgsrc の make の話でした。ターゲット con- figure は、そのような、、環境に合わせたコンパイルの準備 " をするためのものです。配布物カ吐記の autoconf を利用 していればそれを使い、そうでない場合も必要な処理を自 動的に実行します。 pkgsrc は多くのプラットホームで動 くように設計されているため、このような仕掛けが必顎な のですね。 build 以上で準備は完了です。このターゲットは実際にコンパ イルを実行します。コンパイルが終れば、あとはインスト ールするだけです。 install というわけで、インストールです。ふだん何気なく使う 、、インストール " という言葉には、、、据え付ける " という意 味があります。すなわち、コンパイルカ鮗ったパッケージ をシステムに、、据え付け " て、利用できるようにするわけで す。また、 pkgsrc ではインストールされているノヾッケージ の一覧を管理しています。その管理データベースへの登録 作業もここでおこないます。 もし同じパッケージがすでにインストールされていたり ( ここでは、管理データベースに登録済みであることを未 連載コ 0 126 します ) 、共存できないパッケージがインストールされてい るときには、エラーになって処理が止まります。この場合 は、該当するパッケージを削除しないとインストールでき ません。 基本的なターゲットは以上です。これらのターゲットは 紹介した順番に依存しています。すなわち、あるターゲッ トを実行するには、それよりも前に紹介したターゲットを さきに実行しておく必要があります。そして、そのような 依存関係はすべて make コマンドが処理してくれます。た とえば、ターゲットとしていきなり build を指定しても、 ファイルの取得やパッチの適用など、必要な処理をすべて おこなってくれるのです。 ところで、ターゲットを指定しない場合、すなわち暗黙 に、、 a Ⅱ " が指定された場合にはどうなるのでしようか。こ のときは、 build が指定されたことになります。つまり、 インストールの準備ができました、という状態まで実行し てくれるわけです。 その他の便利なターゲット パッケージをインストールする基本的な流れは、上記の 7 つのターゲットから成り立っています。 pkgsrc にはこの ほかにも利便性を高めるために、いくつか便利なターゲッ トが定義されています。 clean パッケージのコンパイルには、イ乍業用の領域として work というディレクトリを使います。このディレクトリはター ゲット extract の実行時に、パッケージのディレクトリの なかに作成されます。 ターゲット clean は、この作業用ディレクトリをきれい さつばり消すためのものです。 reinstall 一度パッケージでターゲット install を実行すると、作 業用の領域 (work ディレクトリ ) に、、インストール済み " という印カ咐きます。そして、たとえそのパッケージを削 除したとしても、もう一度 install を実行することはでき ません。 reinstall は、この、、インストール済み " 印を無視して、 作業用ディレクトリからもう一度 install を実行するター ゲットです。たとえば、なんらかの問題ですべてのファイ UNIX MAGAZINE 2005.3

2. UNIX MAGAZINE 2005年3月号

連載 / U N Ⅸ便利帖ー 0 スがないときは不要です。今回利用した PC にはサウン ドデバイスがなかったので、このライプラリは使っていま せん。 これらのライプラリは、 FreeBSD の ports コレクシ ョンにすべて揃っています。また、 IibSDL はその他の SDL で始まるライプラリと同時にインストールされます し、 libPNG は SDL-Image とともに、 FreeType2 は SDL-TTF とともにインストールされるので、実際には下 記の 5 つのライプラリを用意すればよいことになります。 % cd ・ NetPBM ・ gettext ・ SDL-Mixer ・ SDL-TTF ・ SDL-Image これらを ports コレクションからインストールするに は、次のようにします。 % cd graphics/sdl—image % cd /usr/ports/ sudO sudo cd sudO cd sudo cd sudO make insta11 . /sdl-ttf make insta11 . /netpbm make install . / .. /audio/sdl—mixer make install . /.. /devel/gettext make install インストール後に、、 make clean" を適宜実行し、不要な Tux Paint のインストール ファイルを削除しておきましよう。 もともとは sdl-config コマンドの実行結果に置き換えられ 次の変更点 ( 変数 SDL-LIBS と SDL-CFLAGS) は、 け付けられないために修正したものです。 は、 FreeBSD の make では ifeq—endif という書式が受 最初の変更点 (ifeq → . if 、 else → . else 、 endif → . endif) をリスト 1 に示します。 オリジナルの Makefile と編集後の MakefiIe との差分 すが、 Tux paint では configure を使いません。 は、まず configure スクリプトを実行する場合が多いので 切に編集する必要があります。最近のアプリケーションで Tux Paint をインストールするには、 Makefile を適 156 るように言当されていたのですが、これも文法として許さ れなかったので、手作業でこのコマンドを実行し、その結果 と入れ替えています。 sdl-config は libSDL のインストー ル状況を取得するコマンドで、 FreeBSD の場合は sdll 1 ー config という名前で libSDL とともにインストールされま す。したがって、実際には、 % sdlll—config -libs のように実行しました。 最後の変更点は、 Tux paint では libintl というライプ ラリに定義されている関数カ駛われていたので、そのライ プラリもリンクするように指定するものです。 以上のように変更したうえで、 % make nosound % make install と実行すると、 Tux Paint がインストールされます ( 出 力されるメッセージは省略しました ) 。さきほど書いたよ うに、今回はサウンドデバイスのない PC にインスト ールしたので最初の make コマンドにターゲットとして nosound を渡していますが、サウンドデバイスがあるの なら、このターゲットの指定は省略してもかまいません。 このようにすると、 Tux Paint 本体が /usr/local/bin/ tuxpaint というファイル名で、 Tux paint カ坏リ用するフ ァイルが /usr/local/share/tuxpaint ディレクトリの下 にインストールされます。 続いてスタンプ集 (tuxpaint-stamps-2004-10-03. tar . (z) もインストールしましよう。これにも Makefile が含 まれているので、以下のようにしてインストールします。 % tar xzf tuxpaint—stamps-2004—10—03. tar. gz % cd tuxpaint—stamps-2004—10-03 % sudo make insta11 これで、 /usr/local/share/tuxpaint/stamps の下に スタンプ集が追加されます。 日本言割ヒ Mac OS X の場合と同じく、この時点で tuxpaint コ マンドを実行すると英語版カ起動されます。これを日本語 化してみましよう。 Mac OS X とは異なり、 FreeBSD には Tux Paint の 設疋をグラフィカルにおこなうツールはありません。 Tux UN 工 X MAGAZINE 2005.3

3. UNIX MAGAZINE 2005年3月号

連載 /FreeBSD のブートプロセスをみる リスト 1 testl. c #include く stdio . h> #include く fcntl . h> #include く sys/ioctl . h> main ( ) #include く sys/pioctl . h> 84 ださい。そして、一方のウインドウで testl を実行します。 はコンソールが必要なので、あらかじめ用意しておいてく テストプログラムの実行には、 2 つのウインドウもしく # gcc ー 0 test2 test2. c # gcc ー 0 testl testl . c うにしてコンパイルします。 まず、リスト 1 ~ 2 の内容のファイルを作成し、次のよ ラムを紹介しましよう。 目の STOPEVENT() の動作ができるテストプログ このフラグにはあまり馴染みがないと思うので、 647 行 ます。 が送られるまでプロセスをストップさせる処理をおこない S-EXEC フラグがセットされている場合、 PIOCCONT 最後に、 647 行目の STOPEVENT() では、プロセスに から参照される 3 つのリンクです。 イ磨課アドレスにマップされたデータ領域 イ磨誤アドレスにマップされたテキスト領域 プロセス構造体 ( 554 行目の p_textvp) ioctl(fd, PIOCCONT, 0 ) ; fd = open(path , O-WRONLY) ; "/proc/%s/mem" , argvC1] ) ; snprintf (path, sizeof (path) , char path [ 64 ] ; int fd; main (int argc , char *argv ロ ) #include く sys/pioctl . > #include く sys/ioctl . h> #include く fcntl . 五 > #include く stdio . h> リスト 2 test2. c execve ( "/bin/echo" , arg , NULL) ; getpid() ) ; printf ( "pid = %d\nwait for PIOCCONT\n" ioctl(fd, PIOCBIS, S—EXEC) ; O_WRONLY) ; int fd = open("/proc/curproc/mem" "done. " , NULL} ; char *arg [ 3 ] # . /testl pid = 800 wait for PIOCCONT testl の実行は、 PID を表示したところで止まってしま います。このとき、 testl のプロセスは STOPEVENT() によって停止させられていて、端末から CtrI-C を入力し ても、別のウインドウから KILL シグナルを送っても強制 終了させることができません。 次に、別のウインドウから test2 を実行します。これは、 引数に指定されたプロセスに PIOCCONT を送るプログ ラムです。たとえば、 testl の PID が 800 であれば、 # . /test2 800 とします。このように test2 を実行すると、 testl を実行し たウインドウの画面に、、 d 。Ⅱ e. " という文字列が表示され、 プロンプトカ唳ってくるはずです。ただし、 testl カ亭止 しているあいだに CtrI-C や Ctrl-Z を入力した場合は、 test2 の実行直後に終了したり、サスペンドされます。 このテストプログラムで S-EXEC フラグの動きがイ杓 できたはずですが、そもそも、 「なんのためにこんなこと、するんやろ ? 」 と思うかもしれません。 S-EXEC フラグの使用例は truss コマンドのソースにあるので、卿未のある人はそちらを参 照してください。 ☆ 今回は、 kern-execve() について解説しました。 次回は、 ELF 形式のプログラム・ファイルを読み込 む exec-elf32-imgact() と、図 5 のデータ構造を作成する exec-copyout-strings() と elf32-freebsd-fixup() 、そし て、 trapframe の内容を初期イヒする exec-setregs() を解 説します。 UNIX MAGAZ 工 NE 2005 . 3 ( しらさき・ひろお IIJ)

4. UNIX MAGAZINE 2005年3月号

連載 /FreeBSD のブートプロセスをみる 図 6 execve を実行すると filedesc の共有をやめる (a) execve 実行前 プロセス A p—fd プロセス B (b) execve 実行後 プロセス A p—fd プロセス B p_fd filedesc fd refcnt = 2 filedesc fd_refcnt = 1 コピー fd_refcnt = 1 せん。細かいことをいうと、表 1 の内容が図 5 で上書きさ れるのではなく、表 1 の領域 ( とそれに結びついているべ ージフレーム ) はいったん解放され、その後に、新しく作成 された領域 ( と確保されたページフレーム ) に図 5 の内容 カき込まれます。詳しくは次回に解説します。 図 7 pargs 構本 struct pargs { U_int ar_ref ; u—int ar—length ; u-char ar-args [ 1 ] , ・ / / コマンドライン引数文字列 / / サイズ / / 参照カウンタ /sbin/init\O--\O\O を指しています ( 、、 \ 0 " は NULL 文字を表します ) 。 このとき、 stringbase と endargs はそれぞれ以下の位置 て stringbase カ鮨す作業用領域にコピーされています。 ンドライン引数の文字列は、 exec-eIf32-imgact() によっ init プログラムの起動時に図 1 のように与えられたコマ ps ー 0 command -p を d ンドで確認することができます。 に設疋されるメンバー変数 ar-args の内容は、以下のコマ 定はあとで説明する 579 行目でおこないます。この構造体 こではカーネル空間に領域を確保するだけで、内容の設 ネル空間に保存する pargs 構造体 ( 図 7 ) を生成します。 394 ~ 396 行目は、コマンドライン引数の文字列をカー 0378 : 0379 : 0380 : 0381 : 0382 : 0383 : 0384 : 0385 : 0386 : 0387 : 0394 : 0395 : 0396 : FILEDESC—LOCK (p—>p-fd) ; if (p—>p—fd—>fd—refcnt > 1 ) { struct filedesc *tmp ; tmp = fdcopy(td—>td—proc—>p— FILEDESC—UNLOCK (p—>p-fd) ; fdfree(td) ; p—>p—fd = tmp ; } else FILEDESC_UNLOCK (p—>p—fd) ; newargs = pargs—alloc (i) ; i + sizeof (struct pargs)) if (ps—arg—cache—limit > = 土 = imgp—>endargs imgp¯>stringbase ; ↑ st ringbase ↑ endargs execve を実行するプロセスが、 filedesc 構造体をほかの プロセスと共有している場合、 execve の実行後も filedesc 構造体を共有するのはセキュリティ上の問題があります。 そのため、 380 ~ 385 行目では、 filedesc 構造体のコピー を作成して execve を実行しているプロセスに設定しなお します ( 図 6 ) 。 init プロセスの filedesc 構造体はほかから共有されてい ないので ( 2004 年 11 月号を参照 ) 、 init プログラムを起 動するときは 379 行目の牛が、、偽 " となって、 379 ~ 385 80 行目は実行されません。 この例では、 394 行目の変数 i に、、 14 " が設疋されるの で、 396 行目の pargs-alloc() は、 14 バイトぶんの文字 列を保存できる pargs 構造体を生成します。 " のように コマンドライン引数が、、寿限無、寿限無・・ 長 ~ い場合、 ( おそらくメモリを節約するために ) カーネ ルは保持するのをあきらめます。 395 行目で参照している ps-arg-cache 」 imit は、そのための閾値カ第又疋されている 変数で、その内容は以下のように sysctl コマンドで参照で きます ( 変更することも可能です ) 。 # sysctl kern. ps—arg—cache—limit kern. ps—arg—cache—limit : 256 たとえば、 /bin/sh のプロンプトで以下のコマンドを実 行すると、コマンドライン引数カ俵示されます。 # export HOGE= perl —e print " x " X210 ' ' # sh —c 'ps ー 0 command —p $ $ ; false C OMMAND sh —c ps ー 0 command —p $ $ ; false xxxxxxx しかし、、、 x " の数を 1 っ増やして閾値を超えるようにす ると、 , "$HOGE" UNIX MAGAZINE 2005.3

5. UNIX MAGAZINE 2005年3月号

文房具としての 図 2 ターゲット info でパッケージびメ青報をみる (devel/apr) # make info lnformation for apr ー 0.9 . 5 . 2 . 0 . 52 Ⅱ bl : 連載 ~ ユ 0 Comment : Apache Portab1e Runtime Requires : ← devel/apr 、が " 依存しているパッケー expat>=l .95 . 8 Ⅱ b2 ← devel / apr 、に " 依存しているパッケー Required by: subversion—base—l . 1 . 2 py23—subversion—1.1.2 apache—2.0.52nb8 ap2—ruby18-1.2.4 Description: ン The Apache Portab1e Run—time mission is tO provide a library of routines that aIIows programmers tO write a program once and be able t0 compile it anywhere . Homepage : http : //apr ・ apache . org/ 象になっていたために、多くのパッケージが一度に消えて ⅲ sta Ⅱが始まる、ということがあるのです ( しかもけっこ う頻繁に ) 。 たとえば、 meta-pkgs/gnome を利用している場合、 de- vel/glib2 が更新されると多くのパッケージが ( 一時的に ) 消えてしまいます。また、 graphics/png などが更新され た場合はさらに被害 ( ? ) は大きいでしよう。このように ターゲット update は諸刃の剣ですので、そのことを理解 して使ってください 3 info パッケージの情報をみるためのターゲットです。図 2 の 、ノヾッケージの説明や依存関係などを表示します。 readme パッケージの索引を作成します。このターゲットはディ レクトリに対して再帰的に実行されるので、 /usr/pkgsrc で実行するとすべてのパッケージの索引力胙られます。 れは 2004 年 9 月号でもこっそり ( ? ) 実行してみているの で、憶えている方もいらっしやるかもしれません。 3 このような事態に陥らないようにする方法があればよいのですが、念ながら 128 いまのところはないようです・・ fetch-list ノート PC などで NetBSD を利用している場合、ネッ トワークに接続していない当光態でノヾッケージをコンパイル したくなります 4 。しかし、ネットワークに接続していない と配布物を取得できません。あらかじめターゲット fetch を実行しておけばいいのですが、このターゲットは依存関 係までは考慮してくれないので、依存しているパッケージ の配布物を取得し忘れていると、けっきよくコンパイルで きないことになってしまいます。 そんな悩みは、ターゲット fetch-list カ埆年決してくれま す。このターゲットは、依存関係も考慮して、必要なすべ ての配布物を取得するためのスクリプトを出力します。そ のスクリプトを実行すれば、あとはネットワークに接続し なくてもパッケージの構築ができるわけです。具体的には 以下のようにすればいいでしよう。 # make fetch—list ー sh show—license インストールの際にソフトウェア使用許諾書に同意する 4 、したくなります " というよりは、、せざるをえないことがあります " です ね・・ UNIX MAGAZINE 2005 . 3

6. UNIX MAGAZINE 2005年3月号

文房具としての ASCII UNIX 好評発売中 ! プログラミング・テクニック ルがうまくインストールできなかったので、 もう一度イン ストールを実行したい、といった場合に このターゲット 生きたプログラムから学ぶ実践的手法の数々 を利用するとイ財リです。 プログラミング deinstall テクニック こまでの説明で、何度か、、パッケージを削除 " という記 リ N Ⅸコマンドのソースコードにみる 第プロクラミング手法 述カ咄てきましたが、具体的にどうすんねん ? という疑問 、多物第を和 に対する答 ( の 1 つ ) がこのターゲットです。ターゲット install とは逆に、システムにインストールされたノヾッケー ターン ・多治見寿和著 ジを削除します。 ・ B5 判、 240 ページ ( ートに第あ工第どい 0 を一 00 ーあり一を、そこには . プ 0 ・ ISBN 4-7561-4389- X update つをりと・一・れてい・れ ・ 1 , 890 円 ( 税込み ) パッケージにセキュリティ・ホールが発見されたり、新 しい機能が追加されていたりすると、更新する必要カ咄て フリーの IJN Ⅸやアプリケーションのソースコードを 見ながら、プログラミングにおける " 名匠の技 " を学 きます。しかし、パッケージ間の依存関係もあり、 1 っ 1 ぼうというのが本書の目的です。長い年月をかけ、 つ deinstall して install していくのは面倒ですね。 多くの人の手ですこしずつ改良されてきたソフトウ そこでこのターゲットが活躍します。ターゲット up- ェアは洗練の度合いを増し、名匠の手になる工芸品 date は、現在のパッケージに依存しているパッケージを といった趣があります。そこには、プログラム開発 すべて deinstall し、新たに install します ( ついでに最後 に必要な技術がどっさりと盛り込まれています。 に clean も実行します ) 。また、現在のパッケージカ畩存 しているパッケージについても、依存関係を満たしていな いバージョンのものがあれば、そこまで遡って update を 実行します。 たとえば、以下のような依存関係のあるパッケージがイ ンストールされていたとしましよう ( < は右側のパッケー ジカ鰉側のパッケージに衣存していることを表します ) 。 pkg-a-(). 5 < pkg-b-l. 1 く pkg-c-O. 9 こで、 pkg-b-l. 1 を pkg-b-l. 2 にするために update を実行してみます。 pkg-b-l. 2 カ畯わらず pkg-a-0.5 に 依存しているのであれば、 pkg-b-l. 1 と pkg-c-0.9 カ哨リ除 され、新たに pkg-b-l. 2 と pkg-c-0.9 に対して install が 予されます。 一方、 pkg-b を 1.2 にするために pkg-a も 0.6 にす る必要がある場合は、 pkg-a で update が実行されます。 すなわち、 pkg-a とそれに依存するパッケージカ哨リ除され、 新たに install が実行されるわけです。 この機能はたいへんイ財リですが、よく注意しないと、 ーっ ( 涙 ) 」 ということになりかねません。あるパッケージを更新した いだけなのに、依存している基本的なパッケージも更新対 連載 ~ 1 0 00 いを 0 れ フログラミングに活かす テ - タ構造と刃レゴリズムの 基礎知識 プログラミングこ活 ー響識 データ構造と刋レゴリズムの 泉員史 ・今泉貴史著 ・ A5 判、 288 ページ OISBN 4-7561-4452-7 ・本体 2 , 835 円 ( 税込み ) これからアルゴリズムやデータ構造についての勉 強を始めようと思っている人、数式をみるのは苦 手だけれどもアルゴリズムについて学びたい人、 学校でアルゴリズムの授業を受けたけれど、いま ひとつ理解しきれなかった人、そんな人にお薦め します。 株式会社アスキー 〒 1 02 ー 8584 東京都千代田区九段北ト 1 3-5 日本地所第一ビル 電話 (03) 6888 ー 5500 ( 営業局 ) 127 UNIX MAGAZINE 2005.3

7. UNIX MAGAZINE 2005年3月号

連載 / 旧ルーティング 図 16 ip as-path access-list の〕用例 1 bgpd(config)# ip as-path access—list aspath-regexp permit ( 64512 ー ) + ( 64514 ー ) + $ 2 bgpd(config)# router bgp 65535 3 bgpd(config-router)# neighbor 10 . 0 . 0 . 1 filter—list aspath—regexp in マッチする、 ( と ) で囲まれた部分はアトムとして取り扱わ れる、などを規定しています。 実際の正規表現は气 64512 ー ) 十 ( 64514 ー ) 十 $ のようにな るでしよう。こうすると、、、 64512 64512 64512 64514 64514 " や、、 64512 64514 " という AS-PATH 属性を、 1 つの正規表現で指定できます。 図 16 に、この正規表現を aspath-regexp という名前 の as-path access-list として定義し、 neighbor 10.0.0.1 の受信側フィルタとして定する例を示します。 その他の BGP 属性による BGP 糸各の指定と フィルタ、および変更 (route-map コマンド ) BGP 経路の指定とフィルタ、経路属性の変更を同時に 実行できるのが route-map です。 route-map は prefix- list と同様に名前によって参照され、複数の route-map か 同じ名前をもつ ( つまり、一連の route-map のつながり として扱われる ) ことができます。それぞれの route-map はシーケンス番号をもち、 prefix-list の内部工ントリと同 様に、番号の低いものから順に ( マッチするかどうか加試 されます。マッチした時点で、その route-map に指定さ れた permit か deny が、糸登各カ甘巨否されるかどうかの返 り値となります。 それぞれの route-map は、複数の match 行と set 行 から構成されます。 match 行は BGP 経路を指定するも ので、その指定条件として前述の ip prefix-list ( 終点 IP アドレス・プレフィックスの孑定 ) や ip as-path access- list (AS-PATH 属性の指定 ) が参照できます。もし 1 つ も match 行がなければ、暗黙のうちに permit が返され ます。 1 つ以上の match 行カ在し、そのいすれにもマッ チしなかった場合は、同じ名前の次のシーケンス番号をも つ route-map をテストします。すべての route-map の どの match 行もマッチしなかった場合は、 deny が返され ます。 ある route-map の match 行が permit を返した場合、 その route-map に指定された複数の set 行が ( もしあれ ば ) すべて実行されます。 match 行が deny を返した場 UN 工 X MAGAZINE 2005.3 合 (match 行が prefix-list を参照し、その prefix-list 内 でマッチする内部工ントリの返り値が deny だった場合な ど ) 、 set 行は実行されません。また、 1 つの route-map 内に複数の match 行があり、そのうちのいずれかがマッ チして permit を返せば、 set 行が実行されます 6 。 set 行は経路の属性を変更するためのコマンドであり、 AS-PATH 属性 ( プリペンドのみ ) 、 NEXT-HOP 属性、 LOCAL-PREF 属性、 MED 属性などカ畯更できます。 route-map は neighbor の送受信時のフィルタ ( ⅲ / out) のほか、 redistribute 時にも設疋できます。 redis- tribute はほかのプロトコルから経路を取り込むものなの で、、、経路をほかのプロトコルから受信するか " について フィルタすることになります ( 送信という概念はありませ ん ) 。 route-map の概念とそのおもな書式を、図 17 に示し ます。 図 17 では、一連の route-map のシーケンス番号は それぞれ便宜的に 5 、 10 としました ( 1 行目と 7 行目 ) 。 2 行目は prefix-list による終点 IP アドレス・プレフィ ックスでの条件を、 3 行目は as-path access-list による AS-PATH 属性での条件を、 4 行目は MED 属性での条 件をそれぞれ指定しています。 5 行目は as-path prepend による AS-PATH 属性の変更を、 6 行目は IP アドレス 指定 ( 亠召 . C. D) か neighbor の IP アドレス (peer- address キーワード ) による NEXT-HOP 属性の変更 を、それぞれ実行しています。 8 行目は ORIGIN 属性 での条件を、 9 行目は prefix-list による NEXT-HOP 属性の条件をそれそれ指定し、 10 行目は直による LO- CAL-PREF 属性の変更を、 11 行目は MED 属性の変更 を、 12 行目は ORIGIN 属性の変更をそれぞれ実行してい ます。 13 行目は redistribute 時の route-map を、 14 行目 は neighbor ごとの送受信時の route-map をそれぞれ指 6 この」も、 Cisco のルータとはやや異なります。 Cisco のルータでは、 1 つの route-map 内に複数の match 彳励防る場合、すべての match 彳励 { permit を返さなければ set 彳励や実行されません。この zebra の 挙鋤は変更される可物ゞあります。 113

8. UNIX MAGAZINE 2005年3月号

図 11 ResultSet オブジェクトのカーソ丿 / 立置 music id カーソルの最初の位置ーーー 最初に next ( ) を呼び出した あとの位置 最後のレコードを取得したーーー あとの位置 ジ・コレクションという仕組みがあり、どこからも参照され の条件を満たすレコードを ResuItSet オプジェクトで返 なくなったインスタンスはなんらかのタイミングで解放さ します。 ResultSet オプジェクトには、現在のレコードを指す れます。ただし、データベースへの接続のような外部リソ カーソルがあります。カーソルの進行方向は、 ResultSet ースはガべージ・コレクションの対象外です。したがって、 オプジェクトがどのように生成されたかによって変化しま データベースへの接続カゾく要になった場合は、 Connection す。さきほど、 Connection オプジェクトの createState- オプジェクトの close() メソッドを呼び出し、接続を明示 ment() メソッドを呼び出したとき、引数には何も指定し 的に閉じる必要があります ( 図 10 ー d ) 。 ませんでした。この場合、カーソルは前方にのみ移動しま この場合も例外が送出されますが (con. close() の行の す。 createStatement() メソッドにカーソルの進行方向 左横に x 印が表示されます ) 、ほかにもコードを追加するの を指定すると、後方や任意の位置にカーソルを移動するこ こで入力したコード全体を try/catch 文で囲んでお で、 とができます。 きましよう。それには、入力した部分を選択し、 Source メ 前方にのみ移動するカーソルは、初期状態では 1 件目 ニューから、、 Surround with try/catch Block" を選び のレコードの前に置かれ、レコードを取り出すたびに 1 つ ます。 すつ前方へ移動します。カーソルを前方へ移動しながら次 データベースの操作では、データベースに対して SQL 文 のレコードを取り出すには、 ResultSet オプジェクトの を実行する必要があります。そのためには、 Statement オ next() メソッドを使用します ( 図 11 ) 。 プジェクトを取得しなければなりません。 Statement は getData() メソッドも、 openDB() メソッドや close() データベースに SQL 文を送信するコンテナの彳齬リを担い、 メソッドと同様の手川頁で以下のように入力します。 SQL 文を実行して結果を取得する基本的なメソッドを提 供するオプジェクトです。 Statement オプジェクトを取 private Statement stmt = Ⅱ u11 ; private Resu1tSet rs = null; 得するには、 Connection オプジェクトの createState- ment() メソッドを呼び出します ( 図 10 ー e ) 。 public Resu1tSet getData(String sql) { if (stmt ! = nuII) { Statement オプジェクトのメソッドを呼び出して SQL try { の SELECT 文を実行すると、、、結果セット (ResultSet)" stmt . executeQuery(sq1) ; } catch (SQLException e) { が返されます。結果セットは、 Statement オプジェクトが e . printStackTrace() ; 閉じられたり別の SQL 文が実行されたりすると自動的に 破棄されてしまいます。そこで、 Statement オプジェクト もメンバー変数として保持し ( 図 10 ー f ) 、 closeDB() メソ ッドで明示的に閉じることにします ( 図 10 ー g ) 。 次は、 getData() メソッドの実装です。データベース からデータを取得するには、 Statement オプジェクトの executeQuery() メソッドを呼び出して SELECT 文を 実行します。 executeQuery() メソッドは、 SELECT 文 000 sales title artist ・← - ー 1 件目のレコード ー - 最後のレコード retUrn ; public void c10seDB() { try { if ()s ! = null) { rs . close() ; nu11 ; if (stmt ! = Ⅱ u11 ) { 174 UNIX MAGAZ 工 NE 2005 . 3

9. UNIX MAGAZINE 2005年3月号

連載 / ルーティング な例でなくとも、非効率に多くのメモリを消費するこの方 法は、コスト面からみて現実的ではありません。 このような理由から、現在のおもな BGP 実装では、 Adj ー RIBs-In も Adj-RIBs-Out もデフォルトではイ尉寺されま せん。 Adj-RIBs-Out を保持しないことには問題があり ませんが、 Adj-RIBs-In を保持せずに経路フィルタが変 更された場合の問題には、どのように対処すればよいので しようか。 対処方法の 1 つ目は、 BGP セッションをいったん切っ て張りなおす、というものです。これは BGP セッション のハードリセット (hard reset) と呼ばれます。 BGP セ ッションをハードリセットするには、、、 clearipbgp' コマ ンドを利用します。 BGP セッションを張りなおすと、 neighbor は糸登各を一 から送信しなおしてくれます。これに対して新しい経路フ イルタが適用できるので、自身の Loc-RIB を正しく更新 できます。ただし、この方法は大きな問題を抱えているた め、推奨されません。なぜなら、この neighbor を通じて 学んだ経路セットをすべていったん削除し、そのほとんど ( 更新された糸各フィルタにかかわらない部分 ) については たんに追加しなおされるだけとなります。 BGP 経路を消 すということは、ユーザーがおこなう実際の通信を遮断す ることを未し、大きな問題です。さらに、この削除と追 加という 2 度の変更は、ほかのすべての neighbor にイ番 され、インターネット全体の BGP プロトコルの負荷とな る可能性があります。 次の方法は、特定の neighbor に対してのみ Adj-RIBs- ln を保持するように設疋することです。こうすると、メ モリはよぶんに消費されますが、経路フィルタに変更が あっても BGP セッションを張りなおす必要はありませ ん。 neighbor からこれまでに受信した全経路がそのまま 保持されるので、これに対して経路フィルタを適用しなお すことで Loc-RIB が更新できます。特定の neighbor に対して Adj-RIBs-In を保持するように設疋するには、 neighbor soft-reconfiguration inbound" コマンドを 利用します。また、 BGP セッションを張りなおさずに経 路フィルタを適用しなおすことをソフトリセット (softre- set) と呼び、、、 clear ip bgp soft" コマンドで実行できま す。前述したように Adj-RIBs-Out を保持する必要はと くにないため、 neighbor soft-reconfiguration ・コマン 110 ドに outbound というキーワードは指定できません。 最後の方法は、 Adj-RIBs-In を保持せず、 BGP セッ ションの相手 ( ピア ) に全経路を送信しなおすように要求 を出す方法です。当然、相手側がこの要求を受け入れてく れなければ、この方法は使えません。このような要求を送 受信する方法は、 BGP の拡張として「 Route Refresh Capability for BGP-4 」 [ 3 ] に規定されています。 BGP セッションを張る双方がこの拡張をサポートし、かっその 設定力陏効になっている場合にのみ、この方法カリ用でき ます。この方法はソフトリセットに必要な情報を動的に 交換することから、ダイナミック・ソフトリセット (dy- namic soft reset) などと呼ばれます。 Zebra では、 の方法がデフォルトで肩効になっています。この方法を利 用してソフトリセットを実行するには、 2 番目の方法と同 じ、、 clear ip bgp soft " コマンドを使います。ソフトリ セットされた時点で、 neighbor に soft-reconfiguration inbound カ駁疋されていれば、 2 番目の方法になります。 soft-reconfiguration inbound か奴疋されていなければ、 ダイナミック・ソフトリセットカ河能な場合はそれを実行 し、不可能であればコマンドがエラーになります。 ダイナミック・ソフトリセットはメモリの代わりにネッ トワーク帯域を消費する方法です。メモリに余裕がある場 合には、 soft-reconfiguration を利用するのが一殳的です。 BGP 経路フィルタとルーティング・ポリ シーに関する設定 BGP では、特定の BGP 糸登各をフィルタ ( 拒否 ) する か、特定の BGP 糸登各の BGP 属性を変更することによっ て、 AS のポリシーを実現します。経路に対するフィルタ や変更が実行できるのは、ほかのルーティング・プロトコ ルから糸登各を取り込むときと、各 BGP neighbor に対し て糸各を送信および受イ言するときです。ある 1 つの BGP neighbor に対する送信と受信時には、個別のフィルタや 変更が実行できます。 フィルタや変更を実行する際、対象となる BGP 糸各を 指定するには、大きく分けて 2 種類の方法があります。 1 つは終点 IP アドレス・プレフィックスに対する条件を指 定する方法で、もう 1 つは糸各の BGP 属性に対する条件 を指定する方法です。 UNIX MAGAZINE 2005.3

10. UNIX MAGAZINE 2005年3月号

連載 /FreeBSD のブートプロセスをみる 図 4 イメージ・アクテイへータの酉明」列 シェルスクリプト・アクティベータのエントリ ex_name = " # ! " ex_i mgact execsw exec shell_imgact() ELF32 アクテイへータのエントリ ex_name = モ LF32 " ex_imgact NULL exec_elf32_imgact() その物理アドレスを仮想アドレスにマップするべージテ ープル・エントリの登録 その物理ページフレームを管理する vm-page 構造体を imgp—>firstpage に設疋 プログラム・ファイルの先頭部分 ( ヘッダ ) には、プログ ラムの起動に必要な情報が書かれています。そのため、以 降の処理でその情報を参照できるように、ファイルの先頭 から 4KB の部分をイ反想アドレス空間にマップしています。 for (i=O ; error==—l&&execsw Ci] ; + + i ) { if (execsw [ 幻—>ex—imgact==NULL Ⅱ execsw ¯>ex—imgact==img—first) { continue ; た、 VOP-GETVOBJECT() はカーネルのソースファイ ルではなく、カーネルのコンパイル中に自動生成される v- node-if. h で疋義される点に注意してください。 280 行目の vm-object-reference() は、引数で指定さ れた vm-object 構造体の参照カウンタをインクリメント します。 そして、この vm-object 構造体は、次回に説明するサ プルーチンでプロセス構造体の vm-map に登録される予 定になっています ( 2004 年 12 月号の図 6 の左端も参照し てください ) 。 0289 : 0290 : 0291 : 0292 : 0293 : 0294 : 0310 0311 0312 : textset = imgp—>vp—>v—vflag & VV—TEXT ; 0313 : imgp—>vp—>v—vflag ト VV—TEXT ; 0314 : 0315 : error = exec—map—first—page (imgp) ; 0316 : if (error) 0317 : goto exec-fail—dealloc; 0318 : 0319 : 0320 : 290 行目では、プログラム・ファイルの vnode 構造体 0321 : に VV-TEXT フラグを設疋し、ファイルを書込みモード 0322 : 0323 : でオープンできないようにします。たとえば、実行中のプ 0324 : ログラム・ファイルを書き換えようとすると以下のような 0325 : 工ラーになるのは、このフラグのおかげです。 # echo "update" > /sbin/init /sbin/init : Text file busy. 289 行目では、あとでフラグの状態をもとに戻せるよう に、現在の内容を変数 textset に待避しています ( 320 行 目も参照してください ) 。 292 行目の exec-map-first-page() は、以下のような 処理をおこない、プログラム・ファイルの先頭部分を図 3 の image-header カ甘旨すイ反想アドレスからアクセスできるよ うにマッピングします。 物理ページフレームの割当て er て 0 て = (*execsw [i] ->ex—imgact) (imgp) ; if (error) { if ( e てて 0 て if (textset = 0 ) ~ VV_TEXT ; imgp—>vp—>v-vflag & = error = ENOEXEC ; goto exec—fail—dealloc ; FreeBSD カーネルは、複数の実行ファイル形式をサポ ートしています。たとえば、現在の主流である ELF (Ex- ecutable and Linking Format) や、旧い形式の a. out (Assembler OUTput format) といったバイナリファイ ル 2 、そして、シェル・スクリプトも実行ファイル形式の 1 っとしてサポートされています。 FreeBSD では、実行ファイルを読み込むルーチンを、、イ メージ・アクティベータ " と呼びます。そして、それぞれ の形式のアクティベータは、図 4 のようにグローバル変数 2 試したことはありませんが、カーネルを再構築 - す - れば a. out を gzip した ファイルも囎于できるようです。 78 UNIX MAGAZINE 2005.3