systemdとは
systemdは、LinuxなどのUNIX系OSで長く使用されてきたSysVinitに代わる仕組みで、ソケットとD-BUSを利用することにより並列処理の機能を強化し、依存関係を定義してサービスを管理します。systemdはLennart Poettering氏によって開発され、2010年にリリースされました。
最近の主要なディストリビューションでは、SysVinitあるいはUpstartに代わり、systemd が採用されています[1][2]。
| ディストリビューション | リリース日 | systemdのバージョン |
|---|---|---|
| CentOS 7 | 2014年6月 | 208 |
| SUSE Linux Enterprise Server 12 | 2014年10月 | 210 |
| Fedora 21 | 2014年12月 | 217 |
| Ubuntu 15.04 | 2015年4月 | 219 |
注
[1]: systemdはそのバージョンによってsystemctlのサブコマンドなど、提供する機能に若干の違いがあります。
[2]: FedoraではFedora15以降でsystemdを採用しています。
systemdの中核となるデーモン/usr/lib/systemd/systemdは、SysVinitの/sbin/initと同じくカーネルから起動される最初のユーザプロセスであり、PIDには1が割り当てられます。なお、/sbin/initは、/usr/lib/systemd/systemdへのシンボリックリンクとなっています。
$ ps -e |head -2
PID TTY TIME CMD
1 ? 00:00:40 systemd ← systemdのPIDは1
$ ls -l /sbin/init ← initはsystemdへのシンボリックリンク
lrwxrwxrwx. 1 root root 22 4月 17 13:55 /sbin/init -> ../lib/systemd/systemd
systemdはユニット(unit)によってシステムを管理します。ユニットにはmount、service、targetなど12のタイプがあります。
| ユニット | 説明 |
|---|---|
| mount | ハードウェア、ストレージデバイスのマウント |
| service | サービス |
| target | ターゲット。SysVinitのランレベルに相当 |
各ユニットは/usr/lib/systemdディレクトリと/etc/systemdディレクトリの下のファイルで管理されますが、ファイルを直接編集することなく、systemctlコマンドによって設定や表示などほとんどすべての管理ができます。
systemctl [ オプション ] サブコマンド [ unit名 ]
| 主なオプション | 説明 |
|---|---|
| -a, –all | ストップしているunitも含めてロード(load)されているunitをすべて表示する |
| -l, –full | unit名などを省略しないで表示する |
| -t, –type= | unitの一覧表示の場合、表示するunitのタイプを指定する【例:-t target, -t service】 |
| –no-pager | ページャを使用しない |
| 主なサブコマンド | 説明 |
|---|---|
| start | unitをスタートする |
| restart | unitをリスタートする |
| stop | unitをストップする |
| status | unitの状態を表示する |
| enable | unitをenableにする。これによりシステム起動時にunitは自動的にスタートする |
| disable | unitをdisableにする。これによりシステム起動時にunitはスタートしない |
| isolate | unitおよび依存するunitをスタートし、他のunitはすべてストップする。現在のtargetを変更する場合に使用する |
| list-units | activeなunitをすべて表示表示する。このサブコマンドはデフォルト |
| list-unit-files | インストールされているunitをすべて表示する |
| cat | unit設定ファイルの内容を表示する(バージョン209から)。【実行例:systemctlcat sshd】 |
systemdによるサービスの管理
systemctlコマンドにより、サービスの起動、停止、再起動、状態の表示ができます。またシステム起動時のサービスの自動起動のオン/オフの切り替えができます。
| サービスの管理 | systemd | SysVinit |
|---|---|---|
| 起動 | systemctl start サービス名 | service サービス名 start |
| 停止 | systemctl stop サービス名 | service サービス名 stop |
| 再起動 | systemctl restart サービス名 | service サービス名 restart |
| 状態表示 | systemctl status サービス名 | service サービス名 status |
| 自動起動オン | systemctl enable サービス名 | chkconfig サービス名 on |
| 自動起動オフ | systemctl disable サービス名 | chkconfig サービス名 off |
| 設定表示 | systemctl status サービス名 | chkconfig –list サービス名 |
# systemctl status httpd.service ← httpdサービスの状態を表示
httpd.service - The Apache HTTP Server
Loaded: loaded (/usr/lib/systemd/system/httpd.service; disabled) ← disable になっている
Active: inactive (dead) ← inactive (プロセスは起動していない)
......(以下省略)......
# systemctl start httpd.service ← httpdサービスをスタート
# systemctl status httpd.service
httpd.service - The Apache HTTP Server
Loaded: loaded (/usr/lib/systemd/system/httpd.service; disabled) ← disable になっている
Active: active (running) since 水 2015-04-22 19:35:27 JST; 4s ago ← active (プロセスは起動)
Main PID: 30454 (httpd)
Status: "Processing requests..."
CGroup: /system.slice/httpd.service
├─30454 /usr/sbin/httpd -DFOREGROUND
├─30455 /usr/sbin/httpd -DFOREGROUND
├─30456 /usr/sbin/httpd -DFOREGROUND
├─30457 /usr/sbin/httpd -DFOREGROUND
├─30458 /usr/sbin/httpd -DFOREGROUND
└─30459 /usr/sbin/httpd -DFOREGROUND
......(以下省略)......
# systemctl enable httpd.service ← enableに設定
ln -s '/usr/lib/systemd/system/httpd.service' '/etc/systemd/system/multi-user.target.wants/httpd.service'
サービスを指定する場合には、サービス名.serviceの.serviceを省略できます。例えば、上記のhttpd.serviceであれば、httpdと指定して実行することできます。

