KVM虚拟机MAC地址冲突,引发服务器对xshell说:Go away!

2024-02-02 15:44

本文主要是介绍KVM虚拟机MAC地址冲突,引发服务器对xshell说:Go away!,希望对大家解决编程问题提供一定的参考价值,需要的开发者们随着小编来一起学习吧!

湖蓝几何球体LinkedIn Banner.png
转载说明:如果您喜欢这篇文章并打算转载它,请私信作者取得授权。感谢您喜爱本文,请文明转载,谢谢。


开场白

最近在机房的服务器上装kvm虚拟主机。
不经意间,上演了一场由MAC地址异常而引发的服务器与xshell之间的血案!

问题描述

在一台服务器上装了两个虚拟机,其中一台是从另一台上克隆的。克隆的虚拟机开机之后,发现ssh不能远程连接:

然后在虚拟机管理界面本地去连接上服务器排查:

查看IP地址,想确认xshell是不是连错了IP,找错了对象,却发现ifconfig居然查看不到IP??
图:

查看network的启动状态,看到的是绿油油的active状态。
然后又查看配置文件/etc/sysconfig/network-scripts/ifcfg-eth0 ,检查IP。
配置明明是正确的啊,咋看不到IP呢?

查看/var/log/messages日志,发现有下面这样的报错信息,提示MAC地址有异常:

Jun 24 22:21:05 devops02 network: Shutting down interface eth0:  ERROR    : [/etc/sysconfig/network-scripts/ifdown-eth] Device  has MAC address 00:00:00:00:00:00
Jun 24 22:21:05 devops02 network: 52:54:00:72:E3:FB, instead of configured address 52:54:00:32:43:34. Ignoring.
Jun 24 22:21:05 devops02 /etc/sysconfig/network-scripts/ifdown-eth: Device  has MAC address 00:00:00:00:00:00
52:54:00:72:E3:FB, instead of configured address 52:54:00:32:43:34. Ignoring.
Jun 24 22:21:05 devops02 network: [FAILED]

问题排查

根据上面的报错信息,开始了排查的长征!
日志提示MAC地址异常,查看ifcfg-eht0配置的MAC地址是HWADDR=52:54:00:32:43:34

然鹅,ifconfig显示出来的MAC地址却是52:54:00:72:e3:fb
图:

原来,是两边的MAC地址不一样,引起的问题!

原因分析

为什么会导致一台主机上有两个MAC地址?
原因是在KVM的界面克隆虚拟机的时候,有一个设置mac地址的“Random MAC address”按钮:

克隆主机的时候,因为害怕克隆主机和原始主机的mac地址产生冲突,所以在克隆的时候点了“Random MAC address”按钮,就随机生成了一个新的MAC地址52:54:00:72:e3:fb

这个MAC地址就是后面在ifconfig里面看到的那个mac地址52:54:00:72:e3:fb

而在克隆界面的旁边还有一个XML配置界面,里面也有一个MAC地址的配置:

XML界面的MAC地址就是后面写入到配置文件ifcfg-eth0的MAC地址:52:54:00:32:43:34

这就导致ifconfig和ifcfg-eth0两边的MAC地址不一致了。

另外:

测试了一下,即使在前面点了“Random MAC address”按钮,生成新的mac地址,再把新的MAC地址修改到后面的XML文件,然后再点击克隆主机。新克隆的主机ifcfg-eth0文件里面的MAC地址还是以前的52:54:00:32:43:34,跟ifconfig的MAC地址也是不一样。还是要手动改配置文件。

在这之前也有在KVM上克隆了十几台服务器,但是以前都习惯于在刚刚克隆好主机之后,第一步就是删掉配置文件ifcfg-eth0文件里面的MAC地址和UUID地址,而恰好之前的原始主机配置文件ifcfg-eth0文件里面又配置了DEVICE(关于DEVICE见后文),所以删掉配置文件的MAC地址之后,网卡就顺利起来了,并没有注意到克隆主机MAC地址不一致的问题。

解决方法

这个问题有两种解决方法:
1、修改配置文件ifcfg-eth0的MAC地址,改成和ifconfig一样的。然后再重启network:

2、删掉ifcfg-eth0里面的“HWADDR=52:54:00:32:43:34”这一行,重新添加一行“DEVICE=eth0”,然后重启network:

注意:
删了MAC地址之后,一定要确认配置文件上有DEVICE配置,否则启动network的时候,messages日志里面会有这样的报错:

Jun 24 22:24:40 devops02 network: Shutting down interface eth0:  ERROR    : [ipv6_test_device_status] Missing parameter 'device' (arg 1)
Jun 24 22:24:40 devops02 ipv6_test_device_status: Missing parameter 'device' (arg 1)

上面两种解决方法都尝试过了,重启network,再查看IP地址,就显示正常了:

xshell再次远程连接已经OK:

结束语:

回顾上面的问题,小小总结:

1、ifconfig的MAC地址和ifcfg-eth0的MAC地址一定要相同;

2、如果在ifcfg-eth0里面删除了MAC地址,就要保证有DEVICE配置,因为 DEVICE 和 HWADDR至少得有一个;

3、“/var/log/messages”文件和Google是个好东西;

4、多踩坑,就会避免这种low low的尴尬。

解决问题参考:
https://bugzilla.redhat.com/show_bug.cgi?id=1331276 :

https://www.linuxquestions.org/questions/linux-newbie-8/etc-init-d-network-restart-failed-4175559158/ :

这篇关于KVM虚拟机MAC地址冲突,引发服务器对xshell说:Go away!的文章就介绍到这儿,希望我们推荐的文章对编程师们有所帮助!



http://www.chinasem.cn/article/671196

相关文章

Web服务器-Nginx-高并发问题

《Web服务器-Nginx-高并发问题》Nginx通过事件驱动、I/O多路复用和异步非阻塞技术高效处理高并发,结合动静分离和限流策略,提升性能与稳定性... 目录前言一、架构1. 原生多进程架构2. 事件驱动模型3. IO多路复用4. 异步非阻塞 I/O5. Nginx高并发配置实战二、动静分离1. 职责2

GO语言短变量声明的实现示例

《GO语言短变量声明的实现示例》在Go语言中,短变量声明是一种简洁的变量声明方式,使用:=运算符,可以自动推断变量类型,下面就来具体介绍一下如何使用,感兴趣的可以了解一下... 目录基本语法功能特点与var的区别适用场景注意事项基本语法variableName := value功能特点1、自动类型推

GO语言中函数命名返回值的使用

《GO语言中函数命名返回值的使用》在Go语言中,函数可以为其返回值指定名称,这被称为命名返回值或命名返回参数,这种特性可以使代码更清晰,特别是在返回多个值时,感兴趣的可以了解一下... 目录基本语法函数命名返回特点代码示例命名特点基本语法func functionName(parameters) (nam

Linux搭建ftp服务器的步骤

《Linux搭建ftp服务器的步骤》本文给大家分享Linux搭建ftp服务器的步骤,本文通过图文并茂的形式给大家介绍的非常详细,对大家的学习或工作具有一定的参考借鉴价值,需要的朋友参考下吧... 目录ftp搭建1:下载vsftpd工具2:下载客户端工具3:进入配置文件目录vsftpd.conf配置文件4:

Go之errors.New和fmt.Errorf 的区别小结

《Go之errors.New和fmt.Errorf的区别小结》本文主要介绍了Go之errors.New和fmt.Errorf的区别,文中通过示例代码介绍的非常详细,对大家的学习或者工作具有一定的参考... 目录error的基本用法1. 获取错误信息2. 在条件判断中使用基本区别1.函数签名2.使用场景详细对

Mac电脑如何通过 IntelliJ IDEA 远程连接 MySQL

《Mac电脑如何通过IntelliJIDEA远程连接MySQL》本文详解Mac通过IntelliJIDEA远程连接MySQL的步骤,本文通过图文并茂的形式给大家介绍的非常详细,感兴趣的朋友跟... 目录MAC电脑通过 IntelliJ IDEA 远程连接 mysql 的详细教程一、前缀条件确认二、打开 ID

Go语言连接MySQL数据库执行基本的增删改查

《Go语言连接MySQL数据库执行基本的增删改查》在后端开发中,MySQL是最常用的关系型数据库之一,本文主要为大家详细介绍了如何使用Go连接MySQL数据库并执行基本的增删改查吧... 目录Go语言连接mysql数据库准备工作安装 MySQL 驱动代码实现运行结果注意事项Go语言执行基本的增删改查准备工作

Go中select多路复用的实现示例

《Go中select多路复用的实现示例》Go的select用于多通道通信,实现多路复用,支持随机选择、超时控制及非阻塞操作,建议合理使用以避免协程泄漏和死循环,感兴趣的可以了解一下... 目录一、什么是select基本语法:二、select 使用示例示例1:监听多个通道输入三、select的特性四、使用se

Go语言使用Gin处理路由参数和查询参数

《Go语言使用Gin处理路由参数和查询参数》在WebAPI开发中,处理路由参数(PathParameter)和查询参数(QueryParameter)是非常常见的需求,下面我们就来看看Go语言... 目录一、路由参数 vs 查询参数二、Gin 获取路由参数和查询参数三、示例代码四、运行与测试1. 测试编程路

Linux查询服务器 IP 地址的命令详解

《Linux查询服务器IP地址的命令详解》在服务器管理和网络运维中,快速准确地获取服务器的IP地址是一项基本但至关重要的技能,下面我们来看看Linux中查询服务器IP的相关命令使用吧... 目录一、hostname 命令:简单高效的 IP 查询工具命令详解实际应用技巧注意事项二、ip 命令:新一代网络配置全