| ページ一覧 | ブログ | twitter |  書式 | 書式(表) |

MyMemoWiki

「Systemd」の版間の差分

提供: MyMemoWiki
ナビゲーションに移動 検索に移動
 
(同じ利用者による、間の1版が非表示)
1行目: 1行目:
==Systemd==
+
==[[Systemd]]==
[[Linux]]
+
[[Linux]] |
  
*https://fedoraproject.org/wiki/Systemd
+
*https://fedoraproject.org/wiki/[[Systemd]]
 
*http://d.hatena.ne.jp/enakai00/20130914/1379146157
 
*http://d.hatena.ne.jp/enakai00/20130914/1379146157
 
*http://alpha.mixi.co.jp/2013/12063/
 
*http://alpha.mixi.co.jp/2013/12063/
<blockquote>Linuxの起動処理は、これまでinit/upstartと呼ばれる仕組みで行われていました。Red Hat Enterprise Linux 7 (RHEL7)では、これが、systemdと呼ばれるまったく新しい仕組みに置き換わります。</blockquote>
+
<blockquote>[[Linux]]の起動処理は、これまでinit/upstartと呼ばれる仕組みで行われていました。Red Hat Enterprise [[Linux]] 7 (RHEL7)では、これが、systemdと呼ばれるまったく新しい仕組みに置き換わります。</blockquote>
  
 
===Unit===
 
===Unit===
 
*systemdでは、「Unit」という単位で処理を管理
 
*systemdでは、「Unit」という単位で処理を管理
 
*rc.sysinitやサービス起動スクリプトが実施していた処理の内容は、すべて、Unitとして定義
 
*rc.sysinitやサービス起動スクリプトが実施していた処理の内容は、すべて、Unitとして定義
*Unitは、「target」「mount」「service」「device」など、役割によってタイプがわかれている
+
*Unitは、「target」「mount」「ser[[vi]]ce」「de[[vi]]ce」など、役割によってタイプがわかれている
**設定ファイル名の末尾「.target」「.service」で判別ができます
+
**設定ファイル名の末尾「.target」「.ser[[vi]]ce」で判別ができます
 
*Unitの定義ファイルは /usr/lib/systemd/system/ ディレクトリ配下にあります。
 
*Unitの定義ファイルは /usr/lib/systemd/system/ ディレクトリ配下にあります。
  
26行目: 26行目:
 
|オートマウント処理を実施する(automountdの代替的な機能)
 
|オートマウント処理を実施する(automountdの代替的な機能)
 
|-
 
|-
|service
+
|ser[[vi]]ce
 
|指定のバイナリを実行する(主にはデーモンの起動に使用する)
 
|指定のバイナリを実行する(主にはデーモンの起動に使用する)
 
|-
 
|-
35行目: 35行目:
 
|指定のファイルが作成されると、指定されたサービスを起動する
 
|指定のファイルが作成されると、指定されたサービスを起動する
 
|-
 
|-
|device
+
|de[[vi]]ce
 
|udevから通知されたデバイスを表す
 
|udevから通知されたデバイスを表す
 
|-
 
|-
47行目: 47行目:
  
 
=====稼働サービスの一覧=====
 
=====稼働サービスの一覧=====
  # systemctl list-units --type=service
+
  # systemctl list-units --type=ser[[vi]]ce
  
 
===on/offの設定===
 
===on/offの設定===
*chkconfigによるon/offに対応
+
*[[chkconfig]]によるon/offに対応
 
=====on=====
 
=====on=====
  # systemctl enable docker.service
+
  # systemctl enable docker.ser[[vi]]ce
 
=====off=====
 
=====off=====
  # systemctl disable docker.service
+
  # systemctl disable docker.ser[[vi]]ce
  
 
===ターゲットの設定===
 
===ターゲットの設定===
 
*/usr/lib/systemd/system/ 配下の設定ファイルを確認
 
*/usr/lib/systemd/system/ 配下の設定ファイルを確認
<blockquote>、runlevel 5に相当する「graphical.target」に対しては、「multi-user.target」が前提として定義されていますので、multi-user.targetで有効化されたserviceは、自動的にgraphical.targetでも有効化されます</blockquote>
+
<blockquote>、runlevel 5に相当する「graphical.target」に対しては、「multi-user.target」が前提として定義されていますので、multi-user.targetで有効化されたser[[vi]]ceは、自動的にgraphical.targetでも有効化されます</blockquote>
  
 
=====例=====
 
=====例=====
64行目: 64行目:
 
*runlevel 5だけで有効化したい → WantedByにgraphical.targetを指定
 
*runlevel 5だけで有効化したい → WantedByにgraphical.targetを指定
  
  # cat /usr/lib/systemd/system/docker.service                                                        
+
  # cat /usr/lib/systemd/system/docker.ser[[vi]]ce                                                        
 
  [Unit]
 
  [Unit]
  Description=Docker Application Container Engine
+
  Description=[[Docker]] Application Container Engine
 
  Documentation=http://docs.docker.io
 
  Documentation=http://docs.docker.io
 
  After=network.target
 
  After=network.target
  Requires=docker.socket
+
  [[R]]equires=docker.socket
 
   
 
   
 
  [Service]
 
  [Service]
 
  Type=notify
 
  Type=notify
  EnvironmentFile=-/etc/sysconfig/docker
+
  En[[vi]]ronmentFile=-/etc/sysconfig/docker
 
  ExecStart=/usr/bin/docker -d --selinux-enabled -H fd://
 
  ExecStart=/usr/bin/docker -d --selinux-enabled -H fd://
  Restart=on-failure
+
  [[R]]estart=on-failure
 
  LimitNOFILE=1048576
 
  LimitNOFILE=1048576
  LimitNPROC=1048576
+
  LimitNP[[R]]OC=1048576
 
   
 
   
 
  [Install]
 
  [Install]
83行目: 83行目:
  
 
===サービスの確認===
 
===サービスの確認===
  # systemctl status docker.service
+
  # systemctl status docker.ser[[vi]]ce
  docker.service - Docker Application Container Engine
+
  docker.service - [[Docker]] Application Container Engine
     Loaded: loaded (/usr/lib/systemd/system/docker.service; enabled)
+
     Loaded: loaded (/usr/lib/systemd/system/docker.ser[[vi]]ce; enabled)
 
     Active: active (running) since 日 2014-07-13 23:04:55 JST; 30min ago
 
     Active: active (running) since 日 2014-07-13 23:04:55 JST; 30min ago
 
       Docs: http://docs.docker.io
 
       Docs: http://docs.docker.io
 
   Main PID: 3072 (docker)
 
   Main PID: 3072 (docker)
     CGroup: /system.slice/docker.service
+
     CGroup: /system.slice/docker.ser[[vi]]ce
 
             └─3072 /usr/bin/docker -d --selinux-enabled -H fd://
 
             └─3072 /usr/bin/docker -d --selinux-enabled -H fd://
 
   
 
   
104行目: 104行目:
  
 
===再起動===
 
===再起動===
  # systemctl restart docker.service
+
  # systemctl restart docker.ser[[vi]]ce
 
===設定の再読み込み===
 
===設定の再読み込み===
 
  # systemctl reload [サービス]
 
  # systemctl reload [サービス]
<blockquote>該当のserviceがreloadオプションに対応している必要あり</blockquote>
+
<blockquote>該当のser[[vi]]ceがreloadオプションに対応している必要あり</blockquote>
 
=====例=====
 
=====例=====
*start/reloadの際に実行されるコマンドが指定されています(「ExecStart=」、および「ExecReload=」オプション)
+
*start/reloadの際に実行されるコマンドが指定されています(「ExecStart=」、および「Exec[[R]]eload=」オプション)
 
  [Service]
 
  [Service]
  EnvironmentFile=/etc/sysconfig/sshd
+
  En[[vi]]ronmentFile=/etc/sysconfig/sshd
 
  ExecStartPre=/usr/sbin/sshd-keygen
 
  ExecStartPre=/usr/sbin/sshd-keygen
 
  ExecStart=/usr/sbin/sshd -D $OPTIONS
 
  ExecStart=/usr/sbin/sshd -D $OPTIONS
  ExecReload=/bin/kill -HUP $MAINPID
+
  Exec[[R]]eload=/bin/kill -HUP $MAINPID
  
===chkconfig/serviceコマンドとの共存===
+
===[[chkconfig]]/serviceコマンドとの共存===
/etc/init.d/以下に旧来のサービススクリプトがある場合、そちらをchkconfig/serviceコマンドで操作することも可能です。CentOS7では、次のサービスはsystemdに移行せずに残っています。
+
/etc/init.d/以下に旧来のサービススクリプトがある場合、そちらを[[chkconfig]]/serviceコマンドで操作することも可能です。CentOS7では、次のサービスはsystemdに移行せずに残っています。
  
  # chkconfig --list
+
  # [[chkconfig]] --list
 
   
 
   
 
  注記: この出力は SysV サービスのみであり、ネイティブな systemd のサービスは含まれていません。
 
  注記: この出力は SysV サービスのみであり、ネイティブな systemd のサービスは含まれていません。
       systemd services. SysV 設定のデータはネイティブな systemd の設定によって上書きされます。
+
       systemd ser[[vi]]ces. SysV 設定のデータはネイティブな systemd の設定によって上書きされます。
 
       systemd サービスを一覧表示するには 'systemctl list-unit-files' を使用してください。
 
       systemd サービスを一覧表示するには 'systemctl list-unit-files' を使用してください。
 
       特定のターゲットにおいて有効化されているサービスを確認するには、
 
       特定のターゲットにおいて有効化されているサービスを確認するには、
133行目: 133行目:
 
  network        0:off  1:off  2:on    3:on    4:on    5:on    6:off
 
  network        0:off  1:off  2:on    3:on    4:on    5:on    6:off
  
<blockquote>/etc/init.d/以下にスクリプトがないサービスに対して、chkconfig/serviceコマンドを実行した場合は、自動的に対応するsystemctlコマンドが発行されます。</blockquote>
+
<blockquote>/etc/init.d/以下にスクリプトがないサービスに対して、[[chkconfig]]/serviceコマンドを実行した場合は、自動的に対応するsystemctlコマンドが発行されます。</blockquote>
  
 
===各フェーズにおける起動時間===
 
===各フェーズにおける起動時間===
140行目: 140行目:
  
 
===仮想環境種類の判別===
 
===仮想環境種類の判別===
  # systemd-detect-virt
+
  # systemd-detect-[[vi]]rt
 
  microsoft
 
  microsoft

2020年2月16日 (日) 04:33時点における最新版

Systemd

Linux |

<blockquote>Linuxの起動処理は、これまでinit/upstartと呼ばれる仕組みで行われていました。Red Hat Enterprise Linux 7 (RHEL7)では、これが、systemdと呼ばれるまったく新しい仕組みに置き換わります。</blockquote>

Unit

  • systemdでは、「Unit」という単位で処理を管理
  • rc.sysinitやサービス起動スクリプトが実施していた処理の内容は、すべて、Unitとして定義
  • Unitは、「target」「mount」「service」「device」など、役割によってタイプがわかれている
    • 設定ファイル名の末尾「.target」「.service」で判別ができます
  • Unitの定義ファイルは /usr/lib/systemd/system/ ディレクトリ配下にあります。


Unitのタイプ

タイプ 説明
mount 指定のファイルシステムをマウントする
automount オートマウント処理を実施する(automountdの代替的な機能)
service 指定のバイナリを実行する(主にはデーモンの起動に使用する)
socket systemdがSocketをListenして、接続があるとプロセスに受け渡す(xinetdの代替的な機能)
path 指定のファイルが作成されると、指定されたサービスを起動する
device udevから通知されたデバイスを表す
target 複数のUnitをまとめるために使用する

systemctlコマンドによるUnitの確認

  • 「systemctl list-units」コマンドを利用すると、現在の設定で稼働しているUnitを確認することができます
稼働サービスの一覧
# systemctl list-units --type=service

on/offの設定

on
# systemctl enable docker.service
off
# systemctl disable docker.service

ターゲットの設定

  • /usr/lib/systemd/system/ 配下の設定ファイルを確認

<blockquote>、runlevel 5に相当する「graphical.target」に対しては、「multi-user.target」が前提として定義されていますので、multi-user.targetで有効化されたserviceは、自動的にgraphical.targetでも有効化されます</blockquote>

  • runlevel 3と5で有効化したい → WantedByにmulti-user.targetを指定
  • runlevel 5だけで有効化したい → WantedByにgraphical.targetを指定
# cat /usr/lib/systemd/system/docker.service                                                       
[Unit]
Description=Docker Application Container Engine
Documentation=http://docs.docker.io
After=network.target
Requires=docker.socket

[Service]
Type=notify
EnvironmentFile=-/etc/sysconfig/docker
ExecStart=/usr/bin/docker -d --selinux-enabled -H fd://
Restart=on-failure
LimitNOFILE=1048576
LimitNPROC=1048576

[Install]
WantedBy=multi-user.target

サービスの確認

# systemctl status docker.service
docker.service - Docker Application Container Engine
   Loaded: loaded (/usr/lib/systemd/system/docker.service; enabled)
   Active: active (running) since 日 2014-07-13 23:04:55 JST; 30min ago
     Docs: http://docs.docker.io
 Main PID: 3072 (docker)
   CGroup: /system.slice/docker.service
           └─3072 /usr/bin/docker -d --selinux-enabled -H fd://

 7月 13 23:04:53 higeoyaji docker[3072]: [ba0e5300.init_networkdriver()] creating new bridge for docker0
 7月 13 23:04:54 higeoyaji docker[3072]: [ba0e5300.init_networkdriver()] getting iface addr
 7月 13 23:04:54 higeoyaji docker[3072]: [ba0e5300] -job init_networkdriver() = OK (0)
 7月 13 23:04:55 higeoyaji docker[3072]: Loading containers: : done.
 7月 13 23:04:55 higeoyaji docker[3072]: [ba0e5300.initserver()] Creating pidfile
 7月 13 23:04:55 higeoyaji docker[3072]: [ba0e5300.initserver()] Setting up signal traps
 7月 13 23:04:55 higeoyaji docker[3072]: [ba0e5300] -job initserver() = OK (0)
 7月 13 23:04:55 higeoyaji docker[3072]: [ba0e5300] +job acceptconnections()
 7月 13 23:04:55 higeoyaji docker[3072]: [ba0e5300] -job acceptconnections() = OK (0)
 7月 13 23:04:55 higeoyaji systemd[1]: Started Docker Application Container Engine.

再起動

# systemctl restart docker.service

設定の再読み込み

# systemctl reload [サービス]

<blockquote>該当のserviceがreloadオプションに対応している必要あり</blockquote>

  • start/reloadの際に実行されるコマンドが指定されています(「ExecStart=」、および「ExecReload=」オプション)
[Service]
EnvironmentFile=/etc/sysconfig/sshd
ExecStartPre=/usr/sbin/sshd-keygen
ExecStart=/usr/sbin/sshd -D $OPTIONS
ExecReload=/bin/kill -HUP $MAINPID

chkconfig/serviceコマンドとの共存

/etc/init.d/以下に旧来のサービススクリプトがある場合、そちらをchkconfig/serviceコマンドで操作することも可能です。CentOS7では、次のサービスはsystemdに移行せずに残っています。

# chkconfig --list

注記: この出力は SysV サービスのみであり、ネイティブな systemd のサービスは含まれていません。
      systemd services. SysV 設定のデータはネイティブな systemd の設定によって上書きされます。
      systemd サービスを一覧表示するには 'systemctl list-unit-files' を使用してください。
      特定のターゲットにおいて有効化されているサービスを確認するには、
      'systemctl list-dependencies [target]' 。

iprdump         0:off   1:off   2:on    3:on    4:on    5:on    6:off
iprinit         0:off   1:off   2:on    3:on    4:on    5:on    6:off
iprupdate       0:off   1:off   2:on    3:on    4:on    5:on    6:off
netconsole      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

<blockquote>/etc/init.d/以下にスクリプトがないサービスに対して、chkconfig/serviceコマンドを実行した場合は、自動的に対応するsystemctlコマンドが発行されます。</blockquote>

各フェーズにおける起動時間

# systemd-analyze
Startup finished in 390ms (kernel) + 7.498s (initrd) + 24.687s (userspace) = 32.576s

仮想環境種類の判別

# systemd-detect-virt
microsoft