解决方案

VirtualBox Ubuntu 无法联网,重启后可以联网但是几分钟后断开网络。笔者的情况是因为 NetworkManager 自动修改了网络配置导致无法联网,具体现象是开机后网卡信息如下:

user@allone:~$ ifconfig
brq64ff9b38-fa: flags=4163<UP,BROADCAST,RUNNING,MULTICAST>  mtu 1500
        ether ce:29:de:12:35:06  txqueuelen 1000  (Ethernet)
        RX packets 0  bytes 0 (0.0 B)
        RX errors 0  dropped 0  overruns 0  frame 0
        TX packets 0  bytes 0 (0.0 B)
        TX errors 0  dropped 0 overruns 0  carrier 0  collisions 0

enp0s3: flags=4163<UP,BROADCAST,RUNNING,MULTICAST>  mtu 1500
        inet 10.0.2.15  netmask 255.255.255.0  broadcast 10.0.2.255
        inet6 fe80::2e8f:2be6:3752:dec4  prefixlen 64  scopeid 0x20<link>
        ether 08:00:27:18:31:21  txqueuelen 1000  (Ethernet)
        RX packets 947  bytes 584483 (584.4 KB)
        RX errors 0  dropped 0  overruns 0  frame 0
        TX packets 800  bytes 116611 (116.6 KB)
        TX errors 0  dropped 0 overruns 0  carrier 0  collisions 0

此时网络可以正常使用,经过一两分钟后网络信息如下:

user@allone:~$ ifconfig
brq64ff9b38-fa: flags=4163<UP,BROADCAST,RUNNING,MULTICAST>  mtu 1500
        inet 10.0.2.15  netmask 255.255.255.0  broadcast 10.0.2.255
        ether ce:29:de:12:35:06  txqueuelen 1000  (Ethernet)
        RX packets 0  bytes 0 (0.0 B)
        RX errors 0  dropped 0  overruns 0  frame 0
        TX packets 0  bytes 0 (0.0 B)
        TX errors 0  dropped 0 overruns 0  carrier 0  collisions 0

enp0s3: flags=4163<UP,BROADCAST,RUNNING,MULTICAST>  mtu 1500
        inet6 fe80::2e8f:2be6:3752:dec4  prefixlen 64  scopeid 0x20<link>
        ether 08:00:27:18:31:21  txqueuelen 1000  (Ethernet)
        RX packets 947  bytes 584483 (584.4 KB)
        RX errors 0  dropped 0  overruns 0  frame 0
        TX packets 800  bytes 116611 (116.6 KB)
        TX errors 0  dropped 0 overruns 0  carrier 0  collisions 0

也就是默认虚拟网卡的 IP 地址丢失,而不知名网卡 brq64ff9b38-fa 却拥有了 IP,此时网络不可用。如果有类似情况,可以使用以下方式尝试解决,如果是其他问题。请酌情参考。

  1. 关闭 NetworkManager
sudo systemctl stop NetworkManager
sudo systemctl disable NetworkManager
sudo systemctl mask NetworkManager
  1. 开启 systemd-networkd
sudo systemctl unmask systemd-networkd.service

sudo systemctl enable systemd-networkd.service

sudo systemctl start systemd-networkd.service
  1. 配置 Netplan

编辑/etc/netplan/01-network-manager-all.yaml

network:
    version: 2
    renderer: networkd
    ethernets:
       enp0s3:
           dhcp4: yes
           dhcp6: yes
           addresses: [10.0.2.15/23]
           nameservers:
               addresses: [8.8.8.8, 8.8.4.4]
           optional: true

其中 enp0s3 为网卡名称,addresses 为网卡对应的 IP,均可以通过 ifconfig 查询。

以下是一些背景知识,以及问题回溯有兴趣可以继续阅读。

背景知识

NetworkManager 与 systemd-networked

NetworkManager 是一项后端服务,用于控制 Ubuntu 操作系统上的网络接口。NetworkManager 的替代方法是 systemd-networked,这两者只能使用一个。在 Ubuntu 桌面上,NetworkManager 是通过图形用户界面管理网络界面的默认服务。因此,如果要通过 GUI 配置 IP 地址,则应启用 NetworkManager。如果用的是无桌面的 Server 版,就可以使用 systemd-networked 来管理网络。

这两种方式都可以通过配置 netplan,即/etc/netplan/01-network-manager-all.yaml 来管理网络,但是在 renderer 属性中配置有所不同,使用 NetworkManager 时配置如下:

network:
    version: 2
    renderer: NetworkManager

而使用 systemd-networked 时,配置如下:

network:
    version: 2
    renderer: networkd

有时无法联网可能是因为配置与实际使用的网络管理方式不匹配导致的。