systemd 的运用与配置
5.4.1 网络配置
1. 网络接口配置文件
自版本 209 开始,systemd 提供了一个名为 systemd-networkd 的命令用于处理基本的网络配置。另外,自版本 213 开始,DNS 名称解析可用 systemd-resolved 代替静态的/etc/resolv.conf 文件来解决。默认情况,两种服务都将被启用。
systemd-networkd(和 systemd-resolved)的配置文件可能在/usr/lib/systemd/network 或 /etc/systemd/network 中。在/etc/systemd/network 中,文件比/usr/lib/systemd/network 中的有更高的优先级。配置文件类型有 3 种:.link、.netdev 和.network 文件。你可以通过查阅 man 手册的 systemd-link(5),systemd-netdev(5) 和 systemd-network(5) 获取更多关于这些配置文件的详细介绍。
udev 通常会根据系统物理特性分配接口名称。例如,enp2s1。如果你不确定接口名称,你可以在系统启动后运行 ip link 查看。
对于大多数系统,每种连接只会有一种网络接口。例如,传统有线连接的接口名 eth0。而无线连接的名称通常是 wifi0 或 wlan0。
如果你更青睐传统或是自定义的网络接口名称,有 3 种实现的方法:
- 为默认的策略屏蔽 udev 的.link 文件: ln -s /dev/null /etc/systemd/network/99-default.link
- 创建手动命名规则,例如将接口命名成诸如「internet0」、「dmz0」或「lan0」。为此,请在/etc/systemd/network/中创建.link 文件,为其中的一个、一些,或者全部的接口赋予明确的名字,或更妥善的命名规则。
示例:
systemd 独立小节,介绍 systemd 的用法以及相关配合配置。
/etc/systemd/system.conf 文件包含了大量的 systemd 控制命令。假如未作任何的更改,文件中的所有行应该都是注释掉的,这代表了 systemd 正使用默认的运行方式。这个文件中可以设置日志级别,可以修改日志的基本设置。所有设置项都可以在 man 手册的 systemd-system.conf(5) 中查看。
cat > /etc/systemd/network/10-ether0.link << "EOF"
[Match]
# Change the MAC address as appropriate for your network device
MACAddress=12:34:45:78:90:AB
[Link]
Name=ether0
EOF
你可以参考 man 手册 systemd.link(5) 获取更多信息。 在/boot/grub/grub.cfg 中,给内核命令行传递 net.ifnames=0 选项。
2. 静态 IP 配置
以下为设置静态 IP 而创建的基础配置文件,同时用到了 systemd-networkd 和 systemd-resolved:
cat > /etc/systemd/network/10-eth-static.network << "EOF"
[Match]
Name=enp0s3
[Network]
Address=10.0.2.15/24
Gateway=10.0.2.2
DNS=10.0.2.3
Domains=LFS-BOOK-systemd
EOF
如果你的 DNS 服务器超过了一个,可以为其添加多个 DNS 条目。如果你打算用静态的/etc/resolv.conf 文件,就不要添加 DNS 或域名条目。
3. DHCP 的配置
如果要使用动态 IP,运行以下命令,创建用于设置 IPv4 DHCP 的基础配置文件:
cat > /etc/systemd/network/10-eth-dhcp.network << "EOF"
[Match]
Name=enp0s3
[Network]
DHCP=ipv4
[DHCP]
UseDomains=true
EOF
4. 配置 systemd-resolved
如果你使用其他方式来配置你的网络接口(例如 ppp、network-manager 等),或者任何类型的本地解析器(例如 bind、dnsmasq 等),以及任何生成/etc/resolv.conf 文件的软件(例如 resolvconf),就别用 systemd-resolved 服务了。
用 systemd-resolved 配置 DNS 时会创建/run/systemd/resolve/resolv.conf 文件,并在/etc 中创建一个指向生成文件的符号链接:
ln -sfv /run/systemd/resolve/resolv.conf /etc/resolv.conf
如果需要静态/etc/resolv.conf 文件,可以参考 5.3.8 节。
5.4.2 配置系统时间
systemd 可以通过配置 systemd-timedated 配置时间和时区。 如果你不确定是否将硬件时钟设置为 UTC,可以通过 hwclock --localtime --show 来查看。 这将根据硬件时钟显示当前的时间。如果显示的和手表的时间相同,应该是设置为本地时间了;如果 hwclock 输出的时间不一致,应该是设置为 UTC 了。通过增减数小时,可以确定你所在时区。 systemd-timedated 读取/etc/adjtime,然后确定是本地时间还是 UTC 时间。 如果想要将硬件时钟设置为本地时间,使用以下命令建立/etc/adjtime:
cat > /etc/adjtime << "EOF"
0.0 0 0.0
0
LOCAL
EOF
如果第一次启动时/etc/adjtime 文件不存在, systemd-timedated 会认为硬件时钟设置成 UTC 并且以此调整该文件。 你也可以使用 timedatectl 程序来告诉 systemd-timedated 你的硬件时钟是 UTC 还是本地时间:
timedatectl set-local-rtc 1
timedatectl 也可以用来更改系统时间和时区。 要更改当前系统时间,使用下面的命令:
timedatectl set-time YYYY-MM-DD HH:MM:SS
硬件时钟也会相应更新。要更改当前时区,使用下面命令:
timedatectl set-timezone TIMEZONE
你可以通过运行下面命令查看可用时区列表:
timedatectl list-timezones
5.4.3 配置 Linux 控制台
如果键盘布局是标准 us 键盘的话,可以忽略此配置。
不过作为和 System V 的区别,systemd 可以通过配置 systemd-vconsole-setup 系统服务,配置控制台字体和控制台的键盘映射。
systemd-vconsole-setup 服务读取/etc/vconsole.conf 中的配置信息,确定使用的键盘类型和屏幕的字体。http://www.tldp.org/HOWTO/HOWTO-INDEX/other-lang.html 页面有很多其他语言的「HOWTO」内容可以给你很多帮助。 localectl list-keymaps 可以列举出所有可用的终端键盘布局。/usr/share/consolefonts 目录提供了所有可用的字体。
/etc/vconsole.conf 的每一行都应该形如:VARIABLE="value"。表列举了可用的 VARIABLE:
| KEYMAP | 此变量指定了键盘的按键映射表。如未设置,默认为 us |
|---|---|
| KEYMAP_TOGGLE | 此变量指定配置第二个切换键盘映射,默认不设置 |
| FONT | 此变量指定虚拟控制台的字体 |
| FONT_MAP | 此变量指定要使用的控制台映射 |
| FONT_UNIMAP | 此变量指定 Unicode 字体映射 |
由于中文没有必要设置,这里就不罗列配置的示例是德语的。
cat > /etc/vconsole.conf << "EOF"
KEYMAP=de-latin1
FONT=Lat2-Terminus16
EOF
同时,可以使用 localectl 实用程序更改 KEYMAP 值:
localectl set-keymap MAP
5.4.4 配置系统语言环境
本地语言的支持依赖于 /etc/locale.conf,它包含不少和此相关的环境变量。更改此文件后,可能会出现以下的变化:
- 程序的输出将以本地语言展示;
- 修正字符在字母、数字等类型的分类。对于非英语区域设置来说,只有这样,bash 才能正常显示非 ASCII 字符;
- 国家顺序可以按照字母顺序正常排序
- 默认纸张尺寸;
- 货币、时间和日期值的格式。
请将/etc/locale.conf 中
locale -a
字符映射表可能存在很多的别名,比如 ISO-8859-1 可以写作 iso8859-1 或 iso88591。 但是有一些程序不支持这些乱七八糟的写法(比如 UTF-8 只能写作 UTF-8,utf8 就不认识了)。 所以,为了安全起见,在设置的时候还是尽量的使用特定区域设置的规范名称。可以通过以下命令查询在特定区域下的字符映射表标准名称,
LC_ALL=<locale name> locale charmap
对于「zh_CN.utf8」以上命令将会如下输出:
UTF-8
根据以上输出,再次修改/etc/locale.conf,将字符映射表设置为标准形式(zh_CN.utf8 变为 zh_CN.UTF-8)。同理,也可一并查询以下设置的标准命令,然后将其添加到 bash 的启动文件中 。
LC_ALL=<locale name> locale language
LC_ALL=<locale name> locale charmap
LC_ALL=<locale name> locale int_curr_symbol
LC_ALL=<locale name> locale int_prefix
以上的命令将会输出当前区域设置的语言、字符编码、本地货币单位以及电话国际编码。如果出现类似下文的错误输出,可能是你没有严格按照第 4 章指导的方法操作或者是你当前所用的 Glibc 不支持该地域。
locale: Cannot set LC_* to default locale: No such file or directory
如果这种情况真的发生,你应该使用 localedef 命令安装对应的系统区域,或者考虑更改为其他的区域。假如没有出现错误提示,我们就可以继续进行下一步操作了!
有一些 LFS 之外的包可能会出现对你设置的区域支持很差的情况。比如 X 的库(X Windows System 的一部份), 就可能在内部文件中输出以下消息:
Warning: locale not supported by Xlib, locale set to C
在一些情况下,Xlib 希望以带规范破折号的大写形式列出字符映射表,比如 ISO-8859-1 而不应该写作 iso88591。不过,也可以通过去除区域规范中的字符映射部分找到合适的规范。这可以通过运行 locale charmap 命令来检查。例如,需要更改 de_DE.ISO-8859-15@euro 为 de_DE@euro 以便 Xlib 能识别区域。
即便如此,也可能遇到某些程序因为区域设置和它们预置的不同而导致功能异常(可能不会显示任何的错误消息)。 如果出现这样的情况,可以通过查看其他的发行版是如何进行设置区域的,从而得到启发。 确定了区域后,就可以创建 /etc/locale.conf 文件了:
cat > /etc/locale.conf << "EOF"
LANG=<ll>_<CC>.<charmap><@modifiers>
EOF
也可以通过 systemd 提供的实用程序 localectl 修改/etc/locale.conf:
localectl set-locale LANG="<ll>_<CC>.<charmap><@modifiers>"
也可以指定其他和语言相关的环境变量,例如 LANG、LC_CTYPE、LC_NUMERIC 等。以下示例中,将 LANG 设置为 zh_CN.UTF8,LC_CTYPE 设置为 zh_CN:
localectl set-locale LANG="zh_CN.UTF8" LC_CTYPE="zh_CN"