跳转到内容

自定义网络配置:netplan 与 systemd-networkd ​

读完这一篇,你能在 OMV 的界面做不到的地方,用自己的 netplan 文件或 systemd-networkd 配置补充网络设置,知道 OMV 会清掉哪些文件、不会碰哪些文件,改完怎么验证,出问题怎么退回来。

先问自己:界面真做不到吗 ​

网络 → 接口(Network → Interfaces)已经能做:以太网和 Wi-Fi 的 DHCP 或静态地址(IPv4 和 IPv6 各一个地址、一个网关、一个指标)、DNS 和搜索域、MTU、MAC 地址、WOL,以及 Bond、VLAN、桥接。先读 网络接口、Bond、VLAN、网桥,能用界面就用界面。

界面做不到、本文覆盖的典型需求:

需求用什么
同一块网卡再加一个地址netplan 的 addresses
静态路由、策略路由netplan 的 routes、routing-policy
Bond 的 LACP 速率、最小链路数netplan 的 lacp-rate、min-links
开机时不等某块没插线的网卡netplan 的 optional
关闭网卡的卸载功能(网卡驱动有问题时的变通)netplan 的 *-offload 系列
netplan 没有、systemd-networkd 有的选项networkd 的 drop-in
netplan 没有的虚拟设备(例如 macvlan)自己写 networkd 的 .netdev 和 .network

官方 FAQ 的回答是:OMV 5 起用 systemd-networkd 配置网络,/etc/network/interfaces 由 OMV 控制但不再使用;界面做不到的,用「高级设置」(环境变量和自定义 Salt 状态),或者自己写 systemd-networkd 配置文件。本文展开这两条路,并补上最省事的一条:在 /etc/netplan/ 里放自己的 YAML。

网络配置写错,NAS 会失联

  • 影响范围:应用后,当前的 Web、SSH、SMB、NFS 连接和容器的网络访问都可能中断。netplan apply 会重新配置所有接口,已经存在的虚拟设备(Bond、桥接)在你从配置里删掉之后不会自动消失。
  • 前置条件:手边有本机控制台(显示器和键盘、IPMI,或虚拟机控制台);记下当前的地址、网关和设备名;界面里没有待应用的网络变更;优先在虚拟机或测试机上验证;用 netplan try,不要直接 netplan apply。
  • 怎么回退:到控制台,先把你的文件删掉或改名成不以 .yaml 结尾,再运行 netplan apply;还不行,运行 omv-firstaid 重新配置接口,见 改坏网络后怎么救。

OMV 管着哪些文件,不碰哪些文件 ​

在界面点应用时,OMV 的 systemd-networkd 模块会:清理旧文件,按配置数据库重新生成 netplan 文件,再执行 netplan apply,由 systemd-networkd 配置网卡。下面的表来自这个模块的 Salt 状态:

位置谁管OMV 部署时的行为
/etc/netplan/10-openmediavault-default.yamlOMV重写,指定渲染器为 networkd
/etc/netplan/20-、30-、40-、50-、60-openmediavault-<设备名>.yamlOMV先删后写,依次对应以太网、Wi-Fi、Bond、VLAN、桥接,权限 0600
/etc/netplan/00-installer-config.yaml、/etc/netplan/10-dhcp-all-interfaces.yaml安装器和 Armbian 留下的每次部署都被直接删除
/etc/systemd/network/ 里名字含 openmediavault- 的文件OMV部署时清理
/etc/systemd/network/ 里大小为 0 的普通文件无部署时清理。源码注释:空文件会让 netplan 调用的 udevadm 检查失败
/etc/network/interfacesOMV只剩一行 source-directory,不再被使用
/etc/resolv.confOMV重建为指向 /run/systemd/resolve/stub-resolv.conf 的符号链接
/run/systemd/network/netplan每次生成都重建,不要改
你自己的 /etc/netplan/90-custom.yaml 之类你不碰
你自己的 /etc/systemd/network/10-netplan-<设备名>.network.d/*.conf 之类你不碰

所以起名规则是:文件名不含 openmediavault-,不叫 00-installer-config.yaml 或 10-dhcp-all-interfaces.yaml,扩展名是 .yaml,权限设成 600。netplan 对权限过宽的配置文件会警告,里面可能有 Wi-Fi 密码或隧道密钥。

不要直接改 /etc/netplan/ 里名字含 openmediavault- 的文件,下一次应用就会被删掉重写。

方法一:在 /etc/netplan 里放自己的 YAML ​

netplan 怎么合并多个文件 ​

按 netplan 官方文档:

  • 它读取 /lib/netplan、/etc/netplan、/run/netplan 下的 *.yaml。**文件名不同的文件,按文件名的字典序依次处理,后面的文件添加或覆盖前面的。**文件名相同的,只有优先级最高的目录里的那一份会被读。
  • 键重复时:布尔、数字、字符串这类标量,后面的覆盖前面的;序列(例如 addresses、routes)被连接,后面的追加在前面的后面;映射则逐项按这些规则合并。

对我们的意义:

  • 取名 90-custom.yaml,排在 OMV 的 10 到 60 之后,可以在 OMV 配好的设备上追加地址、路由。
  • 它不能删除或替换 OMV 文件里已有的序列项。想改 OMV 已设置的地址、网关、DNS,只能在界面里改。
  • 设备的 ID 必须和 OMV 文件里的一样,才会合并到同一个设备上,这个 ID 就是 OMV 界面里显示的设备名,例如 ens18、bond0。用别的 ID 去描述同一块网卡,会生成两份配置,结果不可预测。
  • 一个用途一个文件最清楚,例如 90-extra-address.yaml、91-routes.yaml。同一个文件里只能有一个 network: 顶层键。

步骤 ​

  1. 先在界面把能做的设置完,应用,确认网络正常。
  2. 在 OMV 的 shell(root)里,只读查看设备名和 OMV 生成的文件:
sh
# 在 OMV 的 shell 里执行(root),只读
ip -br link
ls -l /etc/netplan/

想看 OMV 生成的内容,可以 cat 其中名字含 openmediavault- 的文件。里面可能有 Wi-Fi 密码,别原样贴到论坛。 3. 新建你的文件,下面以追加地址为例(示例见下一节),并设成 600:

sh
# 在 OMV 的 shell 里执行(root)
nano /etc/netplan/90-extra-address.yaml
chmod 600 /etc/netplan/90-extra-address.yaml
  1. 生成并检查语法。这一步只生成配置,不应用到网卡,有错误会直接报出来:
sh
# 在 OMV 的 shell 里执行(root)
netplan generate
  1. 试运行。netplan try 先应用,如果你没有在限时内(默认 120 秒)按回车确认,就自动回滚。在 SSH 里改网络时用它,比直接 netplan apply 安全得多:
sh
# 在 OMV 的 shell 里执行(root),最好在本机控制台旁边
netplan try

按官方文档,netplan try 和 netplan apply 有同样的已知限制:已经存在、又从配置里删掉的虚拟设备不会被自动删除。 6. 确认之后,按下面的「检查结果」验证。

示例一:同一块网卡再加一个 IPv4 地址 ​

把 ens18 换成你的设备名:

yaml
network:
  version: 2
  ethernets:
    ens18:
      addresses:
        - 192.168.2.200/24

addresses 是序列,会追加到 OMV 配好的地址后面。

示例二:静态路由 ​

访问另一个网段时,改走一个不是默认网关的路由器:

yaml
network:
  version: 2
  ethernets:
    ens18:
      routes:
        - to: 10.20.0.0/16
          via: 192.168.2.254

routes 也是序列,追加在 OMV 生成的默认路由后面。

示例三:Bond 的 LACP 速率和最小链路数 ​

Bond 的界面没有这两项。lacp-rate 只在 802.3ad 模式有意义,fast 表示每秒发一次,默认 slow 是每 30 秒;min-links 是 Bond 要保持「在线」所需的最少链路数。bond0 要换成你的 Bond 名:

yaml
network:
  version: 2
  bonds:
    bond0:
      parameters:
        lacp-rate: fast
        min-links: 1

示例四:开机不等没插线的网卡 ​

NAS 有多块网卡、其中一块常年不接线时,让 systemd-networkd 开机不为它等待:

yaml
network:
  version: 2
  ethernets:
    ens19:
      optional: true

示例五:关闭网卡的卸载功能 ​

只有确认是网卡驱动的卸载功能出问题(例如日志里反复出现网卡「硬件挂起」之类的报错)时才用。这些选项只有 networkd 后端支持,netplan 官方文档建议按 MAC 地址匹配设备,OMV 对有永久 MAC 的物理网卡已经是这样生成的:

yaml
network:
  version: 2
  ethernets:
    ens18:
      generic-receive-offload: false
      generic-segmentation-offload: false
      tcp-segmentation-offload: false

没写的项保持内核默认。关掉卸载会增加 CPU 负担,换一块驱动更成熟的网卡往往是更好的办法。

方法二:systemd-networkd 的 drop-in ​

netplan 不支持的 networkd 选项,不能写进 YAML。netplan 的维护者在问题跟踪里给出的做法是:用 systemd 的 drop-in 机制,在 /etc/systemd/network/ 里为 netplan 生成的文件放一个补充文件。

netplan 把配置转成 /run/systemd/network/10-netplan-<设备名>.network,这些文件每次生成都会重建,不要改它们。drop-in 的路径规则是:

text
/etc/systemd/network/10-netplan-<设备名>.network.d/<任意名字>.conf

drop-in 里要写完整的小节头,选项名大小写敏感,拼错的选项 networkd 会在日志里警告并忽略。不支持通配符,每个生成的文件要有自己的 .network.d 目录。

先用 networkctl status <设备名> 找到那一行 Network File,确认生成的文件名。例子是 netplan 维护者在问题跟踪里回答 DHCPv6 选项时用的写法,选项含义见 systemd.network(5):

ini
# 文件:/etc/systemd/network/10-netplan-ens18.network.d/90-dhcpv6.conf
[DHCPv6]
WithoutRA=solicit

放好之后,让 networkd 重新读取配置并重新配置这块网卡:

sh
# 在 OMV 的 shell 里执行(root),最好在本机控制台旁边
networkctl reload
networkctl reconfigure ens18

drop-in 不会被 OMV 清理:文件名不含 openmediavault-,也不是空文件。

方法三:自己的 .netdev 和 .network 文件 ​

netplan 没有的虚拟设备,例如 macvlan,只能写 networkd 自己的配置文件。常见用途是给 Docker 的 macvlan 网络配一个宿主机这一侧的接口:macvlan 上的容器和宿主机本身默认不能互通,要在宿主机上再建一个同一个父接口的 macvlan 接口,才能互访。

下面是示意,没有在 OMV 8 的实机上验证(待核实),先在虚拟机或有控制台的机器上试。ens18 是父接口,192.168.2.240/29 是留给容器的地址段,192.168.2.250 是一个没被占用的地址,都换成你自己的。

ini
# 文件:/etc/systemd/network/30-macvlan-shim.netdev
[NetDev]
Name=macvlan-shim
Kind=macvlan

[MACVLAN]
Mode=bridge
ini
# 文件:/etc/systemd/network/30-macvlan-shim.network
[Match]
Name=macvlan-shim

[Network]
Address=192.168.2.250/32

[Route]
Destination=192.168.2.240/29

再用方法二的 drop-in 把它挂到父接口上:

ini
# 文件:/etc/systemd/network/10-netplan-ens18.network.d/90-macvlan-shim.conf
[Network]
MACVLAN=macvlan-shim

omv-extras wiki 的 Docker 指南里,对这个需求用的是写 /etc/network/interfaces.d/ 的办法。官方 FAQ 说明 OMV 5 起网络由 systemd-networkd 管理,/etc/network/interfaces 不再使用,所以那个办法在 OMV 8 上是否生效、会不会和 netplan 冲突待核实,wiki 自己也提醒过自担风险。Docker 一侧的 macvlan 网络怎么建,见 Docker 与应用。

方法四:自定义 Salt 状态 ​

只有一种情况需要它:你要在每次网络部署之后运行额外的命令,或者想让 Salt 来管理文件。systemd-networkd 模块的 default.sls 会 include 同目录下所有文件名匹配「数字开头、.sls 结尾」的状态,按文件名排序执行,目前有 05、05、10、50、90 几个。把你的文件命名成 70custom.sls 之类,它会排在 50netplan.sls(执行 netplan apply)之后。写法、注意事项和回退,见 Salt 部署与自定义配置。

这个模块还有三个环境变量,用法见 环境变量:OMV_SYSTEMD_NETWORKD_BOND_PRIMARYRESELECTPOLICY(默认 always,Bond 里主要网卡恢复后是否重新成为活动网卡)、OMV_SYSTEMD_NETWORKD_RESOLVCONF_TARGET(默认 /run/systemd/resolve/stub-resolv.conf,/etc/resolv.conf 指向哪里)、OMV_SYSTEMD_NETWORKD_NETPLANIO_RENDERER(默认 networkd,OMV 的网络部分按 networkd 设计,不要改)。

检查结果 ​

在 OMV 的 shell(root)里,只读确认:

sh
# 在 OMV 的 shell 里执行(root)
netplan get                       # 显示合并之后的最终配置,应同时有 OMV 的部分和你的部分
ip -br addr                       # 地址是否符合预期
ip route                          # 路由是否符合预期(IPv6 用 ip -6 route)
networkctl status ens18           # 设备状态,以及用到的配置文件
journalctl -u systemd-networkd -n 50 --no-pager   # 有没有被忽略的选项或报错

然后做两个「不被覆盖」的验证:

  1. 重启一次 NAS,开机后自定义项仍在。netplan 在开机时会重新生成配置,你的文件和 OMV 的一样会被读到。
  2. 在界面里改一个无关的网络设置并应用,或者在控制台旁边运行 omv-salt deploy run systemd-networkd,再检查一遍,自定义项还在。后者就是点应用时网络模块执行的部署,会再执行一次 netplan apply,只在你已经用 netplan try 确认过之后做。

回退 ​

  • netplan 文件:删掉或移走你的文件,netplan try,确认之后恢复。从配置里删掉的虚拟设备(Bond、桥接、macvlan)不会自动消失,要重启,或者手动删除设备,例如 ip link delete dev macvlan-shim。
  • drop-in 或 networkd 文件:删掉文件,networkctl reload,再对相应设备 networkctl reconfigure。
  • 失联:到控制台按上面的警告处理,必要时 omv-firstaid。

备份与维护 ​

  • 你的文件不在 OMV 的配置数据库里,备份 config.xml 不会带上它们。重装系统或迁移硬件时要自己带过去,建议把它们记进你的配置文档,见 OMV 配置怎么留底。文件里有密钥的,别放进公开的仓库。
  • 重装 OMV 之前先把它们移走。 omv-confdbadm populate(安装 OMV 时会运行)会读取 /etc/netplan/*.yaml 里的 ethernets,把它们导入 OMV 的配置数据库,你的文件可能被当作接口配置导入。只在安装或手动运行 populate 时发生,平时不会。
  • 设备名变了,文件里的 ID 要跟着改。 换网卡、调整 PCI 设备、升级内核后设备名可能变化,ID 对不上的配置不会生效。
  • 升级 OMV 的大版本之后重新验证一遍。

常见问题 ​

netplan generate 报 YAML 错误。 缩进只能用空格,不能用 Tab;同一个文件里只能有一个 network:;冒号后要有空格。

提示权限过宽(Permissions for ... are too open)。 chmod 600 你的文件。

加了配置,应用之后又没了。 文件名里是不是含 openmediavault-,或者就是 00-installer-config.yaml、10-dhcp-all-interfaces.yaml,这几个会被 OMV 删掉。

想改 OMV 已经设置的地址或 DNS,自己的文件改不动。 序列只能追加,不能替换。这类修改在界面里做。

一块网卡出现两个默认路由,或地址冲突。 你的文件和 OMV 的文件同时描述了同一个设备。核对 ID,只在自己的文件里放 OMV 界面做不到的部分。

参考资料 ​

OpenMediaVault 非官方中文使用指南,与 openmediavault 项目及其开发者无隶属关系。