彻底解决VM ubuntu在虚拟机找不到网卡无法上网的问题

  • 💖 作者简介:大家好,我是Zeeland,开源建设者与全栈领域优质创作者。
  • 📝 CSDN主页:Zeeland🔥
  • 📣 我的博客:Zeeland
  • 📚 Github主页: Undertone0809 (Zeeland)
  • 🎉 支持我:点赞👍+收藏⭐️+留言📝
  • 💬介绍:The mixture of software dev+Iot+ml+anything🔥

Introduction

本文将介绍如何解决VM ubuntu在虚拟机找不到网卡无法上网的问题,并给出一些排查思路,旨在帮助读者快速定位问题。

最近 vm ubuntu 用的比较多,因为 ubuntu 里面要跑一个 k8s,需要比较大的内存,于是给 VM 分配了 30G 的内存,分配完内存后,发现 VM 里面的 ubuntu 无法上网了,于是就有了这篇文章。Ubuntu 网卡消失的问题我不是第一次遇到了,之前已经预见过好几次了,有的时候重启 ubuntu 就没网卡了,有时候分配完内存就没网卡了,触发机制十分奇怪,我至今也没搞懂。之前各种遇到这个问题之后每次的处理方案都不一样,有点头疼,正好很久没写文章了,趁此机会好好总结一下问题。

Problem

在此,重新描述一下问题:VM ubuntu 无法上网,这是问题的表征,问题的本质是 VM ubuntu 找不到对应的网卡,从而导致无法上网。

网络环境:

  • VM ubuntu 22.04 LTS
  • 宿主机: windows 11
  • 内存分配: 30G
  • 网络连接: NAT

在我实践中,该问题的发生有两种原因:

  • 给 VM Ubuntu 分配的内存大小发生改变时,可能会触发该问题
  • VM Ubuntu 重启时,可能会触发该问题

Solution

该问题的解决方式比较多样,因为每个人的发生问题不唯一,因此下面将从最简单的解法开始介绍,读者可以根据自己的情况,逐步尝试,直到解决问题为止。

方法一

遇事不决先重启,重启电脑重启 VM,接着再进行下一步的排查。

在这个问题下,可以再尝试重启一下 Ubuntu 的 network-manager 服务,命令如下:

sudo service network-manager stop
sudo rm /var/lib/NetworkManager/NetworkManager.state 
sudo service network-manager start

如果你是使用 systemd 进行管理,可以使用下面的命令:

sudo systemctl restart NetworkManager

有的时候 vmware 找不到网卡不一定是没有网卡,可能只是因为你禁用了,所以用上面的方式可以解决。

Restart 之后,你可以 curl 一下百度或者 google(if you can),看看能不能上网了,如果不能,那么就需要进一步排查了,命令如下所示。

curl www.baidu.com
# curl www.google.com

方法二

笔者有一次网络无法使用,就是因为 windows 下把 vmware 的 nat 服务给关闭了,导致无法上网,然而这个服务当初是我手动关闭的,因为当初对其没有概念,因此,如果你没有手动对 vmware 的 nat 服务进行关闭,那么这个方法就不适用于你了。

检查一下 windows 下是否运行了 vmware 的 nat 服务,在任务管理器中可以查看到,如果没有运行,可以手动运行一下,如下图所示:

最后重启 ubuntu 即可。

方法三

如果上面两种方法都不行,那么就需要进一步排查了,首先,我们需要查看一下 ubuntu 的网卡信息,命令如下所示:

ifconfig

如下所示:

(base) zeeland@zeeland-virtual-machine:~$ ifconfig
br-d53b2b57ad37: ...

docker0: ...

lo: ...

utun: ...

veth214b03a: ...

可以看到,当前运行的网卡,基本上都是给我的 docker 用的,并没有看到如 eth0, ethe33, enp0s3 这样的网卡信息,那么就说明物理网络接口没有启动,因此没有显示在ifconfig输出中。

ifconfig 并没有显示所有的网络接口。虚拟机被配置为仅使用虚拟网络接口,要获得所有网络接口的完整列表,包括关闭的网络接口,可以使用 ip link 命令:

ip link show
(base) zeeland@zeeland-virtual-machine:~$ ip link show
1: lo: <LOOPBACK,UP,LOWER_UP>...
2: ens33: <BROADCAST,MULTICAST> mtu 1500 qdisc noop state DOWN mode DEFAULT group default qlen 1000
    link/ether 00:0c:29:fa:5a:57 brd ff:ff:ff:ff:ff:ff
    altname enp2s1
3: br-d53b2b57ad37: ...
4: docker0: ...
6: veth214b03a@if5: ...
7: utun: ...

可以看到,在我的 Ubuntu 中,ens33 这个网卡应该是我 NAT 服务所需要使用的网卡,但是它的状态是 DOWN,因此,我们需要手动启动它,命令如下所示:

每个人的网卡名字可能不一样,eth0, ethe33, enp0s3 等等,因此,需要根据自己的情况进行调整。

sudo ip link set ens33 up

启动接口后,您可能还需要将其配置为通过DHCP获取IP地址或设置静态IP地址,具体取决于您的网络设置。如果使用DHCP,则可以使用dhclient命令:

sudo dhclient ens33

重启一下 NetworkManager 服务,命令如下所示:

sudo systemctl restart NetworkManager
# sudo service network-manager restart

这个时候,你可以再次使用 ifconfig 命令查看一下网卡信息,正常状态下,你应该可以看到对应的 ens33 网卡信息了,尝试 ping 或者 curl 一下。

curl www.baidu.com

至此,问题应该已经解决了。

Conclusion

本文介绍了 VM ubuntu 无法上网的问题,以及对应的解决方案,希望能够帮助到读者,如果你有更好的解决方案,或者没有解决问题,欢迎留言讨论。