Appendix A 再構築 では " i386 " である。 A. 1.2 cpu これは使っているプロセッサを指定する。ここでは ( 486 などを使っていて も戸 i386 " と指定する。 こまではどの機械でも同しである。次の ident に はこれから作成するカーネルの名前 ( たとえば BERT や MYBSDI など ) を 書く。この名前は実際のホスト名と同じである必要はない。この名前もファ イル名と同様すべて大文字で指定することが多い。また、 ここで指定した名 前はコンパイル時に cpp の定数として定義される。そのためコード中に次の ように書くと MYBSDI 専用のカーネルを作ることができる。 #ifdef MYBSDI / * MYBSDI 専用のコ #endif A. 1.3 timezone ド * / 計算機のある場所が UTC ( 世界協定時 ) と比べてどれだけずれているかを 時間単位で指定する。また夏時間の指定もできる。カーネルは内部では時 刻を UTC で管理している。しかし、ユーザーは生活している場所によって 時刻が異なるため、時差に関する情報をこれまではカーネルが管理してい た。そして、 C のライプラリがこの時差情報を使って実際に使われている場 所の時間に変換していた。しかし、このように時差をカーネルに埋め込む 方法ではバイナリで UNIX を配布しようとした場合に C のライプラリの再 コンパイルが必要になるが、それができない。またソースの配布でも困難 である。そのため現在では時差情報をカーネルの外側で管理するようになっ た。その管理ファイルは / etc / 1 。 caltime である。このファイルはディレクト リ /usr/share/zoneinfo の下に世界各地のファイルがあるので、それをコピー して用いる。日本の場合には Japan をコピーする。 現在カーネルはこの値を BSD / 386 の起動時にパーソナルコンピュータ ( 以 下 PC と略す ) のリアルタイムクロック (RTC) を読み込む際の時差として利 用している。つまり、この値を 0 とすると RTC を UTC として読み込む。ま た date コマンドで時刻を設定した場合は、 RTC には UTC が保存される。 478
2.2 プロセス管理 ①ー 20 から一 1 の優先度クラスは特権ューザー ( スーパーユーザー ) の権限で実行され るプロセスでなければ設定することができない。 ②優先度クラスを設定するには nice コマンドを用いる。なお、このコマンドは C shell では内部コマンドである。そのほかに外部コマンドとして /usr/bin/nice がある。 次のコマンドは優先度クラス 10 に設定して cc を実行するものである (C shell の 場合 ) 。 % nice + 10 cc 土 00. c 優先度クラスに負の数を指定する場合には、たとえば一 10 を指定する場合には 、、十 10 〃の代わりに、、一 10 〃とする。 外部コマンドの nice を使う場合には優先度クラスの指定方法が次のように異なる。 $ nice ー 10 cc f00. c 〃は引数の始まりを示し、負の数を表しているわけではない。負の数を指定す る場合には、、 - ー 10 〃のように指定する。 ③ nice コマンドを優先度クラスを設疋せずに実行した場合の優先度クラスは CsheII の場合 4 に、 /usr/bin/nice の場合には 10 に設定される。また C shell の場合、 コマンドを指定せずに実行すると、シェルの優先度クラスが 4 に設定される。 れ以降、起動するプロセスの優先度クラスがすべて 4 になる。 ④設定した優先度クラスは子プロセスにも引き継がれる。 さて、本書の読者はスーパーユーサーの権限を持っことが多いだろう。 UNIX は比較的自由な環境を提供するオペレーティングシステムであるだけ に、もしスーパーユーザーが低い道徳心を持っているとシステムの効率を大 きく落とす可能性がある。その 1 つの例が優先度クラスの設定である。スー パーユーザーは、優先度クラスを一 20 にまで設定することにより、通常のプ ロセスに優先度で 40 の差を設定することができる。これは一定の経過時間 により与えられるハンディキャップでも埋めることができない差である。し たがって、システムの負荷が高いときにこのような設定をすることは、大き 47
7 章ソフトウェア開発環境 lib ライプラリ名 . a という名前になっている。これらのライプラリをリンクするには cc コマン ドで一 1 オプションを使って指定する。ライプラリ libbar. a をリンクする例 を次にあげる。 % cc 土 00. c —lbar ところで printf などの関数を使うときは libc. a をリンクしなければなら ないので本来は % cc f00. c —lc のように指定しなければならない。しかし、 cc コマンドはデフォルトで libc. a をリンクするようにリンカ 1d を起動するので、特に指定する必要はない。 7.1.4 ライプラリの作り方 いろいろプログラムを作ってくると、自分専用のライプラリがほしくなる こではライプラリの作り方について説明する。 ことがある。 ます、ライプラリファイルの構造について説明しよう。ライプラリファイ ルはアーカイプファイルと呼ばれる形式になっている。このファイル形式は いくつかのファイルを 1 つにまとめたファイルのことを指している。 ライプラリの場合、いくつかのリロケータブル・オプジェクトファイルを 1 つのファイル ( つまりライプラリファイル ) にまとめている。たとえば libc. a は関数 printf の本体がある printf. 。や getchar の本体 getchar. 。などといっ たオプジェクトファイルを 1 つにまとめている。こうすることによって不必 要なファイルをリンクせすにすむ。 さて、アーカイプファイルを扱うためのコマンドが ar コマンドである。 のコマンドはアーカイプファイルを作成したり、保存されているファイル名 を表示することができる。しかし、矼コマンドは単純に複数のファイルを アーカイプ形式のファイルにする機能しか提供していない。 リンカ ld はラ イプラリの中から目的の関数を探す場合、 2 つの方法をとる。 1 つ目は、あらかじめライプラリファイル中に、、どの関数はどのファイル 340
5 章基本ツール この場合、 rlogin などしても正しく表示されるように、同時に alias rlogin 'rlogin \ ! * ; cd . ) とすると、 30 秒ごとに checknews というコマンドが実行されることになる。 alias periodic checknews set tperiod = 30 をセットすることによって指定する。たとえば マンドが実行される。実行する時間間隔は tperi 。 d というシェル変数に秒数 peri 。 dic という名前であるコマンドを alias すると一定時間ごとにそのコ などをしておき、 . cshrc の最後に、、 cd . 〃を入れておくとよい。 ・ cd コマンドの動作のカスタマイズ にカスタマイズできる。 ディレクトリ移動は頻繁に行う操作である。これも自分の使いやすいよう ■ディレクトリ移動 204 コマンドのソースプログラムのあるディレクトリに移動することができる。 などと設定しておくと、、、 cd コマンド名 ( ls 、 rm など ) 〃でどこからでもその set cdpath=(/usr/src/{bin, sbin,usr. {bin, sbin}}) 合は、 ( 図 5 ー 2 ) 。システムのユーティリティコマンドのソースが展開されている場 src というディレクトリがないか順に探して存在した場合はそこに移動する うディレクトリがなかった場合、 cd コマンドは / usr の下、 /public の下に と前もって設定されていたとすると、カレントディレクトリの下に src とい set cdpath= (/usr /public) なければ、、 N 。 such file or directory. 〃といわれる。しかし レクトリの下に src というディレクトリが存在すればそこに移動し、存在し を探すパスを指定する。たとえば cd src を実行すると、通常はカレントディ シェル変数 cdpath は cd コマンドが、引数として与えられたディレクトリ
Appendix A 再構築 から起動可能なカーネルを生成する。しかし、この指定は ident で GENERIC を指定していなければならない ( つまり GENERIC カーネルだけ ) 。 A. 1.6 options カーネルのコンバイル時のオプションをここで指定するためのものである。 たとえば options VIP と記述すると、コンパイル時に v 工 p というシンポルが cpp で定義される。また options VIP="vip" と記述すると、 v ェ p の値が vip に 定義される。 ident のときと同じようにコードに #ifdef などを指定すること によって適当な機能を選択することが可能になる。 A. 1.7 controller 周辺装置を指定するキーワードで、他の周辺装置の親となるような装置を 指定する。特に controller isao は必須であり、省略することができない。 また、割り込みレベルや DMA のレベル、 I / O のアドレスもここで指定する。 詳しくは以下で例を使って説明する。 A. 1.8 device サプュニットを持たない周辺装置を指定する。 disk 、 tape はこのキーワー ドと同し意味である。 controller と同じように割り込みレベルなども記述で きる。 A. 1.9 pseudo-device 実体を持たない仮想的な装置を記述する。たとえば仮想端末をこれで指定 する。 A. 2 ( 例 ) gateway の設定 ここでシステムの構成として 2 枚のイーサネットカードを接続して、いわ ゆる gateway ( あるいはルータ ) として構成する場合について説明する。ハー ドウェア構成は SCSI ディスク、 NE2000 ィーサネットインターフェイスが あるものとする。手順の概要は次のとおり。 480
5.3 5.3.7 起動時オプション / リソース GNU Emacs (MuIe) MuIe の起動時に付けることのできるオプションはたくさんあるが、 中で便利なものをいくつかあげておこう。 その フ。シ - ョン -u ューザー名 -f 関数名 -f s ピクセル数 —fncn フォント名 —fnbig5 フォント名 —fnjp フォント名 -fnkr フォント名 —fnhbw フォント名 説明 などのように用いることが多い alias gnus 'mule —f gnus ' alias mhe 'mule —f mh—rmail ' 起動と同時に指定された関数を実行。 . cs c の中で 指定されたユーザーの . emacs をロードして起動 X で使用している場合、 MuIe のウインドウを開くのではなく、 へプライ語フォントの指定 ハングルフォントの指定 日本語フォントの指定 中国語 Big5 フォントの指定 中国語 GB フォントの指定 フォントサイズの指定 、、流し台〃アイコンを使う kterm (xterm など ) 上に起動する また、同様の指定は ~/. xresources に記述するリソースで行う る。たとえば以下のように設定する。 ! フォント設定 . fontsize: 24 こともでき mule mule mule mule —*—fixed—medium—r—norma1——*—*—is08859—1 . fontltnl: . fontkana: —*—fixed-medium—r—norma1--*-*—J iSX0201.1976 ー 0 —*-fixed—medium—r—norma1——*-*—jisx0201.1976 ー 0 mule . fontroman : . fontJp : —*—fixed-medium—r—normal——*—*—j iSX0208.1983 ー 0 —*—fixed—medium—r-norma1——26—*-gb2312.1980 ー 0 . fontcn: 275 mule . bitmaplcon: on 「流し台」アイコンにする mule. geometry: 80X28 ! 80 桁 28 行に設定
6 章生活環境の整備 分の予定を書く。しかし ~ /. P15 に書かれたものはそのまま ( BSD / 386 の finger では ~ /. pr 。 ject のすべての内容が表示されるが、システムによって は最初の 1 行しか表示されない ) 表示されるので、こちらに自分の連絡先を 書いたり、メッセージを入れたり、自分の売りたいもの買いたいものを書い たりする人も少なくない。 6.2.2 リアルタイムコミュニケーション これまで述べてきたような手段を使って、どこにだれがいるのかを知りた いおもな目的は相手と連絡をとりたいからである。メールを送るのも 1 つの 手であるが、もっと直接的に会話するためのツールも用意されている。 ■ phone ph 。 ne は 3 人以上でも会話ができる。使い方は talk とはとんど同じであ る。日本語化されている phone なら ~/. phonerc に set COde jis ( 表示できる漢字コードが JIS コードの場合。 日本語 EUC では、、 euc ″、シフト JIS では、、 shift-jis" を指定 ) とセットしておくと、ローマ字で入力するとダイナミックにひらがなに変換 して表示してくれるのが大きな特徴である。 非常に忙しいときなど、 phone で呼び出されるのがわすらわしく感じるこ ともあるだろう。そのような場合は mesg Ⅱを実行する。こうすると他のユー サーから自分の端末に書き込みができなくなる。再び write などを受け付け るようにするためには mesg y とする。 ・インターネット・リレーチャット (l RC) インターネット上でチャットをする。インターネット上で公開されている IRC サーバが起動されているホスト ( 日本では現在 endo. wide. ad. jp 、 utsun. s. u- tokyo ・ ac ・ jp 、 irc ・ astem. or. jp など 20 近くのホストで立ち上げられている ) が いくつか存在し、その中で自分のサイトからいちはん近いホストを指定して IRC クライアントを立ち上げる。 IRC クライアントとしては、 Emacs Lisp で書かれていて Mule 上で利用できるもの ( irchat. el ) や端末で利用できるも の (ircll) 、 TcI/Tk を利用した x 対応のもの ( zirc 。 n ) などがある。あるサー 302
A. 1 再構築 BSD/386 しか使わない場合にはこれでも構わないが、同し機械で MS-DOS も起動したい場合には、混乱が生しる場合がある。そのため timezone の値 を一 9 とすると RTC の時刻を日本標準時として読み込む。また設定も時差を 考慮する。 A. 1.4 maxusers カーネル内のさまざまなテープルの大きさを与えるためのパラメータであ る。名前はユーサーの数となっているが、実際にこれを超えるユーザーがロ グインしても問題はない。もちろん、ファイルが作れなくなったりプロセス が起動できなくなることはありえる。通常は 10 になっている。 A. 1.5 config c 。 nfig コマンドで作成するカーネルの名前を指定する。名前は何でもよい が、通常は bsd という名前にする。カーネル名のあとにいくつかオプション を指定することができる。それはて。。 t 、 swap 、 dump である。これらはそれぞ れて 00t ファイノレシステム、 swap ノヾーティション、カーネノレクラッシュ時の core イメージの保存パーティションを表している。たとえば root ファイル システムを SCSI ディスク 0 番の a パーティションにしたいときは次のよう に記述する。 config bsd root on sd0a 同様に swap 、 d Ⅷ p も同じように指定できる。また swap として 2 つ以上の ノヾーティションを指定したければ swap 。Ⅱ sd0b and sdlb というように and で連続して記述する。なお、 c 。Ⅱ fig で必要なのはカーネルの名前と root ファ イルシステムの指定だけである。もし、 swap や d Ⅷ p が省略されていた場合 は、 root ファイルシステムと同しディスクの b パーティションが指定され たことになる。また、特殊な config の記述方法がある。それは GENERIC カーネルを作る際に必要なものである。次のように記述する。 config generic このように指定すると、 c 。 nfig コマンドはサポートしているディスクすべて 479
27 プロセス問通信およびネットワーク れる。 67 そのためには通信するプロセスが相互に、しかも一意に認識できる名前が 通信を行う仕組みになっている。 れば自分のソケットを相手のソケットとあらかしめ結合し、それを利用して ーチャルサーキットであ 手のソケットへ 1 つ 1 つのメッセージを送信し、 を表現するのである。つまり、データグラムであれば自分のソケットから相 トを用いる。通信の準備として相手のソケットを指定することによって対象 そこで、 UN Ⅸのプロセス間通信ではプロセスの識別子ではなく、ソケッ どに依存した論理的な名前ではない。 と呼はれる整数で、各プロセスの上で稼働しているプログラムの起動過程な は存在しない。システムがプロセスを一意に識別しているのはプロセス ID ところが、 UNIX のプロセスには、プロセス間通信に利用できるような名前 通信の準備として相手のプロセスが持っているロを指定しなくてはならない。 プロセス間通信においては、対象はプロセス ( のロ ) である。したがって、 きる。 ている。これを指定すれば、間違いなくただ 1 つの対象を指定することがで 名前の構造を利用しており、かならすシステム内で一意に定まるようになっ ファイル名 ( パス名 ) として指定した。 UN Ⅸでは、ファイル名は、階層的な ファイルの open システムコールでは、ロにつながる対象 ( ファイル ) を、 ■対象の指定 差出人の情報が付いている葉書のような方法である。 ら、その伝達路を用いて通信を行う電話のような方法と、各データに宛先や に対応している。すなわち、ます双方を結合する情報の伝達路を準備してか らは、それぞれバーチャルサーキット、データグラムと呼はれるデータ形式 使用されるものは SOCK_STREAM 、 SOCK_DGRAM の 2 つである。これ SOCK-RDM の 5 つのデータ形式を指定することができる。このうち、通常 SOCK_STREAM 、 SOCK_DGRAM 、 SOCK_RAW 、 SOCK_SEQPACKET 、 データの通信に使うか、という情報を引数にとると述べたが、現在の BSD では トコルが存在するという点である。 s 。 cket システムコールはどのような形式の こで注意する点はファイルの読み書きと異なり、通信にはいろいろなプロ
A. 2 ① GENERIC カーネルの config file をコピー ②ファイル中の c 。Ⅱ fig コマンド行を変更 ③ options GATEWAY を指定 ④ィーサネットインターフェイスを指定 ⑤ config コマンドを実行 ⑥ make コマンドを実行 ⑦カーネルをコピー ⑧ /etc/rc などを変更 ⑨ ) reboot ( 例 ) gateway の設定 ますディレクトリ /usr/src/sys/i386/conf に移動し、ファイル GENERIC を MYBSDI としてコピーする。以後このファイルで作業をする。次に co 浦 g 行が generic となっているので、これを現在のハードウェア構成に合わせる。 sd0 は SCSI ディスクを表している。 config bsd て 00t on sd0a swap on sdOb 次に必要なのは GATEWAY というオプションの指定である。このオプション を指定しないとイーサネットインターフェイスが 2 つ以上あってもバケット を転送しない設定になってしまい、経路情報のテープルなどの大きさが小さ いままになってしまう。 GENERIC カーネルではこのオプションがコメント アウトされているのでこれをはすす。 options GATEWAY NE2000 というイーサネットインターフェイスは 1 枚目、 2 枚目をそれぞ れⅡ e0 、 nel という名前で指定することになっている。 device neO at isa? port 0X320 device neO at isa? port 0X340 device ne0 at isa? port 0X360 481 340 、 360 が指定してある。これは起動時にカーネルがこれらのアドレスを GENERIC カーネルでは上のようにⅡ e0 に対して 3 つの I / 0 アドレス 320 、