2022年8月、ホームページを全面リニューアルしました! 情報を分かりやすくお伝えできるサイト作りを目指してまいります。

Linuxの動きと起動プロセス!

Linuxを何気なく操作する。操作と言うよりもほとんどの人は、「Linuxがミカン箱だとするとその中に旨く収まるようにミカンを収納してるだけ。」である。つまり、LinuxにApacheとかSambaとかの鯖モジュールをインストールして旨く動かしているだけである。OSと言うミカン箱にミカンを旨く並べて、そのミカン自体はインストーラという便利な道具が有るので整然と並べることが出来る。なんて、ちと強引な言い方だけど俺はこのように考える。ApacheとかSambaとかのサービスをインストールできる人は沢山居てもOSで有るLinuxの事をどれだけの人が詳しく知ってるだろうか。まあ、そう言う俺も人のことは言えないが。したがって、反省も含めここではLinuxについて「その動き」とか「プロセス」と言う物を考えてみたい。

1.その前にデーモンとはなんぞや

「Unixデーモンの定義は、起動されるとシステムがシャットダウンするまで常に影ながら動いてるプロセスである。」さらに、常駐していて他のプロセスからの要求があると必要な処理を行うのも役目である。
デーモンには、2種類のタイプがある。

1)カーネルに関与するデーモン
① メモリー内でプロセス切り替えのためのデータを入れ替えたり、I/Oのためのバッファ入れ替えるデーモン

[root@yh root]# ps -ef | more
UID PID PPID C STIME TTY TIME CMD
root 1 0 0 Jan17 ? 00:00:03 init [3]
root 2 1 0 Jan17 ? 00:00:00 [keventd]
root 3 1 0 Jan17 ? 00:00:00 [kapmd]
root 4 1 0 Jan17 ? 00:00:00 [ksoftirqd_CPU0]
root 5 1 0 Jan17 ? 00:00:55 [kswapd]
root 6 1 0 Jan17 ? 00:00:00 [bdflush]
root 7 1 0 Jan17 ? 00:00:00 [kupdated]
root 8 1 0 Jan17 ? 00:00:00 [khubd]
root 9 1 0 Jan17 ? 00:00:48 [kjournald]
root 128 1 0 Jan17 ? 00:00:00 [mdrecoveryd]
root 135 1 0 Jan17 ? 00:00:00 [kjournald]
root 427 1 0 Jan17 ? 00:00:34 syslogd -m 0
root 432 1 0 Jan17 ? 00:00:00 klogd -2
snort 488 1 0 Jan17 ? 03:58:27 /usr/sbin/snort -u snort -g s
root 500 1 0 Jan17 ? 00:00:00 inetd
root 513 1 0 Jan17 ? 00:00:15 /usr/sbin/sshd
root 593 1 0 Jan17 ? 00:00:00 /usr/lib/postfix/master
postfix 601 593 0 Jan17 ? 00:04:25 qmgr -l -t fifo -u
root 619 1 0 Jan17 ? 00:00:00 crond
省略

これは、俺のVineLinux鯖のプロセスの一部である。濃い部分がカーネルに関与するデーモンである。見てもらうと解るが、サービス名に[ ] が付いてるのがkernelデーモンである。以下、簡単にkernelデーモンを個々に説明する。

■keventd      モジュール化されたデバイスドライバを自動的にロードする割込を発生させるコントロールデーモン
■kapmd       パワーマネージメント関係のデーモン
■ksoftirq_CPU0 ソフトIRQをCPU毎に順次処理するデーモン
■kswapd       物理メモリが残り少なくって来たときに、必要に応じてディスク側のスワップ領域に書き込んだり読み込んだりコントロールをするデーモン
■bdflushd      Linuxは構造的にファイルの書き込みを高速化するためにファイルに加えられた変更をメモリ上に一時的にメモって置くが、それを実際にディスクなどの記録媒体に書き込む機能を提供するデーモン
■kupdated     上記と同じ機能だが、このデーモンはbdflushdの機能を定期的にスケジューリングして行うデーモン
■khubd       USB機器の抜き差しを監視するデーモン
■kjournald     ジャーナリング(データベースのようにデータを定期的に記録する構造)をサポートしたファイルシステムReiserFSやExt3 FSを使うときに必要なデーモン
■mdrecoveryd  これは、RAID関係のコントロールデーモンのような気がするって・・・ちと自信なし(;-_-;)  

2)サービスを提供するデーモン
① ログ管理デーモン(syslogd)
② 定期的なジョブ実行デーモン(crond)
③ loginサービスデーモン
④ ネットワーク関係デーモン
⑤ その他

ちなみに、crond のようにサービスの最後の「d」文字はdaemon「d」である事は既に解っていただけると思う。


2.Linuxの動き(RedHat系Linuxのばやい)

1)Linuxの起動からの動きを見てみる

図1

図1は、Linuxの起動からloginプロンプト画面まで何をやっているかを流れ図化したものである。これを、図の番号順に説明する。

① Bootloader
ハードディスクとかCD-ROMドライブとかから、メモリへKernelを読み込む。

② Kernel起動
メモリからKernelを起動する。

③ デバイス検出
Kernelにより各種デバイスの検出。

④ 初期化
使用可能なメモリ領域の初期化、各プログラムパラメータの初期化。

⑤ パーティションのmount
rootをマウントする。

⑥ initの実行
/sbin/initプログラムを実行する。initは実行するときに/etc/inittabファイルを参照して、その内容を順に実行する。
以下にinittabの内容を示す。

[root@yh root]# more /etc/inittab
#
# inittab This file describes how the INIT process should set up
# the system in a certain run-level.
#
# Author: Miquel van Smoorenburg, <miquels@drinkel.nl.mugnet.org>
# Modified for RHS Linux by Marc Ewing and Donnie Barnes
#

# Default runlevel. The runlevels used by RHS are:
# 0 - halt (Do NOT set initdefault to this)    ← 終了
# 1 - Single user mode root             ← ただ一人のみのしか利用できないシングルユーザモード
# 2 - Multiuser, without NFS (The same as 3, if you do not have networking)     ← NFSなどネットワークを利用しないマルチユーザモード
# 3 - Full multiuser mode               ← 本来のマルチユーザモード
# 4 - unused                       ← 使わない
# 5 - X11                         ← Xを使うGUIなloginモード
# 6 - reboot (Do NOT set initdefault to this)   ← 再起動
#
id:3:initdefault:

# System initialization.
si::sysinit:/etc/rc.d/rc.sysinit

l0:0:wait:/etc/rc.d/rc 0                ← 終了
l1:1:wait:/etc/rc.d/rc 1                ← rootただ一人のみのしか利用できないシングルユーザモード
l2:2:wait:/etc/rc.d/rc 2                ← NFSなどネットワークを利用しないマルチユーザモード
l3:3:wait:/etc/rc.d/rc 3                ← 本来のマルチユーザモード
l4:4:wait:/etc/rc.d/rc 4                ← 使わない
l5:5:wait:/etc/rc.d/rc 5                ← Xを使うGUIなloginモード
l6:6:wait:/etc/rc.d/rc 6                ← 再起動

# Things to run in every runlevel.
ud::once:/sbin/update

# Trap CTRL-ALT-DELETE
ca::ctrlaltdel:/sbin/shutdown -t3 -r now

# When our UPS tells us power has failed, assume we have a few minutes
# of power left. Schedule a shutdown for 2 minutes from now.
# This does, of course, assume you have powerd installed and your
# UPS connected and working correctly.
pf::powerfail:/sbin/shutdown -f -h +2 "Power Failure; System Shutting Down"

# If power was restored before the shutdown kicked in, cancel it.
pr:12345:powerokwait:/sbin/shutdown -c "Power Restored; Shutdown Cancelled"

# Run gettys in standard runlevels
1:2345:respawn:/sbin/mingetty tty1
2:2345:respawn:/sbin/mingetty tty2
3:2345:respawn:/sbin/mingetty tty3
#4:2345:respawn:/sbin/mingetty tty4
#5:2345:respawn:/sbin/mingetty tty5
#6:2345:respawn:/sbin/mingetty tty6

# Run xdm in runlevel 5
# xdm is now a separate service
x:5:respawn:/etc/X11/prefdm -nodaemon

以上の/etc/inittab の内容で、ここでinitプログラムは id:3:initdefault: を引数に /etc/rc.d/rcを実行する。この/etc/rc.d/rcプログラムは/etc/rc.dの中のrc.localとrc0.d~rc6.d以下にあるスクリプトを順次実行する。
この中に用意されてるスクリプトは、先頭にSやKの英文字が付いているが、これはSが起動、Kが停止の意味を表していて、後の二桁の数字は実行する順番を表している。以下参照。RHL系では、現在chkconfigで/etc/init.dの中のスクリプトを–addオプションで登録すると自動的に目的のrcX.dへシンボルリンクしてくれてる。つまり、例えば/etc/rc.d/rc3.dの中のスクリプトの実体は/etc/init.dの中のスクリプトと言うことになる。

/etc/rc.d/rc3.dの内容

[root@yh rc3.d]# ls -al
合計 8
drwxr-xr-x 2 root root 4096 Jul 12 2004 .
drwxr-xr-x 10 root root 4096 Apr 15 18:13 ..
lrwxrwxrwx 1 root root 17 Aug 18 2003 K05anacron -> ../init.d/anacron
lrwxrwxrwx 1 root root 13 Aug 18 2003 K10xfs -> ../init.d/xfs
lrwxrwxrwx 1 root root 17 Aug 18 2003 K12FreeWnn -> ../init.d/FreeWnn
lrwxrwxrwx 1 root root 15 Aug 18 2003 K12canna -> ../init.d/canna
lrwxrwxrwx 1 root root 13 Aug 18 2003 K15gpm -> ../init.d/gpm
lrwxrwxrwx 1 root root 20 Aug 18 2003 K44rawdevices -> ../init.d/rawdevices
lrwxrwxrwx 1 root root 15 Aug 18 2003 K45named -> ../init.d/named
lrwxrwxrwx 1 root root 13 Aug 18 2003 K60lpd -> ../init.d/lpd
lrwxrwxrwx 1 root root 14 Aug 18 2003 K74ntpd -> ../init.d/ntpd
lrwxrwxrwx 1 root root 16 Aug 18 2003 K82autofs -> ../init.d/autofs
lrwxrwxrwx 1 root root 16 Aug 18 2003 K96usbmgr -> ../init.d/usbmgr
lrwxrwxrwx 1 root root 18 Aug 18 2003 K99murasaki -> ../init.d/murasaki
lrwxrwxrwx 1 root root 15 Aug 18 2003 S05kudzu -> ../init.d/kudzu
lrwxrwxrwx 1 root root 17 Aug 18 2003 S10network -> ../init.d/network
lrwxrwxrwx 1 root root 16 Aug 18 2003 S12syslog -> ../init.d/syslog
lrwxrwxrwx 1 root root 16 Aug 18 2003 S20random -> ../init.d/random
lrwxrwxrwx 1 root root 15 Aug 18 2003 S25netfs -> ../init.d/netfs
lrwxrwxrwx 1 root root 16 Aug 18 2003 S40snortd -> ../init.d/snortd
lrwxrwxrwx 1 root root 14 Aug 18 2003 S50inet -> ../init.d/inet
lrwxrwxrwx 1 root root 14 Aug 18 2003 S55sshd -> ../init.d/sshd
lrwxrwxrwx 1 root root 18 Aug 18 2003 S75keytable -> ../init.d/keytable
lrwxrwxrwx 1 root root 17 Jul 12 2004 S80postfix -> ../init.d/postfix
lrwxrwxrwx 1 root root 17 Aug 18 2003 S85proftpd -> ../init.d/proftpd
lrwxrwxrwx 1 root root 15 Aug 18 2003 S90crond -> ../init.d/crond
lrwxrwxrwx 1 root root 13 Aug 18 2003 S95atd -> ../init.d/atd
lrwxrwxrwx 1 root root 11 Jan 16 2003 S99local -> ../rc.local

必要な起動スクリプトが実行された後、loginコンソールで入力待ちになる。仮想端末は、前述したがinittabで以下のように設定されているので3個立ち上がってることになる。本来、デフォルトでは仮想端末は1~6迄全てアクティブになっているが、俺の場合はこんなに必要ないので1~3迄使うようにセットアップ時にコメントしている。これも、まがりなりにもメモリーを喰ってる代物なので使ってないときはコメントして起動させないようにすべきである。

# Run gettys in standard runlevels
1:2345:respawn:/sbin/mingetty tty1
2:2345:respawn:/sbin/mingetty tty2
3:2345:respawn:/sbin/mingetty tty3
#4:2345:respawn:/sbin/mingetty tty4
#5:2345:respawn:/sbin/mingetty tty5
#6:2345:respawn:/sbin/mingetty tty6

以上

コメント