diff --git a/ja_JP.eucJP/books/handbook/basics/chapter.sgml b/ja_JP.eucJP/books/handbook/basics/chapter.sgml index 0ce4d6974b..a8d9a77dab 100644 --- a/ja_JP.eucJP/books/handbook/basics/chapter.sgml +++ b/ja_JP.eucJP/books/handbook/basics/chapter.sgml @@ -1,1563 +1,1563 @@ Chris Shumway 改訂 Unix の基礎知識 訳: &a.jp.nakai;, 1996 年 10 月 12 日. この章では 基礎知識(basics) 改訂: Chris Shumway cshumway@osd.bsdi.com, 2000 年 3 月 10 日. この章では FreeBSD オペレーティングシステムの基本的なコマンドと機能について記述しています. ここに書かれてあることのほとんどは, どんな Unix オペレーティングシステムにもあてはまります. この章に書いてあることに馴染みがあるなら, この章は気軽に流し読みしてください. あなたが FreeBSD の初心者なら, 何か質問する前にこの章を読んでおいた方がきっといいはずです. この章を読んで分かることは, 次のようなことです. Unix のファイルの許可属性の仕組み プロセス, デーモンとシグナルとはなにか シェルとはなにか. また, デフォルトのログイン環境を変える方法 テキストエディタの基本的な使い方 さらに詳しい情報を得るためのマニュアルページの読み方 許可属性 Unix FreeBSD は BSD Unix の直系の子孫であり, いくつかの鍵となる Unix 思想にもとづいています. まず最も際だった特徴として最初に言えるのは, FreeBSD がマルチユーザのオペレーティングシステムだということです. FreeBSD は同時に働いている複数のユーザすべてを, 完全に分離したタスク上で処理する能力を持っています. また FreeBSD は, ハードウェアデバイス, 周辺装置, メモリ, CPU 時間等への要求を, 各ユーザが平等に利用できるように適切に共有し, 管理する役割を担っています. システムがマルチユーザをサポートしているため, システムが管理する資源はすべて, 誰がその資源を読み・書き・実行できるかを支配する, 一組の許可属性を持っています. これらの許可属性は 3 つの部分からなる 2 桁の 8 進数の形で格納されています. それはそのファイルの所有者(owner)に対するもの, そのファイルが所属するグループ(group)に対するもの, その他(others)に対するものの 3 つです. これを数字を使って表現すると, 次のようになります. 許可属性(permissions) ファイルの許可属性(permissions) 許可属性 ディレクトリの表示 0 読み込み不可, 書き込み不可, 実行不可 --- 1 読み込み不可, 書き込み不可, 実行可能 --x 2 読み込み不可, 書き込み可能, 実行不可 -w- 3 読み込み不可, 書き込み可能, 実行可能 -wx 4 読み込み可能, 書き込み不可, 実行不可 r-- 5 読み込み可能, 書き込み不可, 実行可能 r-x 6 読み込み可能, 書き込み可能, 実行不可 rw- 7 読み込み可能, 書き込み可能, 実行可能 rwx ls ディレクトリ &man.ls.1; に対してコマンドライン引数 を使うと, 詳細なディレクトリリストを見ることができ, ファイルの所有者, グループ, その他への許可属性を示す欄があるのがわかります. 次に示すのは, ls -l の最初の部分だけ抜き出したものです. -rw-r--r-- 最初の(一番左の)文字は, それが 普通のファイルなのか, ディレクトリなのか, キャラクタ型のデバイス特殊ファイルなのか, ブロック型のデバイス特殊ファイルなのか, ソケットなのか, その他の特殊な疑似ファイルデバイスなのかといった種類を示す特別な文字です. この場合, - という文字は, 普通のファイルであることを示します. この例でその次に来る rw- と書かれた 3 文字は, そのファイルの所有者に許可を与えるものです. その次の r-- の 3 文字は, そのファイルが所属しているグループに許可を与えます. 最後の r-- の 3 文字は, システムに存在するその他のユーザに許可を与えます. - は許可が与えられていないことを示します. このファイルの例では, ファイルの所有者はこのファイルを読み書きでき, ファイルの所属しているグループに属するユーザはファイルを読むことだけでき, そのどちらでもないユーザは, このファイルを読むだけできるように許可属性が与えられています. 上の表によれば, このファイルに与えられた許可属性は 644 となります. ここで各数字は, このファイルの許可属性の 3 つの部分を表しています. ファイルについてはここまでの説明で十分です. しかし, デバイスの場合の許可属性はどのようにコントロールされているのでしょうか? FreeBSD は, 大部分のハードウェアをファイルとして取り扱います. そのため, プログラムからは普通のファイルとまったく同じようにオープンし, データの読み書きができるようになっています. これらのデバイス特殊ファイルは /dev ディレクトリに収められています. ディレクトリもまた, ファイルと同様に扱われます. それは読み込み/書き込み/実行の許可属性を持ちます. ディレクトリの実行ビットはファイルのそれとは少し違った意味を持ちます. ディレクトリが実行可能になっているとき, そのディレクトリに移動することができます. つまり, そのディレクトリに cd することが可能です. また, 実行可能属性がついているディレクトリでは, 名前が分かっているファイルにアクセスすることもできます (もちろんそのファイル自体の許可属性によります). 特に, ディレクトリの中の一覧を表示させるためには, そのディレクトリに読み込み属性が設定されていなければなりません. 一方, 名前が分かっているファイルを削除するためには, そのファイルが含まれているディレクトリに 書き込み属性実行属性 の両方が必要です. この他にも許可属性ビットはありますが, いずれも setuid バイナリや sticky ディレクトリなどといった特殊な状況で使われます. ファイルの許可属性そのものについて, また, それらの設定のしかたに関する詳しい情報は, &man.chmod.1; マニュアルページを参照してください. ディレクトリ構造 ディレクトリの階層構造 FreeBSD のディレクトリ構造は, システム全体を理解するに当たって重要です. 把握しておくべき最も重要なものは, / ディレクトリです. このディレクトリは起動時に一番最初にマウントされ, オペレーティングシステムをマルチユーザで動作させるために 必要な基本システムが含まれています. また, ルートディレクトリには, 他のファイルシステムをマウントするためのマウントポイントも含まれます. マウントポイントとはルートファイルシステムに存在する, 追加のファイルシステムと接続するためのディレクトリのことです. 標準的なマウントポイントには /usr, /var, /mnt, /cdrom があります. 通常これらのディレクトリについては, /etc/fstab というファイル中のエントリが参照されます. /etc/fstab さまざまなファイルシステムとマウントポイントの表であり, システムが参照します. /etc/fstab に書かれたファイルシステムは オプションが指定されていなければ, 起動時に &man.rc.8; スクリプトによって自動的にマウントされます. /etc/fstab ファイルの書式やオプションに関しての詳細は &man.fstab.5; をご覧ください. ファイルシステム構造を網羅した説明は &man.hier.7; に書かれています. ここでは, もっともよく使われるディレクトリについて簡単に 見るだけで十分でしょう. ディレクトリ 説明 / ファイルシステムのルートディレクトリ /bin/ シングルユーザ環境とマルチユーザ環境の両方で重要な ユーザユーティリティ /boot/ オペレーティングシステムの起動時に使われるプログラムと設定ファイル /boot/defaults/ デフォルトの起動設定ファイル; &man.loader.conf.5; 参照 /dev/ デバイスノード; &man.intro.4; 参照 /etc/ システム設定ファイルとスクリプト /etc/defaults/ デフォルトのシステム設定ファイル; &man.rc.8; 参照 /etc/mail/ &man.sendmail.8; のようなメール転送エージェントの設定ファイル /etc/namedb/ named 設定ファイル; &man.named.8; 参照 /etc/periodic/ &man.cron.8; 経由で毎日・毎週・毎月実行されるスクリプト; &man.periodic.8; 参照 /etc/ppp/ ppp 設定ファイル; &man.ppp.8; 参照 /mnt/ システム管理者が一時的なマウントポイントとしてよく使う 空のディレクトリ /proc/ プロセスファイルシステム; &man.procfs.5; と &man.mount.procfs.8; 参照 /root/ root アカウントのホームディレクトリ /sbin/ シングルユーザ環境とマルチユーザ環境の両方で重要な システムプログラムと管理ユーティリティ /stand/ スタンドアロン環境で使われるプログラム /tmp/ 一時的なファイル, &man.mfs.8; メモリファイルシステムであることが多い (普通 /tmp の内容はシステムの再起動で失われる) /usr/ 大部分のユーザユーティリティとアプリケーション /usr/bin/ よく使うユーティリティとプログラミングツールとアプリケーション /usr/include/ C の標準ヘッダファイル /usr/lib/ ライブラリ /usr/libdata/ いろいろなユーティリティのデータファイル /usr/libexec/ システムデーモンとシステムユーティリティ (他のプログラムから実行される) /usr/local/ ローカルのプログラムやライブラリなど. FreeBSD ports 構成のデフォルトインストール先としても使われます. /usr/local 内では, &man.hier.7; に書かれている /usr のための一般構造が使われます. 例外は man ディレクトリで, /usr/local/share の下ではなく /usr/local の下に直接置かれ, ports 関係文書は share/doc/port にあります. /usr/obj/ /usr/src ツリーのビルドで作られる アーキテクチャ依存のターゲットツリー /usr/ports FreeBSD ports 集 (インストールしなくてもよい). /usr/sbin/ (ユーザが実行する)システムデーモンとシステムユーティリティ /usr/share/ アーキテクチャに依存しないファイル /usr/src/ BSD のソースファイルまたはローカルのソースファイル, あるいは両方 /usr/X11R6/ X11R6 のプログラム, ライブラリなど(インストールしなくてもよい) /var/ ログ・一時的なファイル・スプールファイルなどいろいろな用途 /var/log/ いろいろなシステムログファイル /var/mail/ ユーザのメールボックスファイル /var/spool/ プリンタとメールシステムのスプールディレクトリなどなど /var/tmp/ システムが再起動しても消えない一時的なファイル /var/yp NIS のマップ ファイルシステムのマウントとアンマウント ファイルシステムは / をルート (根) とする木構造として考えると視覚的に理解しやすいでしょう. ルートディレクトリにある /dev/usr, その他のディレクトリは枝に相当し, それらには, /usr/local などのように, さらに枝分かれすることができます. ルートファイルシステム さまざまな理由がありますが, ディレクトリをいくつかの異なるファイルシステム上に構築するのが良いでしょう. たとえば /var には, log/spool/ など, さまざまな種類の一時ファイルを置くディレクトリがあるため, あふれてしまう可能性があります. ルートファイルシステムをあふれさせるのは得策ではありませんので, 普通は /var/ から分離します. また, 次のような場合も, ディレクトリツリーを 別のファイルシステムに置く理由として良くあげられます. それは, たとえば物理的に別のディスクにディレクトリツリーを置く場合, ネットワークファイルシステム (Network File System) や CDROM ドライブのような別の仮想ディスクに置くという場合です. <filename>fstab</filename> ファイル ファイルシステム fstab を使ったマウント /etc/fstab に書かれているファイルシステムは ( オプションがなければ) 起動プロセスの途中で 自動的にマウントされます. /etc/fstab ファイルは, 次のような書式で書かれた行のリストになっています. device /mount-point fstype options dumpfreq passno device デバイスの名前 (存在していなければなりません). に説明があります. mount-point ファイルシステムがマウントするディレクトリの名前 (存在していなければなりません). fstype &man.mount.8; に渡されるファイルシステムタイプ. FreeBSD ファイルシステムのデフォルトは ufs です. options 読み書きするファイルシステムには , 読み込み専用のファイルシステムには を, 必要な他のオプションの前に指定します. よく使われるオプションは で, 起動時にはマウントされないファイルシステムに使います. その他のオプションは &man.mount.8; マニュアルページに載っています. dumpfreq これは &man.dump.8; が使うもので, どのファイルシステムにダンプが必要なのかを決めます. この項目がなければ, 0 であるものとみなされます. passno これはファイルシステムをチェックする順番を決めます. ファイルシステムチェックを飛ばしたいファイルシステムには, passno を 0 に設定してください. ルートファイルシステム (どれよりも先にチェックしなければなりません) は passno を 1 に設定してください. 他のファイルシステムの passno は 1 以上に設定してください. 同じ passno のファイルシステムがあった場合, &man.fsck.8; は可能であれば並行してファイルシステムのチェック を行なおうとします. <command>mount</command> コマンド ファイルシステム マウント &man.mount.8; コマンドは, ファイルシステムをマウントするために使われるものです. 基本的には, 次のように使います. &prompt.root; mount device mountpoint &man.mount.8; マニュアルページにはたくさんのオプションが書かれていますが, いちばんよく使われるのは次のものです. マウントオプション /etc/fstab にある全てのファイルシステムをマウントします. 例外は noauto の印がついているものと, フラグで除外されたものと, すでにマウントされているファイルシステムです. 実際にシステムコールする以外の全てのことをします. このオプションは フラグと組み合わせて使い, &man.mount.8; が実際なにをしようとしているのか調べるのに便利です. クリーンでないファイルシステムを強制的にマウントします (危険です). もしくは, ファイルシステムのマウント状態を 読み書き可能から読み込みのみに変更するとき, 書き込みアクセスを強制的に取り消します. ファイルシステムを読み込み専用でマウントします. これは 引数を オプションに使うのと同じです. fstype ファイルシステムを指定のファイルシステムタイプでマウントします. または, を使った場合, 指定したタイプのファイルシステムのみマウントします. デフォルトのファイルシステムタイプは ufs です. ファイルシステムのマウントオプションを更新します. 詳細な出力にします. ファイルシステムを読み書き可能にマウントします. には, 次のようなオプションを複数カンマで区切って指定します. 以下に挙げるのはその一部です. nodev ファイルシステム上のスペシャルデバイスを解釈しません. セキュリティのために有用なオプションです. noexec そのファイルシステム上のバイナリの実行を禁止します. セキュリティのために有用なオプションです. nosuid そのファイルシステム上の setuid や setgid フラグを解釈しません. これもセキュリティのために有用なオプションです. <command>umount</command> コマンド ファイルシステム アンマウント &man.umount.8; コマンドは, パラメータとしてマウントポイントの一つ, デバイス名, もしくは といったオプションを取ります. いずれの形式でも で強制的なアンマウントを行ない, で詳細な出力を出します. ただしほとんどの場合, は使わないほうがよいでしょう. 強制的にファイルシステムをアンマウントすると, 計算機がクラッシュしたりファイルシステム上部のデータが 破壊されたりする恐れがあるためです. オプション はマウントされているファイルシステムすべてをアンマウントするのに使います. にファイルシステムタイプを指定すると, 指定されたものだけがアンマウントされます. また, を使うとルートファイルシステムはアンマウントしません. プロセス FreeBSD はマルチタスクのオペレーティングシステムです. つまり, 1つ以上のプログラムがあたかも同時に動いているかのように見える, ということです. 動作中のプログラムはそれぞれ プロセス と呼ばれます. コマンドを実行すると, 最低でも1つの新しいプロセスがスタートします. システムを正常に機能させるために常に動作しているシステムプロセスもたくさんあります. 各プロセスはプロセス ID, もしくは PID と呼ばれる数字でただ一つに識別されます. また, ファイルのように各プロセスには所有者とグループがあります. 所有者とグループの情報は, これまでに見たファイル許可属性を用い, そのプロセスが開けるファイルやデバイスを決定するために使われます. 多くのプロセスには親プロセスもあります. 親プロセスとは, そのプロセスをスタートさせたプロセスのことです. 例えば, シェルにコマンドを打ち込んでいるときはシェルがプロセスで, 動かすコマンドもまたどれもプロセスです. このようにして起動するプロセスはそれぞれシェルが親プロセスになります. これの例外は init という特別なプロセスです. init は常に最初のプロセスなので, PID は必ず 1 になります. init は FreeBSD がスタートするときカーネルによって自動的に起動されます. &man.ps.1; と &man.top.1; という2つのコマンドが システム上のプロセスを確認するために特に便利です. &man.ps.1; コマンドは現在動作中のプロセスのリストを見るために使い, PID やプロセスが使っているメモリの量, どういうコマンドラインで起動されたのか, などを表示させることができます. &man.top.1; コマンドは動作中の全てのプロセスを表示し, 数秒ごとに表示を更新するので, 計算機がなにをしているのかインタラクティブに知ることができます. デフォルトでは, &man.ps.1; は動作中かつ所有者が自分のコマンドのみを表示します. 例えば: &prompt.user; ps PID TT STAT TIME COMMAND 298 p0 Ss 0:01.10 tcsh 7078 p0 S 2:40.88 xemacs mdoc.xsl (xemacs-21.1.14) 37393 p0 I 0:03.11 xemacs freebsd.dsl (xemacs-21.1.14) 48630 p0 S 2:50.89 /usr/local/lib/netscape-linux/navigator-linux-4.77.bi 48730 p0 IW 0:00.00 (dns helper) (navigator-linux-) 72210 p0 R+ 0:00.00 ps 390 p1 Is 0:01.14 tcsh 7059 p2 Is+ 1:36.18 /usr/local/bin/mutt -y 6688 p3 IWs 0:00.00 tcsh 10735 p4 IWs 0:00.00 tcsh 20256 p5 IWs 0:00.00 tcsh 262 v0 IWs 0:00.00 -tcsh (tcsh) 270 v0 IW+ 0:00.00 /bin/sh /usr/X11R6/bin/startx -- -bpp 16 280 v0 IW+ 0:00.00 xinit /home/nik/.xinitrc -- -bpp 16 284 v0 IW 0:00.00 /bin/sh /home/nik/.xinitrc 285 v0 S 0:38.45 /usr/X11R6/bin/sawfish この例で分かるとおり, &man.ps.1; の出力はいくつかの行に整形されています. PID は先ほど見たプロセス ID です. PID は 1 から順に 99999 まで割り当てられ, 足りなくなると最初に戻って使い回されます. TT はプログラムが動いている tty を示します. 差し当たって無視してもかまわないでしょう. STAT はプログラムの状態を示しますが, これもまた無視してよいでしょう. TIME はプログラムがその CPU 上で動いている時間の長さです—これはプログラムをスタートさせたとき からの経過時間であるとはかぎりません. CPU 上で時間を使う必要があるまでかなりの時間を費すようなプログラムもあるからです. 最後に, COMMAND はそのプログラムを起動するのに使われたコマンドラインとなります. &man.ps.1; は表示する情報を変えるためのオプションをたくさんサポートしています. いちばん便利なのは auxww でしょう. は自分のプロセスだけではなく, 動作中のプロセス全部についての情報を表示します. はプロセスの所有者の名前をメモリ使用量と同様に表示します. はデーモンプロセスについての情報を表示し, で, スクリーンに入りきらないほど長くなったコマンドラインでも省略せず, &man.ps.1; に全コマンドラインを表示させます. &man.top.1; の出力も同様です. 例は以下の通りです. &prompt.user; top last pid: 72257; load averages: 0.13, 0.09, 0.03 up 0+13:38:33 22:39:10 47 processes: 1 running, 46 sleeping CPU states: 12.6% user, 0.0% nice, 7.8% system, 0.0% interrupt, 79.7% idle Mem: 36M Active, 5256K Inact, 13M Wired, 6312K Cache, 15M Buf, 408K Free Swap: 256M Total, 38M Used, 217M Free, 15% Inuse PID USERNAME PRI NICE SIZE RES STATE TIME WCPU CPU COMMAND 72257 nik 28 0 1960K 1044K RUN 0:00 14.86% 1.42% top 7078 nik 2 0 15280K 10960K select 2:54 0.88% 0.88% xemacs-21.1.14 281 nik 2 0 18636K 7112K select 5:36 0.73% 0.73% XF86_SVGA 296 nik 2 0 3240K 1644K select 0:12 0.05% 0.05% xterm 48630 nik 2 0 29816K 9148K select 3:18 0.00% 0.00% navigator-linu 175 root 2 0 924K 252K select 1:41 0.00% 0.00% syslogd 7059 nik 2 0 7260K 4644K poll 1:38 0.00% 0.00% mutt ... 出力は2つのセクションに分かれています. ヘッダ(最初の5行です)は動作している最新のプロセスの PID, システムの平均負荷(システムがどれくらい忙しいかの指標), システムの稼働時間(最後の再起動からの時間) と現在の時刻を示します. ヘッダの中の他の数字は動作中のプロセスの数(この場合 47 ですね), 使われているメモリとスワップ領域の量, そしてシステムが異なる CPU 状態に消費した時間と関係します. その下には &man.ps.1; の出力と同じような情報を持った行が続きます. 前と同様 PID にユーザ名, 消費 CPU 時間と実行中のコマンドを知ることができます. &man.top.1; を使うとデフォルトでプロセスが使っているメモリ容量も分かります. メモリ使用量の欄は2項目に分かれており, 一方は合計使用量, そしてもう一方は実使用量です—合計使用量はアプリケーションが必要としているメモリ量で, 実使用量はその時点で実際に使われているメモリ量です. この例では, Netscape がだいたい 30MB の RAM を必要としていますが, いまのところ 9MB しか使っていないことが分かります. &man.top.1; は自動的に2秒ごとに画面を更新します. オプションを使えば更新間隔を変更することができます. デーモン, シグナルとプロセス終了 エディタを使っている場合, エディタを操作するのは簡単です. ファイルを開く, などと動かせばよいのです. このように操作できるのは, エディタにそういった機能があり, かつエディタが端末に関連づけられているからです. 一方, ユーザから始終入力があるように設計されていないプログラムもあり, そういったプログラムは最初から端末と切り離されます. 例えば, ウェブサーバは一日中ウェブのリクエストばかり処理するので, 通常全く入力を必要としません. サイトからサイトへとメールを転送するプログラムも, こういった種類のアプリケーションの一例です. このようなプログラムは, デーモンと呼ばれます. デーモンはギリシャ神話の登場人物で, 善でも悪でもなく, 大雑把にいうと, 人間のために役立つことをしてくれる小さな妖精さんです. 今日の便利なウェブサーバやメールサーバととてもよく似ていますね. このため, 長い間 BSD のマスコットはスニーカーをはいてフォークを携えた かわいらしい姿のデーモンなのです. 通常デーモンとして動作するプログラムには末尾に d を持った名前をつける慣習があります. BIND は Berkeley Internet Name Daemon ですし (実際実行されるプログラムは named という名前です), Apache ウェブサーバのプログラムは httpd と呼ばれますし, ラインプリンタスプーリングデーモンは lpd, などなどです. これは単なる慣習で, しっかりがっちりとしたルールではありません. 例えば, Sendmail アプリケーションの主なメールデーモンは sendmail という名前で, 連想しそうな maild ではありません. 時々, デーモンプロセスと通信したいときがあります. この通信はシグナルと呼ばれ, デーモンにシグナルを送ることによってデーモン (に限らずどんな動作中のプロセスでも)と通信することができます. 送信可能なシグナルはたくさんあります—特別な意味があるものもあれば, アプリケーションによって解釈されるものもありますし, アプリケーションがシグナルをどう解釈するかは そのアプリケーションの文章を読めば分かるでしょう. 自分が持っているプロセスにしかシグナルを送ることはできません. 他人のプロセスに &man.kill.1; や &man.kill.2; を使ってシグナルを送っても, 許可されないでしょう. これの例外は root ユーザで, ルートユーザは誰のプロセスでもシグナルを送ることができます. FreeBSD もアプリケーションにシグナルを送ることがあります. アプリケーションを下手に書くと, 予想外のメモリにアクセスしようとするので, FreeBSD がプロセスに セグメンテーション違反 シグナル (SIGSEGV) を送ります. ある程度の時間が経ったら &man.alarm.3; システムコールを使って警告してもらうようなアプリケーションには, 警告シグナル (SIGALRM) が送信される, などです. プロセスを止めるためには2つのシグナル, SIGTERMSIGKILL を使います. SIGTERM は穏かにプロセスを終了させる方法です. プロセスはシグナル受け取ることができ, 終了させたいのだなということを理解し, 開いているログファイルを全部を閉じ, 一般的に終了前にしていたことを終えることができます. 中断できない処理の途中だと, SIGTERM をプロセスが無視することもあるかもしれません. プロセスは SIGKILL を無視することができません. これは, なにをしていようが構わないから今すぐ止まれ というシグナルです. プロセスに SIGKILL を送ると, FreeBSD はそのプロセスをそこで止めます 正確ではありません—中断できないものはわずかながら存在します. 例えば, プロセスがネットワーク上の別の計算機にあるファイルを読もうとして, その計算機がなんらかの理由 (電源を落とされたとか, ネットワークに問題があるとか) でいなくなった場合, そのプロセスは中断不可能と言われます. 最終的にはそのプロセスはタイムアウトします. 普通は2分後です. タイムアウトした直後, そのプロセスは終了します. . 使う可能性のあるシグナルは, 他に SIGHUP, SIGUSR1, と SIGUSR2 があります. これらは一般的な用途のシグナルで, このシグナルが送信されたときアプリケーションによって別のことをします. ウェブサーバの設定ファイルを変更したとしましょう—ウェブサーバに新しい設定を再読み込みさせたいですね. httpd を止めて再起動することもできますが, そうするとウェブサーバは一瞬ながら停止してしまいますし, ちょっとでも止まってほしくないこともあるでしょう. ほとんどのデーモンは SIGHUP シグナルに対して設定ファイルを再読み込みする反応を返すよう書かれています. 従って, httpd を止めて再起動する代わりに, SIGHUP シグナルを送りましょう. これらのシグナルへの標準的な反応というものがないために, デーモンごとに行動が違うので, 疑問があれば必ずそのデーモンの文書を読んでください. &man.kill.1; コマンドを使って送るシグナルはこの例をご覧ください. プロセスにシグナルを送る この例では, &man.inetd.8; にシグナルを送る方法を示します. &man.inetd.8; の設定ファイルは /etc/inetd.conf で, &man.inetd.8; は SIGHUP が送信されるとこの設定ファイルを再読み込みします. シグナルを送りたいプロセスのプロセス ID を探します. それには &man.ps.1; と &man.grep.1; を使います. &man.grep.1; コマンドは出力を検索するために使い, 指定した文字列を探します. このコマンドは一般ユーザで実行しますが, &man.inetd.8; は root で実行されているので, &man.ps.1; には オプションを与える必要があります. &prompt.user; ps -ax | grep inetd 198 ?? IWs 0:00.00 inetd -wW ということで, &man.inetd.8; の PID は 198 です. grep inetd コマンドがこの出力に出てくる場合もあります. それは, &man.ps.1; が動作中のプロセスのリストを見つける方法によります. &man.kill.1; を使ってシグナルを送ります. &man.inetd.8; は root で起動されているために, まず &man.su.1; を使って root にならなければなりません. &prompt.user; su Password: &prompt.root; /bin/kill -s HUP 198 大部分の Unix コマンドと同じく, 成功したら &man.kill.1; は何の出力も表示しません. 自分のものではないプロセスにシグナルを送ると, kill: PID: Operation not permitted と表示されます. PID を打ち間違えると, 悪いことに間違ったプロセスにシグナルを送ってしまうか, もしくは運がよければその時点で使われていない PID にシグナルを送ったことになり,kill: PID: No such process と表示されます. なぜ <command>/bin/kill</command> を使うんでしょう? 多くのシェルは kill コマンドを組み込みコマンドとして備えています. つまり, /bin/kill を実行するのではなく, シェルが直接シグナルを送ります. これはとても便利なのですが, シェルが違うと送るシグナルの名前の指定の仕方が違います. シェルによって異なるシグナルの指定の仕方を全部覚えようとはせずに, /bin/kill ... コマンドを直接使うほうが簡単です. 他のシグナルの送り方はほとんど同じで, コマンドラインの TERMKILL を必要に応じて変えるだけです. システム上のランダムプロセスを終了させるのはよくありません. 特に, プロセス ID が 1 の &man.init.8; は特別です. Running /bin/kill -s KILL 1 を使うといとも簡単にシステムをシャットダウンさせることができます. Return を押すに &man.kill.1; を実行する引数を二重にチェックするをつけてください. シェル シェル(shell) コマンドライン FreeBSD では日々の作業のほとんどは, 「シェル」と呼ばれるコマンドラインインタフェイスを通して行われます. シェルの主な仕事はコマンドを入力チャンネルから受け取り, そしてそれらを実行することです. 大部分のシェルはさらに組み込みの機能を持っていて, 日々の作業, ファイル管理やファイル名の展開, コマンドライン編集, コマンドマクロ, 環境変数などに便利です. FreeBSD には sh (Bourne Shell) や tcsh (高機能 C-shell) が含まれています. また, これ以外にも zshbash などたくさんのシェルが FreeBSD Ports Collection から利用可能です. 「あなたは, どのシェルを使いますか?」という質問は, まったく趣味の問題です. あなたが C のプログラマだったとすれば, tcsh のような C 風のシェルの方が落ち着くかもしれません. Linux から来た人や Unix のコマンドラインインタフェイスになじみがなければ, bash を試すのも良いでしょう. ポイントは, それぞれのシェルは, あなたの好みの作業環境で利用できる(もしくはできない)独自の機能を持っているということ, そして, どのシェルを使うことにするかを決めるのはあなた自身だということです. シェルの一般的な機能の一つに, ファイル名の補完があります. コマンドやファイル名の最初の数文字を与えて Tab キーを押すことで, シェルにコマンドやファイル名の残りの部分を自動的に補完させることができます. 例をあげましょう. 二つのファイル foobar, foo.bar が あったとします. ここで foo.bar の方を削除するには, rm fo[Tab].[Tab] と入力します. 環境変数(environment variables) するとシェルは rm foo[BEEP].bar と出力するでしょう. [BEEP] のところはコンソールのベル(訳注: 通常はビープ音が鳴ります)です. これは複数のファイルがマッチしたため, ファイル名の補完を完全に行なえなかったことを伝えています. foobarfoo.bar は 両方とも fo ではじまるため, 補完できるのは foo までです. ここで . を入力して Tab を押せば, シェルはファイル名の残りの部分を補完できます. もう一つあげられるシェルの特徴として, 環境変数があります. 環境変数とは, シェルの環境変数空間におけるキーと値とのペアです. この変数空間は, そのシェルから起動されたプログラムから参照でき, それを利用してプログラムの設定を保存するのに利用されます. 下の表は, 一般的な環境変数とその意味を示したものです. 環境変数(environment variables) 変数名 意味 USER 現在のログインユーザのユーザ名. PATH コロンで区切られた実行ファイル探索のための ディレクトリのリスト. DISPLAY 接続する X11 ディスプレイのネットワーク名(存在する場合のみ). SHELL 現在のシェル. TERM ユーザの端末名. 端末のケーパビリティを決定するのに使われる. TERMCAP 種々の端末の機能を実現する端末のエスケープコードの データベースのエントリ. OSTYPE オペレーティングシステムの種別. たとえば FreeBSD. MACHTYPE システムが動作している CPU のアーキテクチャ. EDITOR ユーザの選んだテキストエディタ. PAGER ユーザの選んだテキストページャ. MANPATH コロンで区切られたマニュアルページ探索のための ディレクトリのリスト. Bourne シェル(Bourne shells) 環境変数をセットする方法は, それぞれのシェルごとに多少異なります. たとえば, tcshcsh 等の C シェルでは setenv を使います. shbash 等の Bourne シェルでは setexport を使います. たとえば cshtcshEDITOR 環境変数の値を /usr/local/bin/emacs に セットするか変更するには, 次のようにします. &prompt.user; setenv EDITOR /usr/local/bin/emacs Bourne シェルでは次のようになります. &prompt.user; export EDITOR="/usr/local/bin/emacs" ほとんどのシェルでは, コマンドライン中の変数名の前に $ 文字を置くことで, 環境変数を展開させることができます. たとえば, echo $TERM$TERM が セットされている内容を表示します. それはシェルが $TERM を展開して echo に渡しているからです. シェルはさまざまな特殊文字を, 特別なデータを表すものとして扱います. その特殊文字はメタキャラクタと呼ばれます. もっとも一般的なものは * で, これはファイル名に含まれる, あらゆる文字を表します. これらの特殊なメタキャラクタはファイル名の展開に使われます. たとえば, echo * と入力すると ls と入力したのとほとんど同じ結果を得られます. これはシェルが * とマッチするすべてのファイルを 受け取って echo のコマンドラインに渡し, 表示するからです. これらの特殊文字をシェルに解釈させないようにするため, 特殊文字の前にバックスラッシュ文字 (\) を置くことができます. echo $TERM は, あなたの端末が何にセットされているかを表示します. echo \$TERM$TERM と そのまま表示します. シェルの変更 シェルを変更する一番簡単な方法は chsh コマンドを使うことです. chsh を実行すると 環境変数 EDITOR で示されたエディタが立ち上がります. 環境変数をセットしていなかった時は vi が立ち上がります. Shell: の行を適宜変更してください. chsh オプションをつけると, エディタを起動せずにシェルを変更することが可能です. たとえば, シェルを bash に変えたいなら, 次のようにしてください. &prompt.user; chsh -s /usr/local/bin/bash chsh をパラメータなしで実行し, エディタでシェルを変更しても同じことができます. 使おうと思っているシェルは必ず /etc/shells 中に書かれているものでなければなりません. シェルを Ports コレクションから インストールしていたのであれば, すでにそれは行なわれていますが, 手動でインストールした場合は, それを忘れずに行ってください. たとえば, bash を手動で /usr/local/bin にインストールした場合 以下のようにする必要があります. &prompt.root; echo "/usr/local/bin/bash" >> /etc/shells そして chsh を実行してください. テキストエディタ テキストエディタ エディタ さまざまな FreeBSD の設定は, テキストファイルを編集することで行われます. そのため, テキストエディタの扱いに慣れると良いでしょう. FreeBSD には, 基本システムの一部として二, 三提供されるものと, Ports collection から利用できる, たくさんのテキストエディタが用意されています. ee 最も学習が簡単なエディタは, easy editor の略で ee と呼ばれるものです. ee を立ち上げるには, コマンドラインから ee filename と入力します. ここで filename は, 編集しようとしているファイルの名前です. たとえば, /etc/rc.conf を編集するには ee /etc/rc.conf と入力します. 一旦 ee の中に入れば, エディタの機能を操作するコマンドはすべてディスプレイの上部に 表示されています. キャレット ^ 文字は キーボードの Ctrl キーを意味しますので, ^e はキーのコンビネーション Ctrle を押すという意味になります. ee を終了するには Esc キーを押し, そして leave editor を選びます. ファイルが更新されていたときは, エディタは変更をセーブするかどうかプロンプトを出します. vi エディタ vi emacs エディタ emacs FreeBSD には, 基本システムの一部として vi, 一方 emacsvim といった他のエディタは Ports Collection の一部として, より強力なテキストエディタが用意されています. これらのエディタはやや学習が複雑ですが, より強力で高い機能性を提供します. しかし, あなたが多量のテキストを編集することを考えているなら, vimemacs といった強力なエディタを習得することは, より多くの時間を節約することでしょう. デバイスとデバイスノード デバイスとはシステム上のハードウェアに関するものに対してよく使われる用語で, ディスクやプリンタ, グラフィックカードやキーボードが含まれます. FreeBSD が起動するとき, FreeBSD が表示しているものの大部分は検出されたデバイスです. /var/run/dmesg.boot を眺めれば起動メッセージを読み直すことができます. 例えば, acd0 は最初の IDE CDROM ドライブで, kbd0 はキーボードを表します. Unix オペレーティングシステムにおけるデバイスのほとんどは, デバイスノードと呼ばれる /dev ディレクトリにあるスペシャルファイルを通してアクセスしなければなりません. デバイスノードを作成する 新しいデバイスをシステムにつけ足したり, - 追加デバイスのサポートをコンパイルして加えたりするとき, - デバイスドライバを作成する必要がよくあります. + 追加デバイスのサポートをコンパイルして加えたりするときは, + デバイスノードを追加で作成しなければならない場合があります. MAKEDEV スクリプト - DEVFS がないシステムでは, + DEVFS がないシステムでは, 以下に示すように &man.MAKEDEV.8; スクリプトを使ってデバイスノードを作成します. &prompt.root; cd /dev &prompt.root; sh MAKEDEV ad1 この例では, 取りつけられたとき2番目に当たる IDE ドライブにとって適切なデバイスノードを作ります. - devfs (デバイスファイルシステム: Device File System) + <literal>DEVFS</literal> (デバイスファイルシステム: Device File System) - デバイスファイルシステム, つまり devfs は, + デバイスファイルシステム DEVFS は, グローバルファイルシステム名前空間の中のカーネルデバイス名前空間へのアクセスを提供します. デバイスノードを作成したり変更したりするのではなく, - devfs がこの特別なファイルシステムを管理するのです. + DEVFS がこの特別なファイルシステムを管理するのです. 詳しくは &man.devfs.5; マニュアルページをご覧ください. - FreeBSD 5.0 では devfs がデフォルトで使われています. + FreeBSD 5.0 では DEVFS がデフォルトで使われています. さらに詳しい情報を得るには... オンラインマニュアル マニュアルページ FreeBSD についてのもっとも包括的な文書は, マニュアルページの形式になっているものです. FreeBSD システム上のほとんどすべてのプログラムには, 基本的な操作方法とさまざまな引数を説明しているリファレンスマニュアルが添付されています. これらのマニュアルは man コマンドで見ることができます. man コマンドの使い方は簡単です. &prompt.user; man コマンド名 コマンド名 のところには, 知りたいコマンドの名前を入れます. たとえば ls コマンドについて知りたい場合には, 次のように入力します. &prompt.user; man ls オンラインマニュアルは, セクション番号で分類されています. ユーザコマンド システムコールとエラー番号 C のライブラリ関数 デバイスドライバ ファイル形式 ゲームや娯楽 さまざまな情報 システムの管理と操作のためのコマンド カーネル開発者のための情報 時折, 同じトピックがオンラインマニュアルの複数のセクションに記載されている場合があります. たとえば, chmod ユーザコマンドと chmod() システムコールの場合がそれに該当します. この場合, man コマンドにセクション番号を与えることで, どちらを参照したいかを指定することができます. &prompt.user; man 1 chmod 上のようにすれば, ユーザコマンド chmod のマニュアルページが表示されます. オンラインマニュアルの特定セクションへの参照は, 慣習的に書かれている文書で括弧の中に示されます. すなわち, &man.chmod.1; は chmod ユーザコマンドを, &man.chmod.2; はシステムコールの方を示しています. コマンドの名前を知っていて, 単純にその使い方を知りたい場合はここまでの説明で十分でしょう. しかし, もしコマンドの名前を思い出せない場合にはどうしたら良いのでしょうか? man スイッチをつければ, コマンド解説(description)の文章から, 指定したキーワードを検索することができます. &prompt.user; man -k mail このコマンドにより, mail というキーワードをコマンド解説に含むコマンドの一覧が表示されます. 実際には, これは apropos コマンドを使う場合と同等の機能です. それでは, /usr/bin にあるさまざまなコマンドすべてを見ていて, それらが実際にどう働くのかが, まったく見当もつかないときには どうしたら良いでしょう? そのときは単純に, &prompt.user; cd /usr/bin &prompt.user; man -f * とするか, あるいは同じ働きをする &prompt.user; cd /usr/bin &prompt.user; whatis * としてください. GNU の Info ファイル Free Software Foundation FreeBSD には Free Software Foundation (FSF) によるアプリケーションや ユーティリティがたくさん含まれています. これらのプログラムには, マニュアルページに加えて info ファイルと呼ばれる ハイパーテキスト形式の文書が付属しています. この文書は info コマンド, あるいは emacs をインストールしているなら emacs の info モードで読むことができます. &man.info.1; コマンドを使うには, 単に次のように入力します. &prompt.user; info h と入力すると, 簡単な手引きを読むことができます. クイックコマンドリファレンスは ? を入力してください.