systemd
systemd は、Linux システム向けの、SysV 系 init および rc の現代的な代替品です。Gentoo においては、代替的な init システムとして提供されています。
init システムの切り替えは、システムの構成や、時としてソフトウェアのインストール可否に深く関わる、簡単には行えない操作です。一般的には、init システムはインストール時に (systemd または openrc stage3 tarball のどちらかをダウンロードすることによって) 選択され、どうしても必要な場合にのみ変更されるでしょう。Gentoo らしく、systemd と OpenRC の他にもいくつかの init システムがサポートされています。
希望に反して systemd が依存関係として取り込まれようとしている場合は、Gentoo without systemd を参照してください。
インストール
もし<=sys-apps/systemd-203からアップデートする場合、upgrade サブ記事を確認してください。
すべてのディストリビューションが構築されるその中心にあるのが Linux カーネルです。カーネルレイヤーはユーザープログラムとハードウェアの間に存在します。Gentoo ではカーネルソースについて複数の選択肢があります。説明付きのすべてのカーネルソースのリストは、カーネルの概要のページで見ることができます。
amd64ベースのシステムについては、Gentooはsys-kernel/gentoo-sourcesパッケージを推奨しています。
適切なカーネルソースを選択して、emergeでインストールします:
root #
emerge --ask sys-kernel/gentoo-sources
カーネル
systemd は Linux カーネルの比較的新しい機能を多用しています。現在、ebuild にて指定されたカーネルの下限バージョンは 2.6.39 です。sys-kernel/gentoo-sources の最近のバージョンでは、systemd が必須、あるいは任意とするカーネルオプションを簡便に選択する方法が用意されています (詳細については Kernel/Configuration をご覧ください):
Gentoo Linux --->
Support for init systems, system and service managers --->
[*] systemd
カーネルのオプションを手動で設定する場合は、次のカーネルオプションが必須となるか、あるいは推奨されます。(なお、sys-kernel/gentoo-sourcesを使わない場合は手動で設定しなければなりません)
General setup --->
[*] Control Group support --->
[*] Support for eBPF programs attached to cgroups
[ ] Enable deprecated sysfs features to support old userspace tools
[*] Configure standard kernel features (expert users) --->
[*] open by fhandle syscalls
[*] Enable eventpoll support
[*] Enable signalfd() system call
[*] Enable timerfd() system call
[*] Enable bpf() system call
[*] Networking support --->
Networking options --->
[*] Unix domain sockets
Device Drivers --->
Generic Driver Options --->
[*] Maintain a devtmpfs filesystem to mount at /dev
File systems --->
[*] Inotify support for userspace
Pseudo filesystems --->
[*] /proc file system support
[*] sysfs file system support
General setup --->
[*] Namespaces support --->
[*] Network namespace
[*] Enable the block layer --->
[*] Block layer SG support v4
Processor type and features --->
[*] Enable seccomp to safely compute untrusted bytecode
Networking support --->
Networking options --->
<*> The IPv6 protocol
Device Drivers --->
Generic Driver Options --->
() path to uevent helper
[ ] Fallback user-helper invocation for firmware loading
Firmware Drivers --->
[*] Export DMI identification via sysfs to userspace
File systems --->
<*> Kernel automounter support (supports v3, v4 and v5)
Pseudo filesystems --->
[*] Tmpfs virtual memory file system support (former shm fs)
[*] Tmpfs POSIX Access Control Lists
[*] Tmpfs extended attributes
UEFIのシステム上では、次のオプションも有効にしてください:
[*] Enable the block layer --->
Partition Types --->
[*] Advanced partition selection
[*] EFI GUID Partition support
Processor type and features --->
[*] EFI runtime service support
Device Drivers --->
Firmware Drivers --->
EFI (Extensible Firmware Interface) Support -->
<*> EFI Variable Support via sysfs
システムが BFQ スケジューラを使用している場合は、階層型スケジューリングサポートを有効にすることが BFQ の開発元によって推奨されています:
IO Schedulers --->
<*> BFQ I/O scheduler
[*] BFQ hierarchical scheduling support
最新の一覧を必要とする人は、systemd の README にある "REQUIREMENTS" を参照してください。
/usr がブート時に存在することを確実にする
/usr を分割したシステム構成では、initramfs を使用して /usr を systemd の起動以前にマウントします。現在のところ、sys-kernel/dracut または sys-kernel/genkernel バージョン 4.1 以降を利用することになります。移行作業のための時間を確保しておいてください:
root #
emerge --ask sys-kernel/genkernel
または
root #
emerge --ask sys-kernel/dracut
dracut を使用する際、自動的に有効になっていなければ、usrmount モジュールを選択し、/usr を自動でマウントするよう設定しておいてください。
# Dracut modules to add to the default
add_dracutmodules+=" usrmount "
genkernel を利用する場合、カーネルをリビルドする前に、genkernel の設定ファイル /etc/initramfs.mounts 内で /usr が設定されていることを確かめてください。これで /usr が initramfs プロセス中にマウントされるようになります:
/usr
root #
genkernel --install all
その他の方法については Initramfs guide をご覧ください。
LVM と initramfs を使う
LVM が使われているシステムを initramfs でブートする場合、initramfs の作成には sys-kernel/genkernel が必須です:
root #
genkernel --lvm <target>
<target>
は、 initramfs
もしくは initramfs が暗黙的に作成される他の genkernel ターゲットです。詳細は genkernel --help の出力を参照してください:
user $
genkernel --help
USE フラグ
USE flags for sys-apps/systemd System and service manager for Linux
acl
|
Add support for Access Control Lists |
apparmor
|
Enable support for the AppArmor application security system |
audit
|
Enable support for sys-process/audit |
boot
|
Enable EFI boot manager and stub loader |
cgroup-hybrid
|
Default to hybrid (legacy) cgroup hierarchy instead of unified (modern). |
cryptsetup
|
Enable cryptsetup tools (includes unit generator for crypttab) |
curl
|
Enable support for uploading journals |
dns-over-tls
|
Enable DNS-over-TLS support |
elfutils
|
Enable coredump stacktraces in the journal |
fido2
|
Enable FIDO2 support |
gcrypt
|
Enable use of dev-libs/libgcrypt for various features |
gnutls
|
Prefer net-libs/gnutls as SSL/TLS provider (ineffective with USE=-ssl) |
homed
|
Enable portable home directories |
http
|
Enable embedded HTTP server in journald |
idn
|
Enable support for Internationalized Domain Names |
importd
|
Enable import daemon |
iptables
|
Use libiptc from net-firewall/iptables for NAT support in systemd-networkd; this is used only if the running kernel does not support nftables |
kernel-install
|
Enable kernel-install |
kmod
|
Enable kernel module loading via sys-apps/kmod |
lz4
|
Enable lz4 compression for the journal |
lzma
|
Support for LZMA compression algorithm |
openssl
|
Enable use of dev-libs/openssl for various features |
pam
|
Add support for PAM (Pluggable Authentication Modules) - DANGEROUS to arbitrarily flip |
pcre
|
Add support for Perl Compatible Regular Expressions |
pkcs11
|
Enable PKCS#11 support for cryptsetup and homed |
policykit
|
Enable PolicyKit (polkit) authentication support |
pwquality
|
Enable password quality checking in homed |
qrcode
|
Enable qrcode output support in journal |
resolvconf
|
Install resolvconf symlink for systemd-resolve |
seccomp
|
Enable seccomp (secure computing mode) to perform system call filtering at runtime to increase security of programs |
secureboot
|
Automatically sign efi executables using user specified key |
selinux
|
!!internal use only!! Security Enhanced Linux support, this must be set by the selinux profile or breakage will occur |
split-usr
|
Enable behavior to support maintaining /bin, /lib*, /sbin and /usr/sbin separately from /usr/bin and /usr/lib* |
sysv-utils
|
Install sysvinit compatibility symlinks and manpages for init, telinit, halt, poweroff, reboot, runlevel, and shutdown |
test
|
Enable dependencies and/or preparations necessary to run tests (usually controlled by FEATURES=test but can be toggled independently) |
tpm
|
Enable TPM support |
ukify
|
Enable systemd-ukify |
vanilla
|
Disable Gentoo-specific behavior and compatibility quirks |
xkb
|
Depend on x11-libs/libxkbcommon to allow logind to control the X11 keymap |
zstd
|
Enable support for ZSTD compression |
プロファイル
systemd
USE フラグを、システム全体に対して有効化してください。また、systemd-logind サービスとの干渉を避けるため、elogind
USE フラグを無効にしなければなりません。別の方法として、systemd サブプロファイルに切り替えることで、適切な USE フラグを初期設定とすることも可能で、この場合 make.conf を変更する必要はありません。
root #
eselect profile list
最後に、新しいプロファイルを使用してシステムを更新します。:
root #
emerge -avDN @world
このコマンドが完了した後には、設定のステップに従うことが重要です。
依存関係の問題
OpenRCをsystemdに置換中、いくつか依存関係の問題が発生するかもしれません。
もしsys-apps/sysvinitがsys-apps/systemdをブロックしている場合、sys-apps/systemdのsysv-utils
のUSEフラグを無効にしてみてください。もし必要ならば、あとでそのUSEフラグを有効にすることが出来ます(そしてsys-apps/systemdを再インストールしてください)。
root #
emerge --oneshot sys-apps/openrc
root #
emerge --ask --depclean
それでもまだ sys-apps/sysvinit が sys-apps/systemd をブロックしている場合は、sysvinit または sys-apps/openrc が world ファイルに含まれないようにしてください:
root #
emerge --deselect sys-apps/openrc sys-apps/sysvinit
sys-fs/udev blocking sys-apps/systemd などの依存関係問題が発生するとき、sys-fs/udev が world ファイルに登録されていることが原因かもしれません。deselect を試みてください:
root #
emerge --deselect sys-fs/udev
sys-apps/systemd には udev が含まれます。systemd がvirtual/udev の提供者となるため、インストール後に sys-fs/udev を削除することができます。
もし @system 集合が sys-fs/eudev を提供している場合、virtual/udev と virtual/libudev は systemd のインストールを妨げるかもしれません。portage にこの問題を解決させるためには、USE フラグを設定したあと、これらの virtual パッケージ群を再インストールしてみてください:
root #
emerge --oneshot virtual/udev virtual/libudev
ブートローダ
sysv-utils
のUSEフラグが有効になっている場合、この操作はもはや必要ではありません。最低でもGentoo内ではバージョン239から、デフォルトで有効になっています。systemd を実行するため、カーネル(もしくは initramfs)が使用する init を切り替えます。
切替中に、以前のサービスマネージャーに対して設定されたサービスが自動的に起動することはありません。ネットワークなどの機能を回復するには、それらのサービスを再び有効化する必要があります。この文書の下部に位置するサービスセクションの中で解説します。
移行作業がシステムを壊してしまった場合、この手順での init の変更を差し戻すことによって、いつでも初期のサービスマネージャー (OpenRC) を使用してのブートに復旧することが可能です。この記事の末部に記載しているトラブルシューティングを実行するには、この方法で元の状態に戻します。
以下のサブセクションでは、ブートマネージャまたはカーネルのいずれかで init を切り替える方法を文書化します。
GRUB Legacy (0.x)
カーネルのコマンドライン引数として init=/usr/lib/systemd/systemd
を追加する必要があります。grub.conf の一例からの抜粋はこのようになるでしょう:
title=Gentoo with systemd
root (hd0,0)
kernel /vmlinuz root=/dev/sda2 init=/lib/systemd/systemd
システムが OpenRC を使用して起動してしまうことがあれば、init
の代わりに real_init
を試してみてください。
GRUB
grub-mkconfig を利用する場合は、この init オプションを GRUB_CMDLINE_LINUX に追加してください:
dracut が systemd をとりこんで生成した initramfs を使用するときには、この作業は必要ありません。initramfs が systemd を起動することになります。
# Append parameters to the linux kernel command line
GRUB_CMDLINE_LINUX="init=/usr/lib/systemd/systemd"
あなたが経験豊富なユーザーで、GRUB の設定ファイルを手書きする場合には、linux
もしくはlinux16
コマンドに init=
パラメーターを追加してください。
linux /vmlinuz-3.10.9 root=UUID=508868e4-54c6-4e6b-84b0-b3b28b1656b6 init=/lib/systemd/systemd
YABOOT
Yabootは、PowerPCベースのLinuxを動かしているハードウェア、特にNew World ROM マッキントッシュシステムのためのブートローダです。
init=/lib/systemd/systemd
引数は、カーネルのコマンドラインの直後に追加されるべきです。yaboot.confの例です:
image=/vmlinux
append="init=/lib/systemd/systemd"
label=Linux
read-only
initrd=/initramfs
initrd-size=8192
変更を有効にするため、yaboot.conf を変更したら毎回 ybin コマンドを実行しなければなりません。
カーネルのコンフィグ
カーネルのコンフィギュレーションに init の設定を書き込むこともできます。Processor type and features -> Built-in kernel command line を参照してください。この技法は GRUB レガシーと GRUB の両方に対して通用します。
アップグレード
systemdには、(再起動を必要とせずに)動作しているシステム上でアップデートする機能があります。systemdのアップグレード版がemergeされたら、次のコマンドを実行してください:
root #
systemctl daemon-reexec
設定
systemd では、最も基本的なシステムの詳細を設定するのには、いくつかのシステム設定ファイルをサポートしています。
systemd をインストールしたら、次を実行してください:
root #
systemd-machine-id-setup
root #
systemd-firstboot --prompt
root #
systemctl preset-all
systemd-firstboot が実行されていない場合は、次回ブート時に自動で実行されるでしょう。しかしながら、これは通常のブートプロセスに割り込むため、例えば SSH 経由でサーバにアクセスする場合など、対話的コンソールへアクセスできないユーザはシステムにアクセスできなくなってしまうでしょう。
対応する設定ファイルの変更によって更新できる設定もありますが、大半の設定は systemd が実行されていなければ動作しないユーティリティを使って管理します。hostnamectl、 localectl、timedatectl などの必要なユーティリティを使用するには、コンピューターを再起動してください。この場合の systemd を使用した再ブートは安全に行えます。
マシンID
ジャーナリングを機能させるためにマシンIDを作成してください。これは次のコマンドの過程で行なえます:
root #
systemd-machine-id-setup
systemd-machine-id-setup コマンドは、
systemd-networkd
サービスにも影響を与えます。もしこのコマンドが実行されていないと、ネットワークインターフェイスが立ち上がらなかったり、ネットワークアドレスが適用されなかったりと、システムが奇妙な振る舞いを見せるかもしれません。ホスト名
ホスト名を設定するには、/etc/hostname を作成または編集して、希望のホスト名を入力してください。
systemd を使って起動したときには、hostnamectl と呼ばれるツールが利用でき、/etc/hostname と /etc/machine-info の編集が行えます。ホスト名を変更するには以下を実行してください:
root #
hostnamectl set-hostname <HOSTNAME>
他のオプションについては man hostnamectl を参照してください。
ロケール
通常、ロケールは systemd をインストールする作業の中で、OpenRC から正しい形で移行されます。ロケールを変更する必要があれば、Gentoo ハンドブックの手順通りに、/etc/locale.conf で設定できます。
LANG="en_US.utf8"
systemd を使って起動した後には、localectl ツールが、ロケールおよびコンソールやX11のキーマップの設定を行います。システムロケールを変更するには、以下のコマンドを実行してください:
root #
localectl set-locale LANG=<LOCALE>
仮想コンソールのキーマップを変更するには:
root #
localectl set-keymap <KEYMAP>
最後に X11 のキー配列を設定するには:
root #
localectl set-x11-keymap <LAYOUT>
必要があれば model、variant、options も指定できます:
root #
localectl set-x11-keymap <LAYOUT> <MODEL> <VARIANT> <OPTIONS>
以上のどれかを実行したあとは、変更が有効になるように環境を更新してください:
root #
env-update && source /etc/profile
時刻と日付
時刻、日付そしてタイムゾーンは timedatectl ユーティリティで設定できます。net-misc/ntp などを利用せず、systemd 付属の実装によって同期を行う機能も持ちます。
timedatectl の使い方を知るには:
root #
timedatectl --help
モジュールの自動読み込み
モジュールの自動読み込みは、異なるファイル、あるいはディレクトリ内のファイルで設定します。設定ファイルは/etc/modules-load.d内に保存されます。起動時に、モジュールの一覧を格納しているすべてのファイルが読み込まれます。ファイルの形式は改行区切りのモジュールの一覧で、.confで終わる限り、どのような名前でも構いません。モジュールの読み込みはプログラムやサービス、あるいは個人的な好みに合うもので区切ることも可能です。virtualbox.confの例は以下に示されています:
vboxdrv
vboxnetflt
vboxnetadp
vboxpci
ブート時のパーティションの自動マウント
Systemd is capable of automatically mounting various partitions to standardized location via systemd-gpt-auto-generator. This makes it possible to boot and automatically mount essential partitions without an fstab and without a root= paramter on the kernel command line. To use this capability, first systemd must be included in the initramfs, this is the case by default for initramfs images generated with Dracut on systems with systemd installed. And second, each partition must have the correct Partition Type GUID. A list of the most important GUIDs can be found in the systemd-gpt-auto-generator manual, the full list can be found on wikipedia.
To list the current Partition Type GUID of your partitions:
root #
lsblk -o NAME,LABEL,PARTLABEL,PARTTYPE,PARTTYPENAME,MOUNTPOINT
systemd-gpt-auto-generator can auto-mount partitions at the following locations, note that the correct GUID depends on the systems CPU architecture:
- / SD_GPT_ROOT_....
- /boot/ SD_GPT_ESP if no /efi/ and no XBOOTLDR partition, otherwise SD_GPT_XBOOTLDR
- /efi/ SD_GPT_ESP if /efi/ is present on the root, if not then ESP is at /boot/
- /home/ SD_GPT_HOME
- /srv/ SD_GPT_SRV
- /usr/ SD_GPT_USR_....
- /var/ SD_GPT_VAR
- /var/tmp/ SD_GPT_TMP
- Swap SD_GPT_SWAP
Below is an example of the most basic partition layout consisting of one EFI System Partition and one x86-64 root partition.
root #
lsblk -o NAME,LABEL,PARTLABEL,PARTTYPE,PARTTYPENAME,MOUNTPOINT
NAME LABEL PARTLABEL PARTTYPE PARTTYPENAME MOUNTPOINT nvme1n1 ├─nvme1n1p1 ESP EFI System Partition c12a7328-f81f-11d2-ba4b-00a0c93ec93b EFI System /boot └─nvme1n1p2 Gentoo Gentoo 4f68bce3-e8cd-4db1-96e7-fbcaf984b709 Linux root (x86-64) /
The PARTTYPE for an EFI System Partition is c12a7328-f81f-11d2-ba4b-00a0c93ec93b, it will be mounted at either /efi/ or /boot/ depending on which of these mount points is available and on if there is also an Extended Boot Loader Partition (PARTTYPE=bc13c2ff-59e6-4262-a352-b275fd6f7172) present on this disk. The PARTTYPE for an x86-64 root parition is 4f68bce3-e8cd-4db1-96e7-fbcaf984b709.
If the Partition Type GUID is not correct it can be changed without data loss using a partitioning tool such as fdisk. Note that the system must be offline to change the patition types! A system rescue image, or secondary operating system, must be used to complete the following steps.
Open the disk with the to be changed partition types in fdisk, in this exameple /dev/nvme1n1 is used:
root #
fdisk /dev/nvme1n1
Welcome to fdisk (util-linux 2.39.3). Changes will remain in memory only, until you decide to write them. Be careful before using the write command. Command (m for help):
List the current partition layout with the p command:
Command (m for help):
p
Disk /dev/nvme1n1: 1.82 TiB, 2000398934016 bytes, 3907029168 sectors Disk model: Samsung SSD 970 EVO Plus 2TB Units: sectors of 1 * 512 = 512 bytes Sector size (logical/physical): 512 bytes / 512 bytes I/O size (minimum/optimal): 512 bytes / 512 bytes Disklabel type: gpt Disk identifier: B25D5B33-4A10-F940-826C-3CB24ADC7D86 Device Start End Sectors Size Type /dev/nvme1n1p1 2048 1052671 1050624 513M EFI System /dev/nvme1n1p2 1052672 3907028991 3905976320 1.8T Linux root (x86-64)
Change the Partition Type GUID of any partition with the t command, followed by the number of the partition to be changed, and finally the alias for the desired partition type:
Command (m for help):
t
Partition number (1,2, default 2): 2 Partition type or alias (type L to list all): L Partition type or alias (type L to list all): 23 Changed type of partition 'Linux root (x86-64)' to 'Linux root (x86-64)'.
Repeat the above steps for any additional partitions of which the Partition Type GUID should be changed. Once completed, save the changes with the w command:
Command (m for help):
w
systemd-gpt-auto-generator will only auto-mount partitions that reside on the same disk as the EFI System Partition that the system is being booted from.
Some tools may become confused if there is no root= parameter on the kernel command line at all. To placate such tools add
root=/dev/gpt-auto-root
to the kernel command line. This trick is also usefull if a swapfile on the root partition is used instead of a swap partition for hibernation, i.e. one may specify the resume target on the kernel command line as resume=/dev/gpt-auto-root resume_offset=xxxxxxxxx
.ネットワーク
systemd はさまざまなネットワーク管理ツールに対応しています。
systemd-networkd
systemd システム上での有線ネットワークのセットアップの詳細については、systemd/systemd-networkd 記事を参照してください。
systemd-resolved
systemd システム上でのアドレス名解決 (DNS) のセットアップの詳細については、systemd/systemd-resolved 記事を参照してください。
NetworkManager
ネットワークの設定を構成するのによく使用されるのが NetworkManager です。グラフィカルなデスクトップから設定するには、次のコマンドを実行するだけです:
root #
nm-connection-editor
デスクトップではなく、コンソールから設定する必要がある場合には、nmcli を試してみる、もしくは nmtui の設定手続きに従います:
root #
nmtui
nmtui は、コンソールで設定を行うユーザーを手助けする curses フロントエンドです。
さらなる詳細については、個別の記事を参照してください。
ログファイルの対応
systemd は、app-admin/syslog-ng や app-admin/rsyslog などの外部のログシステムに依存しない、独自の手法でログファイルを管理します。
もし望むならば、ロギングサービスを、sysklogやsyslog-ngのような外部ユーティリティにメッセージを渡すように設定することもできます。状況に応じてsystemd-journaldサービスを設定する方法については、man journald.confをご覧ください。
systemdの統合されたロギングサービスは、ログメッセージを安全に、バイナリフォーマットに書き込みます。ログはjournalctlを使用することで読むことが出来ます。これは、systemd-journalのロギングサービスとは分けられた実行可能形式です。
systemdが動作しているシステムでは大体デフォルトである、systemdのsystemd-journald.serviceをロギングとして使用している時、通常ユーザがjournalctlコマンドを実行すると、unable to view system logsと表示されるでしょう。システムログを非ルートユーザで閲覧するには、ユーザは以下の3つのユーザグループのどれかに参加していなければなりません:systemd-journal、admあるいはwheel。通常ユーザにログの閲覧を許可する最も単純な方法は、systemd-journalグループを使用する方法です。以下のコマンドを実行してユーザを追加してください。ここで
larry
を、グループに追加したいユーザに変更してください:root #
gpasswd --add larry systemd-journal
よく使われる journalctl のオプション:
journalctl のコマンドラインオプション | 結果 |
---|---|
オプション無しのjournalctl | すべてのログの項目を表示します。最も手っ取り早いです。 |
-b , --boot |
最近の起動からのすべてのログの項目を表示します。 |
-r , --reverse |
新しいログを最初に表示します(逆順)。 |
-f , --follow |
最後の数個のログ項目を表示し、新たにログが生成される毎にそれらを表示します。これは、テキストログユーティリティでtail -fを実行するのに似ています。 |
-p , --priority= |
メッセージを表示する(最低)優先度を指定します。選択肢:"emerg" (0), "alert" (1), "crit" (2), "err" (3), "warning" (4), "notice" (5), "info" (6), "debug" (7). |
-S , --since= , -U , --until= |
項目を時間で指定します。 使用可能な書式は"YYYY-MM-DD hh:mm:ss"、あるいは文字列"yesterday"、"today"そして"tomorrow"です |
-n , --lines= |
項目数を指定します。 |
-k , --dmesg |
カーネルメッセージのみ表示します。 |
-u , --unit= |
特定のsystemdのユニットだけを表示します。 |
--system |
システムサービスとカーネルログを閲覧します。 既定では、ルートユーザのみ実行が可能です。どのように通常ユーザにシステムジャーナルを読む権限を与えるかについては、man journalctlを参照してください。 |
詳しい情報、そしてここに記載されていない数多くのオプションについては、man journalctl をご覧ください。
/tmp が tmpfs に
/etc/fstab において、他のファイルシステムが /tmp に明示的にマウントされない限り、systemd は /tmp を tmpfs としてマウントします。これによって、/tmp は起動するごとに空になり、システムの RAM サイズの 50% の大きさに制限されることになります。この振る舞いが最適であるとされる理由や、これを変更する方法については、API File Systems を一読してください。
ブートプロセスの冗長性の設定
systemd へ移行中のユーザーは、ブートプロセスの冗長性に差があることに気がつきます:
- カーネルコマンドラインオプション
quiet
が、カーネルの出力だけではなく、systemd からの出力にも影響します。発生したエラーの発見を容易にするため、systemd の設定作業を行っている間は、quiet
オプションを除去してください。作業後に元に戻しておきましょう。画面が静かになるのに加えて、ブート時間の短縮にも役立ちます。 - カーネルコマンドラインオプション
quiet
を指定している場合でも、systemd.show_status=1
の指定によって、systemd が状態を報告するように設定できます。 - カーネルコマンドラインオプション
quiet
を使用しないとき、コンソールにメッセージが上書きされることがあるかも知れません。これはカーネルの特定の設定によるものかもしれません。(man 5 proc を開き、/proc/sys/kernel/printk を調べましょう)。改善するには、カーネルにloglevel=5
カーネルコマンドラインパラメータを渡し、必要に応じて1のような小さい数を指定するなどの調整を行ってください。
使い方
伝統的なホームディレクトリを systemd homed に変換する
systemd-homed サブ記事を参照してください。
サービス
systemd がシステムモードで動作している状態に移行するために、ある時点でシステムを再起動する必要があります。この文書に最初から最後まで目を通し、systemd に対して再起動の前に可能な限りの設定が行われたことを確認してください。journalctl は systemd が起動していなくても動作しますが、systemctl が機能するには systemd が必要です。サービスの有効化と開始などの設定は、systemd が動作しているシステムにログインした後で行います。
プリセットサービス
ほとんどのサービスは、systemdが最初にインストールされた時に無効にされています。"プリセット"ファイルが提供されますので、適当なデフォルトサービスのセットを有効にするためにこのファイルを使用できます。
root #
systemctl preset-all
OpenRC サービス
当初の systemd は、旧来の init.d スクリプトの実行を可能にするように考慮されていましたが、このサポート機能が OpenRC のような依存性を基づく RC に適したものでなかったため、Gentoo では完全に無効化されています。予期しない結果を引き起こさないよう、OpenRC が起動に使われなかったシステムでは、init.d スクリプトの動作を防ぐ保護措置が、OpenRC に組み込まれています。
利用可能なサービスの一覧表示
利用できるすべてのサービスを、systemctl の list-units
引数を使用して一覧できます:
root #
systemctl list-units
UNIT LOAD ACTIVE SUB DESCRIPTION boot.automount loaded active waiting EFI System Partition Automount proc-sys-fs-binfmt_misc.automount loaded active waiting Arbitrary Executable File Formats File System Automount Point ...
以下のファイル名の接尾辞が関心の対象となるでしょう:
接尾辞 | 説明 |
---|---|
.service | 普通サービスファイル(デーモンを直に起動するだけのものなど) |
.socket | ソケットリスナー(inetd と同様です) |
.path | サービスのファイルシステムトリガー(ファイルが更新されたときにサービスを実行するなど) |
代わりにsystemctlツールを使用して、(暗黙なものも含む)すべてのサービスの一覧を表示できます:
root #
systemctl --all --full
最後に、起動に失敗したサービスを確認する方法です:
root #
systemctl --failed
サービスの有効化、無効化、開始、そして停止
サービスを有効にする一般的な方法は次のコマンドを使用します。:
root #
systemctl enable foo.service
サービスは、同様に無効にすることが出来ます:
root #
systemctl disable foo.service
これらのコマンドは、既定のターゲットの既定の名前を使用してサービスを有効にします(この2つとも、サービスファイルの"install"セクション内で指定されます)。しかしながら、時々サービスがこの情報を提供しなかったり、ユーザが他の名前/ターゲットを好む場合があります。
これらのコマンドは、サービスを次の起動時から有効あるいは無効にすることに注意してください。サービスを直ちに開始するには、次のコマンドを使用してください:
root #
systemctl start foo.service
サービスは、同様に停止することができます。:
root #
systemctl stop foo.service
ExecReload=
を実装するサービスには、サービス自体を再開することなく、設定を再読み込みするように命令することができます:
root #
systemctl reload foo.service
カスタムユニットファイルのインストール
カスタムユニットファイルは/etc/systemd/system内に置くことが出来ます。systemctl daemon-reloadを実行したあと、これらのファイルは認識されます:
root #
systemctl daemon-reload
/lib/systemd/system ディレクトリは、パッケージマネージャによってインストールされたサービスファイル用に予約されています。
ユニットファイルのカスタマイズ
ユニットにわずかな変更や上書きのみが必要な場合、/etc/systemd/system/ や /lib/systemd/system/ にある元のユニットファイル全体をコピーする必要はありません。/etc/systemd/system/ 内の、元のユニット名をもとにした *.d ディレクトリ (たとえば apache2.service.d) 内のドロップインファイルによって、パッケージ管理で導入されたユニットの設定を上書きできます。
ドロップインディレクトリと設定ファイルは、systemctl edit ユーティリティを使用するか、または手動で作成することができます。
編集ユーティリティは次のようにして呼び出すことができます:
root #
systemctl edit apache2.service
[Service]
MemoryLimit=1G
systemdに変更を伝えるため、systemdの再読み込みが必要です:
root #
systemctl daemon-reload
そして、変更を適用するために、サービスを再スタートする必要があります:
root #
systemctl restart apache2
サービスのプロパティの変更が適用されたことを確認します。:
root #
systemctl show --property=MemoryLimit apache2
MemoryLimit=1074000000
ドロップインは、上書きされるユニットから取得されたアイテムをリストエントリ (
ExecStart=
など) に追加します。取得したアイテムを削除するためには、先にリストエントリを空にして、その後に希望するアイテムを追加する必要があります。例えば:
[Service]
ExecStart=
ExecStart=/usr/bin/bar
任意の名前でサービスを有効にする
ユニットの [Install]
セクションの Alias=
で指定された名前が期待通りでなく、カスタマイズによって永続的な新たな名前を与えることも望まないときは、手動で /etc/systemd/system/*.wants/ 内にシンボリックリンクを作ることができます。 *.wants ディレクトリの名前には、ターゲットか、新たなサービスに依存する別のサービスを指定します。
例えば、mysqld.serviceをdb.serviceとしてmulti-user.target内にインストールする場合:
root #
ln -s /lib/systemd/system/mysqld.service /etc/systemd/system/multi-user.target.wants/db.service
サービスを無効にするなら、単にシンボリックリンクを削除してください:
root #
unlink /etc/systemd/system/multi-user.target.wants/db.service
既に存在するサービス
Gentooのパッケージの中には、既にsystemdユニットファイルをインストールしているものがあります。これらに関しては、サービスを有効にするだけで十分です。ユニットファイルをインストールするパッケージの早見表は、systemd eclassユーザリストで確認できます。
以下の表は、OpenRCのサービスに合致するsystemdのサービスの一覧を示しています:
Gentooパッケージ | OpenRCサービス | systemdユニット | 注意 |
---|---|---|---|
sys-apps/openrc | bootmisc | systemd-tmpfiles-setup.service | 常に有効。tmpfiles.dを使用。 |
consolefont | systemd-vconsole-setup.service | 常に有効。vconsole.confを使用。 | |
devfs | |||
dmesg | |||
fsck | fsck*.service | マウントによって暗黙的に使用 | |
functions.sh | 注意を参照 | bug #373219 | |
hostname | (ビルドイン) | /etc/hostname | |
hwclock | 注意を参照 | systemdの一部として常に有効(つまり、内蔵で、ユニットではありません) | |
keymaps | systemd-vconsole-setup.service | 常に有効。vconsole.confを使用。 | |
killprocs | |||
local | |||
localmount | local-fs.target | 実際のユニットは/etc/fstabから暗黙的に作成されます。 | |
modules | systemd-modules-load.service | 常に有効。/etc/modules-load.d/*.confを使用。 | |
mount-ro | |||
mtab | |||
netmount | remote-fs.target | ||
numlock | |||
procfs | (ビルドイン) | ||
root | remount-rootfs.service | ||
savecache | n/a | OpenRC内蔵 | |
staticroute | |||
swap | swap.target | 実際のユニットは/etc/fstabから暗黙的に作成されます。 | |
swclock | |||
sysctl | systemd-sysctl.service | sysctl.confとsysctl.d/ | |
sysfs | (ビルドイン) | ||
termencoding | systemd-vconsole-setup.service | 常に有効。vconsole.confを使用。 | |
urandom | systemd-random-seed-load.service | ||
systemd-random-seed-save.service | |||
app-admin/rsyslog | rsyslog | rsyslog.service | |
app-admin/syslog-ng | syslog-ng | syslog-ng.service | |
media-sound/alsa-utils | alsasound | alsa-store.service | (デフォルトで有効) |
alsa-restore.socket | (デフォルトで有効) | ||
net-misc/dhcpcd | dhcpcd | dhcpcd.service | |
net-misc/netifrc | net.* | net@.service | net.*スクリプトのsystemdラッパー(net-misc/netifrc由来) |
netctl@.service | net-misc/netctlは元々Arch Linuxのツールです。 | ||
NetworkManager.service | <networkmanager-0.9.8.4:dispatcher.dスクリプトが機能するよう、NetworkManager-dispatcher.serviceを有効にしてください。 システムが動作しているインターネット接続を検出するために、NetworkManager-wait-online.serviceを有効にしてください。 他のすべてのマネージャ(例:wicd、dhcpcd)と、wpa_supplicantを無効にしてください。 | ||
dhcpcd.service | net-misc/dhcpcdが提供 | ||
systemd.networkd.service | systemdの一部 | ||
net-misc/openntpd | ntpd | ntpd.service | |
net-misc/openssh | sshd | sshd.service | sshdをデーモンとして実行 |
sshd.socket | sshdをinetdライクなものをベースとして実行(入接続それぞれに対し) | ||
net-wireless/wpa_supplicant | wpa-supplicant | wpa_supplicant.service | D-Busによってコントロールされているデーモン(例えばNetworkManager用) |
wpa_supplicant@.service | インターフェイス固有のwpa_supplicant(wpa_supplicant@wlan0.serviceのようなものに使用されます) | ||
net-print/cups | cupsd | cups.service | クラシックな、起動時に立ち上がるサービス |
cups.socket | ソケットアクティベーション、パケットアクティベーション(cupsは必要な時に限って開始します) | ||
cups.path | |||
net-wireless/bluez | bluetooth | bluetooth.service | |
sys-apps/dbus | dbus | dbus.service | |
dbus.socket | |||
sys-apps/irqbalance | irqbalance | irqbalance.service | デーモンモードのみ対応 |
sys-apps/microcode-ctl | microcode_ctl | microcodeをモジュールとして設定してください。これによって、microcodeが自身を読み込めるようになります。"Processor type and features" -> "CPU microcode loading support"と遷移し、IntelかAMDプロセッサのシステムによって正しいオプションを追加するのを忘れないでください。 | |
sys-fs/udev | udev | udev.service | |
udev-mount | (ビルドイン) | /devはtmpfsとしてマウントされます。 | |
udev-postmount | udev-trigger.service | ||
udev-settle.service | |||
sys-power/acpid | acpid | acpid.service | このサービスのほとんどの機能はsystemd自体が行います。従ってこのサービスを無効にすることを検討してください。 |
x11-apps/xdm | (xdm) | xdm.service | OpenRCは、x11-base/xorg-serverによってインストールされた、一般的なxdm init.dを使用します。systemdでは、それぞれのDM(gdm.service、kdm.service...)に対応するユニットファイルを有効にする必要があります。 |
net-firewall/iptables | iptables | iptables-store.service | |
iptables-restore.service |
ユーザサービス
ユーザ毎の systemd 実行単位としてサービスを管理することができます。これにより、ユーザは固有のサービスまたはタイマを設定することができます。
ユーザユニットは複数の場所に配置することができます。ユーザは $XDG_CONFIG_HOME/systemd/user/ に配置することができます。インストールされたパッケージは /usr/lib/systemd/user/ に配置します。
ユーザサービスは systemctl の --user
オプションを使用します。例えば、mpd ユーザサービスを開始するには:
user $
systemctl --user start mpd
タイマサービス
バージョン197からsystemdはタイマをサポートしたので、systemdのシステムではcronが不必要となりました。バージョン212からは永続的なサービスがサポートされたので、anacronさえ置き換えるようになりました。永続タイマは、タイマの実行予定時にシステムがシャットダウンされていたならば、次の予定時に実行されます。
以下は、特定のユーザとして実行するシンプルなタイマをどのように作成するかの例です。これは、ユーザがログインしていなくても実行されます。すべてのタイマ付きサービスはタイマと、タイマによって有効にされる以下のようなサービスユニットファイルが必要です:
[Unit]
Description=daily backup work
RefuseManualStart=no
RefuseManualStop=no
[Timer]
Persistent=false
OnCalendar=Mon-Fri *-*-* 11:30:00
Unit=backup-work.service
[Install]
WantedBy=default.target
[Unit]
Description=daily backup work
RefuseManualStart=no
RefuseManualStop=yes
[Service]
Type=oneshot
ExecStart=/home/<user>/scripts/backup-work.sh
これらのユニットファイルは、手動か、systemctl edit ユーティリティを使って作成することができます:
user $
systemctl edit --force --full --user backup-work.timer
ユニットファイルを手動で作成するときは、ファイルは ~/.config/systemd/user ディレクトリ内に配置してください。関連するユーザのためにディレクトリを作成する必要があるかもしれません:
user $
mkdir -p ~/.config/systemd/user
ユーザがログインしていない間もタイマを実行させるには、残留セッションを有効化しておいてください:
user $
loginctl enable-linger <username>
まず、systemdにサービスファイルを再スキャンするよう伝えます:
user $
systemctl --user daemon-reload
以下のコマンドを実行することで、手動でバックアップを取ることも可能です:
user $
systemctl --user start backup-work.service
以下のコマンドで、手動でタイマを開始あるいは停止します:
user $
systemctl --user start backup-work.timer
user $
systemctl --user stop backup-work.timer
最後に、システムの開始毎にタイマを有効にするには、次のコマンドを実行してください:
user $
systemctl --user enable backup-work.timer
サービス実行の最後の結果を確認します:
user $
systemctl --user list-timers
失敗をEメールで通知
もし、タイマが有効になっているサービスが実行され失敗した場合、ユーザや管理者にEメールで通知することが出来ます。これは、もしサービスが失敗した場合に何をするかを指定する"OnFailure"の項を使用することで可能です。失敗は、呼び出されたスクリプトの終了コードが0でないことで検出されます。
次のようにそのためのスクリプトを変更します。:
[Unit]
Description=daily backup work
RefuseManualStart=no
RefuseManualStop=yes
OnFailure=failure-email@%i.service
[Service]
Type=oneshot
ExecStart=/home/<user>/scripts/backup-work.sh
これは、failure-email@.serviceサービスがインストールされている必要があります。このサービスは kylemannaのsystemd-utilsのリポジトリにあります。
cronの置き換え
以上のタイマやサービスファイルは、システム全体で利用可能にするために/lib/systemd/systemに追加することも出来ます。その場合、installセクションで、システムが開始した時にサービスを有効にするためにWantedBy=multi-user.target
と記述するべきです。
しかしながら、cronは/etc/cron.dailyや他の場所にあるスクリプトも実行します。いくつかのパッケージは、毎日実行されることを期待してスクリプトをそれらの場所に置きます。この振る舞いは、sys-process/systemd-cronをインストールすることで、systemdでエミュレート出来ます。その場合、以下のコマンドで新しい代替のcronを有効にしてください:
root #
systemctl enable cron.target
root #
systemctl start cron.target
トラブルシューティング
動作中のサービスのせいでシャットダウンや再起動が遅い
- 問題
- ブロックしているサービスがタイムアウトするのを systemd が待つ時間のデフォルト設定のために、systemd のシステムサービスまたはユーザサービスがシステムの電源オフ/シャットダウンまたは再起動操作を非常に遅くすることがある。
- 解決策
- この操作を高速化するためには、サービスがタスクを正しく完了しないかもしれないリスクを負う代わりに、デフォルトタイムアウト値を減らすことができます。効率化するには、システムサービスとユーザサービスのデフォルトタイムアウトを短縮する、以下の設定変更の両方を反映させる必要があります。
[Manager]
DefaultTimeoutStopSec=10s
[Manager]
DefaultTimeoutStopSec=10s
/dev/kmsg buffer overrun, some messages lost
- 問題
- システムを起動中、無限に次のメッセージが表示される:
/dev/kmsg buffer overrun, some messages lost
。ブートプロセスがログインに到達しないので、一向にコンソールへのログイン画面が表示されない。
- 解決策
- 大抵の場合、この問題はCONFIG_POWER_SUPPLY_DEBUGオプションがカーネルで有効になっているからです。現在の回避策は、カーネルでこのオプションを無効にし、再コンパイルして、インストールそして新しいカーネルで起動することです。また、解決策はGentooフォーラムのこのスレッドにもあります。このフォーラムの一人のユーザによれば、この問題は、埋め込みシステムでI2C EEPROMを使用している時にも発生しました[1]。この場合、解決策は、カーネルオプションCONFIG_I2C_DEBUG_COREを無効にすることでした。
グラフィカルセッションがランダムな場所に開かれる
既定で、systemdはgettyプロセスを、使用される予定の時だけ始動させます。これによっていくつかの(GDMのような)ディスプレイマネージャが、残りのTTYをグラフィカルセッションのために必要に応じて使用し、結果としてコンソールやグラフィカルセッションが、使用される順番によってランダムに配置されることになります。
より“古典的な”挙動 (つまりtty1からtty6までで起動されるコンソールと残りのTTYで起動するグラフィカルセッション) を使い続けるには、 getty を常にTTY上で起動するよう systemd に強制します:
root #
systemctl enable getty@tty{2,3,4,5,6}.service
LVM
OpenRCからsystemdに切り替え中、LVMが適切にシステムボリュームにマウントされている必要があるならば、LVMサービスを有効にしてください:
root #
systemctl enable lvm2-monitor.service
ルートボリュームを有効にする必要はないかもしれません(もしLVMがinitramfsに統合されているなら)が、サービスが有効でない限り、他のLVMボリュームが動作しないかもしれません。
systemd-bootchart
CONFIG_DEBUG_KERNEL、CONFIG_SCHED_DEBUGそしてCONFIG_SCHEDSTATSを確実に有効にしてください。
File systems --->
Pseudo filesystems --->
[*] /proc file system support
Kernel hacking --->
[*] Kernel debugging
[*] Collect scheduler debugging info
[*] Collect scheduler statistics
次に、systemd-bootchart.serviceを有効にしてください:
root #
systemctl enable systemd-bootchart
この変更の結果として、毎回の起動後に、/run/log/にSVG形式のbootchartレポートが作成されます。これは最新のウェブブラウザで閲覧することが出来ます。
systemd-bootchartの代替として、サービスの開始は以下のコマンドでビジュアライズ化することが出来ます:
root #
systemd-analyze plot > plot.svg
systemd用のsyslog-ngソース
設定ファイルである/etc/syslog-ng/syslog-ng.confにunix-dgram('/dev/log');
を追加する必要はありません。これを行うと、syslog-ngが失敗します(少なくともsyslog-ng-3.7.2以上では)。source src { ...; };
の行を以下のように、syslog-ngの記事で示されているように更新してください:
# openrcでのデフォルト
#source src { system(); internal(); };
# systemd
source src { systemd-journal(); internal(); };
sys-fs/cryptsetupの設定
systemdは/etc/conf.d/dmcryptに従わないようです(bug #429966を参照してください)。従って、/etc/crypttabファイルで設定をする必要があります:
crypt-home UUID=c25dd0f3-ecdd-420e-99a8-0ff2eaf3f391 -
cryptsetup
USEフラグをsys-apps/systemdに対し確実に有効にしてください。これで、起動時に各エントリに対し、サービス(上記の例ではcryptsetup@crypt-home.service
)を生成する、/lib/systemd/system-generators/systemd-cryptsetup-generatorがインストールされます。
開始に失敗したユニットの確認
開始に失敗したユニットを確認するには、次のコマンドを実行してください:
root #
systemctl --failed
デバッグモードを有効にする
より多くの情報を得るには、/etc/systemd/system.confで以下のように設定してください:
LogLevel=debug
あるいは、tty9のターミナルで開かれるデバッグシェルを有効にしてください。これは、ブートプロセス中のサービスをデバッグするのに役立ちます。
root #
systemctl enable debug-shell.service
e4ratの使い方
/etc/e4rat.confの'init'設定を/lib/systemd/systemdに編集するのを忘れないでください。そうでないと、OpenRCを起動し続けるでしょう。
GRSecurityのハードニング
grsecurityが有効になっていると、systemd-networkdは以下のエラーをログに残すかもしれません:
could not find udev device: Permission denied
このエラーは、systemd-networkdが非ルートユーザの下で活動していて、grsecurityがそのユーザに対して完全な/sys構造に対するアクセスを拒否しているからです。このオプションを無効にするには、カーネルオプションCONFIG_GRKERNSEC_SYSFS_RESTRICTを無効にしてください。
logindも、CONFIG_GRKERNSEC_PROCが有効になっているとちょっとした権限問題が発生するかもしれません。bug #472098を確認してください。
shutdown -rFがfsckを強制しない
systemd-fsckサービスが、必要になったらfsckを行う事になっています。このサービスはshutdownの-rF
オプションに従いません。しかし、その代わりに以下のカーネル起動パラメータに従います。
起動パラメータ | 対応しているオプション | 説明 |
---|---|---|
fsck.mode
|
auto force skip
|
動作のモードを操作します。既定ではauto となっていて、ファイルシステムチェッカーが必要と認識した時にファイルシステムチェックが行われます。force は完全なファイルシステムチェックを状況にかかわらず行います。skip はいかなるファイルシステムチェックも行いません。
|
fsck.repair
|
preen yes no
|
動作のモードを指定します。既定ではpreen となっていて、安全に解決できる問題を自動的に修復します。yes はfsckの質問にすべてyesと答え、no はすべての質問にnoと答えます。
|
追加の systemd バイナリ
特定の USE フラグを設定することで、多数の追加の systemd バイナリをビルドすることができます。以下は、不完全ですが、USE フラグからバイナリへの対応表です。
USE フラグ | ビルドされる追加のバイナリ |
---|---|
curl
|
/lib/systemd/systemd-journal-upload |
http
|
/lib/systemd/systemd-journal-gatewayd /lib/systemd/systemd-journal-remote |
関連項目
- systemd/systemd-homed — provides instructions to migrate home directories from their traditional structure into the encrypted by default, portable concept provided by systemd's homed.
- systemd/systemd-boot — a minimal UEFI boot manager.
- systemd/systemd-nspawn — a lightweight, loosely chroot-like, OS-level OCI container environment native to systemd.
- Comparison of init systems — init システムを対比させ比較します。
- Hard dependencies on systemd — a (possibly partial) list of packages in Gentoo's repository that unconditionally require systemd
- OpenRC to systemd Cheatsheet — 日常的に使用される OpenRC のコマンドと、それと同等の systemd コマンドのリストです。