ARTICLE DETAIL

资讯详情

深耕郑州网站建设与运营推广的一线实战洞察。

openKylin 虚拟机增强:VMware Tools 安装与验收

openKylin 虚拟机增强:VMware Tools 安装与验收 1. 先把问题问对openKylin 里为什么非要装 VMware ToolsopenKylin 是国产 Linux 桌面发行版里比较有代表性的一套系统底层包管理走的是 Debian 系那套apt/dpkg桌面环境是自家的 UKUI。很多人第一次把它装进 VMware 虚拟机开机之后的第一反应通常是“能用但总觉得哪里不对”窗口分辨率死板、画面拖动有拖影、鼠标从宿主机移到虚拟机里要按一下 CtrlAlt 才能切出来、剪贴板复制粘贴失效、宿主机和虚拟机之间传文件只能靠 U 盘或者共享网络。这些问题没有一个是“系统坏了”但叠加在一起日常使用的效率会直接砍半。这些现象的共同根因是虚拟机里的 guest OS 和宿主机的 hypervisor宿主上的 VMware Workstation/Player之间少了一层通信代理。这层代理在 VMware 的语境里叫 VMware Tools它包含几个部分一套内核态驱动负责图形、内存、时钟同步、共享文件夹的 hgfs、网卡半虚拟化 vmxnet 等再加一个用户态守护进程vmtoolsd处理剪贴板、拖拽、分辨率自适应、时间同步、关机信号等。没有它虚拟机就是一台“能跑但和宿主没什么交流”的黑盒装上它虚拟机才真正像宿主机上的一个窗口应用那样顺手。这篇内容适合三类人一是刚把 openKylin 装进 VMware、被分辨率和拖拽问题卡住的普通用户二是手上有多套 Linux 发行版虚拟机、想理清 open-vm-tools 和官方 VMware Tools 区别的运维同学三是准备把国产操作系统纳入日常开发/测试环境需要稳定可复现配置的开发者。我会把两条安装路线都拆开讲清楚包括依赖怎么补、脚本卡在哪、装完怎么验收、出问题怎么查保证你照着做一遍能落地。提示openKylin 的版本迭代比较快本文涉及的命令在 Debian 系包管理逻辑下通用但包名和默认内核版本可能随版本变化。执行前建议先确认自己的系统版本和内核号别直接照抄包名。2. 动手前先摸清环境三件事必须在装之前确认2.1 确认系统版本、内核号与桌面会话类型装任何驱动类组件之前先把“自己站在哪里”搞清楚。这一步听起来啰嗦但 VMware Tools 的编译安装强依赖内核头文件你连内核号都不确认后面一定会卡在“头文件找不到”上。打开终端依次敲# 查看发行版信息和桌面环境 cat /etc/os-release echo $XDG_CURRENT_DESKTOP # 查看内核版本后面装头文件要用这个号 uname -r uname -m # 查看会话是 X11 还是 Wayland echo $XDG_SESSION_TYPE/etc/os-release会告诉你当前是 openKylin 的哪个版本、基于哪个上游uname -r给出的是类似6.1.0-xxx-generic这样的完整内核号这个字符串后面要用两次一次是装头文件一次是排查编译失败。XDG_SESSION_TYPE的值很关键如果是wayland那么剪贴板互通、窗口拖拽这类功能在某些 VMware 版本上会表现不稳定必要时可以在登录界面切换到 X11 会话如果是x11那就没什么额外担心的。这一步我还建议顺手记录一下 VMware 的版本号菜单里“帮助 - 关于”能看到。原因很实际VMware Workstation 从 15 之后官方对 Linux 客户机的策略变了光盘里那个linux.iso在很多新版本里默认不带取而代之的是一句“请使用 open-vm-tools”。如果你手头的 VMware 是 16/17菜单里点了“安装 VMware Tools”却发现光驱是空的不是操作错了是官方策略如此得走仓库安装那条路。2.2 补齐编译工具链与内核头文件手动编译 VMware Tools 的本质是在本地把几个内核模块vmhgfs、vmxnet、vsock 等源码编译成.ko文件再加载。编译需要gcc、make和内核对得上的头文件这三样缺一不可。openKylin 是 Debian 系直接用 apt# 更新索引这一步别省索引过期会报无法定位软件包 sudo apt update # 基础编译工具链 sudo apt install -y build-essential make gcc perl # 内核头文件注意 $(uname -r) 要和当前运行内核完全一致 sudo apt install -y linux-headers-$(uname -r) # 可选DKMS装了它内核升级后模块能自动重建 sudo apt install -y dkms装完头文件后做个验证路径存在才算真的装上了ls -d /lib/modules/$(uname -r)/build如果这条命令报“没有那个文件或目录”说明头文件没装成功。常见原因是官方源里没有和你当前内核号严格对应的头文件包——这在国产发行版里不算罕见尤其是系统做过内核小版本更新之后。这时候有两个处理方向一是执行apt search linux-headers看看源里到底有哪些版本挑一个版本号前缀一致的装上二是把内核一起升级到源里最新的版本sudo apt install linux-image-generic linux-headers-generic之类具体包名以apt search结果为准重启后再装对应头文件。我个人的偏好是第二种因为把内核和头文件版本对齐之后后面编译失败的变量会少很多。2.3 装之前打个快照两分钟换一份安心这一步是纯经验话。VMware Tools 的安装脚本会往/usr/bin、/etc/init.d、/usr/lib里写东西还会编译内核模块。绝大多数情况没问题但只要你手动改过源、或者内核和头文件版本对不齐就有一定概率把系统的启动流程弄乱内核模块加载失败、显示服务起不来。虚拟机打快照的成本几乎是零收益是把“系统起不来要重装”这件事变成“回滚 30 秒”。养成习惯任何涉及内核模块、显卡驱动、系统服务注册的操作之前先建快照。3. 路线一走仓库装 open-vm-tools我更推荐这条3.1 为什么优先选开源版本而不是官方脚本open-vm-tools 是 VMware 把 Tools 里大部分组件开源之后由各发行版维护者打包进官方仓库的版本。它和官方VMwareTools-*.tar.gz的关系可以理解成“官方内核 发行版适配层”。走仓库安装有几个明显优势包管理器帮你处理依赖、版本跟着系统更新一起走、出问题可以直接apt remove干净卸载、内核升级时不用手动重装。官方安装脚本的优势只有一个——它包含一些闭源组件比如某些旧版的图形加速模块但对现代 Linux 桌面来说这些组件的实际价值已经很低了。判断依据很简单你的系统仓库里能查到open-vm-tools就走仓库这条路。只有当你明确需要共享文件夹在某些老内核上的特殊行为、或者官方脚本里有仓库版没有的功能时才考虑手动编译。对 openKylin 这种桌面发行版99% 的场景仓库版够用。3.2 安装命令与两个包的分工# 核心包内核模块 用户态守护进程 sudo apt install -y open-vm-tools # 桌面增强包剪贴板共享、分辨率自适应、拖拽 sudo apt install -y open-vm-tools-desktop # 检查服务是否已启动 systemctl status vmtoolsd两个包的分工必须说清楚很多人只装第一个然后抱怨“为什么拖拽不能用”。open-vm-tools负责的是底层能力时间同步、内存气球回收、共享文件夹的 hgfs 模块、关机信号响应open-vm-tools-desktop才负责桌面体验部分——屏幕分辨率随窗口大小自动调整、宿主机和虚拟机之间复制粘贴、文件拖拽。桌面用户两个都要装只装核心包等于买了一辆车没装方向盘。装完之后执行systemctl status vmtoolsd看到active (running)就说明用户态服务起来了。再看一眼内核模块加载情况lsmod | grep -E vmw|vmx|vsock正常应该能看到vmw_vmci、vmxnet3、vsock之类的条目。如果这条命令输出为空说明模块没加载可以手动sudo modprobe vmxnet3试试报错信息会告诉你缺什么。3.3 共享文件夹仓库版的正确挂载姿势共享文件夹是很多人装 Tools 的主要目的。在 VMware 端设置好共享目录虚拟机设置 - 选项 - 共享文件夹选“总是启用”然后在 openKylin 里做挂载。仓库版用的是 FUSE 方式的vmhgfs-fuse命令如下# 先看看宿主机共享了哪些目录 vmware-hgfsclient # 创建挂载点 sudo mkdir -p /mnt/hgfs # 手动挂载-o allow_other 让普通用户也能读写 sudo vmhgfs-fuse .host:/ /mnt/hgfs -o allow_othervmware-hgfsclient这条命令能列出宿主机共享的目录名如果它返回为空说明共享配置没生效或者 hgfs 模块没加载先别急着挂载回去查配置。另外要特别注意allow_other这个参数不加它挂载点里的文件只有 root 能访问普通用户点进去是空的这个坑我见过太多人踩。想让它开机自动挂载写进/etc/fstab# 追加到 /etc/fstab 末尾 .host:/ /mnt/hgfs fuse.vmhgfs-fuse allow_other,defaults 0 0写 fstab 有个风险提示如果这行配置有问题下次开机可能进入紧急模式。所以写完先执行sudo mount -a验证一遍不报错再重启别写完就直接重启赌运气。3.4 分辨率、剪贴板和拖拽的开关在哪桌面增强功能装好后分辨率自适应一般会自动生效——拖动虚拟机窗口的边缘桌面分辨率应该跟着变。如果没生效检查 VMware 的“查看 - 自动调整大小”是否勾选同时确认装的确实是open-vm-tools-desktop。剪贴板互通需要在 VMware 设置里勾选“客户机隔离 - 启用复制粘贴”这一项默认是开的但如果你的系统里装过其他虚拟机增强工具可能会出现冲突。拖拽功能要提前打个预防针Wayland 会话下拖拽文件经常不生效这是协议层面的限制不是配置问题。解决办法就是在登录界面把会话切成 X11或者干脆用共享文件夹代替拖拽——共享文件夹在稳定性和速度上都比拖拽靠谱尤其传大文件的时候。4. 路线二手动挂载官方光盘编译安装4.1 光盘挂载与文件定位当仓库版本满足不了需求或者你手上这台 VMware 较老、菜单里还有“安装 VMware Tools”的可用选项时走手动路线。点击虚拟机菜单“虚拟机 - 安装 VMware Tools”然后在系统里挂载光驱sudo mkdir -p /mnt/cdrom sudo mount /dev/cdrom /mnt/cdrom ls -l /mnt/cdrom正常情况下你能看到VMwareTools-版本号.tar.gz和几个说明文件。如果目录是空的基本可以断定是两个原因之一一是 VMware 版本较新安装包里只有windows.isoLinux 侧被官方引导去用 open-vm-tools 了二是光驱挂载点不对可以用lsblk看看是不是/dev/sr0。lsblk这个命令很实用能直接列出块设备树看到sr0对应的挂载状态就一目了然。4.2 解压与安装脚本的运行# 解压到临时目录不要解压到光盘里只读 tar -zxvf /mnt/cdrom/VMwareTools-*.tar.gz -C /tmp # 进入解压后的目录 cd /tmp/vmware-tools-distrib # 运行安装脚本 sudo ./vmware-install.pl脚本是 Perl 写的交互式脚本一路回车用默认值就行但有几个问题必须看仔细。第一个是“In which directory do you want to install the binary files?”之类的问题默认路径是/usr/bin不用改。第二个关键问题是模块编译相关的会问你是否要运行vmware-config-tools.pl配置脚本选 yes。第三个是分辨率设置脚本会列一串分辨率候选值这时候输入你实际想要的分辨率数字比如1920别直接回车用默认值——默认值经常是800x600这种上古分辨率回头还得手动改。4.3 编译阶段最容易卡住的三个点脚本跑到编译阶段是整条路线里最容易出问题的地方。提前把这三个点记住能省下大量搜索时间。第一个是头文件版本不匹配。报错通常是Unable to find the kernel headers for the running kernel。根因就是uname -r和/lib/modules/$(uname -r)/build指向的版本对不上或者那个目录干脆不存在。处理办法回到 2.2 节先把头文件补齐。这里有个细节有些系统里build是个指向/usr/src/linux-headers-xxx的软链接链接断了也会报同样的错用ls -l /lib/modules/$(uname -r)/看一眼就知道。第二个是GCC 版本过新导致的编译警告报错。较新的 GCC 对代码里的隐式类型转换、未使用变量检查更严格老版本 VMware Tools 的源码在新编译器下可能直接报 error 而不是 warning。这种情况通常有两种处理一是装一个旧版 GCC 并临时切换sudo apt install gcc-11然后用CCgcc-11环境变量或 update-alternatives 切换二是换用 open-vm-tools 路线新维护的代码对编译器兼容性更好。我的建议是后者为了一套闭源组件去降级编译器性价比不高。第三个是Secure Boot 拦截模块加载。如果你在虚拟机里开了安全启动编译出来的未签名内核模块会被拒绝加载日志里能看到module verification failed或者Key was rejected by service。虚拟机环境下安全启动的意义本来就不大直接在虚拟机设置里关掉最省事比给模块签名简单得多。4.4 安装完成后的服务注册官方脚本会把vmtoolsd注册成服务较老的写法是/etc/init.d/vmware-tools遵循 systemd 的发行版上脚本会自动生成 unit。装完执行sudo systemctl status vmware-tools # 或者直接看进程 ps -ef | grep vmtoolsd如果 systemd 里查不到这个服务但进程在跑说明它用的是老式 init 脚本能用就行不用强行改成 unit 文件。5. 装完必须做的五项验收测试5.1 逐项检查别只看一个指标装完 Tools 不等于用上了五项功能挨个测一遍心里才有底。我一般按下面这个顺序来验收项测试方法期望结果分辨率自适应拖动虚拟机窗口边缘改变大小桌面分辨率跟随变化无黑边剪贴板互通宿主机复制一段文字虚拟机里 CtrlV粘贴内容一致文件拖拽从宿主机桌面拖一个文件到虚拟机窗口文件出现在目标目录X11 会话下共享文件夹ls /mnt/hgfs能看到共享目录内容时间同步宿主机改系统时间后虚拟机内date短时间内自动同步共享文件夹这项如果挂了但目录为空先执行vmware-hgfsclient确认宿主机侧的共享是否真的配置了再确认挂载命令带了allow_other。时间同步依赖vmtoolsd守护进程如果这个进程没跑时间就会慢慢漂移——虚拟机挂起再恢复之后时间偏差是常见现象靠的就是它来校准。5.2 版本校验与常用维护命令几条随手会用到的小命令建议存一下# 查看 Tools 版本 vmware-toolbox-cmd -v # 查看当前生效的功能开关 vmware-toolbox-cmd stat sessionid # 手动触发时间同步 sudo vmware-toolbox-cmd timesync enable # 查看共享文件夹列表 vmware-hgfsclientvmware-toolbox-cmd -v返回的版本号能帮你判断到底装的是哪个版本——有版本号说明安装成功命令不存在说明用户态组件没装上这时候回去检查open-vm-tools包。这条命令是判断安装是否成功最快的方式比翻日志靠谱。6. 常见报错与排查速查表6.1 “继续运行脚本未能在虚拟机中成功运行”类报错这个提示在手动安装过程中出现频率很高字面意思是脚本没能正常走完。它背后的真实原因通常集中在三处编译环境缺失gcc/make/头文件、内核头文件版本不匹配、权限不足。排查顺序建议这样走先确认gcc --version和make --version都能输出再确认/lib/modules/$(uname -r)/build存在最后确认是用sudo执行的脚本。三样都正常还报错就看脚本执行时终端里刷过去的具体编译错误那里面一定有明确的行号和文件名。另外有一种情况值得单独说脚本中途被 CtrlC 中断过再重新运行时残留文件会导致冲突。这时候把/tmp/vmware-tools-distrib删掉重新解压一遍比在残留状态上继续折腾快得多。6.2 内核升级之后 Tools 失效这是最容易被忽略的长期问题。Linux 内核升级后原来的模块目录变成/lib/modules/旧版本/新内核启动时找不到对应模块共享文件夹、网卡半虚拟化这些功能会静默失效表现是“昨天还好好的今天就不行了”。处理办法有两种一是每次内核升级后手动重装一次头文件和 Tools二是装 DKMS让它在内核更新时自动重建模块。DKMS 对 open-vm-tools 的支持通常由打包方处理好了所以走仓库安装这条路本质上是天然免疫这个问题的——这也是我推荐仓库版的另一个原因。6.3 共享文件夹挂载失败的两类原因第一类是 hgfs 模块没加载。执行lsmod | grep vmw看看有没有vmw_vmci和vmhgfs没有就sudo modprobe vmhgfs手动加载报错就说明模块没编译出来。第二类是挂载点权限问题。前面提过的allow_other参数是最常见的坑还有一个隐性问题如果/mnt/hgfs目录之前被其它挂载占用过比如挂过 U 盘需要先sudo umount /mnt/hgfs再重新挂。mount | grep hgfs这条命令能看清当前挂载状态排查时先跑它。6.4 其它零碎问题速查现象可能原因处理方向光驱里没有 tar.gzVMware 新版不再提供 linux.iso改走 open-vm-tools 路线剪贴板单向失效客户机隔离选项未勾选检查虚拟机设置中的复制粘贴开关拖拽一直不生效Wayland 会话限制切换到 X11 会话分辨率选项里没有想要的值手动安装时选了默认分辨率重跑配置脚本vmware-config-tools.pl装完系统启动变慢模块加载超时查看dmesg中 vmw 相关报错apt 报无法定位 linux-headers源里无对应内核版本头文件升级内核后头文件一起装7. 卸载、回滚与后续维护的一点经验仓库安装的版本卸载很干净sudo apt remove --purge open-vm-tools open-vm-tools-desktop再sudo apt autoremove清掉依赖共享文件夹的 fstab 那行记得手动删掉否则开机挂载会失败。手动安装的版本用脚本自带参数卸cd /tmp/vmware-tools-distrib sudo ./vmware-install.pl -uninstall如果那个目录已经被删了就得手动清理/etc/init.d/vmware-tools、/usr/bin/vmware-*这些残留文件这也是我更喜欢仓库版的原因之一——可回滚性差太多。关于后续维护我的实际体会是先把“系统内核版本”和“Tools 版本”当成一对绑定关系来看待。每次做系统大版本更新之前先确认一下更新包里会不会动内核会动就顺手把 Tools 重装一遍或者在更新后立刻验证一次vmware-toolbox-cmd -v和ls /mnt/hgfs。这个动作花不了一分钟但能避免“更新完发现开发环境挂了、又不知道是哪一步导致的”这种最耗时间的排查场景。最后再分享一个小技巧如果你同时维护好几台 Linux 虚拟机可以把安装和验收命令写成一个脚本里面包含依赖安装、tools 安装、fstab 写入、五项功能自检这几段。新环境复制过去跑一遍五分钟出一个配置一致的虚拟机比每次翻文档点鼠标快得多。这套东西在 openKylin 上跑通之后往其它 Debian 系发行版迁移基本不需要改。
返回列表