💻 对于经常在本地用 VMware 跑 Ubuntu 虚拟机的开发者来说,日常部署 Redis、拉取数据库的 Docker 镜像或是跑跑后端服务,网络是重中之重。
😱 但在最近折腾 ubuntu-22.04.5-desktop-amd64.iso 桌面版镜像时,我踩到了一个极其让人崩溃的底层大坑:刚装好的虚拟机,只要一重启,代表外部物理网络的网卡(如 ens33)就会离奇失踪。虚拟机彻底断网,沦为一座“网络孤岛”。
这篇博客完整记录了这次排坑的全过程。如果你也卡在了 strictly unmanaged 这个报错上,可以直接跳转到最后的终极解法。
🕵️ 一、 案发现场:陷入死循环的排查历程
当你敲下命令准备更新包,却被系统无情提示 Network is unreachable 时,排查的噩梦就开始了。
👻 1. 消失的物理网卡与不存在的 Netplan
第一时间用 ip a 查看网络接口,发现本该拿到局域网 IP 的 ens33 网卡毫无踪影,列表中只有本地回环(lo)和 Docker 虚拟网桥(docker0)。
由于网上绝大多数针对 Ubuntu 的教程都会让你去修改 /etc/netplan 配置文件,我毫不犹豫地执行了查看命令:
ls /etc/netplan
然而,终端却冷冷地抛出了没有该目录的提示:
ls: cannot access '/etc/netplan': No such file or directory
🧠 分析: 这说明在我们使用的
ubuntu-22.04.5-desktop镜像中,网络压根不是由 Netplan 接管的,而是由传统的图形化网络服务NetworkManager掌控。
🚫 2. 强行拉起网卡,遭遇“严格封印”
既然是 NetworkManager 负责,那我直接用 nmcli 工具给网卡建个配置并强行激活。
首先,尝试建立连接(这一步非常顺利):
sudo nmcli connection add type ethernet ifname ens33 con-name ens33 ipv4.method auto
Connection 'ens33' (72dff3c9-f599-4b57-b885-7df2f46c7dc0) successfully added.
看着配置生成成功,我满心欢喜地准备拉起网卡:
sudo nmcli connection up ens33
就在这时,迎来了最绝望的一击报错 💔:
Error: Connection activation failed: No suitable device found for this connection (device lo not available because device is strictly unmanaged).
这句提示中最后两个词 strictly unmanaged(严格未托管) 引起了我的警觉。为了确认,我查看了所有设备的底层托管状态:
nmcli device status
得到的状态列表令人窒息:
DEVICE TYPE STATE CONNECTION
docker0 bridge unmanaged --
ens33 ethernet unmanaged --
vethdb0030a ethernet unmanaged --
lo loopback unmanaged --
🎯 破案了: Ubuntu 22.04 桌面版底层隐藏了一套黑名单潜规则,它死死锁住了
ens33物理网卡,并对 NetworkManager 下达了死命令——“这块网卡你不准碰!”。
💥 3. 乱写配置补丁的惨痛代价
查阅资料后,我试图通过 echo 命令强行向系统写入一个解除限制的补丁文件,结果由于终端环境解析换行符的差异,直接导致网络服务全面崩溃。
当我尝试重启网络服务时:
sudo systemctl restart NetworkManager
直接报错罢工:
Job for NetworkManager.service failed because the control process exited with error code.
See "systemctl status NetworkManager.service" and "journalctl -xeu NetworkManager.service" for details.
🛠️ 二、 破局方案:四步优雅解除底层黑名单
经历了上述各种折腾,在清理掉错误的配置文件后,我终于找到了一套“用魔法打败魔法”的完美方案:不需要修改任何主配置文件,只需塞给系统一个特权的空文件,就能静默覆盖掉默认的禁用规则。
请依次执行以下 4 步命令,全程极度安全:
🪄 Step 1:创建覆盖文件,打破锁死规则
不要使用容易引起格式错误的文本编辑器,直接用 touch 命令在配置目录下生成一个特定的空文件。只要这个文件存在,系统就会交出网卡控制权。
sudo touch /etc/NetworkManager/conf.d/10-globally-managed-devices.conf
🔄 Step 2:重启网络服务,让解封生效
重新加载服务,让 NetworkManager 读取刚刚创建的特权文件。
sudo systemctl restart NetworkManager
(注:命令执行后不会有任何输出,此时网卡已解除 unmanaged 状态)
🎉 Step 3:重新唤醒网卡,见证奇迹
现在,我们可以毫无阻碍地拉起前面已经建好的 ens33 连接了:
sudo nmcli connection up ens33
如果你看到终端弹出下面这行绿色的成功激活提示,恭喜你,网络通了!
Connection successfully activated (D-Bus active path: /org/freedesktop/NetworkManager/ActiveConnection/1)
紧接着敲下 ip a,久违的局域网 IP(比如 192.168.xx.xx)终于重见天日 ☀️。
🔒 Step 4:锁死开机自启配置
为了斩草除根,给这个网络连接打上开机自启的烙印,防止下次重启旧病复发:
sudo nmcli connection modify ens33 connection.autoconnect yes
🛡️ 三、 最后的一道防线:检查 VMware 宿主设置
虚拟机的系统内部调教得再完美,如果外部环境没给“插网线”也是徒劳。在重启测试前,请务必检查 VMware 的物理设置:
右键当前虚拟机,进入 设置 (Settings) ⚙️。
在硬件列表中定位到 网络适配器 (Network Adapter) 🔌。
确保右侧的 “启动时连接” (Connect at power on) 处于 ✅ 勾选状态。
网络连接模式建议选择 NAT 模式 🌐,这在本地开发环境中最为稳定。
💡 总结
做完这一切,尽情去重启你的虚拟机吧。从此彻底告别每次开机都要手动捞网卡的折磨,畅快地去写代码!👨💻✨