部署Linux虚拟机出现的网络故障
2020-04-20福州大学至诚学院李昂
■福州大学至诚学院 李昂
笔者在为某客户单位部署一款信息平台时,该信息平台需要18台服务器。因该单位已使用VMware vSphere进行了服务器虚拟化,为减少部署时间,降低部署工作量,笔者先部署了一台操作系统为RedHat Enterprise Linux 7.1的虚拟机,然后将该虚拟机转换成虚拟机模板,通过此虚拟机模板创建了信息平台所需的18台虚拟机。当使用这些虚拟机部署信息平台时,发现它们的网卡都无法正常工作。
故障现象
1.无法配置网络
用“ifconfig eth0 172.16.5.178 netmask 255.255.255.0 broadcat 172.16.5.255”命令为虚拟机配置IP地址,显示“eth0:unknown interface:No such device”等错误提示,如图1所示。
图1 错误提示
图2 显示名为“lo”的网卡
2.不能启动网卡
用“ifup eth0”命令启动网卡,显示“Device eth0 does not seem to be present,delaying initialization”错误,表示不存在这样的设备。
3.只有lo网卡
用命令“ifconfig”查看当前有哪些网络设备,结果虚拟机没有“eth0”网卡,只有一块名为“lo”的网卡,如图2所示。“lo”是操作系统虚拟出来的一块回环网卡,它不与任何实际设备连接,只是用来初始化设备以及初始化数据包格式。
故障排查过程
是不是安装的虚拟机操作系统出了问题?于是笔者重新安装了一台虚拟机,用同样的命令配置网卡,网卡能正常工作,没有出现故障。由此可见,通过虚拟机模板部署的虚拟机是导致上述故障的主要原因。
笔者用命令“cd/etc/sysconfig/networkscripts”,进入“networkscripts”文件夹,发现该文件夹中有“ifcfg-eth0”和“ifcfg-lo”两块网卡的配置文件,如图3所示。
用命令“vi ifcfg-eth0”打开eth0网络配置文件,该配置文件中名为“HUADDR”一行记录的是网卡的物理地址,如图4所示。
笔者怀疑这不是当前网卡的物理地址。通过查看虚拟机网卡设置,发现eth0网络配置文件中网卡物理地址和实际网卡的物理地址不一致。很明显,虽然笔者是通过模板部署的方式创建的虚拟机,其实和虚拟机克隆差不多,创建虚拟机时VMware都会为其产生一个与原始虚拟机网卡物理地址完全不同的网卡。
前面用命令“ifconfig”无法配置网络,无法启动eth0网卡,用命令“ifconfig”查看网络设备时,只有一块“lo”网卡,这些故障出现的原因就是因为用虚拟机模板部署的虚拟机,用虚拟机模板部署虚拟机实际上和虚拟机克隆一样,VMware都将为其重新配置了一块新网卡。
图3 出现两块网卡的配置文件
图4 记录的网卡物理地址
实际上,对RedHat之类的Linux系统而言,会把运行时的网卡物理地址记入“/etc/udev/rules.d/70-persistent-net.rules”文件中,只要将该文件删除,重新启动虚拟机。在系统重新启动过程中,会通过扫描硬件,把这块新网卡当作是eth1,并且会把该网卡的物理地址记入“/etc/udev/rules.d/70-persistentnet.rules”文件中,如果没有“/etc/udev/rules.d/70-persistent-net.rules”文件,操作系统会自动产生这个文件。172.16.5.178 netmask 255.255.255.0 broadcast 255.255.255.0”命令配置IP地址,此时的网卡应该是“eth1”而不是“eth0”,前面配置网卡出现错误就是因为网卡名称发生了变化。
使用命令“route add default gw 172.16.5.254”配置网关。
配置好虚拟机网络后,分别ping本地地址和外网地址,经测试,虚拟机网络配置成功。
解决方案(一)
用命令“rm/etc/udev/rules.d/70-persistent-net.rules”删除“70-persistent-net.rules”文件后,重启虚拟机。
在重启虚拟机后,使用“ifconfig eth1
注意:用ifconfig命令配置的网络只在当前状态有效,虚拟机重启后,网络配置也就不存在了。如果要将网络配置信息永久保存起来,则需要修改网络配置文件。目前该电脑只有网卡eth0的配置文件“ifcfg-eth0”,可以用命令“mv/etc/sysconfig/networkscripts/ifcfg-eth0/etc/sysconfig/network-scripts/ifcfg-eth1”将网卡eth0的配置文件更改为网卡eth1的配置文件“ifcfg-eth1”。
解决方案(二)
在上面的解决方案中,网卡名称是“eth1”,不是默认的“eth0”。其他运维工程师在维护这些虚拟机时,可能会误认为网卡名称是“eth0”,给运维带来不必要的麻烦。
有没有办法将重新生成的网卡名称改回eth0呢?答案是肯定的,下面是将网卡名称改回“eth0”的具体过程。
首先用命令“vi/etc/udev/rules.d/70-persistent-net.rules”编辑文件“70-persistentnet.rules”。
打开“70-persistentnet.rules”文件后,可以看到这个文件里面有两块网卡,其中名为“eth0”的网卡是原虚拟机网卡,名为“eth1”的网卡才是当前网卡如图5所示。
删除名为“eth0”的网卡信息,将名为“eth1”网卡名称更改为“eth0”。
用命令“vi/etc/sysconfig/networkscripts/ifcfg-eth0”编辑网络配置文件“ifcfgeth0”。
图5 “eth1”的网卡才是当前网卡
此时该配置文件的信息仍是原网卡的配置信息,网卡的物理地址仍是原网卡的物理地址。
此时,就可以按“70-persistent-net.rules”文件中当前网卡的物理地址来修改网络配置文件“ifcfgeth0”中的物理地址,其他信息则根据实际情况配置即可。
修改好网络配置文件“ifcfg-eth0”后,用命令“/etc/init.d/network restart”重启网络。
重启网络后,用“ping”命令分别ping内网地址和外网地址,测试网络配置是否有效。
测试证明,当前网卡已经变成了默认的网卡“eth0”,所对应的网络配置文件仍是“ifcfg-eth0”,并且工作正常。
结语
看上去这个问题很简单,网上也有不少相关资料,可能是某些环节给漏掉了,笔者尝试了一个多小时才解决这个问题,为了少走弯路,笔者梳理出上述解决方案,愿与大家一起分享。
在上述解决方案中,有几处需要特别说明:
一是ifconfig命令是用于配置和显示Linux内核中网络接口的网络参数,ifconfig命令做出的网络配置是临时性,重启电脑后无效,这对Linux操作不够熟练的运维管理人员而言,是容易犯的错误。
二是修改网络配置文件“ifcfg-eth0”后,很多运维管理人员会重启操作系统,理所当然地认为重启系统就会使设置生效。但事实上,有不少Linux操作系统在重启后,并未按网络配置文件内容启动网络。因此,使用命令“/etc/init.d/network restart”来重启网络是比较关键的一步操作,笔者也正是因为这个原因才走了不少弯路。