/etc/systemd/system.conf
ファイルには、基本的な
systemd 動作を制御するための設定オプション項目があります。
デフォルトのファイルは、各項目のデフォルト値が示された上でそれがコメントアウトされています。
このファイルでは基本的なジャーナル設定やログレベルを設定する必要があります。 各オプションの詳細については man ページ
systemd-system.conf(5)
を参照してください。
通常 systemd はブート処理の最後に画面をクリアします。 必要ならばこの動きを以下のようにして変更することができます。
mkdir -pv /etc/systemd/system/getty@tty1.service.d
cat > /etc/systemd/system/getty@tty1.service.d/noclear.conf << EOF
[Service]
TTYVTDisallocate=no
EOF
ブートメッセージは、root
ユーザーになってコマンド
journalctl -b
を実行することで、常に表示しておくこともできます。
デフォルトでは /tmp
は tmpfs として生成されます。
これが適当ではないならば、以下のコマンドによりオーバーライドすることができます。
ln -sfv /dev/null /etc/systemd/system/tmp.mount
それとは別に /tmp
を別パーティションとする場合は、/etc/fstab
にそのパーティションを指定します。
/tmp
を別パーティションとした場合、このパーティションに対してシンボリックリンクを作成することは避けてください。
これを行ってしまうと、ルートファイルシステム(/)を r/w
として再マウントすることができなくなり、システムを再起動すると利用できなくなります。
ファイルやディレクトリを生成、削除するサービスがいくつかあります。
systemd-tmpfiles-clean.service
systemd-tmpfiles-setup-dev.service
systemd-tmpfiles-setup.service
システム用設定ファイルは /usr/lib/tmpfiles.d/*.conf
です。 ローカル用設定ファイルは
/etc/tmpfiles.d/*.conf
に置きます。
/etc/tmpfiles.d
にあるファイルは /usr/lib/tmpfiles.d
にある同名ファイルをオーバーライドします。
ファイル書式の詳細については man ページ tmpfiles.d(5)
を参照してください。
/usr/lib/tmpfiles.d/*.conf
ファイルの文法はやっかいなものです。 例えば /tmp ディレクトリ内のファイルを消去するためのデフォルト設定は
/usr/lib/tmpfiles.d/tmp.conf
ファイルに以下のように記述されます。
q /tmp 1777 root root 10d
型を表わす q はクォータを用いたサブボリュームを生成するものとして説明されています。 ただこれが適用できるのは btrfs ファイルシステムのみです。 この型は v を参照し、次に d(ディレクトリ)を参照します。 指定されたディレクトリが存在しない場合はそれが生成されて、パーミッションと所有者が指定されたものに設定されます。 時間指定が行われた場合、そのディレクトリ内のファイルは、それに応じて削除されます。
デフォルトパラーメーターを必要としない場合は、設定ファイルを /etc/tmpfiles.d
にコピーして必要な設定を行っておきます。 例えば以下です。
mkdir -p /etc/tmpfiles.d cp /usr/lib/tmpfiles.d/tmp.conf /etc/tmpfiles.d
ユニットパラメーターをオーバーライドするには /etc/systemd/system
ディレクトリを生成して設定ファイルを作成します。
例えば以下のとおりです。
mkdir -pv /etc/systemd/system/foobar.service.d
cat > /etc/systemd/system/foobar.service.d/foobar.conf << EOF
[Service]
Restart=always
RestartSec=30
EOF
詳しくは man ページ systemd.unit(5)
を参照してください。 設定ファイルを作成したら systemctl
daemon-reload
と systemctl restart foobar
を実行します。
これによりサービスの設定内容が反映されます。
SysVinit や BSD スタイルの起動システムにおいては単純なシェルスクリプトが用いられていますが、 systemd ではさまざまな形式の起動ファイル (あるいはユニット) を統一化するフォーマットが用いられています。 systemctl コマンドがユニットファイルの有効/無効、状態制御/参照を行います。 以下に示すものがよく用いられます。
systemctl list-units -t
<service>
[--all]: サービスタイプのユニットファイルをロードします。
systemctl list-units -t
<target>
[--all]: ターゲットタイプのユニットファイルをロードします。
systemctl show -p Wants
<multi-user.target>
:
マルチユーザーターゲットに依存するユニットをすべて表示します。 ターゲットは特別なユニットファイルであり、SysVinit
におけるランレベルに相当します。
systemctl status <servicename.service>
:
servicename で示されるサービスの状態を表示します。 拡張子 .service
は、他に同名のサービスがない限り、例えば .socket ファイルであるような場合は省略することができます。
(.socket ファイルは inetd/xinetd と同様の機能を提供するソケットを生成します。)
systemd により起動したシステムのシステムログは、従来の unix syslog デーモンとは異なり、デフォルトで systemd-journald により扱われます。 必要に応じて標準的な syslog デーモンを追加することも可能で、両者を併用することもできます。 systemd-journald プログラムはジャーナル項目を保存しますが、それはテキストログファイルではなく、バイナリフォーマットファイルです。 そのファイル内容を確認するために journalctl コマンドが提供されています。 以下に示すものがよく用いられます。
journalctl -r: ジャーナル項目すべてを日付の昇順により表示します。
journalctl -u UNIT
: 指定された
UNIT ファイルに関連したジャーナル項目を表示します。
journalctl -b[=ID] -r: 直近の起動成功から (あるいはブートIDから) のジャーナル項目を、日付の昇順により表示します。
journalctl -f: tail -f と同様の機能を提供します。
クラッシュしたプログラムをデバッグするのに、コアダンプというものが重宝します。 特にデーモンプロセスがクラッシュした場合です。
systemd によるブートシステムにおいて、コアダンプは systemd-coredump が取り扱います。
このプログラムはジャーナル内にコアダンプのログを出力し、コアダンプそのものは /var/lib/systemd/coredump
に保存します。
コアダンプを取り出して処理するために coredumpctl というツールが提供されています。
よく利用されるコマンド例を以下に示します。
coredumpctl -r: すべてのコアダンプを新しい順に一覧表示します。
coredumpctl -1 info: 最新のコアダンプの情報を表示します。
coredumpctl -1 debug: 最新のコアダンプを GDB にロードします。
コアダンプはディスク容量を大量に消費することがあります。 /etc/systemd/coredump.conf.d
に設定ファイルを生成して、
コアダンプに利用するディスク容量の最大を制御することができます。 たとえば以下のとおりです。
mkdir -pv /etc/systemd/coredump.conf.d
cat > /etc/systemd/coredump.conf.d/maxuse.conf << EOF
[Coredump]
MaxUse=5G
EOF
詳細は systemd-coredump(8), coredumpctl(1), coredump.conf.d(5) の各 man ページを参照してください。
systemd-230 より取り入れられた機能として、ユーザープロセスは、たとえ nohup が用いられたり、あるいは
daemon()
や setsid()
が利用されたプロセスであっても、ユーザーセッションが終了するとともに終了します。
この機能変更は、従来からの柔軟な実装を厳格なものとする意図で行われたものです。 したがって稼動し続けるプロセスが利用されていると
(例えば screen や
tmux
など)、この機能変更が問題を引き起こすことになるかもしれません。
つまりユーザーセッションが終了した後にもプロセスをアクティブにしておくことが必要になります。
ユーザーセッション終了後にプロセスを継続させる方法として、以下の三つの方法があります。
指定ユーザーのプロセスを継続させる方法:
標準的なユーザーは自身のユーザー権限においてコマンド loginctl enable-linger
を実行して、プロセスを継続させることができます。 システム管理者は user
引数を利用して、そのユーザーに対して同一のコマンドを実行可能です。 そしてそのユーザーは systemd-run
コマンドを実行することでプロセスを継続的に稼動させます。 例えば systemd-run --scope --user
/usr/bin/screen などとします。
特定ユーザーに対してのプロセス継続を行った場合、ログインセッションがすべて終了しても user@.service
が残ります。 そしてこれはシステム起動時にも自動実行されます。
つまりユーザーセッションが終了した後にもプロセスの有効無効の制御が明示的に行えるものであり、nohup や deamon()
を利用するユーティリティーなどの下位互換性をなくすものです。
システムワイドなプロセスを継続させる方法:
/etc/systemd/logind.conf
ファイル内に
KillUserProcesses=no
を指定すれば、全ユーザーに対してグローバルにプロセスを継続起動させることができます。
これは明示的に制御する方法を無用とし、従来どおり全ユーザーに対しての方式を残すメリットがあります。
機能変更をビルド時に無効化する方法:
プロセス継続をデフォルトとするために systemd のビルド時に meson コマンドにおいて -Ddefault-kill-user-processes=false
スイッチを指定する方法があります。 この方法をとれば、systemd
がセッション終了時にユーザープロセスを終了させてしまう機能を完全に無効化することができます。