Skip to content

Latest commit

 

History

History
424 lines (253 loc) · 17.2 KB

88.0、systemd-link - systemd 网络设备配置文件.md

File metadata and controls

424 lines (253 loc) · 17.2 KB

systemd.link

名称

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 文件的问题。

[Match] 段选项

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] 段选项

[Link] 接受下列键:

  • Description=

    一个对设备的描述。

  • Alias=

    ifalias 界面属性将设置为该值。

  • MACAddressPolicy=

    MAC 地址应该设置的策略。可用下述策略:

    • persistent

      若硬件具有一个永久 MAC 地址,正如大多数硬件应有的,且该地址被内核所使用,则不做任何操作。否则,生成一个新的 MAC 地址,该地址将保证对于给定的机器和设备,每次重启之后的值都相同,其他情况则随机生成。该特性依赖于链路上有 ID_NAME_ 属性的存在。在没有设置这些属性的硬件上,生成永久 MAC 地址的操作将失败。

    • random

      若内核使用了一个随机 MAC 地址,则不做任何操作。否则,每次该设备出现时,通常为启动时,都生成一个新的地址。无论何种情况下,随机地址都将会设置 unicastlocally 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/external0lan0/lan1/lan3

  • MTUBytes=

    设置设备的以字节记的最大传输单元。支持常用的后缀 K M G,且以 1024 为底。

  • BitsPerSecond=

    设置设备的速度,该值下舍至最近的 Mbps。支持常用的后缀 K M G,且以 1000 为底。

  • Duplex=

    设置设备的双工模式。接受的值为 halffull

  • 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=

    设置接收通道数(介于 14294967295 之间的数)。

  • TxChannels=

    设置发送通道数(介于 14294967295 之间的数)。

  • OtherChannels=

    设置其它通道数(介于 14294967295 之间的数)。

  • CombinedChannels=

    设置合并通道数(介于 14294967295 之间的数)。

  • 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)