今天尝试启动在虚拟机中启动一些中间件环境(用docker管理),使用ssh连接虚拟机,却始终无法连接
我怀疑是不是虚拟机的ip地址改变了,但是之前我的虚拟机ip已经在 /etc/sysconfig/network-scripts
目录下,创建了对应的局域网网卡设置ifcfg-ens33
。
通过ipconfig,可以看到,这里并没有ens33
,前三个都是docker网桥接口的名称,每个docker网络都会创建一个对应的虚拟网桥接口。
- 所以我通过
ip addr
指令,查看真实的虚拟网卡的信息。
1: lo: <LOOPBACK,UP,LOWER_UP> mtu 65536 qdisc noqueue state UNKNOWN group default qlen 1000
link/loopback 00:00:00:00:00:00 brd 00:00:00:00:00:00
inet 127.0.0.1/8 scope host lo
valid_lft forever preferred_lft forever
inet6 ::1/128 scope host
valid_lft forever preferred_lft forever
2: ens33: <BROADCAST,MULTICAST> mtu 1500 qdisc noop state DOWN group default qlen 1000
link/ether 00:0c:29:d7:b5:4c brd ff:ff:ff:ff:ff:ff
3: virbr0: <NO-CARRIER,BROADCAST,MULTICAST,UP> mtu 1500 qdisc noqueue state DOWN group default qlen 1000
link/ether 52:54:00:b0:a8:63 brd ff:ff:ff:ff:ff:ff
inet 192.168.122.1/24 brd 192.168.122.255 scope global virbr0
valid_lft forever preferred_lft forever
4: virbr0-nic: <BROADCAST,MULTICAST> mtu 1500 qdisc pfifo_fast master virbr0 state DOWN group default qlen 1000
link/ether 52:54:00:b0:a8:63 brd ff:ff:ff:ff:ff:ff
5: br-04540592dade: <NO-CARRIER,BROADCAST,MULTICAST,UP> mtu 1500 qdisc noqueue state DOWN group default
link/ether 02:42:d0:bf:51:92 brd ff:ff:ff:ff:ff:ff
inet 172.19.0.1/16 brd 172.19.255.255 scope global br-04540592dade
valid_lft forever preferred_lft forever
6: docker0: <NO-CARRIER,BROADCAST,MULTICAST,UP> mtu 1500 qdisc noqueue state DOWN group default
link/ether 02:42:1a:43:91:f2 brd ff:ff:ff:ff:ff:ff
inet 172.17.0.1/16 brd 172.17.255.255 scope global docker0
valid_lft forever preferred_lft forever
7: br-f64a3536172d: <NO-CARRIER,BROADCAST,MULTICAST,UP> mtu 1500 qdisc noqueue state DOWN group default
link/ether 02:42:7b:6f:d6:49 brd ff:ff:ff:ff:ff:ff
inet 172.20.0.1/16 brd 172.20.255.255 scope global br-f64a3536172d
valid_lft forever preferred_lft forever
- 可以看到虚拟机的主网卡接口 ens33 当前处于DOWN状态。
ip link set ens33 up
命令将其启用。
2: ens33: <BROADCAST,MULTICAST,UP,LOWER_UP> mtu 1500 qdisc pfifo_fast state UP group default qlen 1000
link/ether 00:0c:29:d7:b5:4c brd ff:ff:ff:ff:ff:ff
inet6 fe80::20c:29ff:fed7:b54c/64 scope link
此时 ens33 的状态为 up,说明正常启用。
但是启动 network服务 systemctl start network
仍然失败 (Active:failed),
-
从输出信息来看,是网络接口冲突导致的(RTNETLINK),可能同一个IP地址或网桥被多个接口使用。
我怀疑是docker虚拟接口占用了网络配置,与系统的网络配置发生了冲突。所以我停止了docker服务systemctl stop docker
,并且禁用了相关的网络接口ip link set <docker接口名> down
。 -
然后再次尝试启动 network服务,结果仍然和之前的一样启动失败。通过
journalctl -xe
查看network.service的日志信息,network服务仍然failed。说明不是docker 服务的问题。
查看虚拟机ip,显示ens33 状态为 UP,但是未分配ip地址
ens33: flags=4163<UP,BROADCAST,RUNNING,MULTICAST> mtu 1500
inet6 fe80::20c:29ff:fed7:b54c prefixlen 64 scopeid 0x20<link>
ether 00:0c:29:d7:b5:4c txqueuelen 1000 (Ethernet)
RX packets 0 bytes 0 (0.0 B)
RX errors 0 dropped 0 overruns 0 frame 0
TX packets 8 bytes 656 (656.0 B)
TX errors 0 dropped 0 overruns 0 carrier 0 collisions 0
我再次检查了/etc/sysconfig/network-scripts/ifcfg-ens33
,配置没有问题
TYPE="Ethernet"
PROXY_METHOD="none"
BROWSER_ONLY="no"
BOOTPROTO="static"
DEFROUTE="yes"
IPV4_FAILURE_FATAL="no"
IPV6INIT="yes"
IPV6_AUTOCONF="yes"
IPV6_DEFROUTE="yes"
IPV6_FAILURE_FATAL="no"
IPV6_ADDR_GEN_MODE="stable-privacy"
NAME="ens33"
UUID="5be4b2fe-675f-4bb6-83cf-e3f358b3652b"
DEVICE="ens33"
ONBOOT="yes"
#IP地址
IPADDR=192.168.72.100
#网关
GATEWAY=192.168.72.2
#域名解析器
DNS1=192.168.72.2
- 手动在 ens33 上配置临时 ip,让ens33生效
ip link set ens33 up
ip addr add 192.168.72.100/24 dev ens33 # 设置 ip 为 192.168.72.100,子网掩码为 255.255.255.0
ip route add default via 192.168.72.2 # 网关为 192.168.72.2
- 设置ip 成功,
ping www.baidu.com
成功接收数据包,且通过ssh 可以正常连接虚拟机,但是 network服务 还是无法启动。
这是一种临时的解决方案,当我重启虚拟机时,network 服务再次 failed😩,且 ens33并没有作为网络接口,状态仍为 DOWN。
在最后,我认识到了 NetworkManager 和 network服务之间的关系。
两种服务都负责管理和配置网络接口,两者之间存在一定的功能重叠。
network 是比较传统的网络管理方式,偏向于命令行的方式控制ifcfg-ens33
,而 NetworkManager 是后来引入的新方案,更偏向于 图形化界面或命令行解决。两种服务存在兼容问题,可以禁用 NetworkManager 服务,解决此问题。
- 所以我最后禁用了 NetworkManager服务,并且可以正常启动network服务。且ip 配置都正常。
systemctl stop NetworkManager
systemctl disable NetworkManager
systemctl restart network
重启后,网络配置正常。