3.1 システム起動プロセス
3.1.1 ブートからカーネルの起動まで
ながれ
- BIOS/UEFI起動
-
BIOS/UEFIがブートローダを起動
- 格納方式: MBR/GPT
- ブートローダがカーネルをロードして実行
BIOS
BIOS: Basic Input/Output System
UEFI
UEFI: Unified Extinsible Firmware Interface
BIOSの代替
勉強環境ではこちらだった
dmesg
[ 0.000000] Initializing cgroup subsys cpuset
[ 0.000000] Initializing cgroup subsys cpu
[ 0.000000] Initializing cgroup subsys cpuacct
[ 0.000000] Linux version 3.10.0-1127.19.1.el7.x86_64 (mockbuild@kbuilder.bsys.centos.org) (gcc version 4.8.5 20150623 (Red Hat 4.8.5-39) (GCC) ) #1 SMP Tue Aug 25 17:23:54 UTC 2020
[ 0.000000] Command line: BOOT_IMAGE=/boot/vmlinuz-3.10.0-1127.19.1.el7.x86_64 root=UUID=24481a5c-eda4-4815-b7e5-9d86ef6e4320 ro crashkernel=auto console=ttyS0,38400n8 elevator=noop
[ 0.000000] e820: BIOS-provided physical RAM map:
[ 0.000000] BIOS-e820: [mem 0x0000000000000000-0x0000000000000fff] reserved
[ 0.000000] BIOS-e820: [mem 0x0000000000001000-0x0000000000054fff] usable
...
[ 0.000000] NX (Execute Disable) protection: active
[ 0.000000] efi: EFI v2.70 by EDK II
[ 0.000000] efi: ACPI=0x3ebfa000 ACPI 2.0=0x3ebfa014 SMBIOS=0x3ebcd000
[ 0.000000] efi: mem00: type=0, attr=0xf, range=[0x0000000000000000-0x0000000000001000) (0MB)
[ 0.000000] efi: mem01: type=2, attr=0xf, range=[0x0000000000001000-0x0000000000002000) (0MB)
...
MBR/GPT
パーティション管理・ブートローダ格納
- MBR: Master Boot Record
-
GPT: GUID Partition Table
- ブートローダは ESP: Efi System Partitionに格納
- /boot/efi にFAT(VFAT)でマウントされる
grep -e /boot/efi /etc/mtab
/dev/sda1 /boot/efi vfat rw,relatime,fmask=0077,dmask=0077,codepage=437,iocharset=ascii,shortname=winnt,errors=remount-ro 0 0
勉強環境ではVFATだった
BIOS | UEFI | |
---|---|---|
起動ドライブの容量制限 | 2TB | 8ZB |
セットアップ画面 | GUI可能 | |
パーティション管理 | MBR(64B) | GPT |
(一次)ブートローダ格納箇所 | MBR(446B) | ESP |
ブートローダ
-
特にBIOSの場合、MBRの446Bにブートローダ全体が載りきらないので一次ブートローダ/二次ブートローダに分かれる
- 一次ブートローダ: パーティションの先頭等から二次ブートローダを起動する人
- 二次ブートローダ: 指定されたパーティションからカーネルをロードして起動する人
-
よく使われるもの
- GRUB Legacy: GRand Unified Bootloader -
- GRUB 2
カーネル
-
いろいろ行う
- 組み込まれているH/Wの検出
- メモリの初期化
- システムクロックの設定
- IRQの設定
- ルートパーティションの設定
dmesg
...
[ 0.000000] Memory: 942184k/1048448k available (7784k kernel code, 1140k absent, 105124k reserved, 5958k data, 1980k init)
...
...
[ 0.000000] kvm-clock: cpu 0, msr 0:3fea0001, primary cpu clock
[ 0.000000] kvm-clock: Using msrs 4b564d01 and 4b564d00
[ 0.000000] kvm-clock: using sched offset of 3918169783 cycles
...
...
[ 0.000000] ACPI: INT_SRC_OVR (bus 0 bus_irq 5 global_irq 5 high level)
[ 0.000000] ACPI: INT_SRC_OVR (bus 0 bus_irq 9 global_irq 9 high level)
[ 0.000000] ACPI: INT_SRC_OVR (bus 0 bus_irq 10 global_irq 10 high level)
[ 0.000000] ACPI: INT_SRC_OVR (bus 0 bus_irq 11 global_irq 11 high level)
[ 0.000000] ACPI: IRQ5 used by override.
[ 0.000000] ACPI: IRQ9 used by override.
[ 0.000000] ACPI: IRQ10 used by override.
[ 0.000000] ACPI: IRQ11 used by override.
...
- 最後にinitプログラムを実行
...
[ 1.552643] random: systemd: uninitialized urandom read (16 bytes read)
[ 1.554859] random: systemd: uninitialized urandom read (16 bytes read)
[ 1.556575] random: systemd: uninitialized urandom read (16 bytes read)
[ 1.559324] systemd[1]: systemd 219 running in system mode. (+PAM +AUDIT +SELINUX +IMA -APPARMOR +SMACK +SYSVINIT +UTMP +LIBCRYPTSETUP +GCRYPT +GNUTLS +ACL +XZ +LZ4 -SECCOMP +BLKID +ELFUTILS +KMOD +IDN)
[ 1.562647] systemd[1]: Detected virtualization kvm.
[ 1.563646] systemd[1]: Detected architecture x86-64.
[ 1.564534] systemd[1]: Running in initial RAM disk.
[ 1.570236] systemd[1]: Set hostname to <localhost>.
...
- PID1確認
ps p 1
PID TTY STAT TIME COMMAND
1 ? Ss 0:01 /usr/lib/systemd/systemd --switched-root --system --deseri
which init
/usr/sbin/init
ls -l $(which init)
lrwxrwxrwx. 1 root root 22 Nov 10 18:10 /usr/sbin/init -> ../lib/systemd/systemd
ls -l /sbin/init
lrwxrwxrwx. 1 root root 22 Nov 10 18:10 /sbin/init -> ../lib/systemd/systemd
/lib/
と /usr/lib/
の実体が同じっぽいので結局/sbin/init
プログラムとしてsystemd
が起動される
3.1.2 SysVinitの概要
SysVinit: System Five Init
むかしのやつ
cat /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
#
もう使われてない
昔のCentOSだとある
-
(vsyscall絡みでコンテナログインできないのでログインしてない)
- https://hub.docker.com/_/centos “A note about vsyscall”
docker container run --rm centos:5 cat /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
# 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:
# 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
l2:2:wait:/etc/rc.d/rc 2
l3:3:wait:/etc/rc.d/rc 3
l4:4:wait:/etc/rc.d/rc 4
l5:5:wait:/etc/rc.d/rc 5
l6:6:wait:/etc/rc.d/rc 6
# 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
x:5:respawn:/etc/X11/prefdm -nodaemon
書式
2:2345:respawn:/sbin/mingetty tty2
-
2
- ID。エントリの識別子(1-4文字)
-
2345
- ランレベル
-
respawn
- アクション指示子(どのようなタイミングで処理を行うか)
-
/sbin/mingetty tty2
- 処理内容
アクション指示子
initdefault: デフォルトのランレベル指定
# 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:3:initdefault:
sysinit: システム起動時にbootやbootwaitよりも先に実行
# System initialization.
si::sysinit:/etc/rc.d/rc.sysinit
wait: 指定したランレベルになったら1度だけ実行、プロセス終了を待つ
- onceは待たない版
l0:0:wait:/etc/rc.d/rc 0
l1:1:wait:/etc/rc.d/rc 1
l2:2:wait:/etc/rc.d/rc 2
l3:3:wait:/etc/rc.d/rc 3
l4:4:wait:/etc/rc.d/rc 4
l5:5:wait:/etc/rc.d/rc 5
l6:6:wait:/etc/rc.d/rc 6
ctrlaltdel: SIGINTがinitに送られたときに実行
- 例えば、ctrl+alt+delが押下された場合
# Trap CTRL-ALT-DELETE
ca::ctrlaltdel:/sbin/shutdown -t3 -r now
- 【補】ctrl+alt+delを押下したときにSIGINTをinitに送るかどうかはsysfsで確認・設定できる
cat /proc/sys/kernel/ctrl-alt-del
0
powerwait/powerfail: 電源異常時に実行
- powerwaitはプロセス終了を待つ
- powerfailはプロセス終了を待たない
# 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"
powerokwait: 電源が回復したら実行
# If power was restored before the shutdown kicked in, cancel it.
pr:12345:powerokwait:/sbin/shutdown -c "Power Restored; Shutdown Cancelled"
respawn: 終了したら再起動
# 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
x:5:respawn:/etc/X11/prefdm -nodaemon
3.1.3 起動スクリプトとランレベル
docker container run -it --rm centos:5 ls /etc/rc{0,1,2,3,4,5,6}.d
/etc/rc0.d:
K44rawdevices K74rsyslog K87multipathd K89netplugd S00killall
K50netconsole K75netfs K89iscsi K89rdisc S01halt
K74lvm2-monitor K87mcstrans K89iscsid K90network
/etc/rc1.d:
K44rawdevices K75netfs K89iscsi K89rdisc S99single
K50netconsole K87mcstrans K89iscsid K90network
K74rsyslog K87multipathd K89netplugd S26lvm2-monitor
/etc/rc2.d:
K44rawdevices K75netfs K89iscsid S08mcstrans S99local
K50netconsole K87multipathd K89netplugd S10network
K74rsyslog K89iscsi K89rdisc S26lvm2-monitor
/etc/rc3.d:
K50netconsole K89netplugd S08mcstrans S25netfs S99local
K74rsyslog K89rdisc S10network S26lvm2-monitor
K87multipathd S07iscsid S13iscsi S56rawdevices
/etc/rc4.d:
K50netconsole K89netplugd S08mcstrans S25netfs S99local
K74rsyslog K89rdisc S10network S26lvm2-monitor
K87multipathd S07iscsid S13iscsi S56rawdevices
/etc/rc5.d:
K50netconsole K89netplugd S08mcstrans S25netfs S99local
K74rsyslog K89rdisc S10network S26lvm2-monitor
K87multipathd S07iscsid S13iscsi S56rawdevices
/etc/rc6.d:
K44rawdevices K74rsyslog K87multipathd K89netplugd S00killall
K50netconsole K75netfs K89iscsi K89rdisc S01reboot
K74lvm2-monitor K87mcstrans K89iscsid K90network
- S始まり: Startするやつ
- K始まり: Killするやつ
- 番号: 小さい順に実行
- のこり: serviceコマンドで実行するサービス名
/etc/init.d/
にあるスクリプト実体へのsymlink
docker container run -it --rm centos:5 ls -lF /etc/init.d/
total 92
-rwxr-xr-x 1 root root 14793 Mar 19 2014 functions*
-rwxr-xr-x 1 root root 5788 Mar 19 2014 halt*
-rwxr-xr-x 1 root root 1369 Jan 9 2013 iscsi*
-rwxr-xr-x 1 root root 1899 Jan 9 2013 iscsid*
-rwxr-xr-x 1 root root 652 Mar 19 2014 killall*
-r-xr-xr-x 1 root root 2497 Sep 17 2014 lvm2-monitor*
-rwxr-xr-x 1 root root 1914 Jan 21 2009 mcstrans*
-rwxr-xr-x 1 root root 2323 Oct 22 2015 multipathd*
-rwxr-xr-x 1 root root 3009 Mar 19 2014 netconsole*
-rwxr-xr-x 1 root root 5920 Mar 19 2014 netfs*
-rwxr-xr-x 1 root root 1258 Oct 15 2013 netplugd*
-rwxr-xr-x 1 root root 8471 Mar 19 2014 network*
-rwxr-xr-x 1 root root 2245 Mar 19 2014 rawdevices*
-rwxr-xr-x 1 root root 1387 Sep 26 2009 rdisc*
-rwxr-xr-x 1 root root 2475 Oct 18 2011 rsyslog*
-rwxr-xr-x 1 root root 647 Mar 19 2014 single*
column: LSB
LSB: Linux Standard Base
ディストリビューション間の差異を小さくして幸せになろう、というやつ
lsb_release
-bash: lsb_release: command not found
入ってなかったので入れる
yum provides lsb_release
Failed to set locale, defaulting to C
Loaded plugins: fastestmirror
Loading mirror speeds from cached hostfile
* base: ty1.mirror.newmediaexpress.com
* centos-sclo-rh: ty1.mirror.newmediaexpress.com
* centos-sclo-sclo: ty1.mirror.newmediaexpress.com
* epel: d2lzkl7pfhq30w.cloudfront.net
* extras: ty1.mirror.newmediaexpress.com
* updates: ty1.mirror.newmediaexpress.com
redhat-lsb-core-4.1-27.el7.centos.1.i686 : LSB Core module support
Repo : base
Matched from:
Filename : /usr/bin/lsb_release
redhat-lsb-core-4.1-27.el7.centos.1.x86_64 : LSB Core module support
Repo : base
Matched from:
Filename : /usr/bin/lsb_release
redhat-lsb-core
パッケージで入るらしい
sudo yum install -y redhat-lsb-core
lsb_release -a
LSB Version: :core-4.1-amd64:core-4.1-noarch
Distributor ID: CentOS
Description: CentOS Linux release 7.8.2003 (Core)
Release: 7.8.2003
Codename: Core
Debian系の場合: lsb-release
バッケージで入るらしい
docker container run -it --rm debian bash
# apt-get update && apt-get install -y apt-file
# apt-file update && apt-file search lsb_release
cdist: /usr/lib/python3/dist-packages/cdist/conf/explorer/lsb_release
lsb-release: /usr/bin/lsb_release
lsb-release: /usr/lib/python2.7/dist-packages/lsb_release.py
lsb-release: /usr/lib/python3/dist-packages/lsb_release.py
lsb-release: /usr/share/man/man1/lsb_release.1.gz
lsb-release: /usr/share/pyshared/lsb_release.py
# apt-get install -y lsb-release
$ lsb_release -a
No LSB modules are available.
Distributor ID: Debian
Description: Debian GNU/Linux 10 (buster)
Release: 10
Codename: buster
3.1.4 サービスの自動起動
手動でリンクを作成
docker container run --rm centos:5 ls -lF /etc/rc3.d
lrwxrwxrwx 1 root root 10 Mar 31 2016 /etc/rc3.d -> rc.d/rc3.d/
docker container run --rm centos:5 ls -lF /etc/rc.d/rc3.d
total 0
lrwxrwxrwx 1 root root 20 Mar 31 2016 K50netconsole -> ../init.d/netconsole*
lrwxrwxrwx 1 root root 17 Mar 31 2016 K74rsyslog -> ../init.d/rsyslog*
lrwxrwxrwx 1 root root 20 Mar 31 2016 K87multipathd -> ../init.d/multipathd*
lrwxrwxrwx 1 root root 18 Mar 31 2016 K89netplugd -> ../init.d/netplugd*
lrwxrwxrwx 1 root root 15 Mar 31 2016 K89rdisc -> ../init.d/rdisc*
lrwxrwxrwx 1 root root 16 Mar 31 2016 S07iscsid -> ../init.d/iscsid*
lrwxrwxrwx 1 root root 18 Mar 31 2016 S08mcstrans -> ../init.d/mcstrans*
lrwxrwxrwx 1 root root 17 Mar 31 2016 S10network -> ../init.d/network*
lrwxrwxrwx 1 root root 15 Mar 31 2016 S13iscsi -> ../init.d/iscsi*
lrwxrwxrwx 1 root root 15 Mar 31 2016 S25netfs -> ../init.d/netfs*
lrwxrwxrwx 1 root root 22 Mar 31 2016 S26lvm2-monitor -> ../init.d/lvm2-monitor*
lrwxrwxrwx 1 root root 20 Mar 31 2016 S56rawdevices -> ../init.d/rawdevices*
lrwxrwxrwx 1 root root 11 Mar 31 2016 S99local -> ../rc.local*
([SK])(\d{2})\w+
なる命名規則に従っていい感じに/etc/init.d/
にあるスクリプトへのsymlinkを置くだけ
chkconfig
Red Hat系ディストリビューションに入っている
サービスの自動起動を設定するツール
chkconfig version 1.3.30.2 - Copyright (C) 1997-2000 Red Hat, Inc.
This may be freely redistributed under the terms of the GNU Public License.
usage: chkconfig --list [name]
chkconfig --add <name>
chkconfig --del <name>
chkconfig [--level <levels>] <name> <on|off|reset|resetpriorities>
--list
: ランレベルごとに一覧
docker container run --rm centos:5 chkconfig --list
iscsi 0:off 1:off 2:off 3:on 4:on 5:on 6:off
iscsid 0:off 1:off 2:off 3:on 4:on 5:on 6:off
lvm2-monitor 0:off 1:on 2:on 3:on 4:on 5:on 6:off
mcstrans 0:off 1:off 2:on 3:on 4:on 5:on 6:off
multipathd 0:off 1:off 2:off 3:off 4:off 5:off 6:off
netconsole 0:off 1:off 2:off 3:off 4:off 5:off 6:off
netfs 0:off 1:off 2:off 3:on 4:on 5:on 6:off
netplugd 0:off 1:off 2:off 3:off 4:off 5:off 6:off
network 0:off 1:off 2:on 3:on 4:on 5:on 6:off
rawdevices 0:off 1:off 2:off 3:on 4:on 5:on 6:off
rdisc 0:off 1:off 2:off 3:off 4:off 5:off 6:off
rsyslog 0:off 1:off 2:off 3:off 4:off 5:off 6:off
デフォルトのランレベルと優先順位は /etc/init.d/
以下のスクリプトのコメントに書かれている
docker container run --rm centos:5 grep -e chkconfig /etc/init.d/network
# chkconfig: 2345 10 90
update-rc.d
Debian系ディストリビューションに入っている
lsb_release -i
Distributor ID: Ubuntu
update-rc.d --help
usage: update-rc.d [-f] <basename> remove
update-rc.d [-f] <basename> defaults
update-rc.d [-f] <basename> defaults-disabled
update-rc.d <basename> disable|enable [S|2|3|4|5]
-f: force
The disable|enable API is not stable and might change in the future.
- 書籍的には -n で表示のみ(dry-run)らしいが動かなかった
update-rc.d -n
update-rc.d: error: unknown option
Debian buster(10)でも同じだった
lsb_release -a
No LSB modules are available.
Distributor ID: Debian
Description: Debian GNU/Linux 10 (buster)
Release: 10
Codename: buster
update-rc.d
update-rc.d: error: not enough arguments
usage: update-rc.d [-f] <basename> remove
update-rc.d [-f] <basename> defaults
update-rc.d [-f] <basename> defaults-disabled
update-rc.d <basename> disable|enable [S|2|3|4|5]
-f: force
The disable|enable API is not stable and might change in the future.
Debian stretch(9)だと-n
オプションがあった
lsb_release -a
No LSB modules are available.
Distributor ID: Debian
Description: Debian GNU/Linux 9.13 (stretch)
Release: 9.13
Codename: stretch
update-rc.d
update-rc.d: error: not enough arguments
usage: update-rc.d [-n] [-f] <basename> remove
update-rc.d [-n] [-f] <basename> defaults
update-rc.d [-n] <basename> disable|enable [S|2|3|4|5]
-n: not really
-f: force
The disable|enable API is not stable and might change in the future.
他にも書籍といろいろ違いすぎる
start|stop
とされている部分がdisable|enable
だったり