ip addr add 配置的 ip 重启后消失是因为该命令仅修改内核运行时状态,不写入任何持久化配置文件;debian/ubuntu 应写入 /etc/network/interfaces,rhel/centos 8+ 应用 nmcli 或 netplan,且 netplan 的 yaml 缩进和格式必须严格正确。

为什么 ip addr add 配置的 IP 重启后就没了
因为 ip addr add 是纯内存操作,改的是内核网络栈的运行时状态,不写入任何持久化配置文件。系统一重启,内核重载,所有临时配置清空。
常见错误现象:ip addr show 能看到 IP,reboot 后消失;或者 systemctl restart networking(Debian/Ubuntu)也失效——说明你没走对持久化路径。
- 使用场景:临时调试、CI 环境快速配网、容器宿主机手动测试
- 它和
ifconfig一样,只作用于当前会话,别指望它扛过 reboot - 没有“参数开关”能让它持久,硬加
--permanent或类似选项都是错的(那不是这个命令的功能)
Debian/Ubuntu 持久化该写进 /etc/network/interfaces
这是传统 ifupdown 工具链的配置入口,systemctl restart networking 读的就是它。新装的 Ubuntu 22.04+ 默认不用这套,但只要没卸载 ifupdown,它就依然生效且优先级高于 Netplan(除非你明确禁用)。
示例(给 eth0 配静态 IP):
auto eth0
iface eth0 inet static
address 192.168.1.100
netmask 255.255.255.0
gateway 192.168.1.1
- 必须用
auto行声明接口启动,否则ifup eth0都不会触发 -
iface xxx inet dhcp写法才走 DHCP;写成inet static才走下面的address - 改完要执行
sudo ifdown eth0 && sudo ifup eth0测试,别直接 reboot - 如果系统同时启用了 Netplan(如 Ubuntu 18.04+ 默认),两个配置冲突会导致
networking服务启动失败,journalctl -u networking里能看到 “interface already configured” 类错误
CentOS/RHEL 8+ 用 /etc/sysconfig/network-scripts/ifcfg-xxx 还是 Netplan?
RHEL 8+ 和 CentOS Stream 默认弃用 ifcfg-*,转而通过 NetworkManager + keyfile 或 Netplan(若装了)管理。但很多用户仍习惯改 ifcfg-eth0,结果 nmcli connection reload 不生效、systemctl restart network 报错“Failed to start network.service”。
- 真实情况:
network.service在 RHEL 8+ 是被 mask 掉的,systemctl unmask network并不能安全启用它 - 正确做法是用
nmcli:比如nmcli connection modify "System eth0" ipv4.addresses 192.168.1.100/24,再nmcli connection down "System eth0" && nmcli connection up "System eth0" - 如果非要写文件,得用
/etc/NetworkManager/system-connections/下的 keyfile(格式类似 ini),而不是 ifcfg;手写容易少[connection] id=xxx导致加载失败 -
nmcli connection show是唯一可信的“当前生效配置”来源,ip addr只反映结果,不反映来源
Netplan 配置写错一个缩进,整个网络就起不来
Netplan 是 YAML 格式,缩进即语法。少一个空格、混用 tab、冒号后没空格——都会导致 netplan apply 失败,且错误提示极其简陋:Invalid YAML at //etc/netplan/01-network-manager-all.yaml line 12 column 3: did not find expected key。
- 必须用空格缩进,严禁 tab;推荐用 2 空格,和官方示例一致
- 所有键名后必须跟
:+ 一个空格,比如addresses:不是addresses:(后面没空格)或addresses:(多一个空格也不行) - 修改后先运行
sudo netplan generate,它会把 YAML 编译成 NetworkManager 或 systemd-networkd 的中间配置,出错就停在这步,比apply安全 - 如果用了
renderer: NetworkManager,但系统没装NetworkManager包,netplan apply会静默失败,ip link看不到接口 UP,得查journalctl -u systemd-networkd或journalctl -u NetworkManager
最麻烦的点在于:不同发行版默认 renderer 不同,同一份 YAML 在 Ubuntu 上跑 NetworkManager,在 Debian 上可能被 systemd-networkd 解析——行为差异藏在底层,不看 cat /etc/netplan/*.yaml | grep renderer 根本意识不到。










