実行 - みる会図書館


検索対象: UNIX MAGAZINE 2004年2月号
73件見つかりました。

1. UNIX MAGAZINE 2004年2月号

プログラミング・テクニック この修飾子は、指定した変数の値カ定されていればそ れを使い、設疋されていないときには : ーの後ろの文字列を 使用します。つまり、 -interpreter ( 第 3 引数をそのまま 代入しています ) カ啌なら後ろの、、 . " が、なんらかの値が 指定されていればその値が重 nd ー processes に渡されるこ とになります。 check_process 関数 この関数は、引数として指定されたプロセスカ働作して いれば、そのプロセス ID のリストを返します。第 2 引数を 指定することもでき、その場合は前節の check-pidfile 関 数と同様にインタープリタの指定として解釈されます。 の関数は、引数を調整して -find-processes 関数を呼び出 すだけです。 _find—processes $_procname ${_interpreter : こで呼び出している -find-processes 関数は、第 3 引 数に指定された値を引数として ps コマンドを実行し、その 結果から第 1 引数で指定されたプロセスをみつけだして、 そのプロセス ID のリストを出力します。第 2 引数はイン タープリタの指定で、これが、、 . " の場合にはインタープリ タを利用しないプロセスであることを示します。 この関数では、最終的に末尾に書かれた次の行を実行し eval $—proccheck ます。 の -proccheck 変数を定するカ功澗題になります。 ここに到達するまでにどのようにしてこ けっきよく、 この直前のコードでは、 -proccheck 変数を次のように 設疋しています。 —proccheck= ) PS ー 0 while "pid,command" "'$-psargs" read —npid ' " $ fp-args" case "$—npid" in PID) -pref=" ech0 -n "$—pref$-npid" '$—fp-match" ' continue UNIX MAGAZINE 2004.2 done ) 99 を取り出しましたが、こちらはすこし複雑な処理となって ほどは read コマンドに複数の引数を指定して先頭の単語 登録してから、この行の地頁の単語を取り出します。さき 除きます。さらに、 set を使っていったん位置パラメータに 的には、頁行を取り出して最初に書かれている # ! を取り プリタが正しく指定されているかどうかを調べます。具体 まずプログラム・ファイルの先頭行を読み込み、インター が実行されます。 インタープリタカ甘旨定されている場合は、図 2 のコード た文字列がパターンとして -fp-match にオされます。 もの、ファイル名を括弧で括ったものを朝で区切って並べ り除いたファイル名だけのもの、ファイル名に : カ咐いた 値と、この値から # # を使ってディレクトリ名の部分を取 -procname 変数に第 1 引数がオ内されています。この " (${-procnamebn}) " ) ' $-procnamel $-procnamebnl ${—procnamebn} —fp—match= ' case "$—argO" in —fp-args= ' —argO —argv ' —procnamebn=${—procname##*/} いない場合、次のようなコードが実行されます。 問題のパターン部分では、インタープリタが指定されて 外は前に空白文字カ咐けられることになります。 とプロセス ID カ咄力されるので、最初のプロセス ID 以 で -pref 変数の値を空白文字にします。すると今度は空白 されます。そして、 1 つ目のプロセス ID を出力した段階 $-pref$-npid ですから、まずはプロセス ID のみカ咄カ は、 -pref 変数は空文字列になっています。出力するのは てよけいな空白文字がイ寸かないようにしています。最初 この関数では、 reverse 」 ist 関数とは異なる手法を用い ス ID を出力します。 マッチするかを調べます。マッチした場合にはそのプロセ それ以外の行は、 $-fp-match 変数に書かれたパターンに します。ループでは、先頭行は無視して処理を続けます。 の結果の各行に対してパイプの後ろの while ループを実行 分では、 ps コマンドに $-psargs 引数を付けて実行し、そ は、展開されて代入されることになります。つまりこの部 用符で括られている $-psargs や $-fp-args などの変数値 そのまま -proccheck 変数に代入されます。一方、二重引 等号の右辺のなかで、一重引用符で括られている部分は

2. UNIX MAGAZINE 2004年2月号

連載 /FreeBSD のブートプロセスをみる 14. スタックからレジスタ EIP 、 CS 、 EFLAGS 、 ESP 、 SS 13. IRET を実行します。 セグメントとオフセット・アドレスをブッシュします。 12. 仮想 8086 モード用に移行したときにジャンプする先の す ( 物理メモリの頁に割込みテープルがあります ) 。 に値がロードされます。 EIP 、 CS 、 EFLAGS 、 ESP 、 SS をスタックの底にコ 5. TSS の ESPI カ甘旨すアドレスから ES 、 DS 、 FS 、 GS 、 V86 にコピーして保存します。 4. スタックに積まれている ES 、 DS 、 FS 、 GS を構造体 す。 HLT 命令によるものであれば intrtn にジャンプしま 3. 例外が発生した原因が HLT 命令によるものかを調べ、 す。 2. すべての汎用レジスタの内容をスタックにブッシュしま 1. v86mon にジャンプします。 ます。 護例外 ( べクタ番号 13 ) が発生し、 ex-v86 に制御が移り 仮想 8086 モードでは、 HLT 命令を実行すると一 - 一般保 にジャンプし、そこで HLT 命令が実行されます。 か IRET が実行されます。すると、サプルーチン inthlt 実行されます。そして、そのサプルーチンの最後で LRET こで、指定されたサプルーチンが一磨課 8086 モードで 16. スタックから ES 、 DS 、 FS 、 GS をロードします。 ことを検知し、仮想 8086 モードに移行します。 15. CPU は EFLAGS の VM フラグがセットされている ピーします ( 図 7 ) 。 166 したところに戻ります。そして、仮想 8086 モードで実行 これで v86int() による処理が終り、 v86int() を呼び出 容と入れ替えます。 EDI 、 EFLAGS の内容を構造体 V86 に設定された内 11. レジスタ EAX 、 EBX 、 ECX 、 EDX 、 EBP 、 ESI 、 INT 31H を実行した位置にジャンプします。 10. ここで CPU がプロテクトモードに戻り、 v86int() で に値がロードされます。 9. スタックからレジスタ EIP 、 CS 、 EFLAGS 、 ESP 、 SS 8. IRET 命令を実行します。 7. ES 、 DS 、 FS 、 GS をスタックから復帰させます。 6. すべての汎用レジスタをスタックから彳帚させます。 図 7 プロテクトモードへ戻る途中のスタックの様子 CPL=O 用 スタック EDI ESI EBP EBX EDX ECX EAX 0000000 D 工ラーコード EIP CS EFLAGS ESP SS ES DS FS GS スタックの底 SS ESP EFLAGS CS EIP GS FS DS このようになる コ HLT 命令を実行 したアドレス 構造体 V86 ctl addr ES DS FS GS EAX ECX E DX EBX EFLAGS E BP ESI EDI 呼出し元 実行中の値 TS S espl(l EOOH) esp0(1800H ) ssO(SEL_SDATA) コピー ポインタ ( v ) ES DS FS GS 日 P(V) CS EFLAGS ESP(V) SS v86int() 実行中 の値 したサプルーチンの結果を、構造体 V86 から取り出すこと ができます。 ☆ UN 工 X MAGAZ 工 NE 2004.2 ( しらさき・ひろお IIJ) 次回は、いよいよカーネルのコードを読んでいきます。 これで、ようやくカーネルがメモリにロードされました。

3. UNIX MAGAZINE 2004年2月号

0 図 1 autorun. inf びメ列 CAut orun] open=N0tify. bat xcon=myxcon .1C0 図 2 Ⅵ7 ・ indows XP の自動実尺ウインドウ PICOSPY 仕 ) 。 1 に , 。。。日ミャ鵞カメ豸ウィサード使用 广帝に選択した動作を行う。 Pict い・ e ら「 S れⅶ 0 フォトコレクション使用 0 写真を取り込む Windons ビりチャと FAX ビューア使用 イメージのスライドショーを表示する 写真の印刷ウィサ・一ド使用 画像を印刷する Wmdows が実行する勒作をんでください。 に、 Wmdows が自自こ実行する作を選析できます この種の万イルのディスりを挿入したり、デバイスに接統したりするたび 外部ディスクを Windows XP に接続すると、デフォル 的にさまざまな処理を実行させることができます。 XP であれば、外部ディスクがマウントされたときに自動 込んでおいても自動再生はできません。しかし、 Windows 残念ながら、 USB メモリの場合は autorun. inf を書き とができます。 動したりアイコンとして myicon. ico を指定したりするこ き込んでおけば、 CD を挿入したときに Notify. bat を起 いうファイルを作成し、 CD のルート・ディレクトリに書 Windows では、図 1 のような内容の autorun. inf と らプログラムを実行する。 2. マウント状況をつねにポーリングし、挿入が検知された 1. マウント時に自動実行されるスクリプトを利用する。 れるようにするには、以下のような方法が考えられます。 メディアを挿入したとき、プログラムが自動的に起動さ 仕組みがあれは前述のような機構を実現できます。 ラムが起動し、コンテクスト情報を必要な場所に通知する CD や USB メモリを PC に挿入すると自動的にプログ メディア挿入による状態通知 合わせればいろいろとおもしろい使い方ができそうです。 190 図 3 自動実行プログラムの言綻 全般自再生レールレトドウェⅵ共有ー 円 COSPY 0 : ) のプ 0 バティ - のは b 引使 、扣新 ic 旧 n P にれ Ge Studio フォトコレ : ) ション使用 0 動作を毎回選択する 0 何もしない 0 、ン / つスプローラ使用 フォルダを亂、てファイルを表〒する 写真を取り込む 実行する作を択 」混在したコンテンツ 宗鼕洋 : がこのデバイスで使われた場合に・。 , 既定値に戻す⑧ ぃ c.:r ” 1 諭マいョ、一物ド立 Y ド 1 ー下 イメージのスライドショーを表示する し 5 4 VEd き 0 「 0 し PlayVideoFdes リ罅製 0 し、 b 載 リ引 ng : d ? 0 DVD ムーどーの再生 リ ng に d こ引 4 日 d 島 Playet 0V0 ビデオの再生 リ 5 れ 0 e : e Piayer 1 0V0 ビデオの再生 、 Re 0 「旧 y 等 CD の書き込み AUtopiayHanders 図 4 Tweak UI による自動実行プログラムの指定 国 Corrrnon し alogs 国 Explorer 国 Mouse 辷 GeneraI 国 AbNJt ツ T 物 e 誌Ⅲ A ( ( 5 ( レ ol 国 Lcgon ( 第 idP 「 ort を口 ern Expbrer T 町叩は es ( 併セ olPan 引 Drive Le 針 5 H id! 已 Types 三 A 0 y 印は Fo 旧 e 要 : 国 T 出砿 dSt に価第」 UNIX MAGAZ 工 NE 2004.2 powertoys ・ asp 4 http://www.microsoft.com/windowsxp/pro/downloads/ 3 これらの画面に表示される項目は、システムによって異なります。 リティを使うと、システムに対して、外部ディスクを接続 Microsoft カ己布している Tweak U14 というユーティ というプログラムの起動を指定しています。 択できます。図 3 の例では、自分で用意した Notify. bat いときは、ドライプのプロバティの、、自動再生 " で処理が選 表示されますが、メディア再生などを自動的に実行させた 自動実行が指定されていない場合は図 2 のウインドウが うです ) 。 torun. inf が書き込まれていると、この機能は働かないよ 実行するかが選べるようになっています ( ディスクに au- トでは図 2 のウインドウ 3 が表示され、どういった処理を

4. UNIX MAGAZINE 2004年2月号

連載 /Red Hat Linux のツールたち 図 17 smbmount コマンドの書式 おもなオプションについて簡単に説明します。なお、値 って列挙します。 マシンにアクセスする際のユーザー名などをカンマで区切 るディレクトリのパス名です。叩 0 れ s には、 Windows ルダの共有名、 mountpoint は共有フォルダをマウントす ん os は Windows マシンのホスト名、訪礰・ e は共有フォ 図 17 のようになります。 smbmount / / ん ost / s ん礰℃ / mo れれ切れ t [ ー 0 0 〃 0 れ s ] ・ username という形式で指定します。 オプション名 = 値 をとるオプションは、 UN 工 X MAGAZ 工 NE 2004.2 euc-jp" を指定すればいいでしよう。 します。 Red Hat Linux の場合は、 EUC を創未する 値として、 UNIX マシン側の文字コードセットを指定 ・ iocharset mount を実行したユーザーカ嘱すグループになります。 たグループとして扱われます。省略した場合は、 smb- イルやフォルダのグループが、このオプションで指定し ープ名を指定します。マウントボイント以下にあるファ 値として、 UNIX マシン上のグループ ID またはグル ・ gid を実行したユーザーになります。 ーザーとして扱われます。省略した場合は、 smbmount ルやフォルダの所有者が、このオプションで指定したユ ー名を指定します。マウントボイント以下にあるファイ 値として、 UNIX マシン上のユーザー ID またはユーザ ・ tlid ください。 りますが、パスワードが端末に表示されるので注意して smbmount 実行時にパスワード入力を求められなくな ワード ) を指定します。このオプションを指定すると、 のパスワード (Windows マシンに登録されているパス 値として、 username オプションで指定したユーザー ・ password ー名を指定します。 値として、 Windows マシンにアクセスする際のユーザ ・ co depage 値として、 Windows マシン側の文字コードセットを 指定します。日本語 Windows の場合は、 Shift-JIS (SJIS) を前末する、、 CP932 " を指定します。 ・ ro または rw 前者は読出し専用モードでのマウント、後者は読み書き モードでのマウントを未します。値はありません。い すれも省略した場合は、読み書きモードでマウントしま す。当り前ですが、 Windows マシンの共有フォルダが 書込み可能に設疋されていなければ、 rw オプションを指 定しても未がありません。 たとえば、さきほど設定した共有フォルダ / / h 。 stos / tmp を、、 / smb " というディレクトリにマウントする場合 には、 smbmount を図 18 のように実行します。 この例では、 password オプションを指定 ( pasuwa- d 。 " がパスワードです ) していますが、省略するとコマン ド実行時にパスワードの入力を求められます。マウントに 成功すると、ローカルファイルと同様に扱うことができ、 kterm などの日本語端末であれば、日本語のファイル名も 正しく表示されます。 smbmount は、 UNIX の標準的な mount コマンドか ら実行することも可能です。この場合、ファイルシステム の種類を未する -t オプションの引数に、、 smbfs" を指定 します。たとえば、 mount コマンドを使って図 18 の例と 同様にマウントするのなら、図 19 のように実行すればよ いことになります。 一方、共有フォルダのマウントを解除 ( アンマウント ) す るには、 /usr/bin/smbumount コマンドか umount コ マンドを使います。どちらの場合も、 UNIX 側のマウント ポイントのディレクトリを引数に指定します。、、デバイス を使用中です " というエラーメッセージが表示されてアン マウントできない場合は、 ・カレント・ディレクトリがマウントボイント以下にない か ・マウントボイント以下のファイルやディレクトリを使用 しているプロセスがないか などをチェックしてください。 こまでの例では、 smbmount または mount コマン ドを実行する際に、マウントボイントやオプションをいち 175

5. UNIX MAGAZINE 2004年2月号

連載 /Red Hat Linux のツールたち 図 2 smbstatus の実行 [root@valhalla root] # smbstatus Samba version 2 . 2 .8a-ja-1.1 SerVICe tmp uid hayao gid hay ao pid 13392 machine hostos ( 192. 168 . 1 . 1 ) Mon Dec OK OK 8 15 : 05 : 19 2003 No locked files [root@valhalla て 00t ] # 図 3 テーモン窈亭止 SMB サービスを停止中 : NMB サービスを停止中 : Croot@va1ha11a root] # ロ Croot@vaIhaIIa て 00t ] # /etc/rc . d/init . d/smb stop 図 4 smb サービスの自重最が亭止 . [root@valhalla root] # smb 0 : オフ [root@valhalla root] # [root@valhalla root] # smb 0 : オフ chkconfig ——list smb 1 : オフ 2 : オフ 3 : オン chkconfig smb 0ff chkconfig ——list smb 1 : オフ 2 : オフ 3 : オフ 4 : オフ 4 : オフ 5 : オン 5 : オフ 6 : オフ 6 : オフ [root@valhalla root] # すです。 x ⅲ etd によるアクセス制御 UN 工 X MAGAZ 工 NE 2004.2 します。 3 サービス走」スクリプトに引数として、 start" を付けて実行することを前未 効にする前はランレベル 3 または 5 へ移行する際に smb -list は現在の状態を確認するためのオプションで、無 し、 smb サービスが起動 3 されないように設疋します。 す。そこで、 chkconfig コマンドを図 4 のように実行 たたびサービス起動スクリプトが実行されてしまいま このままの状態で Samba サーバーを再起動すると、ふ 2. smb サービスを無効にする デーモンとして動いているプログラムを停止します。 まず、サービス起動スクリプトを図 3 のように実行し、 1. smbd と nmbd を停止する 変更するときは、以下の手川頁で作業をおこないます。 アクセス制御機能力駛えます。 ますが、 xinetd で管理するように設疋すれば、 xinetd の されます。これらのプログラムはデーモンとして動き続け サービス起動スクリプト /etc/rc. d/init. d/smb から実行 ラムである smbd および nmbd は、システムの起動時に Red Hat Linux の場合、 Samba のサーバー・プログ 図 5 smbd のサービス設疋ファイル servxce netbios—ssn disable no socket-type Stream wait /usr/sbin/smbd root 169 に netbios-ssn という名前で登録されているので、 用しますが、このポート番号は /etc/services ファイル うになります。 smbd は TCP の 137 番ポートを使 この場合、 /etc/xinetd. d/smbd の中身は図 5 のよ りやすいようにプログラムと同名にしたものとします。 す。ファイル名は適当でかまいませんが、以下では分か 定ファイルを、 /etc/xinetd. d ディレクトリに追加しま smbd と nmbd を xinetd で管理するためのサービス設 3. xinetd 用のサービス設疋ファイルを追加する 実行します。 す。もとの状態に戻すには、 chkconfig smb on" を てのランレベルで smb サービスが無効 ( オフ ) になりま これに対し、、、 chkconfig smb 0 仕 " を実行すると、すべ サービスを起動 ( オン ) するようになっています。

6. UNIX MAGAZINE 2004年2月号

インターフェイスの街角 図 5 Notify. bat c : *cygwin*usr*local*bin*ruby ¯S -x % 0 % 1 % 2 exit # ! ruby # CD や USB メモリが挿入されたときに呼び出され、サーバーの CGI を wget で呼び出す。 # Windows xp の自動実行機能で呼び出された場合はドライブ名が引数として渡される。 CGI 'http://example.com/notify.cgi' WGET = ' c : /cygwin/bin/wget ' class Notification PERIOD = 60 def initialize(drive) @drive = drive if @drive . nil? then if $ 0 た Ca-zA-Z] : / then # E: @drive et c . end end @cmd end "#{WGET} -q ー 0 #{CGIY' def main while true do if Fi1eTest .directory?(@drive) then きます。 したときに自動実行可能なプログラムを登録することがで notification . maIII notification = N0tification. new(ARGV[O] ) end end system @cmd put s @cmd def notify end end end break else notify sleep PERIOD UNIX MAGAZINE 2004.2 れると終了します。 呼び出すようになっており、 PC からメディアカ陬り外さ のバッチファイルです。サーノヾーの notify. cgi を定期的に Notify. bat は、 Cygwin 環境で Ruby を起動するため 行できるようになります。 シンに挿入すると図 5 のような Notify. bat を自動的に実 これらの設疋により、 USB メモリを WindowsXP マ ただし、自動実行 (autorun) 機能を有効にしておくと 危険な場合もあります。 autorun. inf に悪質なプログラム カ第当された CD や DVD を PC に挿入すると、取り返 しのつかないダメージを受けるおそれがあります。外部か ら持ち込まれた CD などを扱う可能性がある環境では、自 動実行の機能は停止しておくほうが安全でしよう。 Tweak UI では、図 6 のようにドライプごとに自動実行の可 / 不可 を指定することもできます。 残念ながら、 Windows XP 以外の Windows で USB 191

7. UNIX MAGAZINE 2004年2月号

連載 /Red Hat Linux のツールたち 図 16 smbclient の実イ列 Domain= [MYGROUP] OS= CWindows 5 . 1 ] Server= [Windows 2000 LAN Manager] Password : ←パスワードを入力 added interface ip = 192 .168 . 1 . 4 bcast=192.168.1.255 nmask=255.255.255.0 [hayao@valhalla hayao] $ smbclient //hostos/tmp smb: \ > IS t e st 新規テキスト smb: \ > ロ ドキュメント . txt 0 Mon Dec 0 Mon Dec 0 Mon Dec 0 Mon Dec 8 40014 blocks of size 262144. 17973 blocks 8 15 : 44 : 25 2003 8 15 : 44 : 25 2003 8 15 : 44 : 11 2003 15 : 44 : 25 2003 available タンをクリックすると、図 15 のような設定画面カれ ます。ここで、、フルコントロール " をチェックし、 [OK] ボタンをクリックします。 この場合、 Windows マシンに登録されているユーザー なら誰でも読み書き可能になるので、ユーザーごとにア クセス権限を変更したければ、図 15 の画面でユーザー 名を追加して設定する必要があります。 4. 最後に、図 14 の [ OK ] ボタンをクリックします。 上記の作業をおこなったあと、 UNIX マシン上で smb- client を実行すると、図 16 のようになります。 最初に、パスワードの入力を求められます。 Windows マシンに登録された正しいパスワードを入力すれば、 smb- client のプロンプト (smb: \ > ) が表示されます。この 場合、とくに指定しなければ、 smbclient を実行したユー ザー名で Windows マシンにアクセスするものとみなされ ます。 UNIX と Windows とでユーザー名が異なるので あれば、 -U オプションに続けてユーザー名を指定します (smbclient コマンドのオプションは、かならず共有名よ りも後ろに指定します ) 。 このようにしてアクセスすると、 ls や get などのサプコ マンドを使用して、 ftp コマンドと同様な感覚で共有フォ ルダ内のファイルやフォルダを扱うことができます。 help または、、 ? " サプコマンドを実行すると、 smbclient のサプ コマンドー覧が表示されます。さらに、 help サプコマン ド名 " を実行するとそのサプコマンドの簡単な使い方も表 示されるので、参考にするといいでしよう。 smbclient コ exit" または q サプコマンド マンドを終了するには、 を実行します。 図 16 からも分かるように、日本語の表示が可能な端末 174 (kterm など ) 上で smbclient を実行すれば、日本語の ファイル名も正しく表示されます。 UNIX 側で使用する漢 字コードは smb. conf の coding system ノヾラメータの値 によって変わりますが、 Red Hat Linux の場合は EUC を使うように設疋しておけばいいでしよう。 こでは共有フォルダにアクセスする場合のみを なお、 紹介しましたが、 smbclient を使って Windows の共有プ リンタを利用することも可能です ( 言田は、 2003 年 7 月号 [ 3 ] などを参照してください ) 。 smbfs smbfs は、 Windows マシンの共有フォルダを UNIX マシンにマウントして利用するためのファイルシステムで す。いったんマウントすれば、 ( いくつか制約はあります が ) ローカルなファイルと同様に扱うことができます。 smbfs の処理には Samba のサーバー・プログラムは介 在しないので、 Samba サーバーではない UNIX マシンで も smbfs を利用することができます (Samba のパッケー ジはインストールしておく必要があります ) 。ただし、ファ イルシステムに対する読み書きなどはカーネルが処理する ため、すべての UNIX 系 OS で使えるとはかぎりません。 Linux の場合、最近のカーネルは smbfs をサポートして いるので、ほとんどのディストリビューションで利用でき るはすです。さらに、 Red Hat Linux 7.3 では、 OS イ ンストール時のカーネルに smbfs のサポートが組み込まれ ていますから、カーネルを再構築して smbfs のサポートを 外していないかぎり、特別な設定をしなくても使えます。 コマンド行から Windows マシンの共有フォルダをマ ウントするには、スーパーユーザーの権限で / usr / b ⅲ / smbmount コマンドを実行します。基本的な使い方は、 UNIX MAGAZINE 2004.2

8. UNIX MAGAZINE 2004年2月号

連載 /FreeBSD のブートプロセスをみる 571 行目では、これらのレジスタに引数を設定しています。 レジスタ意味 図 6 イ反想 8086 モ ードへ不テ中のスタックの様子 AX CX DH DL LBA ( ビット 0 ~ 15 ) LBA ( ビット 16 ~ 31 ) 誌囚みセクタ数 ドライプ番号 CPL=O 用 スタック ポインタ ES DS FS GS EDI ESI EBP EBX EDX ECX EAX ダミ E 旧 (V) CS E FLAG S ESP(V) SS スタックの底 このようになる GS FS DS ES SS ESP EFLAGS CS 曰 P コピー ES:BX 中幻去先アドレス 以下に、処理の概要を示します。卿未と余力のある人は、 うなので、詳しい説明は省略します。 雑であり、プートプロセスの本質とはあまり関係はなさそ ろいポイントはいくつかありますが、その処理はかなり複 仮想 8086 モードやモードの移行など、技術的におもし ふたたびプロテクトモードに戻す処理をおこないます。 を呼び出します。そして、その実行が終ったら、 CPU を モードに移し、指定されたサプルーチンや割込みハンドラ v86int() は、 CPU の動作モードを一時的に仮想 8086 仮想 8086 モードでのサブルーチン実行 を呼び出してディスクからデータを読み出します。 572 行目の v86int() は、 b00t1 のサプルーチン xread 2. INT 31H を実行します。 容と入れ替えます。 EDI 、 EFLAGS の内容を構造体 V86 に設定された内 1. レジスタ EAX 、 EBX 、 ECX 、 EDX 、 EBP 、 ESI 、 btxv86. s の 50 行目で定義されています。 これを参考にコードを読んでみてください。 v86int() は、 UNIX MAGAZINE 2004.2 オフセット・アドレスをブッシュします。 FLAGS の内容、サプルーチン inthlt のセグメントと 7. イ反想 8086 モードに移行したときに使用するスタックに、 この時点でのスタックの様子を表したものです。 するときに備えて保存しておきます ) 。図 6 の上半分は、 指すアドレスにコピーします ( プロテクトモードに復帰 CS 、 EIP 、 GS 、 FS 、 DS 、 ES の内容を TSS の ESPI が 6. スタックに積まれたレジスタ SS 、 ESP 、 EFLAGS 、 すべてのレジスタの内容力黷まれたことになります。 5. このとき、スタックには、 INT 31H を実行したときの す。 4. すべての汎用レジスタの内容をスタックにブッシュしま SS と ESP にロードされます。 3. CPL が 0 に移行し、 TSS の SSO と ESPO の内容が ES DS FS GS EIP(V) CS EFLAGS ESP(V) SS TSS SSO(SEL_SDATA) espO(1800H ) espl(l EOOH) v86int() 実行中 の値 仮想 8086 モード で実行するサブ ルーチンのアドレス VM フラグが セットされて し、る コピー 構造体 V86 ctl addr ES DS 実行中の値 呼出し元 EDI ESI EBP EFLAGS EBX EDX ECX EAX GS FS 8. 構造体 V86 の GS 、 FS 、 DS 、 ES を CPLO 用のスタッ クの底にコピーします ( 図 6 の下半分 ) 9. その上に仮想 8086 モード用に移行したときのための SS 、 ESP をブッシュします。 10. VM フラグをセットした EFLAGS をブッシュします。 11. 割込みべクタ番号が指定されている場合は、割込みハン ドラのセグメントとオフセット・アドレスを読み取りま 165

9. UNIX MAGAZINE 2004年2月号

特集 図 24 PPTP 車の / ヾッチを適用 pptp—conntrack-nat . patch NOT APPLIED ( 8 missing files) Testing. The extra/pptp¯conntrack—nat patch : Author : Hara1d We1te く laforge@gnumonks . org> Status : Beta DO you want t0 apply this patch [N/y/t/f/a/r/b/w/q/?] y 図 25 GRE と PPTP をサポートするか ? GRE protocol support (CONFIG-IP-NF-CT—PROTO_GRE) [N/m/?] (NEW) PPTP protocol support (CONFIG—IP—NF—PPTP) [N/m/?] (NEW) 安全なネットワー ク② y を入力するのは、この 1 回だけです。あとはふたたび リターンキーを押し続けます。 コマンド・プロンプトに戻ってきたら、次のコマンドを 実行してカーネルを再コンパイルし、インストールします。 さきほど PPTP サーバーのカーネルを再構築したとき # make install # make modules_install # make modules # make bzlmage # make dep # make oldconfig # make mrproper cd /usr/src/Iinux—2.4.20 ー 20.9 では、どちらも、、 m " ( モジュールとしてコンパイル ) を入 、いま当てたパッチによって追加されたものです。 これら 2 つのオプションは、名前から想像できるよう 状態になります。 oldconfig の実行中に、図 25 の質問か表示されて入力待ち 定ファイルを作成してくれました。しかし、今回は make は、 make oldconfig を実行すると、途中で止まらずに設 力してください。 UNIX MAGAZINE 2004.2 メントアウトしている場合は、それを外してください。 ip-conntrack-pptp モジュールをロードしている行をコ もし、前回紹介した rc. firewall ファイルを変更して、 ↓ defau1t=0 default=l うに書き換えて再起動します。 make install の実行後、 /etc/grub. conf を以下のよ # make menuconfig 次のコマンドを実行するとよいでしよう。 をカスタマイズしたい場合は、 make dep を実行する前に 必須ではありませんが、さらにコンパイル・オプション カーネルが起動したら、今度は iptables コマンドを再 コンパイルします。 新しいカーネルでは、前回紹介した rc.firewall スクリ プトでフィルタを登録するときにエラーメッセージが表示 され、 MASQUERADE ターゲットのルールが登録でき なくなります。これは、さきほど当てたパッチによって、 iptables のコマンドとカーネル・モジュール間で送受信す るデータ構造が更新され、両者のあいだで不整合が生じて いるからです。このため、 iptables コマンドを再コンパイ ルする必要があります。 Red Hat Linux 9 の配布サイト から、次の RPM パッケージを入手してください。 ・ iptables-l. 2.7aー2. src. rpm ダウンロードが終ったら、以下のコマンドを実行してコ マンドとモジュールを再構築します。 # rpm —ivh iptables—l . 2.7a ー 2. src. rpm # cd /usr/src/redhat/SPECS/ # rpmbuild —bp iptables . spec # cd .. /BUILD/iptab1es—1.2.7a / # make COPT_FLAGS= ー 02 —march=i686" - KERNEL_DIR=/usr/src/1inux—2.4.20 ー 20.9 - LIBDIR=/1ib # cp iptables /sbin/iptables # cp iptables—save /sbin/iptables—save # cp iptables-restore /sbin/iptables—restore # cp extensions/* . SO /lib/iptables/ 以上でファイアウォールでの作業は終りです。 それでは、 Windows から PPTP 接続をしてみましよ Windows での言又疋 こまで、長い長いイバラの道でした。途中で挫折せず、 最後まで歩きとおした成果を楽しむ時間です。 試しに、内部 LAN の Windows PC から DMZ にあ る PPTP サーバーに接続してみましよう。 131

10. UNIX MAGAZINE 2004年2月号

ロプログラミンク・テクニック 多治見寿和 rc スクリプト ( 3 ) 前回は、 rc スクリプトから最初に呼び出されるスクリプ トとして、ディスクレス・マシンのために用意されている initdiskless をとりあげ、その動作を説明しました。 /etc /rc. d ディレクトリに置かれているスクリプトのなかで、 initdiskless のようにかなり凝ったことをしているものは あまりありません。 /etc/rc. d に置かれたほかのスクリプト・ファイルの多 くは、つくりカ甬っています。これには理由があります。 rc. d に置かれたスクリプトが共通に利用できる、 C 言語 のライプラリ関数のようなものが用意されているからです。 rc. d に置かれたスクリプトはこれらのライプラリ関数を使 うため、その流儀に則ったプログラムとなり、つくりも似 たものが多くなるわけです。今回は、このライプラリ関数 群を紹介します。 /etc/rc. d/rcconf.sh 2003 年 12 月号で紹介した rcorder コマンドによって、 initdiskless スクリプトの次に実行すべきファイルとして 選ばれるのは、 /etc/rc. d/rcconf. sh です。このファイル は、以下に示すようにたいへん短いものです ( 誌面の都合 -- ヒ、で折り返しています。以下同様 ) 。 # ! /bin/sh $FreeBSD: src/etc/rc . d/rcconf . sh,v 1 . 2 - # PROVIDE : # REQUIRE : # BEFORE : # KEYWORD : 94 2003 / 01 / 25 20 : 02 : 35 mtm Exp $ rcconf initdiskless disks initrandom FreeBSD /etc/rc . subr echO "Loading configuration files . load—rc—config 'XXX' ファイルに関するコメントと、 rcorder コマンドのため のコメントを除くと、 3 行しかありません。それぞれを順 番にみていきましよう。 最初に実行しているのは、 /etc/rc. subr ファイルの取 込みです。後述するように、このファイルには / etc / rc. d ディレクトリに置かれたファイル群を処理する際に便利な 関数がいくつも定義されています。 続いて、コンフィギュレーション・ファイルを読み込ん でいるというメッセージを表示し、 load-rc-config 関数を 実行します。この関数も、 rc. subr ファイルで定義されて います。そこで、次に /etc/rc. subr ファイルをみておく ことにしましよう。 /etc/rc.subr /etc/rc. subr ファイルでは、上記のように /etc/rc ファ イルから呼び出される / etc / rc. d ディレクトリ内のスクリ プトを実行するときに使う関数群が定義されています。 まず、 rc. subr ファイルが FreeBSD 以外のマシンで動 UN 工 X MAGAZINE 2004.2 いたものを FreeBSD に移植したものです。これは、ファ げる rc. subr ファイルは、もともと NetBSD で使われて に書かれているものが多くあります。じつは、今回とりあ ときにも触れましたが、 NetBSD でも同様に動作するよう よう。 rc 関連のファイルは、 rcorder コマンドを紹介した 作することを考慮すべきかどうかについて述べておきまし