本日はLinuxの動きや起動についてブログしたいと思います。近年はインフラもクラウドばかりですし、オンプレも(OSインストールから設定まで)触ることが減ってきました。(kickstartあるし)Linux触っているならどのように起動して、どのように動いているのかはちゃんと把握するべきです。
■その前にデーモン(Daemon)って何なのよ
「起動されるとシステムがシャットダウンするまで常に動いてるプロセス」です。
ちなみに二種類のタイプがありますので以下を参考に。
- カーネルに関係するデーモン
メモリー内でプロセス切り替えに使うデータを入れ替え、I/Oのためのバッファを入れ替えるデーモンがあります。CentOSで見ていきましょう。
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 |
$ ps -ef | more UID PID PPID C STIME TTY TIME CMD oot 2 0 0 2月26 ? 00:00:00 [kthreadd] root 3 2 0 2月26 ? 00:07:07 [ksoftirqd/0] root 5 2 0 2月26 ? 00:00:00 [kworker/0:0H] root 7 2 0 2月26 ? 00:00:54 [migration/0] root 8 2 0 2月26 ? 00:00:00 [rcu_bh] root 9 2 0 2月26 ? 00:36:40 [rcu_sched] root 10 2 0 2月26 ? 00:00:19 [watchdog/0] root 11 2 0 2月26 ? 00:00:15 [watchdog/1] root 12 2 0 2月26 ? 00:00:54 [migration/1] root 13 2 0 2月26 ? 00:02:39 [ksoftirqd/1] root 15 2 0 2月26 ? 00:00:00 [kworker/1:0H] root 17 2 0 2月26 ? 00:00:00 [kdevtmpfs] root 18 2 0 2月26 ? 00:00:00 [netns] root 19 2 0 2月26 ? 00:00:02 [khungtaskd] root 20 2 0 2月26 ? 00:00:00 [writeback] root 21 2 0 2月26 ? 00:00:00 [kintegrityd] root 22 2 0 2月26 ? 00:00:00 [bioset] root 23 2 0 2月26 ? 00:00:00 [kblockd] root 24 2 0 2月26 ? 00:00:00 [md] root 31 2 0 2月26 ? 00:18:27 [kswapd0] root 32 2 0 2月26 ? 00:00:00 [ksmd] root 33 2 0 2月26 ? 00:00:09 [khugepaged] root 34 2 0 2月26 ? 00:00:00 [crypto] root 42 2 0 2月26 ? 00:00:00 [kthrotld] root 44 2 0 2月26 ? 00:00:00 [kmpath_rdacd] root 45 2 0 2月26 ? 00:00:00 [kpsmoused] root 47 2 0 2月26 ? 00:00:00 [ipv6_addrconf] root 66 2 0 2月26 ? 00:00:00 [deferwq] root 100 2 0 2月26 ? 00:00:00 [kauditd] root 140 2 0 2月26 ? 00:00:00 [virtscsi-scan] root 142 2 0 2月26 ? 00:00:00 [scsi_eh_0] root 143 2 0 2月26 ? 00:00:00 [scsi_tmf_0] root 168 2 0 2月26 ? 00:00:00 [bioset] |
サービス名に[ ] が付いてるのがkernelデーモンです。よく見ると「watchdog」とかPS4のハッカーゲームでありましたね。(以下watchdogs2より)そもそもwatchdogの役目としては
システムが正常に動作しているか監視し、異常発生時にシステムのリセット等が行われるようになっています。
多分このゲームタイトル名もwatchdogでシステム全体を監視/ハッキングするという意味で付けられたのでしょう。(予想)
話を戻して、上記で動いているkernelデーモンについていくつか紹介していきましょう。
・keventd
→モジュール化されたデバイスドライバを自動的にロードする割込を発生させるコントロールデーモン
・kapmd
→パワーマネージメント関係のデーモン
・ksoftirq_CPU0
→ソフトIRQをCPU毎に順次処理するデーモン
・kswapd
→物理メモリが少なくなると必要に応じてディスク側のスワップ領域に読み書きしてコントロールするデーモン
・bdflushd
→ディスクなどの記録媒体に書き込む機能を提供するデーモン
・kupdated
→bdflushdの機能を定期的にスケジューリングして行うデーモン
・khubd
→USB機器の抜き差しを監視するデーモン
・kjournald
→ジャーナリング(データベースのようにデータを定期的に記録する構造)をサポートしたファイルシステムReiserFSやExt3 FSを使うときに必要なデーモン
・mdrecoveryd
→RAID関係のコントロールデーモン
- サービスを提供するデーモン
・ ログ管理デーモン(syslogd)
・ 定期的なジョブ実行デーモン(crond)
・ loginサービスデーモン
・ ネットワークデーモン
ちなみにcrondのdはDaemonのdです。ではLinuxの動きについて図を作ってみました。
■Linux起動からログインまで
このニワトリ親子の図はLinuxの起動からログインまでの流れを表したものです。(CentOS6系)非常に分かりやすいと思いますが、補足としてCentOS7はsystemctlなのでinitは使われなくなりましたが、基本initと変わりありません。とりあえずinitプログラムについて簡単にご紹介します。
- initプログラムとは
initは実行するときに/etc/inittabファイルを参照し、その内容を順に実行します。以下はAmazon Linuxのinittabです。
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 |
$ more /etc/inittab # inittab is only used by upstart for the default runlevel. # # ADDING OTHER CONFIGURATION HERE WILL HAVE NO EFFECT ON YOUR SYSTEM. # # System initialization is started by /etc/init/rcS.conf # # Individual runlevels are started by /etc/init/rc.conf # # Ctrl-Alt-Delete is handled by /etc/init/control-alt-delete.conf # # Terminal gettys are handled by /etc/init/tty.conf and /etc/init/serial.conf, # with configuration in /etc/sysconfig/init. # # For information on how to write upstart event handlers, or how # upstart works, see init(5), init(8), and initctl(8). # # Default runlevel. The runlevels used 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:3:initdefault: |
inittabはinitの実行から各種デーモンの起動からのログインプロンプトが表示されるまでの処理が記述されています。上記の6~13行目を見ると何やら処理が書いてますね。
id:3なのでランレベルは3のmultiuser modeで動いているのも分かります。ちなみCentOS7のinittabはこんな感じ。
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 |
$ more /etc/inittab # inittab is no longer used when using systemd. # # ADDING CONFIGURATION HERE WILL HAVE NO EFFECT ON YOUR SYSTEM. # # Ctrl-Alt-Delete is handled by /usr/lib/systemd/system/ctrl-alt-del.target # # systemd uses 'targets' instead of runlevels. By default, there are two main targets: # # multi-user.target: analogous to runlevel 3 # graphical.target: analogous to runlevel 5 # # To view current default target, run: # systemctl get-default # # To set a default target, run: # systemctl set-default TARGET.target |
上記のようにあらかじめ決められた順番で起動していく仕組みのことをSysVinitと言います。サービスの起動に手間取ると、次に起動するサービスを待ち時間がかかってしまい、最終的な起動完了まで時間がかかります。最近のLinuxディストリビューションではUpstartという仕組みを採用しており、並列起動することで短時間でシステムを起動できるようになりました。
- 起動後のログはどこで確認できるんです?
・/var/log/messages
→システム全般の情報
・/var/log/boot.log
→システム起動時の各プロセスが「OK」か「Failed」かを確認
・/var/log/dmesg
→システム起動時のメッセージが出力
ちなみに$ dmesgで詳細が分かります。↓Amazon LinuxはXenということも書いてます。
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 |
# dmesg [ 0.000000] Linux version 4.9.38-16.35.amzn1.x86_64 (mockbuild@gobi-build-60006) (gcc version 4.8.3 20140911 (Red Hat 4.8.3-9) (GCC) ) #1 SMP Sat Aug 5 01:39:35 UTC 2017 [ 0.000000] Command line: root=LABEL=/ console=tty1 console=ttyS0 selinux=0 [ 0.000000] x86/fpu: Supporting XSAVE feature 0x001: 'x87 floating point registers' [ 0.000000] x86/fpu: Supporting XSAVE feature 0x002: 'SSE registers' [ 0.000000] x86/fpu: Supporting XSAVE feature 0x004: 'AVX registers' [ 0.000000] x86/fpu: xstate_offset[2]: 576, xstate_sizes[2]: 256 [ 0.000000] x86/fpu: Enabled xstate features 0x7, context size is 832 bytes, using 'standard' format. [ 0.000000] x86/fpu: Using 'eager' FPU context switches. [ 0.000000] e820: BIOS-provided physical RAM map: [ 0.000000] BIOS-e820: [mem 0x0000000000000000-0x000000000009dfff] usable [ 0.000000] BIOS-e820: [mem 0x000000000009e000-0x000000000009ffff] reserved [ 0.000000] BIOS-e820: [mem 0x00000000000e0000-0x00000000000fffff] reserved [ 0.000000] BIOS-e820: [mem 0x0000000000100000-0x000000003fffffff] usable [ 0.000000] BIOS-e820: [mem 0x00000000fc000000-0x00000000ffffffff] reserved [ 0.000000] NX (Execute Disable) protection: active [ 0.000000] SMBIOS 2.7 present. [ 0.000000] DMI: Xen HVM domU, BIOS 4.2.amazon 08/24/2006 [ 0.000000] Hypervisor detected: Xen [ 0.000000] Xen version 4.2. [ 0.000000] Xen Platform PCI: I/O protocol version 1 [ 0.000000] Netfront and the Xen platform PCI driver have been compiled for this kernel: unplug emulated NICs. [ 0.000000] Blkfront and the Xen platform PCI driver have been compiled for this kernel: unplug emulated disks. |
■まとめ
Linuxよ…..深いぜ….
参考
http://www.atmarkit.co.jp/ait/articles/0204/02/news002.html
http://www.infraeye.com/study/linuxz2.html
http://www.kozupon.pgw.jp/kiso/linux_process.html
0件のコメント