LPIC201/202 あずき本 ch3 システムの起動 (1/2)

LPIC201勉強メモ資格勉強

出典: 

3.1 システム起動プロセス

3.1.1 ブートからカーネルの起動まで

ながれ

  1. BIOS/UEFI起動
  2. BIOS/UEFIがブートローダを起動

    • 格納方式: MBR/GPT
  3. ブートローダがカーネルをロードして実行

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だとある

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

    • 処理内容

man

アクション指示子

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 だったり