マシンに電源が入るとBIOSがプライマリブートデバイスを探し、それがハードディスクであればディスクの先頭512バイトに位置するマスターブートレコード(MBR)を読み込む。MBRに保存してある、GRUBなどのブートストラッププログラム(ブートローダ)を読み込み、Linuxカーネルがメモリにロードされる。なお、GRUBの設定ファイルはLinuxパーティションに保存されるため、Linuxのパーティションを削除すると起動できなくなる恐れがある。
カーネルがメモリにロードされてからのLinuxの起動プロセスを見ていく。
かつて最初にinitプロセスsysvinitが起動しこれがすべての他のプロセスの祖先になっていた。CentOS 6系列までは/etc/inittabファイルがinitプロセスの設定ファイルであったが、CentOS 7系列(2014年7月7日~)からsystemdに置き換えられた。Ubuntuではバージョン15.04(2015年4月 )からにsystemdに置き換えられた。systemdの主な改善は並列・並行起動が可能になったところで、システムの起動においてマルチコアのメリットを享受でき、起動が速くなったところである。
pstreeコマンドを実行するとプロセスの祖先がsystemdであることが確認できる。Webサービスのapacheやnginxもここから起動する。
systemd はsystemd units という概念が導入されており、システムサービスを表すservice、unitsのグループを表すtarget、ファイルやディレクトリを表すpathなどがある。これらは/etc/systemd/systemディレクトリなどに保存されている。かつてのSysvinitではシェルスクリプトで処理されていたがsystemd unitsに置き換えられている。
LinuxMintの場合は、使用される設定ファイルは/etc/systemd/systemディレクトリに保存されている。デフォルトの設定ファイルは/lib/systemd/systemまたは/usr/lib/systemdディレクトリ内にあり、こちらは変更してはならない。
LinuxはGUIまたはCUIで起動する。個人用PCとして使われる場合は、GUIで起動することが多い。一方、サーバー用途ではCUIで起動することもある。「systemctl set-default」コマンドで起動時の切り替えができるが、そのあたり解説する。
Debianの動作モードを表すランレベルの設定は/lib/systemd/systemディレクトリのrunlevel0.target~runlevel6.targetファイルによって決まる。各ファイルはシンボリックリンクになっている。
runlevel0.target powor0ff.target
runlevel1.target rescue.target
runlevel2.target multi-user.target
runlevel3.target multi-user.target
runlevel4.target multi-user.target
runlevel5.target graphical.target
runlevel6.target reboot.target
tty1~6はそれぞれCtrl+Alt+F1~6に対応する。DebianではCtrl+Alt+F2で、LinuxMintではCtrl+Alt+F7でデフォルトGUIを表示する。
各target のコメントを除く内容は以下のとおりである。
poweroff.target
[Unit]
Description=Power-Off
Documentation=man:systemd.special(7)
DefaultDependencies=no
Requires=system-poweroff.service
After=system.poweroff.service
AllowIsolate=yes
JobTimeoutSec=30min
JobTimeoutAction=poweroff-force
[Install]
Alias=ctrl-alt-del.target
multi-user.target
[Unit]
Description=Rescue Mode
Documentation=man:systemd.special(7)
Requires=sysinit.target rescue.service
After=sysinit.target rescue.service
AllowIsolate=yes
multi-user.target
[Unit]
Description=Multi-User System
Documentation=man:systemd.special(7)
Requires=basic.target
Conflicts=rescue.service rescue.target
After=basic.target rescue.service rescue.target
AllowIsolate=yes
graphical.target
[Unit]
Description=Graphical Interface
Documentation=man:systemd.special(7)
Requires=multi-user.target
Wants=display-manager.service
Conflicts=rescue.service rescue.target
After=multi-user.target rescue.service rescue.target display-manager.service
AllowIsolate=yes
reboot.target
[Unit]
Description=Reboot
Documentation=man:systemd.special(7)
DefaultDependencies=no
Requires=system-reboot.service
After=system.reboot.service
AllowIsolate=yes
JobTimeoutSec=30min
JobTimeoutAction=reboot-force
[Install]
Alias=ctrl-alt-del.target
現在のアクティブなターゲットはsystemctl list-units --type targetコマンドで表示する。読み込み済みのターゲットを全て表示するにはsystemctl list-units --type target --allを実行する。
デフォルトターゲットを変更するには「systemctl set-default (ターゲット名)」を実行する。(ターゲット名)はmulti-userなどを指定する。このコマンドは/etc/systemd/system/default.targetのシンボリックリンクを置き換える。デフォルトではgraphical.targetになっている。またLinux Mintなどはdefault.targetがないが、その場合graphical.targetで起動する。
端末でttyを実行すると /dev/pts/0と表示される。XWindowSytemを起動せずにCUIで実行すると/dev/tty1などと表示される。
Windowsでは背後で実行されるプログラムをサービスという形で実行している。コントロールパネル>管理ツール>サービスで一覧を開くことができる。
Linuxではsystemctl list-units --type serviceコマンドでサービスの一覧を表示することができる。
表形式の表示でUNIT, LOAD, ACTIVE, SUB, DESCRIPTIONの5項目が表示される。また、service --status-allでもサービス一覧表示できる。
サービスを停止するにはsystemctl stopコマンドを使用する。nginxを停止するにはsystemctl stop nginx.serviceコマンドを実行すればよい。サービスを起動するにはstopをstartに変えた、systemctl start nginx.serviceコマンドを実行する。
サービスが有効かどうか調べるにはsystemctl statusコマンドを実行する。nginxサービスを調べるにはsystemctl status nginx.serviceコマンドを実行する。「.service」の入力は省略可能である。
08:41:46:~$ systemctl status nginx.service
● nginx.service - nginx - high performance web server
Loaded: loaded (/lib/systemd/system/nginx.service; disabled; vendor preset: enabled)
Active: active (running) since Mon 2020-07-20 08:33:03 JST; 8min ago
Docs: http://nginx.org/en/docs/
Main PID: 8290 (nginx)
Tasks: 2 (limit: 4915)
CGroup: /system.slice/nginx.service
├─8290 nginx: master process /usr/sbin/nginx -c /etc/nginx/nginx.conf
└─8291 nginx: worker process
7月 20 08:33:03 cpageT40 systemd[1]: Starting nginx - high performance web server...
7月 20 08:33:03 cpageT40 systemd[1]: Started nginx - high performance web server.
08:41:49:~$
システムサービスはシステム起動時に自動的に起動させることができる。systemctl list-units --type serviceコマンドで表示されたサービス一覧ではACTIVE項目はactiveまたはfailedになっているが、activeになっているサービスは起動中である。システム起動直後にactiveになっていれば自動的に起動するといることになる。
nginxを例にすると自動的に起動するかどうかはsystemctl is-enabled nginxコマンドで調べることができる。disabledと表示されれば起動されず、enabledと表示されれば自動起動される。
自動起動されるようにするにはsudo systemctl enable nginxコマンドを実行する。逆に、自動起動されないようにするにはsudo systemctl disable nginxコマンドを実行する。