systemd.link — 网络设备配置
link.link
网络链路配置由 net_setup_link udev 内建函数执行。
链路文件从位于系统网络文件夹 /usr/lib/systemd/network
,易失运行时网络文件夹 /run/systemd/network
,以及本地管理网络文件夹 /etc/systemd/network
中读取。链路文件必须具有后缀名 .link
;其它后缀名皆被忽略。所有链路文件均以字符顺序排列和处理,无论他们所处的文件夹。但是,具有完全一致文件名的文件将相互替代。在 /etc
中的文件具有最高优先级,在 /run
中的文件优先于 /usr/lib
中的同名文件。这可以按需使用一个本地文件覆盖一个系统提供的链路文件。作为特例,一个空文件(文件大小为 0),或具有相同文件名,但指向 /dev/null
的文件完全禁用一个文件(被“遮盖”)。
链路文件包含一个 [Match]
段,它决定一个给定的链路文件可以作用于一个给定的设备,以及一个 [Link]
段指定设备该如何配置。首个(以字符顺序)匹配上给定设备的链路文件将起效。注意,默认文件 99-default.link
是附在系统中的。任何用户提供的 .link
应该具有比该文件更早的文件名,来让配置文件被考虑在内。
参见 udevadm(8) 来诊断 .link
文件的问题。
A link file is said to match a device if all matches specified by the "[Match]" section are satisfied. When a link file does not contain valid settings in "[Match]" section, then the file will match all devices and systemd-udevd warns about that. Hint: to avoid the warning and to make it clear that all interfaces shall be matched, add the following:
如果在 [Match]
段指定的所有条目均匹配了一个设备,则说该链路文件匹配上该设备。当一个链路文件不具有有效的 [Match]
段时,该文件将匹配所有的设备,且 systemd-udevd 将警告该情况。提示:要避免警告,并明确所有的界面均配匹配,添加如下内容:
OriginalName=*
接受下列键:
-
MACAddress=
一个白空格分隔的列表,内容为硬件地址。使用全 分号、连字符、点号分隔的十六进制数。参见下方的例子。该选项可多次指定,在这种情况下,列表将会被合并。若在该选项中使用了空字符串,则重置前序所有指定的硬件地址。
例子:
MACAddress=01:23:45:67:89:ab 00-11-22-33-44-55 AABB.CCDD.EEFF
-
OriginalName=
一个白空格分隔的列表,内容为 shell 样式通配符匹配的设备名称,该名称如 udev 属性 INTERFACE 中导出的一样。它不能被用于匹配已经从用户空间修改过的名称。当匹配内核分配的名称时要额外注意,这些名称在每次重启之后是不稳定的。
-
Path=
一个白空格分隔的列表,内容为 shell 样式通配符匹配的永久路径,如 udev 属性 ID_PATH。
-
Driver=
一个白空格分隔的列表,内容为 shell 样式通配符匹配的当前与设备所绑定的驱动,如同其父级设备的 udev 属性 ID_NET_DRIVER 导出的一样,如果该 udev 属性为设置,则为该设备自身通过
ethtool -i
获取的一样。 -
Type=
一个白空格分隔的列表,内容为 shell 样式通配符匹配的设备类型,如同 udev 属性 DEVTYPE 导出的一样。
-
Property=
一个白空格分隔的列表,内容为 udev 属性名以及一个等号
=
和该属性对应的值。若指定了多个属性,则测试结果取“且”。若列表前缀一个!
,则测试反向。若一个值包含白空格,则请用双引号包含整个键值对。若一个值包含引号,则使用\
将引号转义。案例:若一个
.link
文件具有下列内容:Property=ID_MODEL_ID=9999 "ID_VENDOR_FROM_DATABASE=vendor name" "KEY=with \"quotation\""
则
.link
文件仅匹配与上述三个属性均匹配的界面。 -
Host=
匹配主机名或主机的机器名。参见 systemd.unit(5) 中的
ConditionHost=
了解详情。若前缀了一个!
,结果取反。若赋予了一个空字符串,则清除前序值。 -
Virtualization=
检查系统是否在虚拟环境中运行,并额外地测试该虚拟环境是否为特定的实现。参见 systemd.unit(5) 中的
ConditionVirtualization=
了解详情。若前缀了一个!
,则结果取反。若赋予了一个空字符串,则清除前序值。 -
KernelCommandLine=
测试是否设置了特定的内核命令。参见 systemd.unit(5) 中的
ConditionKernelCommandLine=
了解详情。若前缀了一个!
,则结果取反。若赋予了一个空字符串,则清除前序值。 -
KernelVersion=
测试内核版本(如
uname -r
回报的)匹配一个特定的表达式。参见 systemd.unit(5) 中的ConditioniKernelVersion=
了解详情。若前缀了一个!
,则结果取反。若赋予了一个空字符串,则清除前序值。 -
Architecture=
测试系统是否在一个特定的架构上运行。参见 systemd.unit(5) 中的
ConditionArchitecture=
了解详情。若前缀了一个!
,则结果取反。若赋予了一个空字符串,则清除前序值。
[Link]
接受下列键:
-
Description=
一个对设备的描述。
-
Alias=
ifalias 界面属性将设置为该值。
-
MACAddressPolicy=
MAC 地址应该设置的策略。可用下述策略:
-
persistent
若硬件具有一个永久 MAC 地址,正如大多数硬件应有的,且该地址被内核所使用,则不做任何操作。否则,生成一个新的 MAC 地址,该地址将保证对于给定的机器和设备,每次重启之后的值都相同,其他情况则随机生成。该特性依赖于链路上有 ID_NAME_ 属性的存在。在没有设置这些属性的硬件上,生成永久 MAC 地址的操作将失败。
-
random
若内核使用了一个随机 MAC 地址,则不做任何操作。否则,每次该设备出现时,通常为启动时,都生成一个新的地址。无论何种情况下,随机地址都将会设置 unicast 和 locally administered bit。
-
none
保留内核分配的 MAC 地址。
-
-
MACAddress=
若未设置
MACAddressPolicy=
,则要使用的 MAC 地址。 -
NamePolicy=
一个有序的、白空格分隔的列表,包含了界面名称如何设置的策略。
NamePolicy=
可能因为在内核命令行设置net.ifnames=0
而禁用。每个策略都可能失败,首个成功的策略将被使用。该名称不会直接被使用,而是导出给 udev 作为 ID_NET_NAME 属性,该属性默认被 udev(7) 所使用,来设置 NAME。可用的策略为:-
kernel
若内核宣称它为一个设备设置的名称是可预测的,则不执行重命名。
-
database
名称基于 udev 的 Hardware Database 条目的键 ID_NET_NAME_FROM_DATABASE 来设置。
-
onboard
名称基于板载设备的固件给出的信息来设置,如同 udev 属性 ID_NET_NAME_ONBOARD 导出的一样。参见 systemd.net-naming-scheme(7)。
-
slot
名称基于热插拔设备的固件给出的信息来设置,如同 udev 属性 ID_NET_NAME_SLOT 导出的一样。参见 systemd.net-naming-scheme(7)。
-
path
名称基于设备的物理位置来设置,如同 udev 属性 ID_NET_NAME_PATH 导出的一样。参见 systemd.net-naming-scheme(7)。
-
mac
名称基于设备的永久 MAC 地址设置,如同 udev 属性 ID_NET_NAME_MAC 导出的一样。参见 systemd.net-naming-scheme(7)。
-
keep
如果该设备已经从用户空间获得了一个名称(作为创建该设备的一部分,或一次重命名),则保留它。
-
-
Name=
设置要使用的界面名。该选项具有比
NamePolicy=
更低的优先级,所以若要使该设置起效,则NamePolicy=
必须为未设置、空值、禁用、或者所有配置的策略全失败中的一种。同时参看下方案例中Name=dmz0
的案例。注意,指定一个内核可能赋给另一个界面的名称(比如
eth0
)是很危险的,因为通过 udev 赋予的名称可能会与内核赋予的名称产生竞态,且仅有一个界面可以使用该值。依照操作的顺序,udev 或内核都可能胜出,导致命名不可预测。最好使用一些不同的前缀,比如internal0
/external0
或lan0
/lan1
/lan3
。 -
MTUBytes=
设置设备的以字节记的最大传输单元。支持常用的后缀
K
M
G
,且以 1024 为底。 -
BitsPerSecond=
设置设备的速度,该值下舍至最近的 Mbps。支持常用的后缀
K
M
G
,且以 1000 为底。 -
Duplex=
设置设备的双工模式。接受的值为
half
和full
。 -
AutoNegotiation=
接受一个布尔值。若设置为
yes
,启用自动协商传输参数。自动协商是一个过程,通过该过程,两个相连的以太网设备选择共有的传输参数,比如速度、双工模式、流控制。当未设置时,使用内核默认值。注意若启动了自动协商,速度和双工设置均为只读。若自动协商被禁用,速度和双工设置在驱动支持多种链路模式的情况下时可写的。
-
WakeOnLan=
设置设备的局域网唤醒策略。支持的值为:
-
phy
在 PHY 活动时唤醒。
-
unicast
收到单播报文时唤醒。
-
multicast
收到多播报文时唤醒。
-
broadcast
收到广播报文时唤醒。
-
arp
收到 ARP 时唤醒
-
magic
根据魔包的指示唤醒。
-
secureon
启动 MagicPacket(tm) 的 secureon(tm) 密码。
-
off
永不唤醒。
默认值为
off
。 -
-
Port=
port
选项用于选择设备的端口。支持的值为:-
tp
使用双绞线作为介质的以太网界面。
-
aui
挂接设备接口(Attachment Unit Interface(AUI))。通常用于集线器。
-
bnc
使用同轴电缆连接器和同轴线缆的以太网界面。
-
mii
使用媒介无关界面(Media Independent Interface(MII))的以太网界面。
-
fibre
使用光导纤维作为介质的以太网界面。
-
-
Advertise=
该选项设置了何种速度和双工模式将被用于自动协商的宣告。该选项隐含
AutoNegotiation=yes
。支持的值为:表 1. 支持的宣告值
宣告 速度(Mbps) 双工模式 10baset-half
10 半双工 10baset-full
10 全双工 100baset-half
100 半双工 100baset-full
100 全双工 1000baset-half
1000 半双工 1000baset-full
1000 全双工 10000baset-full
10000 全双工 2500basex-full
2500 全双工 1000basekx-full
1000 全双工 10000basekx4-full
10000 全双工 10000basekr-full
10000 全双工 10000baser-fec
10000 全双工 20000basemld2-full
20000 全双工 20000basekr2-full
20000 全双工 默认该值未设置,也就是说,所有可能的值均被宣告。该选项可以指定多次,在这种情况下,宣告所有指定的速度和模式。若空字符串赋予该选项,则列表被重置,前序赋值将不起作用。
-
TCPSegmentationOffload=
接受一个布尔值。若设置未真,则启用 TCP 分片负载转移(TCP Segmentation Offload(TSO))。若未设置,则使用内核默认值。
-
TCP6SegmentationOffload=
接受一个布尔值。若设置为真,则启用 TCP6 分片负载转移(TCP6 Segmentation Offload(tx-tcp6-segmentation))。当未设置时,使用内核默认值。
-
GenericSegmentationOffload=
接受一个布尔值。若设置为真,则启用通用分片负载转移(Generic Segmentation Offload(GSO))。当未设置时,使用内核默认值。
-
GenericReceiveOffload=
接受一个布尔值。若设置为真,则启用通用接收负载转移(Generic Receive Offload(GRO))。当未设置时,使用内核默认值。
-
LargeReceiveOffload=
接收一个布尔值,若设置为真,则启用大型接收负载转移(Large Receive Offload(LRO))。当未设置时,使用内核默认值。
-
RxChannels=
设置接收通道数(介于
1
和4294967295
之间的数)。 -
TxChannels=
设置发送通道数(介于
1
和4294967295
之间的数)。 -
OtherChannels=
设置其它通道数(介于
1
和4294967295
之间的数)。 -
CombinedChannels=
设置合并通道数(介于
1
和4294967295
之间的数)。 -
RxBufferSize=
接受一个整数。指定网卡的接收环缓冲大小。当未设置时,使用内核默认值。
-
TxBufferSize=
接受一个整数。指定网卡的发送环缓冲大小。当未设置时,使用内核默认值。
-
案例 1. /usr/lib/systemd/network/99-default.link
systemd 随附的链路文件
99-default.link
定义了默认的链路命名策略。[Link] NamePolicy=kernel database onboard slot path MACAddressPolicy=persistent
-
案例 2. /etc/systemd/network/10-dmz.link
这个案例将固定名称
dmz0
赋予具有 MAC 地址00:a0:de:64:7a:e6
的界面:[Match] MACAddress=00:a0:de:63:7a:e6 [Link] Name=dmz0
由于
namepolicy=
并未设置,所以Name=
起效。我们使用了10-
前缀,让该文件较早出现在列表中。注意,若要使它起效,它需要先于99-link
,比如赋予一个数字前缀。 -
案例 3. 排查
NamePolicy=
赋值错误sudo SYSTEMD_LOG_LEVEL=debug udevadm test-builtin net_setup_link /sys/class/net/hub0
Parsed configuration file /usr/lib/systemd/network/99-default.link Parsed configuration file /etc/systemd/network/10-eth0.link ID_NET_DRIVER=cdc_ether Config file /etc/systemd/network/10-eth0.link applies to device hub0 link_config: autonegotiation is unset or enabled, the speed and duplex are not writable. hub0: Device has name_assign_type=4 Using default interface naming scheme 'v240'. hub0: Policies didn't yield a name, using specified Name=hub0. ID_NET_LINK_FILE=/etc/systemd/network/10-eth0.link ID_NET_NAME=hub0
在上述情况下,直接定义的
Name=
配置胜出。sudo SYSTEMD_LOG_LEVEL=debug udevadm test-builtin net_setup_link /sys/class/net/enp0s31f6
Parsed configuration file /usr/lib/systemd/network/99-default.link Parsed configuration file /etc/systemd/network/10-eth0.link Created link configuration context. ID_NET_DRIVER=e1000e Config file /usr/lib/systemd/network/99-default.link applies to device enp0s31f6 link_config: autonegotiation is unset or enabled, the speed and duplex are not writable. enp0s31f6: Device has name_assign_type=4 Using default interface naming scheme 'v240'. enp0s31f6: Policy *keep*: keeping existing userspace name enp0s31f6: Device has addr_assign_type=0 enp0s31f6: MAC on the device already matches policy *persistent* ID_NET_LINK_FILE=/usr/lib/systemd/network/99-default.link
上述情况下,界面已经被重命名,所以
99-default.link
中的首个选项keep
策略意味着已存在的名称被保留。若移除了keep
,或在重命名发生前就启动,我们可能会得到下面的结果:enp0s31f6: Policy *path* yields "enp0s31f6". enp0s31f6: Device has addr_assign_type=0 enp0s31f6: MAC on the device already matches policy *persistent* ID_NET_LINK_FILE=/usr/lib/systemd/network/99-default.link ID_NET_NAME=enp0s31f6
请注意输出的细节可能会有所不同。
-
案例 4. /etc/systemd/network/10-internet.link
该案例将固定名称
internet0
赋予具有设备路径pci-000:00:1a.0-*
的界面:[Match] Path=pci-0000:00:1a.0-* [Link] Name=internet0
-
案例 5. /etc/systemd/network/25-wireless.link
这里有一个过于复杂的案例,展示了大量的
[Match]
和[Link]
的设置[Match] MACAddress=12:34:56:78:9a:bc Driver=brcmsmac Path=pci-0000:02:00.0-* Type=wlan Virtualization=no Host=my-laptop Architecture=x86-64 [Link] Name=wireless0 MTUBytes=1450 BitsPerSecond=10M WakeOnLan=magic MACAddress=cb:a9:87:65:43:21
systemd-udevd.service(8), udevadm(8), systemd.netdev(5), systemd.network(5)