今回はデーモンというものに触れていきます。デーモンというのはシステムの中でユーザーには見えないような裏の部分で動いているものです。仕事内容はシステムの維持やユーザーに対してサービスを提供したりなどがあります。
デーモンと言われるとよく想像するのがdemon(悪魔)ですが、今回扱うデーモンはdaemon(守護神)のことを意味します。
デーモンの説明をする前準備として、先に必要となるいくつかの新たな概念の説明をします。
プロセスというのは現在動いているプログラムのことをさします。これはデーモンだけではなくコマンドなど、OS上で動いているものすべてです。コマンドのプロセスの生成から終了までは以下のようになります。
$ ps [オプション...]
$ ps aux USER PID %CPU %MEM VSZ RSS TTY STAT START TIME COMMAND root 1 0.0 0.0 3216 560 ? S Jun05 0:00 init [3] root 2 0.0 0.0 0 0 ? S Jun05 0:00 [migration/0] root 3 0.0 0.0 0 0 ? SN Jun05 0:00 [ksoftirqd/0] root 4 0.0 0.0 0 0 ? S Jun05 0:00 [migration/1] root 5 0.0 0.0 0 0 ? SN Jun05 0:00 [ksoftirqd/1] root 6 0.0 0.0 0 0 ? S< Jun05 0:00 [events/0] …中略… root 3494 0.0 0.2 9396 2252 ? SNs Jun05 0:00 cupsd root 5818 0.0 0.0 0 0 ? S< Jun05 0:00 [krfcommd] root 5849 0.0 0.0 3336 876 ? Ss Jun05 0:00 hcid: processing events root 5853 0.0 0.0 2548 528 ? Ss Jun05 0:00 sdpd httpd 13781 0.0 0.1 4708 1848 ? S Jun07 0:00 /usr/local/httpd/bin/httpd foo 24160 0.0 0.0 3284 744 pts/0 R+ 09:12 0:00 ps aux
USERは誰の権限で実行しているかを表します。PIDはプロセスに割り振られたID番号でプロセスIDと呼びます。STATはそのプロセスが現在どんな状態であるかを表します。COMMANDはどんなコマンドやデーモンなどのプロセスが動いているかを表します。
今、実行したのはps auxというコマンドでしたが、コマンド以外にもいろんなプロセスが動いていることがよくわかると思います。
シグナルというのはプログラマがキーボードなどから信号を送って制御するためのものです。例としては暴走したプロセスを強制終了したり、現在動かしているプロセスを中断してやめるときなどに使います。たとえば以下の4種類などがあります。
種類 | 用途 |
---|---|
INT(INTerrupt) | 現在ユーザが実行しているプロセスに対して割り込みをかけます。端末上でCtrl+cと入力するとこの効果を得ます。 |
TERM(TERMinate) | 終了させるという意味どおり、プロセスを終了させるために使います。 |
HUP(HangUP) | デーモンなどの設定ファイルなどについては再読み込みをすることもあります。 |
KILL(KILL) | INTやTERMでは終了できないような(暴走している)プロセスを強制的に終了させるために使われます。 |
シグナルはコマンドを使っても送れます。コマンド名はkillです。
$ kill [オプション] シグナル プロセスID
シグナルは上記のものなどを使います。
$ kill -s TERM 1234
リンクとはコマンドでいうエイリアスのようなものです。リンクを作成するにはこのコマンドを使います。
ln [オプション] リンク元 リンクの置き場所
$ ln -s hoge bar
確認してみましょう。確認にはlsコマンドに-lオプションをつけて実行します。
$ ls -l -rw-rw-r-- 3 foo foo 50 5月 1 21:21 hoge lrwxrwxrwx 1 foo foo 4 6月 19 10:52 bar -> hoge
第二回のアクセス権の項で説明したファイルタイプの場所にlというのが表示されています。これはシンボリックリンクのファイルタイプを表すものです。また「-> hoge」というのはこのファイルはhogeというファイルへのリンクであることを示します。
lnコマンドでオプションをつけずに作成されたリンクはハードリンクと呼ばれ、コピーと違いリンク元と変更などすべて同じファイルとして扱います。そのため、ファイルの情報を集めて作成されたiノードという番号は同じものを使用されます。シンボリックリンクというのは、第3回で説明しました、エイリアスのようにファイルやディレクトリに対して別名をつけるようなイメージでリンクを作成してもどのファイルへのリンクが明示されるだけで、実際このファイルそのものは内容を持ちません。ただ、ディレクトリにシンボリックリンクを作成するとあたかもシンボリックリンクの中に元でファイルやディレクトリが存在しているように見えるためシンボリックリンクはWindowsでいうショートカットのようなものとして理解できると思います。
例えば/etc/rc.d/init.d/というディレクトリにシンボリックリンクを作成して様子を見てみましょう。
シンボリックリンク元である/etc/rc.d/init.d/ディレクトリの内容です。
$ ls /etc/rc.d/init.d FreeWnn crond httpd messagebus pcmcia sendmail NetworkManager cups iiim microcode_ctl portmap single acpid cups-config-daemon ipmi netdump psacct smartd anacron diskdump iptables netfs rawdevices sshd apmd dund irda netplugd readahead syslog atd firstboot irqbalance network readahead_early vncserver auditd functions isdn nfs rhnsd winbind autofs gpm killall nfslock rpcgssd xfs bluetooth haldaemon kudzu nscd rpcidmapd xinetd canna halt mdmonitor ntpd rpcsvcgssd ypbind cpuspeed hidd mdmpd pand saslauthd yum
ファイルサイズは、
$ ls -l /etc/rc.d/ drwxr-xr-x 2 root root 4096 6月 16 05:43 init.d
からわかるように4096となっています。
$ ln -s /etc/rc.d/init.d/ init
/etc/rc.d/init.dディレクトリに対してシンボリックリンクinitを作成しました。
$ cd init
シンボリックリンクinitに移動しました。
$ ls FreeWnn crond httpd messagebus pcmcia sendmail NetworkManager cups iiim microcode_ctl portmap single acpid cups-config-daemon ipmi netdump psacct smartd anacron diskdump iptables netfs rawdevices sshd apmd dund irda netplugd readahead syslog atd firstboot irqbalance network readahead_early vncserver auditd functions isdn nfs rhnsd winbind autofs gpm killall nfslock rpcgssd xfs bluetooth haldaemon kudzu nscd rpcidmapd xinetd canna halt mdmonitor ntpd rpcsvcgssd ypbind cpuspeed hidd mdmpd pand saslauthd yum
内容が/etc/rc.d/init.d/ディレクトリとまったく同じです。
$ pwd /home/foo/init
しかし、現在地は/etc/rc.d/init.d/ではありませんし、このinitのファイルサイズは
$ ls -l lrwxrwxrwx 1 foo foo 17 6月 21 00:36 init -> /etc/rc.d/init.d/
からわかるように17しかありません。
Linuxには起動のレベルがあり、0~6までのレベルがあります。これをランレベルといい、起動時にどのレベルで動作させるかは/etc/inittabで設定されています。このファイルで注目すべきは以下のところです。
# Default runlevel. The runlevels used by RHS are: # 0 - halt (Do NOT set initdefault to this) # 1 - Single user mode # 2 - Multiuser, without NFS (The same as 3, if you do not have networking) # 3 - Full multiuser mode # 4 - unused # 5 - X11 # 6 - reboot (Do NOT set initdefault to this) # id:5:initdefault:
これはそれぞれのランレベルの簡単な説明と最後のid:5:initdefault:はランレベル5で起動するという意味になります。
主に使われるランレベルは1,3,5のいずれかでそれぞれの用途は下記になります。ただしこれはCentOS、FedoraCoreをはじめとするRedHat系のディストリビューションでの話で、他のディストリビューションでは異なる事もあります。
ランレベル | 用途 |
---|---|
0 | コンピュータの電源を切る |
1 | 障害復旧用 |
2 | CUIのみを使用する状態でネットワークをつながない場合 |
3 | CUIのみを使用する場合 |
4 | 使用されてません |
5 | GUI環境を使用する場合 |
6 | 再起動する場合 |
各ランレベルで何がマシン起動時にどのデーモンが起動するかは/etc/rc?.d/ディレクトリでlsコマンドを実行すると、どのデーモンが起動、停止するという一覧を表示してくれます。
※?にはランレベルが入ります。
[foo@cisnote ~]$ ls /etc/rc5.d K-1ipmi K30spamassassin K85mdmpd S09pcmcia K01yum K35vncserver K86nfslock S10network K02NetworkManager K35winbind K87auditd S12syslog K02cups-config-daemon K36lisa K87irqbalance S26apmd K02haldaemon K40smartd K87portmap S28autofs K03messagebus K44rawdevices K89netplugd S44acpid K03rhnsd K50netdump K90bluetooth S55sshd K05anacron K50xinetd K91isdn S85gpm K05atd K68rpcidmapd K94diskdump S87iiim K05saslauthd K69rpcgssd K96ipmi S90canna K10cups K73ypbind K99microcode_ctl S90crond K10psacct K74lm_sensors K99readahead S90xfs K12FreeWnn K74nscd K99readahead_early S99local K20nfs K74ntpd S05kudzu K24irda K75netfs S06cpuspeed K30sendmail K85mdmonitor S08iptables
K-1ipmi、S05kudzuこれらを例にとってみると、先頭の1文字がKだとそのサービスがマシン起動時に停止していることを表し、Sだと起動することを表します。
それでは、デーモンの説明に入ります。デーモンというのは総称で様々な種類のものがあります。例えば、ファイアウォール関係やWEBサーバ関係などがあります。起動しているデーモンは出番来るまでメインメモリに常駐して、いつ出番が来てもいいようにスタンバイをしているプロセスです。常日頃デスクトップ用途でマシンを使っている場合、このデーモンが動いているかどうかは、意識することはないものです。ですが、デーモンが働いていないとさまざまところで不具合が出ます。最悪の場合まともに起動しなくなることもあります。つまりデーモンが動いていることで初めてGUI環境で操作ができる、ネットワークにつながるなどといったサービスが提供されるのです。サービスは多くの場合ひとつのサービス対して、ひとつのデーモンが起動していることが条件ですが、サービスの中には二つ以上のデーモンが起動している事が条件となる場合もあります。
普段デーモンはマシンを起動したときに自動で起動します。起動するデーモンはntsysvというコマンドで変える事ができます。このコマンドはWindowsのスタートアップの設定に近いものです。
# ntsysv [オプション]
このコマンドはシステム的に重要なコマンドなのでrootでしか実行できません。su -でrootになってから実行しましょう。また、普段使わないと思われるデーモンは起動しないようにしましょう。理由はマシンのメモリを余計に取られてしまい処理速度が低下してしまう他、セキュリティにも無駄なリスクを抱えることにつながります。必要なデーモンであるかどうか適切に判断して設定するのがシステム管理の基本的な事柄の一つです。
ntsysv --level 5
ここでチェックを入れると、チェックの入ったデーモンがマシン起動時に自動的に起動します。
その確認はランレベル5に対して実行したので、ランレベル5の設定を見ることで確認できます。
各種サービスの起動ファイルは、/etc/init.d/以下に配置されています。
# /etc/init.d/サービス名 起動オプション
# /etc/init.d/network restart
このnetworkというデーモンはLinuxにおいてネットワーク接続を設定するデーモンです。
ここではデーモンによって提供されるサービスの例を紹介します。
これは決められた時間に設定されたコマンドを実行するサービスを実行するデーモンです。
データのバックアップなどをいちいち手作業でやっていたら煩雑かつ面倒です。そこでこのcrondの設定ファイルに毎週何時とか毎日何時にデータのバックアップを行うといったように書き込みcrondを再起動して設定を読み込ませれば、後はデーモンが自動でバックアップをとってくれます。
第5回で講義をしましたsshサーバー側で動いているデーモンです。サービスの内容はssh接続を提供するものです。
これが動いていないと、第4回ネットワークで説明しましたポート番号22番が開いていてもsshで接続することはできなくなります。また設定を変更したときにもsshdを再起動しないと設定の変更が有効になりません。
今までGUIでの終了方法しかわからなかったと思いますが、CUIもしくはコマンドで終了することができます。そのコマンドがshutdownコマンドです。
# shutdown オプション 時間
shutdown -h now