外观
自定义网络配置: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.yaml | OMV | 重写,指定渲染器为 networkd |
/etc/netplan/20-、30-、40-、50-、60-openmediavault-<设备名>.yaml | OMV | 先删后写,依次对应以太网、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/interfaces | OMV | 只剩一行 source-directory,不再被使用 |
/etc/resolv.conf | OMV | 重建为指向 /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:顶层键。
步骤
- 先在界面把能做的设置完,应用,确认网络正常。
- 在 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- 生成并检查语法。这一步只生成配置,不应用到网卡,有错误会直接报出来:
sh
# 在 OMV 的 shell 里执行(root)
netplan generate- 试运行。
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/24addresses 是序列,会追加到 OMV 配好的地址后面。
示例二:静态路由
访问另一个网段时,改走一个不是默认网关的路由器:
yaml
network:
version: 2
ethernets:
ens18:
routes:
- to: 10.20.0.0/16
via: 192.168.2.254routes 也是序列,追加在 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/<任意名字>.confdrop-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 ens18drop-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=bridgeini
# 文件:/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-shimomv-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 # 有没有被忽略的选项或报错然后做两个「不被覆盖」的验证:
- 重启一次 NAS,开机后自定义项仍在。netplan 在开机时会重新生成配置,你的文件和 OMV 的一样会被读到。
- 在界面里改一个无关的网络设置并应用,或者在控制台旁边运行
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 界面做不到的部分。
参考资料
- OMV 官方 FAQ:How can I modify or add a network configuration with some custom options the Web UI does not provide?,以及 Custom Configuration
- OMV 源码:systemd-networkd 的 Salt 状态
- netplan 文档:netplan-generate(多文件合并规则)、netplan-try、netplan-apply、YAML 配置参考
- drop-in 做法的出处:netplan 的问题跟踪 #2023727;选项含义见
systemd.network(5)