
在Mac上用Parallels Desktop或VMware搭建Linux虚拟机,是很多开发者的日常操作。虚拟机性能好,隔离性强,还能随时快照回滚。但有个问题一直很烦人:虚拟机的IP地址经常变化。
上周在家里连的是家用WiFi,虚拟机IP是192.168.1.100。周一到公司连了公司网络,虚拟机IP变成了10.0.0.50。每次网络环境切换,都要进虚拟机控制台查一次IP,然后修改Termius、VS Code Remote SSH等工具里保存的连接配置。虚拟机控制台本身也不好用,字体小、复制粘贴麻烦、快捷键冲突。
这个问题有更好的解决方案吗?有,就是用avahi服务实现mDNS(Multicast DNS)协议,让虚拟机可以通过固定的.local域名访问,IP变了域名不变。
avahi是一个实现mDNS/DNS-SD协议的开源服务,在Linux系统中广泛使用。它的核心作用是在局域网内广播主机信息,让其他设备可以通过主机名.local的形式来发现和访问这台机器。
macOS和Windows都原生支持mDNS协议,Mac上叫Bonjour,Windows上叫Link-Local Multicast Name Resolution。这意味着在Mac上配置好虚拟机的avahi后,Mac主机就能直接用虚拟机名.local来访问,不需要知道具体IP,也不需要配置hosts文件。
对于虚拟机使用场景,这个特性非常实用。网络环境切换导致IP变化时,域名解析会自动更新到新IP,SSH连接、文件传输等操作完全不受影响。
这次使用的是Parallels Desktop虚拟机,系统是openEuler最新版本25.09。虚拟机已经安装完成,网络模式是桥接模式(Bridged Network),可以和Mac主机直接通信。
查看当前系统版本和IP地址:
ip addr show
cat /etc/os-release
从输出可以看到系统是openEuler 25.09,主机名是open-euler-one,网卡enpBs5的IP地址是10.211.55.3。这个IP是DHCP动态分配的,网络环境变化后会改变。
openEuler的官方仓库中包含avahi软件包,直接用dnf安装:
sudo dnf install -y avahi
从安装输出可以看到,dnf自动处理了依赖关系,安装了3个软件包:avahi主程序(0.8-24版本)、avahi-tools工具集、libdaemon依赖库。总共下载385KB,安装后占用1.5MB空间。
安装过程中avahi会自动创建systemd服务配置,包括avahi-daemon.socket套接字和avahi-daemon.service服务单元。GPG密钥验证也自动完成,确保软件包来源可信。
avahi的配置文件位于/etc/avahi/avahi-daemon.conf,需要修改几个关键参数才能让.local域名解析生效。
sudo vi /etc/avahi/avahi-daemon.conf
配置文件分为多个section,我们需要关注的是publish这一节。这个section控制avahi向局域网发布哪些信息。默认配置中有些关键项是注释掉的或设置为no,需要手动改成yes。

从截图可以看到需要确保三个配置项为yes:
publish-addresses=yes:发布IP地址信息,这样其他设备才能知道这台机器的IP
publish-hinfo=yes:发布主机硬件和操作系统信息,提供更完整的设备识别
publish-workstation=yes:发布工作站服务信息,这是最关键的一项,让主机名.local域名生效
这三个配置项配合使用,才能让avahi正常工作。修改保存后就可以启动服务了。
重启avahi-daemon服务让配置生效:
sudo systemctl restart avahi-daemon
sudo systemctl status avahi-daemon
从服务状态可以看到avahi-daemon已经active (running),主进程PID是9825,内存占用只有568KB,非常轻量。进程列表显示有两个进程:主进程和chroot helper辅助进程。
日志部分有几条关键信息。avahi在lo和enpBs5两个网卡上加入了mDNS多播组,注册了多个地址记录包括IPv4地址10.211.55.3和IPv6地址。最重要的是最后一行:Server startup complete. Host name is open-euler-one.local,说明.local域名已经生效。
回到Mac终端,用ping命令测试.local域名是否能解析:
ping open-euler-one.local
从测试结果可以看到,open-euler-one.local成功解析到10.211.55.3,这正是虚拟机的IP地址。ping延迟在1ms左右,说明网络通信正常。
这个域名解析是通过mDNS协议在局域网内实现的,不需要DNS服务器,不需要修改hosts文件,完全自动。以后虚拟机IP变化时,Mac会自动通过mDNS协议获取新的IP地址,域名始终能解析到正确的地址。
有了.local域名,就可以在Termius中使用固定域名代替IP地址了。打开Termius,新建SSH连接,主机地址填入open-euler-one.local:

从截图可以看到,Termius成功连接到虚拟机,标签页标题显示的就是open-euler-one.local。在虚拟机中执行cat /etc/os-release命令,正常显示openEuler 25.09的系统信息。
这个连接配置以后不用再改了。不管是在家里还是在公司,不管虚拟机IP怎么变,Termius都能通过open-euler-one.local这个域名正确连接到虚拟机。复制粘贴、分屏、脚本执行等操作都比虚拟机控制台方便太多。
通过avahi实现.local域名访问,看似是个小优化,但对提升openEuler的易用性有实际意义。
对于虚拟机使用场景,这个配置降低了使用门槛。不需要每次查IP,不需要改连接配置,SSH工具、文件传输工具、开发工具都能用固定域名连接。移动办公时在不同网络环境切换,不会因为IP变化而中断工作流程。
对于团队协作场景,域名比IP更容易记忆和分享。告诉同事"连接server1.local"比"连接192.168.1.100"更直观,也不用担心IP过期失效的问题。
对于开发测试环境,多台虚拟机可以用描述性的主机名来标识,比如dev-web.local、test-db.local、prod-api.local,比IP地址更有语义,管理起来更清晰。
这就是易获得性的价值:让系统更容易访问,让工具更容易使用,让工作流程更顺畅。技术实现并不复杂,但解决的是实实在在的日常痛点。
通过在openEuler虚拟机上安装和配置avahi服务,实现了用.local域名代替IP地址访问虚拟机的目标。整个配置过程只需要安装软件包、修改三个配置项、重启服务,用时不到5分钟。配置完成后,Mac主机可以直接用open-euler-one.local域名连接虚拟机,不再受IP地址变化的影响。Termius等SSH工具只需要配置一次域名,就能在任何网络环境下正常使用。这个方案不仅适用于个人开发环境,也适用于团队测试环境和多虚拟机管理场景,通过降低访问门槛提升了系统的易用性和易获得性。
原创声明:本文系作者授权腾讯云开发者社区发表,未经许可,不得转载。
如有侵权,请联系 cloudcommunity@tencent.com 删除。
原创声明:本文系作者授权腾讯云开发者社区发表,未经许可,不得转载。
如有侵权,请联系 cloudcommunity@tencent.com 删除。