Linux リテラシ2006 - 第6回 デーモン

今回はデーモンというものに触れていきます。デーモンというのはシステムの中でユーザーには見えないような裏の部分で動いているものです。仕事内容はシステムの維持やユーザーに対してサービスを提供したりなどがあります。
デーモンと言われるとよく想像するのがdemon(悪魔)ですが、今回扱うデーモンはdaemon(守護神)のことを意味します。

導入

デーモンの説明をする前準備として、先に必要となるいくつかの新たな概念の説明をします。

プロセス

プロセスというのは現在動いているプログラムのことをさします。これはデーモンだけではなくコマンドなど、OS上で動いているものすべてです。コマンドのプロセスの生成から終了までは以下のようになります。

  1. キーボードでコマンドを入力してEnterで実行する
  2. OSがコマンドのプロセスを生成する
  3. 生成されたプロセスがプログラム通りに処理を行う
  4. コマンドのプロセスを終了する

現在動作しているプログラムを見る

$ ps [オプション...]
a
他のユーザのプロセスも出力する
u
ユーザにとってわかりやすい形式にする
x
キーボードなどで制御されていないプロセスを表示する
すべてのプロセスをわかりやすく表示する
$ 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

オプション

-s
シグナルを指定する

シグナル

シグナルは上記のものなどを使います。

プロセスID1234を終了させる。
$ kill -s TERM 1234

リンク

リンクとはコマンドでいうエイリアスのようなものです。リンクを作成するにはこのコマンドを使います。

ln [オプション] リンク元 リンクの置き場所

オプション

-s
シンボリックリンクを作成する
カレントディレクトリのhogeというファイルにbarというシンボリックリンクを作成する
$ 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コマンドを実行すると、どのデーモンが起動、停止するという一覧を表示してくれます。
※?にはランレベルが入ります。

ランレベル5の設定を見る
[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 [オプション]

オプション

--level 0~6までの数字
変更するランレベルを指定する

このコマンドはシステム的に重要なコマンドなのでrootでしか実行できません。su -でrootになってから実行しましょう。また、普段使わないと思われるデーモンは起動しないようにしましょう。理由はマシンのメモリを余計に取られてしまい処理速度が低下してしまう他、セキュリティにも無駄なリスクを抱えることにつながります。必要なデーモンであるかどうか適切に判断して設定するのがシステム管理の基本的な事柄の一つです。

ntsysvコマンドをランレベル5に対して実行する
ntsysv --level 5

ここでチェックを入れると、チェックの入ったデーモンがマシン起動時に自動的に起動します。
その確認はランレベル5に対して実行したので、ランレベル5の設定を見ることで確認できます。

各種サービスの起動や停止

各種サービスの起動ファイルは、/etc/init.d/以下に配置されています。

# /etc/init.d/サービス名 起動オプション

起動オプション

start
起動する
stop
停止する
restart
再起動する
networkを再起動する
# /etc/init.d/network restart

このnetworkというデーモンはLinuxにおいてネットワーク接続を設定するデーモンです。

デーモンの例

ここではデーモンによって提供されるサービスの例を紹介します。

crond

これは決められた時間に設定されたコマンドを実行するサービスを実行するデーモンです。
データのバックアップなどをいちいち手作業でやっていたら煩雑かつ面倒です。そこでこのcrondの設定ファイルに毎週何時とか毎日何時にデータのバックアップを行うといったように書き込みcrondを再起動して設定を読み込ませれば、後はデーモンが自動でバックアップをとってくれます。

sshd

第5回で講義をしましたsshサーバー側で動いているデーモンです。サービスの内容はssh接続を提供するものです。
これが動いていないと、第4回ネットワークで説明しましたポート番号22番が開いていてもsshで接続することはできなくなります。また設定を変更したときにもsshdを再起動しないと設定の変更が有効になりません。

シャットダウンをする

今までGUIでの終了方法しかわからなかったと思いますが、CUIもしくはコマンドで終了することができます。そのコマンドがshutdownコマンドです。

# shutdown オプション 時間

オプション

-h
電源を切る
-r
再起動する

時間

now
今すぐ実行する

今すぐ電源を切る

shutdown -h now