VMware 里跑一台 SUSE 10 虚拟机,虚拟机网络配置这件事能把人折腾到怀疑人生。这系统发布于十多年前,网络栈还停留在 ifup/ifdown 时代,没有 NetworkManager 那套图形化托盘,网卡配置文件也不是简单的 ifcfg-eth0,而是带着 MAC 地址后缀的 ifcfg-eth-id-xx:xx:xx:xx:xx:xx。更麻烦的是,宿主机这边新版本的 VMware 默认给你塞一块 vmxnet3 适配器,SUSE 10 那套 2.6 内核根本不认,开机进去 ifconfig 一看,只有一个 lo,什么都没有。我前后在不同宿主机上搭过七八次这个组合,每次都会卡在不一样的地方,有的是适配器类型,有的是 MAC 绑定,有的是防火墙默认策略,还有一次纯粹是因为虚拟网络编辑器里的 DHCP 服务被关了。这篇就把这条链路从上到下捋一遍,从宿主机那层虚拟交换机讲到 SUSE 10 里的配置文件、路由、DNS 和防火墙,把每一步为什么这么做讲清楚,把踩过的坑都摆出来,适合手上正好要维护老系统兼容环境的读者直接照着排查。
1. 先把VMware那层的虚拟交换机理清楚,再谈虚拟机里的配置
虚拟机网络配置有个很典型的新手误区:一上来就钻进系统里改 ifcfg 文件,改了半天发现根本没生效,回头一看是宿主机侧的虚拟网络压根没通。VMware 的网络是两层的,宿主机上有一组虚拟交换机(VMnet),虚拟机只是挂在这些交换机的一个端口上,交换机本身没有连到正确的上游,虚拟机里配置写得再漂亮也是白搭。所以排查顺序永远是先外后内,先确认虚拟机网卡挂在哪块 VMnet 上、这块 VMnet 对应什么模式、宿主机侧这块虚拟网卡有没有正常启用,然后再进去改 SUSE 的配置文件。
1.1 三种连接方式在宿主机上分别对应哪块虚拟网卡
VMware Workstation 默认会创建三块虚拟网络:VMnet0 是桥接,VMnet1 是仅主机模式,VMnet8 是 NAT 模式。这三块在 Windows 宿主机上用 ipconfig 是能直接看到的,名字通常叫「VMware Network Adapter VMnet1」和「VMware Network Adapter VMnet8」,桥接模式的 VMnet0 比较特殊,它不会在宿主机上生成一块可见的虚拟网卡,而是通过一个桥接协议把虚拟机的流量直接注入到某块物理网卡上。理解这个差别很重要,因为桥接模式出问题时你没法通过在宿主机上 ping 虚拟机来定位,而 NAT 和仅主机模式可以。
三种模式的本质区别在于「虚拟机看到的网络边界在哪里」。桥接模式下,虚拟机在逻辑上和宿主机是平级的,它从局域网的 DHCP 拿地址,或者你自己配一个和物理网段同段的静态地址,局域网里其他机器能直接访问它;NAT 模式下,虚拟机被关在 VMnet8 这个私有网段里,出网的流量要经过宿主机上的 NAT 服务做地址转换,外面看不到它,它能看到外面;仅主机模式下,虚拟机只能和宿主机以及同一块 VMnet1 上的其他虚拟机通信,出不了宿主机。
| 模式 | 对应虚拟网络 | 宿主机是否可见虚拟网卡 | 默认网段 | 网关地址 | 出网能力 |
|---|---|---|---|---|---|
| 桥接 | VMnet0 | 否(走物理网卡) | 与物理网段一致 | 物理网段网关 | 有 |
| NAT | VMnet8 | 是 | 192.168.x.0/24 | x.2 | 有(经地址转换) |
| 仅主机 | VMnet1 | 是 | 192.168.x.0/24 | x.1 | 无 |
选哪种模式取决于你的实际需求。如果这台 SUSE 10 只是要模拟一个独立服务器、需要被局域网内其他设备访问,那就桥接;如果只是自己在宿主机上做兼容性测试、需要它能装软件包,NAT 最省事;如果纯粹是做双机通信实验、不需要外网,仅主机模式最干净,因为它不会和外网产生任何交集。我这台模拟环境选的是 NAT,原因是宿主机换过几次网络环境(从有线切到无线),桥接模式在无线网卡上经常不稳定,而 NAT 模式跟物理网卡解耦,走到哪都能用。
1.2 虚拟网络编辑器里几个容易被忽略的开关
打开 VMware 的「编辑」菜单进「虚拟网络编辑器」,这个界面里的几个开关经常是问题根源。第一是「将主机虚拟适配器连接到此网络」这个勾选框,如果它没勾上,宿主机上的 VMnet1/VMnet8 虚拟网卡就不存在,虚拟机虽然能启动,但和宿主机的通信链路是断的。第二是「使用本地 DHCP 服务将 IP 地址分配给虚拟机」,这个勾选决定了虚拟机设置成 DHCP 时能不能拿到地址,有些人为了「干净」把它取消掉,然后忘了虚拟机里还是 DHCP 配置,开机等半天超时,最后拿着 169.254 开头的地址来排查,方向就偏了。
第三是 NAT 设置里的网关地址,点「NAT 设置」能看到当前 VMnet8 的网关,默认是网段的 .2,这个值和你在 SUSE 里填的网关必须严格一致。第四是「DHCP 设置」里的地址池起始和结束范围,如果你打算用静态地址,一定要选一个不在地址池范围内的地址,否则偶尔会和别的虚拟机撞上,产生那种「昨天还好好的今天突然连不上」的诡异现象。我在一台宿主机上就遇到过地址池被设成了 .128 到 .254,然后我给虚拟机静态配了 .200,开了第二台虚拟机之后两台互相抢地址,排查了大半天才发现是地址池重叠。
提示:改完虚拟网络编辑器的配置后,最好把虚拟机关机再开机,而不是重启系统。有些配置变更在虚拟机的「热」状态下不会被重新协商。
1.3 硬件兼容性版本:老系统跑在新版VMware上的隐形门槛
这一条跟网络没有直接关系,但它会让你的网络配置根本走不到那一步。新版 VMware Workstation 创建虚拟机时默认硬件版本很高,SUSE 10 这种老系统的内核和驱动模型跟不上,表现是开机卡住、找不到硬盘、或者网卡设备压根不出现在 PCI 总线上。我的做法是在创建虚拟机时手动把硬件兼容性降到比较低的档位(Workstation 6.5-7.x 这一档),然后网络适配器类型手动选 e1000,不要用默认的 vmxnet3。降版本之后功能上没什么损失,VMware Tools 也照样能装。
如果不幸已经把虚拟机建好了才发现硬件版本太高,不用重建,可以在虚拟机关机状态下修改 .vmx 配置文件,把 virtualHW.version 改成较低的数值,同时把 ethernet0.virtualDev 改成 "e1000"。改之前记得备份 .vmx,这个文件是所有虚拟机设置的唯一真相来源,改错一个字段可能直接导致虚拟机打不开。
2. SUSE 10 里网卡为什么「看不见」:驱动、命名和配置文件三处断点
进到系统里,ifconfig -a敲下去只有 lo,这是最常见的开场。这时候不要急着怀疑网卡坏了,SUSE 10 里网卡不出现通常就三个原因:内核没加载对应驱动、驱动加载了但设备被识别成了非 eth 的名字、或者设备识别了但配置文件缺失导致接口没被拉起。这三个原因对应三种不同的现象,用dmesg | grep -i eth和hwinfo --netcard两条命令基本就能把范围缩小到一处。
2.1 适配器类型选错,系统里连eth0都不会出现
如果dmesg里完全看不到任何网卡相关的初始化信息,大概率是驱动问题。SUSE 10 自带的内核版本大约在 2.6.16 这个量级,能支持的虚拟网卡驱动包括 pcnet32、e1000,vmxnet3 是后来才加的。虚拟机的网络适配器如果选了 vmxnet3,内核在启动时找不到匹配的驱动模块,这块设备就相当于不存在,hwinfo --netcard也扫不出来。处理方式是在 VMware 里把虚拟机关机,进「编辑虚拟机设置」,找到网络适配器,点开「高级」,把适配器类型从 vmxnet3 改成 e1000,保存后开机。
改完之后用dmesg | grep -i e1000应该能看到类似「e1000: eth0: e1000_probe: Intel(R) PRO/1000 Network Connection」这样的输出,说明驱动起来了、设备也绑定到了 eth0 这个逻辑名字上。如果驱动加载了但名字不是 eth0,比如变成了 eth1 或者 eth2,那就是命名的问题,往下看。
还有一种情况是驱动压根没编进内核、需要手动 modprobe。你可以先modprobe e1000试一下,如果成功加载并出现网卡,说明模块存在,问题只是没自动加载,需要在/etc/sysconfig/kernel里把模块名加到 MODULES_LOADED_ON_BOOT 里,或者更简单的方式是用 YaST 的「硬件」-「硬件信息」重新探测一遍,它会自动补上配置。
2.2 ifcfg-eth-id-后面那串MAC地址是什么来路
SUSE 10 的网络配置体系和同时期的 RedHat 系差别很大,它不满足于用 eth0 这种会漂移的名字绑定配置,而是把配置文件和网卡的 MAC 地址直接绑定,文件名形如ifcfg-eth-id-00:0c:29:1a:2b:3c。这套设计的初衷是防止多网卡机器上接口名乱序导致配置错位,但在虚拟机场景下它会带来两个大麻烦:一是克隆虚拟机之后 MAC 变了,配置文件对不上,网卡起不来;二是你手动创建ifcfg-eth0的时候,如果同时存在一个 ifcfg-eth-id-* 文件,两者可能打架,谁生效取决于具体版本的处理逻辑。
我的实践是:先ls /etc/sysconfig/network/看清楚现有的文件名,把里面 ifcfg-eth-id-* 的 MAC 部分和虚拟机设置里显示的 MAC 地址对一遍。对不上就说明配置绑的是旧网卡。处理方式有两种,一种是直接把文件名里的 MAC 改成当前的,另一种是在文件内容里补一行NAME='eth0'并另存为 ifcfg-eth0,然后删掉 ifcfg-eth-id-*。我倾向第二种,因为在虚拟环境里 eth0 到 eth0 的稳定映射靠的是 MAC 绑定,但克隆场景下 MAC 会变,用 eth0 这种不绑 MAC 的写法更抗折腾。删旧文件之前一定要备份,我吃过这个亏,删了之后发现新文件里少了个字段,网卡起来了但是路由不通。
2.3 hwinfo和dmesg:判断网卡到底有没有被识别
这两个工具的分工要分清楚。dmesg看的是内核启动日志,反映的是「驱动层面发生了什么」,包括模块加载、PCI 设备探测、链路状态协商。hwinfo --netcard看的是「系统当前识别到了哪些网络设备以及它们的详细属性」,包括 MAC、总线位置、驱动名、是否启用。排查时先用 dmesg 确认驱动加载了、设备探测到了,再用 hwinfo 确认 MAC 地址和你在 VMware 里看到的一致,两者都通过说明硬件层面没问题,剩下的就是配置文件的事了。
有个细节值得单独说:dmesg里的链路状态信息能直接反映虚拟交换机那侧的连接情况。如果看到「e1000: eth0 NIC Link is Up 1000 Mbps Full Duplex」,说明虚拟网卡到 VMnet 的连接是通的;如果一直是「Link is Down」,那就要回头检查虚拟机的网络适配器是不是勾了「已连接」和「启动时连接」。这两个勾选框在虚拟机设置里是分开的,只勾一个的话,运行中可能表现为链路时断时续,很难查。
3. 三种模式逐一落地:静态地址、网关和DNS怎么填
地址配置这件事,核心原则只有一句:虚拟机里的地址、掩码、网关、DNS,必须和它挂的那块 VMnet 的定义严格匹配。桥接模式匹配物理网段,NAT 模式匹配 VMnet8 的网段,仅主机模式匹配 VMnet1 的网段,三者不能混。我见过有人把虚拟机配成 NAT 模式却填了物理网段的地址,然后奇怪为什么网关 ping 不通——虚拟机发出去了,但 VMnet8 那块的网关地址根本不是这个,包就被丢了。
3.1 桥接模式:把虚拟机当一台真实的机器对待
桥接模式的配置思路最简单也最容易出岔子。最简单是因为虚拟机就是局域网里的一台普通机器,地址、掩码、网关、DNS 全部照抄宿主机所在网段的规则即可,宿主机用 DHCP 拿地址的话虚拟机也可以用 DHCP。容易出岔子是因为桥接需要指定绑到哪块物理网卡,而 VMware 的「自动」选项在多网卡环境(尤其是有虚拟网卡、无线网卡、蓝牙网卡的笔记本)下经常选错。
正确的做法是在「虚拟网络编辑器」里选中 VMnet0,把「桥接到」从「自动」改成手动指定具体的物理网卡名称。Windows 宿主机上这个列表显示的是网卡描述而不是连接名称,需要对着「网络和共享中心」里的适配器列表找一下对应关系。另外无线网卡做桥接有几个已知的限制,某些无线驱动不支持混杂模式,桥接会失败或者时通时断,这种情况下要么改用 NAT,要么插网线。
桥接模式下的 SUSE 配置样例,假设物理网段是 192.168.1.0/24、网关 192.168.1.1、DNS 用 192.168.1.1:
# /etc/sysconfig/network/ifcfg-eth0 BOOTPROTO='static' IPADDR='192.168.1.150' NETMASK='255.255.255.0' NETWORK='192.168.1.0' BROADCAST='192.168.1.255' STARTMODE='auto' USERCONTROL='no'这里有个坑:NETWORK和BROADCAST这两个字段在 SUSE 10 里不是必填项,但如果你写了就必须写对。我有一次手抖把 BROADCAST 写成了网关地址,结果ifconfig显示一切正常、同网段能通,但跨网段访问全部失败,查了半天才发现是广播地址错误导致路由判断异常。填之前用 ip 计算器验算一遍,或者干脆不写这两行让它自动推导。
3.2 NAT模式:跟着VMnet8的网段走,别自己另起炉灶
NAT 模式的网段是 VMware 在安装时随机生成的,不同机器上不一样,所以第一步一定是去宿主机的命令行里ipconfig看一眼 VMnet8 的地址,比如看到 192.168.163.1、掩码 255.255.255.0,那么虚拟机的网段就是 192.168.163.0/24,网关是 192.168.163.2(注意是 .2 不是 .1,.1 被宿主机上的 VMnet8 虚拟网卡占了),DNS 可以直接填宿主机的 VMnet8 地址,也可以填公共 DNS。
虚拟机里对应的配置:
# /etc/sysconfig/network/ifcfg-eth0 BOOTPROTO='static' IPADDR='192.168.163.128' NETMASK='255.255.255.0' NETWORK='192.168.163.0' BROADCAST='192.168.163.255' STARTMODE='auto' USERCONTROL='no'NAT 模式有一个非常隐蔽的坑:它依赖宿主机上的两个服务,一个是「VMware NAT Service」,一个是「VMware DHCP Service」,在 Windows 的服务列表里能看到。如果这两个服务被禁用或者没启动,虚拟机配得再对也出不了网,表现为能 ping 通网关 192.168.163.2,但 ping 任何外网地址都超时。这种情况很多人会误以为是 DNS 问题,其实地址转换根本没生效。排查方法很简单,在宿主机上打开服务管理器看一眼这两个服务的状态和启动类型,设成自动并启动即可。
3.3 仅主机模式:只做宿主机和虚拟机之间的内网通信
仅主机模式适合不依赖外网的纯测试场景,比如验证两个服务之间的 TCP 通信、跑一个不需要联网的数据库。它的配置和 NAT 几乎一样,唯一区别是网关填 VMnet1 的地址(默认是 x.1),而且实际上网关填不填都无所谓,因为压根没有出口。DNS 可以留空,或者随便填一个,反正解析不到。
用这个模式的时候要注意一点:SUSE 10 里如果 DNS 配置为空,某些程序(比如 YaST 在线更新、或者任何会做反查的守护进程)可能会在启动时卡住等超时,启动速度慢得离谱。我的习惯是即使不用外网,也在 /etc/resolv.conf 里写一个地址,避免这类莫名其妙的卡顿。
3.4 配置文件的完整样例与字段含义
把字段含义摊开说一遍,比反复试错效率高得多。
| 字段 | 含义 | 常见取值与注意点 |
|---|---|---|
| BOOTPROTO | 地址获取方式 | static / dhcp,用 dhcp 时下面的 IPADDR 等字段会被忽略 |
| IPADDR | IPv4 地址 | 必须与 NETMASK、网关同网段 |
| NETMASK | 子网掩码 | 点分十进制,不要写成 /24 的 CIDR 形式,SUSE 10 不认 |
| NETWORK | 网段地址 | 可选,写了就必须是网络号,不是某个主机地址 |
| BROADCAST | 广播地址 | 可选,写错会导致跨网段通信异常 |
| STARTMODE | 接口启动方式 | auto 开机自动;manual 需手动 ifup;off 禁用;hotplug 热插拔 |
| USERCONTROL | 是否允许普通用户控制 | 一般设 no,避免被误操作 |
配置文件写完之后,权限也要看一眼。SUSE 10 的 network 脚本以 root 身份读取这些文件,权限 644 就够,如果之前用编辑器以奇怪的方式保存导致权限变成了 600 且属主不是 root,读取会失败,但错误信息很含糊,只在 /var/log/messages 里留一行。我遇到过一次,改完配置怎么都不生效,最后ls -l一看属主是普通用户,chown 之后立马正常。
4. 改完配置不生效:ifup、yast2和启动脚本的协作关系
SUSE 10 的网络服务是传统的 SysV 脚本体系,/etc/init.d/network这个脚本负责读取/etc/sysconfig/network/下的所有配置并拉起接口。它和ifup、ifdown是同一套逻辑的不同入口,而 YaST 的图形化网络配置工具本质上也是往同一批文件里写内容。理解它们之间的关系,能避免「改了文件但服务不认」这类反复出现的问题。
4.1 rcnetwork restart 与 ifdown/ifup 的区别
rcnetwork restart会把所有配置了 STARTMODE=auto 的接口全部 down 掉再 up 一遍,影响面是整个系统;ifdown eth0 && ifup eth0只针对单个接口,更精准。日常调试我建议用后者,因为 restart 在某些情况下会连带重置路由表,如果你的机器上有手动加的路由,会被一起清掉。
还有一个更细的粒度:ifup eth0在接口已经 up 的状态下再次执行,行为是「重读配置并应用」,但不是所有字段都能热生效,比如 IPADDR 变更它会先 down 再 up,而 NETMASK 变更可能只在部分版本上正确应用。所以最保险的做法是ifdown eth0; ifconfig eth0 down; ifup eth0,多敲两条命令,省掉猜的时间。
执行完一定要看输出和日志。SUSE 10 的 ifup 脚本在出错时会往 stderr 打信息,比如「eth0: no configuration found for eth0」或者「waiting for mandatory interface eth0」。看到前者说明配置文件名和接口名对不上,回到第 2 节检查文件命名。看到后者通常是链路没起来,检查虚拟机网络适配器的连接状态。
4.2 yast2 lan 会覆盖什么,不会覆盖什么
用yast2 lan命令(或者 YaST 控制中心里的「网络设备」-「网卡」)配置网络,优点是它会帮你把字段填全、自动处理路由和 DNS 的联动,缺点是它有自己的逻辑,可能覆盖你手写的配置。具体来说,YaST 会重写 ifcfg 文件里的所有标准字段,也会更新/etc/sysconfig/network/routes和/etc/resolv.conf(在配置了 DNS 的情况下)。它不会动的是你在文件里加的自定义注释、以及非标准字段。
我个人的习惯是:先用 YaST 配一遍,让它把骨架搭好,然后手工改 ifcfg 文件微调地址,改完之后不再进 YaST,避免它把手工改动覆盖掉。如果非要再用 YaST,改完记得diff一下文件看看有没有被清掉自加的内容。这个流程听起来绕,但比在两种配置方式之间来回折腾要稳。
另外 YaST 有个行为要留意:它在保存配置时会顺带重启网络服务,而这个重启过程在某些慢速虚拟磁盘上是同步阻塞的,界面上看起来像卡死,其实在等 ifup 完成。不要在这个时候强杀进程,否则可能留下半写状态的文件,下次开机直接起不来。
4.3 STARTMODE的几个取值及其适用场景
STARTMODE这个字段经常被忽略,但它决定了接口在什么时机被拉起,选错了会出现「开机后要手动 ifup 才有网」的现象。
auto:开机时由 network 脚本自动拉起,最常用。适合绝大多数场景。manual:不自动拉起,需要手动ifup eth0。适合做实验、临时接口。off:接口被完全禁用,即使手动 ifup 也会被跳过。适合彻底停用某块网卡。hotplug:由热插拔事件触发。虚拟机网卡一般不需要,选这个反而可能导致开机时接口没起来。
从别的系统迁移配置过来的时候,容易把 STARTMODE 写成onboot之类 RedHat 风格的取值,SUSE 10 不认识这个值,行为是当成未知值处理,接口不启动且不报错,非常隐蔽。看到「配置都对但开机没网、手动 ifup 就有」的现象,第一个要查的就是这个字段。
5. 能ping通网关却打不开页面:路由、DNS、防火墙的分层排查
到这一步,配置已经写完了,接口也起来了。如果还有问题,通常是这三层里的某一层:路由不对、DNS 解析不了、或者防火墙把包拦了。这三层的现象有细微差别,抓住差别能快速定位,不用一层层盲试。
5.1 按链路分段定位的排查顺序
我的固定顺序是先看本地接口状态,再看同网段连通性,再看网关连通性,再看跨网段连通性,最后看域名解析。每一步都有一个明确的成功标志,任何一步失败就停在那里深挖,不要跳步。
第一步ifconfig eth0看有没有 IP、有没有 RUNNING 标志、RX/TX 包计数是否在增长。第二步ping 同网段另一台机器(或者宿主机的 VMnet 地址),通说明二层链路和交换机没问题。第三步ping 网关,通说明本地路由表和网关的 ARP 都正常。第四步ping 一个外网 IP(比如 8.8.8.8 这类公共地址),通说明出口和地址转换都没问题。第五步ping 一个域名,通说明 DNS 正常。
这套顺序的价值在于,任何一步失败,问题的范围就被锁定在一个很窄的区间里。比如第四步失败但第三步成功,问题一定在 NAT 服务或者宿主机的转发配置上,跟虚拟机内部一点关系都没有,不用再去翻 ifcfg 文件。
5.2 route -n 与 routes 文件不一致的情况
SUSE 10 的默认路由有两个来源:一是 ifcfg 文件里的默认网关字段(某些版本支持),二是/etc/sysconfig/network/routes文件。这个文件的内容格式很朴素,一行一条路由,字段用空格分隔:
# /etc/sysconfig/network/routes default 192.168.163.2 - -三个字段分别是目的网络、网关、掩码(默认路由用-占位)、以及可选的接口名。写完这个文件必须重启网络服务才生效,ifup单个接口不一定读它。我踩过的坑是:改完 ifcfg 里的地址,忘了同步改 routes 里的网关,结果本机地址变了、路由还指着旧网段的网关,表现为能 ping 同网段、ping 网关直接报「Network is unreachable」。用route -n看一眼默认路由的 Gateway 列,和预期对不上就改 routes 文件。
还有一种更隐蔽的情况:route -n显示的默认路由是对的,但cat /etc/sysconfig/network/routes里根本没有对应的行。这说明路由是某个启动脚本临时加的,重启就没了。这种问题在克隆出来的虚拟机上特别常见,因为原机器的某些启动脚本被一起复制过来了,行为和新环境不匹配。
5.3 SuSEfirewall2 的默认策略会不会拦掉你的流量
SUSE 10 用的是 SuSEfirewall2,不是后来的 firewalld。它的配置文件在/etc/sysconfig/SuSEfirewall2,控制逻辑是「默认拒绝、显式放行」。安装系统时如果勾选了防火墙,默认策略通常是把外部接口的所有入站流量都拒掉,只放行少数几个服务。对于一台只做测试的虚拟机,这个策略会带来很多莫名其妙的「能出去不能进来」现象。
排查的第一步是确认防火墙状态:rcSuSEfirewall2 status。如果它开着,先用rcSuSEfirewall2 stop停掉,再测一遍连通性,能通就说明是防火墙的问题,然后再决定是永久关闭还是精细放行。永久关闭的做法是chkconfig SuSEfirewall2 off加上 stop,注意这两个操作要分开做,chkconfig off只影响开机自启,不影响当前运行状态。
如果要保留防火墙只放行特定端口,改配置文件里的这几个变量:FW_DEV_EXT指定外部接口名(填 eth0),FW_SERVICES_EXT_TCP填要放行的端口列表(比如 "22 80 3306"),改完rcSuSEfirewall2 restart。这里有个坑:FW_DEV_EXT如果填的接口名和实际不符(比如写成了 eth1 但实际是 eth0),防火墙会认为没有外部接口,策略行为会变得很奇怪,既不拦也不放,全靠默认。改之前一定用ifconfig确认接口名。
5.4 DNS解析失败的三个可能断点
域名解析不了,可能是三处出了问题:/etc/resolv.conf里没有 nameserver、有 nameserver 但地址不可达、或者地址可达但查询被拦。第一处的检查最直接,cat /etc/resolv.conf看有没有nameserver x.x.x.x这样的行。SUSE 10 里这个文件可能被 YaST 管理,手工改了之后如果又进 YaST 保存网络配置,会被覆盖回去,所以要确认改完之后没有再触发 YaST 的网络模块。
第二处用ping直接测 nameserver 的地址,通说明网络可达。第三处用nslookup或者host命令测一次查询,SUSE 10 默认装了 bind-utils 的话这两个命令都有。如果 ping 通但查询超时,可能是上游 DNS 不接受来自这个网段的查询,换一个公共 DNS 试试就能验证。
还有一个 SUSE 10 特有的细节:/etc/nsswitch.conf里hosts:这一行的顺序决定了先查本地文件还是先查 DNS。默认是files dns,先查 /etc/hosts。如果你在 hosts 里写过一条错误的记录,会出现「域名解析到奇怪地址」的现象,而且不管怎么改 resolv.conf 都没用。这个文件也要看一眼。
6. 克隆、快照、迁移后网络再次失联的复发问题
配置一次成功不难,难的是这套配置在克隆、快照回滚、换宿主机之后还能不能活。SUSE 10 这套 MAC 绑定的配置体系在这类场景下特别脆弱,我几乎每次克隆都会遇到网络失联,所以养成了克隆完先检查网络的习惯。
6.1 MAC地址变了但配置文件还绑着旧地址
克隆虚拟机时 VMware 会问你是「我已复制该虚拟机」还是「我已移动该虚拟机」。选复制会生成新的 MAC 地址,选移动会保留原来的。如果选了复制,而 SUSE 里的配置文件是ifcfg-eth-id-00:0c:29:旧MAC,那么新 MAC 找不到匹配的配置文件,接口不会被拉起,ifconfig里只有 lo。
处理方式前面提过,两种:改文件名里的 MAC 段,或者改成不绑 MAC 的ifcfg-eth0。我现在的标准做法是克隆完成后第一件事就是进系统执行ls /etc/sysconfig/network/,把 ifcfg-eth-id-* 的文件名和hwinfo --netcard里的 MAC 对一遍,不一致就改名,然后ifdown eth0; ifup eth0。整个过程两分钟,比事后排查半小时划算。
如果克隆出来的机器不止一台,还要注意 MAC 冲突。理论上 VMware 会自动分配不重复的 MAC,但如果虚拟机是从别的宿主机拷贝过来的 .vmx 文件,里面的 MAC 是写死的,可能出现两台虚拟机 MAC 相同的情况。现象是两台机器网络时通时断、ARP 表频繁抖动。检查方法是在两台机器上分别ifconfig看 MAC,相同就说明冲突了,在 VMware 里对其中一台执行「生成新 MAC」即可。
6.2 选择「我已复制该虚拟机」之后的连锁反应
选复制不只是换 MAC,它还会触发一系列系统层面的变化。SUSE 10 里跟网络相关的连带影响主要有两个:一是网卡的持久化命名规则会重新计算,如果机器上有多个网卡,eth0 和 eth1 的顺序可能互换;二是/etc/sysconfig/network/config里的某些全局设置可能被重置。
顺序互换这个问题在没有 udev 持久命名规则的 SUSE 10 上反而不太常见,但一旦发生就很难查,因为现象是「配置明明对,但网卡名变了」。判断方法是dmesg | grep eth看内核给网卡分配的名字,和配置文件里的名字对比。不一致就把配置文件改成对应的名字,或者反过来调整虚拟机的 PCI 插槽顺序。
另外,克隆之后/etc/hosts里通常会留着原机器的主机名映射,如果你改了主机名但没改 hosts,某些服务启动时会因为解析不到自己的主机名而卡住。这个跟网络配置不是一回事,但表现经常混在一起,排查时容易混淆。
6.3 一份可以贴在虚拟机里的自检清单
我把这套流程整理成了一个固定顺序的检查清单,克隆完或者网络出问题时按顺序过一遍,基本不会漏。
- 虚拟机设置里确认网络适配器是 e1000、已勾选「已连接」和「启动时连接」。
- 虚拟网络编辑器里确认目标 VMnet 的模式正确、DHCP 和 NAT 服务状态符合预期。
- 宿主机上
ipconfig确认 VMnet8/VMnet1 虚拟网卡存在且有地址。 - 虚拟机里
dmesg | grep -i eth确认驱动加载和链路状态。 hwinfo --netcard确认 MAC 与 VMware 中显示的一致。ls /etc/sysconfig/network/确认配置文件名和 MAC 对得上。cat ifcfg-*检查 BOOTPROTO、IPADDR、NETMASK、STARTMODE 四个关键字段。cat /etc/sysconfig/network/routes检查默认路由。cat /etc/resolv.conf检查 DNS。rcSuSEfirewall2 status确认防火墙策略。route -n和ifconfig交叉验证当前生效状态与配置文件是否一致。- 按「同网段 → 网关 → 外网 IP → 域名」的顺序做四级连通性测试。
这份清单看着长,但熟练之后走一遍也就几分钟,而且每一步都有明确的判断依据,不会出现「改了半天不知道改对没有」的情况。真正耗时的从来不是操作,而是没有章法地东改一处西改一处。
最后分享一个小技巧:把这套配置好的 ifcfg 文件、routes 文件和 resolv.conf 一起打个包放在/root/下,文件名叫 network-backup.tar.gz。以后不管是克隆还是误改,解压覆盖再rcnetwork restart,一分钟恢复。老系统维护最怕的就是「当时配好了但说不清怎么配的」,有个可回滚的备份,比什么排查技巧都实在。