Systemd/zh-cn

systemd 是一个Linux的现代的sysvinit来替换传统的init. Gentoo支持init替换为systemd.

systemd 是一个现代的 SysV-style init 和 rc (run command) 作为linux系统传统的init替代项.

内核
systemd利用Linux内核的许多现代特点. 要想支持systemd，内核必须高于ebuild 2.6.39 在最新的版本, 有一个快捷的方法来为systemd启用强制选择和可选的内核的选项:

手动配置内核选项 (这是在不使用时，唯一的选择 ), 下面是内核配置选项的要求或建议:

UEFI系统应该启用下面的:

如果你的系统使用BFQ scheduler, 这里推荐使用 BFQ upstream 来启用 "BFQ hierarchical scheduling support" under "Enable the block layer -> IO Schedulers".

要获取一个最新的列表,请参阅部分上游的“需求”说明：README

目录
目录被systemd 使用，其他的应用程序作为一个非连续性存储的运行时数据像文件, 网络编程接口和状态文件.

systemd包将自动创建 本身的路径文件. 然而， 请注意,这一变化也将触发自动安装的OpenRC， 并可能会触发其使用的不同软件包.

Upstream only supports the file being a symlink to. Not creating this symlink will also cause problems with mount and df. In the past some utilities wrote information (like mount options) into and thus it was supposed to be a regular file. Nowadays all software is supposed to avoid this problem. Still, before switching the file to become a symbolic link, please check to be sure that the system is not affected by any reported regressions.

要创建链接文件，执行：

在启动时确保/usr路径存在
For a split configuration, use an initramfs to mount  before starting systemd. See the Initramfs Gentoo Guide for instructions.

使用LVM2和initramfs
When sys-fs/lvm2 is used and the system is booted using an initramfs, the initramfs will have to be created using by running:

is either  or one of the other genkernel targets which imply the creation of an initramfs. For more information, look at the output of genkernel --help:

When LVM is used, the lvmetad daemon needs to be started as well. Otherwise systemd will be unable to mount LVM volumes. lvmetad can be enabled in :

安装
contains udev. Once installed, can be removed as systemd will be the provider for.

Enable the  USE flag globally (in ). The  USE flag should also be disabled to prevent conflicts with the systemd-logind service. It is also possible to switch to a systemd subprofile to use saner USE flags defaults in which case it is not necessary to change :

最后更新系统与Flags:

When dependency problems occur (such as blocking ),  might be registered in the world file. Try to resolve this by deselecting it:

使用systemd引导启动
为了运行systemd,切换init可用内核 (或者 initramfs)使用.

The following subsections document how to switch the init in one of the boot managers or the kernel.

Grub Legacy (0.x)
The  argument should be added to the kernel command-line. An example excerpt from would look like so:

Should the system boot using OpenRC, try using  instead of.

Grub 2
When is used, add the init option to GRUB_CMDLINE_LINUX :

When the GRUB 2 configuration file is written by hand (experts only), append the  parameter to the   or   command.

When using genkernel-next's initrd, use  instead of.

内核配置
The init configuration can also be hard-coded in the kernel configuration. See "Processor type and features -> Built-in kernel command line". Note that this technique works for both grub</tt> and grub2</tt>.

设置root密码
请不要忘记设置系统的根密码. 如果出现错误,systemd将提示输入根密码进入维护模式.

安装后的设置
systemd支持几个系统配置文件来设置系统最基本的细节要求.

主机名称
要设置主机名称，创建/编辑 然后并简单地输入所需的主机名.

When booted using systemd, a tool called exists for editing  and. To change the hostname, run:

参考 来获得更多选项.

区域设置
Usually, locales will be properly migrated from OpenRC when installing systemd. When required, the locale can be set in as per the Gentoo handbook instructions:

Once booted with systemd, the tool localectl</tt> is used to set locale and console or X11 keymaps. To change the system locale, run the following command:

要更改虚拟控制台键盘映射表：

最后,要设置X11布局:

If needed the model, variant and options can be specified as well:

时间和日期
Time and date can be set using the timedatectl</tt> utility. That will also allow users to set up synchronization without needing to rely on or other providers than systemd's own implementation.

To learn how to use timedatectl</tt> simply run:

自动加载模块
Automatic module loading is configured in a different file, or rather directory of files. The configuration files are stored in. On boot every file with a list of modules will be loaded. The file format is a list of modules separated by newlines and can have any name as long as it ends with. The module loading can be separated by program, service or whatever way that fits personal preference. An example virtualbox.conf</tt> is listed below:

systemd-networkd
systemd-networkd在有线网络接口的简单的配置上是很有用的. 它在默认情况下是禁用的.

To configure systemd-networkd, create a file under. See systemd.network(5) for reference. A simple DHCP configuration is given below:

Note that systemd-networkd does not update by default. To have systemd manage the DNS settings, replace with a symlink and start systemd-resolved.

网络管理
通常NetworkManager的用于配置网络设置. 为了这个目的，简单地用一个基于X11的桌面时，运行以下命令：

If that is not the case and the network needs to be configured from console, give nmcli a try, or follow a guided configuration process through nmtui</tt>:

nmtui is a curses frontend that will guide the user in the process while running in console mode.

处理日志文件
systemd has its own way of handling log files without needing to rely on any external log system (like or ). Messages can now be read with journalctl</tt>. Anyway, it can still be configured to use a preferred external tool for handling them. Please type man journald.conf for learning about how to configure journald to suit personal needs.

/tmp is now in tmpfs
Unless some other filesystem is explicitly mounted to in, systemd will mount  as tmpfs. That means it will be emptied on every boot and its size will be limited to 50% of the system's RAM size. To know why this is the desired behavior and how to modify it, take a look at API File Systems.

配置复杂的引导过程
当迁移到systemd用户通常注意到差异引导过程的时间


 * The boot option  not only influences the kernel output, but also that of systemd itself. Then, while setting up systemd for the machine, drop the option to see any errors could arise more easily. After that, add it back to get a quiet (and faster) boot.
 * Even passing the  boot option, systemd can still be configured to show its status by also passing.
 * When not using the  boot option, some messages might be overwriting consoles. That is caused by the kernel configuration (see man 5 proc and look for ). To tweak it pass the   boot parameter to the kernel (and update the value according to preference, for instance set a lower value like 1).

服务
At some point the system will need to be rebooted in order to get systemd running (in system mode). Be sure to read all of this document to ensure systemd is configured as completely as possible before rebooting. Note that journalctl</tt> works with systemd not running, but that systemctl</tt> will not do anything useful without systemd running. Complete the service configuration (enabling and starting of services) after logging in to the system running systemd.

OpenRC services
Although systemd originally intended to support running old init.d scripts, that support is not suited well for a dependency-based RC like OpenRC and thus is completely disabled on Gentoo. OpenRC provides additional measures to ensure that init.d scripts can't be run when OpenRC was not used to boot the system (otherwise the results would be unpredictable).

Listing available services
All available service units can be listed using the  argument of systemctl</tt>:

The following file suffixes are of interest:

Alternatively the systemctl</tt> tool can be used to list all services (including implicit ones):

And finally check for services that failed to start:

Enabling, disabling, starting, and stopping services
The usual way of enabling a service is using the following command:

Services can be disabled likewise:

These commands enable services using their default name in default target (both specified in "Install" section of the service file). However, sometimes services either don't provide that information or users prefer to have another name/target.

Note that these commands only enable or disable the system to be started on a next boot; to start the service right now, use:

Services can be stopped likewise:

Installing custom unit files
Custom unit files can be placed in, where they will be recognized after running systemctl daemon-reload</tt>:

is reserved for service files installed by the package manager.

Customizing unit files
When only minor changes to a unit are needed, there's no need to create a full copy of the original unit file in. Overriding settings in a package management provided unit can be achieved by drop-in files in a directory named after the original unit (e.g. ) in.

A reload of systemd is needed to inform it of the changes:

Then the service needs to be restarted to apply the changes:

Verify that the changed property was applied to the service:

Enabling a service under a custom name
When the name provided by "Alias" in the unit's "[Install]" section does not meet the expectations and providing a permanent new value for this through a customization is not desired, a symlink can be created manually in. The name of the directory can either specify a target or another service which will depend on the new one.

For example, to install as  in the :

To disable the service, just remove the symlink:

Native services
Some of Gentoo packages already install systemd unit files. For these services, it is enough to enable them. A quick summary of packages installing unit files can be seen on systemd eclass users list.

The following table lists systemd services matching OpenRC ones:

Timer services
Since version 197 systemd supports timers, making cron unnecessary on a systemd system. Since version 212 persistent services are supported, replacing even anacron. Persistent timers are run at the next opportunity if the system was powered down when the timer was scheduled.

The following is an example on how to make a simple timer that runs in the context of a user. It will even run if the user is not logged in. Every timed service needs a timer and a service file that is activated by the timer as follows:

Firstly, tell systemd to rescan the service files:

It is possible to trigger the backup manually by running the following command:

Start and stop the timer manually as follows:

Finally, to activate the timer at every system start, run:

To check the last results of running the service:

Emailing failures
If a timed service runs and fails an e-mail can be send out to inform the user or administrator. This is possible with the "OnFailure" stanza which specifies what should happen if a service fails. A failure is detected by a non-zero return code of the invoked script.

For that change the script as follows:

This requires to have the service installed, which can be found in kylemanna's systemd-utils repository.

Replacing cron
The above timer and service files can also be added to to make them available system-wide. The install section should then say  to enable the service at system start.

However, cron also runs the scripts in and other locations. Several packages place scripts there that they expect to be run daily. This behavior can be emulated with systemd by installing. Then activate the new cron replacement with the following commands:

Troubleshooting

 * Upstream debugging guide
 * Upstream debugging guide
 * Upstream debugging guide

Graphical sessions opened in random places
By default systemd only launches a getty</tt> process when it's going to be used. This causes some display managers (like GDM) to use the remaining TTYs for opening graphical sessions on demand, which can result in having consoles and graphical sessions placed randomly depending on the order they were used.

To stick with a more "classical" behavior (i.e, consoles placed from to  and graphical sessions using the remaining TTYs) force it to always launch getty</tt> on those:

lvm
When switching from OpenRC to systemd and lvm is needed to properly mount the system volumes, activate the lvm service:

While it might not be needed for activation of the root volume (if lvm is integrated into the initramfs) it might not work for other lvm volumes, unless the service is activated.

systemd-bootchart
As systemd-bootchart attempts to start, reconfigure it to invoke systemd instead:

The result of the bootchart is a report in SVG format located in.

syslog-ng conflicts with systemd
systemd creates as datagram socket  so syslog-ng needs to be told to read from a unix-dgram instead of a unix-stream as otherwise syslog-ng would be using a "wrong" stream:

sys-fs/cryptsetup configuration
systemd does not seem to respect (see ) so it needs to be configured through the  file:

You may need to create a new service file from your file. To do this, enable the  USE flag for. It will install. Executing it will create a service file in, which you can now copy to , adjust manually and add to the desired runlevel.

Check for units that failed to start
Check for units that failed to start with:

Enable Debug Mode
To get more informations set the following in :

Or enable the debug-shell, that opens a terminal at tty9. This helps to debug services during the boot process.

e4rat usage
Please remember to edit setting 'init' to, otherwise it will keep booting OpenRC.

GRSecurity hardening
With grsecurity enabled, systemd-networkd might log the following error:

The error raises due to systemd-networkd working under a non-root user with grsecurity refusing access to the complete structure for such users. To disable this option, disable the kernel option.

External resources

 * FAQ
 * Tips and tricks