systemd FAQ

提供: ArchWiki
2022年1月13日 (木) 19:33時点におけるKgx (トーク | 投稿記録)による版 (→‎{{ic|Failed to issue method call: File exists}} エラー: 情報を翻訳して更新)
ナビゲーションに移動 検索に移動

関連記事

FAQ

既知の問題の最新のリストについては、アップストリームの TODO を調べて下さい。

どうしてログメッセージがコンソールに表示されるのですか?

カーネルの loglevel はあなた自身の手で設定してください。歴史的に、/etc/rc.sysinit がこれを行って dmesg のログレベルを 3 (適度に quiet なログレベル) に設定していました。loglevel=3quiet のどちらかをカーネルパラメータに追加してください。

デフォルトで動作する getty の数を修正するにはどうすればいいですか?

getty を追加するには、/etc/systemd/system/getty.target.wants/ ディレクトリに getty をインスタンス生成するシンボリックリンクを作ってください:

# ln -sf /usr/lib/systemd/system/getty@.service /etc/systemd/system/getty.target.wants/getty@tty9.service
# systemctl start getty@tty9.service

getty を削除するには、/etc/systemd/system/getty.target.wants/ ディレクトリから削除したい getty のシンボリックリンクを削除してください:

# rm /etc/systemd/system/getty.target.wants/getty@{tty5,tty6}.service
# systemctl stop getty@tty5.service getty@tty6.service

systemd は /etc/inittab ファイルを使いません。

ノート: systemd 30 では、デフォルトで getty はひとつだけ起動します。他の tty に切り替えた場合、そこに getty が起動します (socket-activation style)。上の方法を使って agetty プロセスの追加を強制することは可能です。

/etc/systemd/logind.conf を編集して NAutoVTs の値を変更することで自動で生成させる getty の数を変更することもできます。このようにすれば、必要なときに生成されるのは変わらずに、上の方法で起動時に実行する getty を指定できます。

起動中の出力をもっと詳細に表示するにはどうすればいいですか?

initram のメッセージの後、コンソールに何も表示されない場合、kernel 行に quiet パラメータが設定されているのが原因です。パラメータを削除すれば、少なくとも最初に systemd で起動した時、全てが ok かどうか見ることができます。そして、緑の [ OK ] か赤の [ FAILED ] のリストが表示されます。

全てのメッセージはシステムログに保存されるので、システムの状態を知りたいときは systemctl を実行 (root 権限は必要ありません) するか journalctl を使ってブート・システムログを見て下さい。

起動後にコンソールが消されるのを止めるにはどうすればいいですか?

/etc/systemd/system/getty@.service.d という名前のディレクトリを作成してその中に nodisallocate.conf を配置して TTYVTDisallocate オプションを no上書きしてください。

/etc/systemd/system/getty@.service.d/nodisallocate.conf
[Service]
TTYVTDisallocate=no

公式の Arch カーネルを使わない場合どのカーネルオプションを有効にする必要がありますか?

2.6.39 以前のカーネルはサポートされていません。

以下は必須・推奨オプションのリストの一部です、全てではありません:

General setup
 CONFIG_FHANDLE=y
 CONFIG_AUDIT=y (推奨)
 CONFIG_AUDIT_LOGINUID_IMMUTABLE=y (not required, may break sysvinit compatibility)
 CONFIG_CGROUPS=y
 -> Namespaces support
    CONFIG_NET_NS=y (for private network)
Networking support -> Networking options
 CONFIG_IPV6=[y|m] (強く推奨)
Device Drivers
 -> Generic Driver Options
    CONFIG_UEVENT_HELPER_PATH=""
    CONFIG_DEVTMPFS=y
    CONFIG_DEVTMPFS_MOUNT=y (必須、initramfs を使わない場合)
 -> Real Time Clock
    CONFIG_RTC_DRV_CMOS=y (強く推奨)
File systems
 CONFIG_FANOTIFY=y (readahead に必須)
 CONFIG_AUTOFS4_FS=[y|m]
 -> Pseudo filesystems
    CONFIG_TMPFS_POSIX_ACL=y (推奨、pam_systemd.so を使う場合)

あるユニットが依存している他のユニットを調べるにはどうすればいいですか?

例えば、multi-user.target のようなターゲットがどのサービスを使っているか調べたい時は、次のようなコマンドを使って下さい:

$ systemctl show -p "Wants" multi-user.target
Wants=rc-local.service avahi-daemon.service rpcbind.service NetworkManager.service acpid.service dbus.service atd.service crond.service auditd.service ntpd.service udisks.service bluetooth.service org.cups.cupsd.service wpa_supplicant.service getty.target modem-manager.service portreserve.service abrtd.service yum-updatesd.service upowerd.service test-first.service pcscd.service rsyslog.service haldaemon.service remote-fs.target plymouth-quit.service systemd-update-utmp-runlevel.service sendmail.service lvm2-monitor.service cpuspeed.service udev-post.service mdmonitor.service iscsid.service livesys.service livesys-late.service irqbalance.service iscsi.service

Wants の代わりにそれぞれの依存関係のタイプによって WantedBy, Requires, RequiredBy, Conflicts, ConflictedBy, Before, After を使うこともできます。

コンピューターをシャットダウンにしたのに、電源が落ちません

systemctl halt ではなく次のコマンドを使って下さい:

$ systemctl poweroff

ブートプロセスの間にスクリプトを起動するにはどうすればいいですか?

/etc/systemd/system/myscript.service とのように新しいファイル を作成して以下の内容を追加してください:

[Unit]
Description=My script

[Service]
ExecStart=/usr/bin/my-script

[Install]
WantedBy=multi-user.target 


この例では multi-user ターゲットが起動した時にあなたのスクリプトを実行します。スクリプトには実行可能属性が付与されているようにしてください。

myscript.service有効化すると次回起動時からは起動時に実行されます。

ノート: シェルスクリプトを起動したい場合は、スクリプトの最初の行に shebang を置くようにしてください: #!/bin/sh。次のように書いても機能しません: ExecStart=/bin/sh /path/to/script.sh # DOES NOT WORK

.service の状態が緑の "active (exited)" (例: iptables)

これはおかしなことでは全くありません。iptables の場合、実行するデーモンがなくカーネル内でコントロールされるためです。従って、ルールがロードされた後 iptables は終了します。

iptables のルールが正しくロードされたか確認するには:

# iptables --list

既存のシンボリックリンクのためにユニットを有効にすることができない

ユニットを 有効化 しようとすると、次のようなエラーが発生することがあります。

Failed to enable unit: File /etc/systemd/system/symlink already exists and is a symlink to file.

ユニットを有効にして作成された symlink が既に /etc/systemd/system/ に存在する場合に発生する可能性があります。これは通常、あるディスプレイマネージャから別のディスプレイに切り替えたとき (例えば GDM から SDDM へ、それぞれ gdm.servicesddm.service で有効にできる)、対応するシンボリックリンク /etc/systemd/system/display-manager.service が既に存在するときに起こります。

この問題を解決するには、まず関連するディスプレイマネージャを無効にしてから新しいものを有効にするか、新しいものを有効にするときに -f/--force オプションを使って既存の競合するシンボリックリンクを上書きします (systemctl(1) § OPTIONS による)