一台虚拟机刚装完 CentOS 7 最小化系统,敲ip addr发现只有 lo 和一块没拿到地址的网卡,想装点东西又发现gcc、make、kernel-devel全都没有,这时候再去点虚拟机菜单里的“安装 VMware Tools”,然后把那个 tar.gz 解开跑./vmware-install.pl,十有八九会在半路停下来。这个场景我遇到过太多次,也帮人收拾过太多次残局,问题基本都集中在两件事上:一是最小化安装缺的依赖没补齐,二是很多人根本没搞清楚自己到底该用官方 VMware Tools 还是系统仓库里的 open-vm-tools。这篇就把 CentOS 7 最小化安装(没有桌面环境)下安装 VMware Tools 这件事从头到尾走一遍,包括依赖怎么补、本地源怎么搭、编译过程中的交互问答怎么答、装完怎么验证、出问题怎么查。适合手上有虚拟机测试环境、习惯用命令行干活的人,也适合刚接手一批离线虚拟机的同行。
1. 先把需求想清楚:最小化安装到底缺什么
1.1 最小化安装里那些“看不见的缺口”
CentOS 7 的 Minimal 安装包不到 1 GB,装完系统大概占用 1 GB 出头的磁盘空间,它砍掉的不只是图形界面,还有一大堆日常运维默认会用到的工具。ifconfig、netstat、telnet、lsof、wget这些全都没有,编译环境更是干干净净一个不留。第一次上手的人最容易踩的坑就是照着网上教程敲命令,结果第一步make就报command not found,然后开始怀疑教程是不是写错了。
更隐蔽的问题是内核头文件。VMware Tools 里面有几个必须现场编译的内核模块,比如负责共享目录的 vmhgfs、负责虚拟机通信的 vmw_vmci,这些模块的编译强依赖两个东西:一是当前正在运行的内核版本对应的kernel-devel,二是gcc和make组成的工具链。最小化安装这两样都没有,而且kernel-devel还有版本严格匹配的坑,装成别的版本一点用都没有。
还有一个容易被忽略的点:官方 VMware Tools 的安装脚本是 Perl 写的。CentOS 7 Minimal 的软件包组里通常带着 perl,多数情况下perl -v能正常输出,但不排除某些精简过的镜像或者被人为裁剪过的模板里没有。所以动手之前先确认一下,比装到一半被打断要体面得多。
1.2 官方 VMware Tools 和 open-vm-tools 到底选哪个
这是绕不开的选择题,网上的说法一直很乱,有说官方包更好的,有说 open-vm-tools 才是正道的。我的判断标准很简单:看你的虚拟机能不能连外网、看你的内核版本。
| 对比项 | 官方 VMware Tools | open-vm-tools |
|---|---|---|
| 获取方式 | 虚拟机菜单挂载 ISO,手动解包 | yum install -y open-vm-tools |
| 依赖要求 | 需要 gcc、make、kernel-devel | 基本零依赖,仓库直接装 |
| 内核升级后 | 需要手动重跑vmware-config-tools.pl | 多数情况自动适配,内核自带模块 |
| 共享目录 | vmhgfs 内核模块,需编译 | 新版本走 fuse,兼容性更好 |
| 离线环境 | 有 ISO 就能装 | 需要本地源里有包 |
| 维护成本 | 版本跟着虚拟化平台走,容易滞后 | 跟着系统仓库更新,省心 |
如果虚拟机能在本地源里找到open-vm-tools,我建议优先用它,尤其是在批量部署的场景下,十几个 yum 命令就能全搞定,不用一台台挂 ISO。但现实里有相当一部分内网虚拟机是彻底断网的,系统镜像之外什么包都没有,这种时候官方包的 ISO 反而是唯一解,因为它在虚拟机软件自带的目录里躺着,不需要额外下载任何东西。
还有一个细节:CentOS 7 的 base 仓库里open-vm-tools的版本不算新,某些老版本对高版本内核的支持一般。如果你的虚拟化平台比较新,或者你需要一些偏门功能,官方包反而更稳。选哪个不是信仰问题,是环境问题。
1.3 装完之后到底能换来什么实际收益
很多人装 VMware Tools 只是习惯性动作,其实说不清它解决了什么。最小化安装没有桌面,图形相关的自适应分辨率、拖拽文件这些都用不上,真正起作用的是下面这几项。
第一是共享目录。宿主机和虚拟机之间传文件,最土的办法是搭个临时服务或者用 U 盘镜像,共享目录能直接把宿主机的某个文件夹映射成虚拟机里的一个挂载点,改配置文件、扔安装包都方便得多。第二是时间同步,虚拟机的时钟漂移是个老问题,跑久了差几分钟很正常,工具里的时间同步能把这事压到毫秒级。第三是内存气球和内存热添加支持,宿主机内存吃紧时能动态回收,做多台虚拟机的测试环境时这个特性很实用。第四是优雅关机,虚拟机软件发关机指令时,客户机里的服务脚本能正常停服务再断电,不会把文件系统搞脏。
还有一项容易被忽视的影响:网卡驱动的性能。虽然 CentOS 7 内核自带 vmxnet3 驱动,理论上不依赖 Tools,但 Tools 装好之后能正确识别和配置虚拟网卡的高级特性,配合虚拟机软件的网络策略效果更好。对做性能测试的人来说,这部分差异在压测时是能看出来的。
2. 动手前的准备:依赖、源与快照
2.1 用 ISO 搭一个临时本地源,把光驱空出来
虚拟机一般只有一个虚拟光驱,你把它挂上系统安装 ISO 用来当软件源,就没法同时挂 VMware Tools 的 ISO 了。这是个非常典型的死循环:装依赖要光盘,装 Tools 也要光盘。解决办法有两个,我更推荐第一个。
办法一,把系统安装 ISO 上传到虚拟机本地磁盘,用 loop 方式挂载。这样虚拟光驱就彻底空出来了,随时可以换成 Tools 的镜像。具体操作是先建目录,再挂载:
mkdir -p /mnt/dvd mount -o loop,ro /root/CentOS-7-x86_64-DVD-1810.iso /mnt/dvd然后用这里的文件写一个最小化的仓库配置:
cat > /etc/yum.repos.d/local-dvd.repo <<'EOF' [dvd-base] name=CentOS 7 DVD Base baseurl=file:///mnt/dvd gpgcheck=0 enabled=1 EOF yum clean all yum repolistgpgcheck=0是为了省掉导入密钥的步骤,本地光盘源本身不存在篡改风险,这么做没问题。yum repolist能列出dvd-base就说明源生效了。
办法二,直接用虚拟光驱挂系统 ISO,装完依赖之后卸载,再换成 Tools 的 ISO。这条路也能走通,只是中间多两步,而且如果依赖没装全还得来回切,很容易乱。另外提一句,CentOS 7 的完整 DVD 镜像里是有open-vm-tools的,如果你决定走 open-vm-tools 路线,挂上 DVD 直接yum install -y open-vm-tools就完事了,全程不碰编译。Minimal 版 ISO 里的包太少,基本指望不上。
2.2 补齐编译工具链,特别盯住 kernel-devel 的版本
源配好之后,一口气把需要的东西装上:
yum install -y gcc make perl kernel-devel kernel-headers这里有个必须强调的点:kernel-devel的版本必须和uname -r的输出完全一致。yum install kernel-devel装的是仓库里最新的内核头文件,如果你的系统跑的是老内核,装完就会不匹配,编译阶段直接报找不到内核头文件。装完先核对一遍:
uname -r ls -l /lib/modules/$(uname -r)/build/lib/modules/$(uname -r)/build应该是一个指向/usr/src/kernels/$(uname -r)的软链接。如果这个链接指过去是空的,或者干脆不存在,那就是版本没对上。最稳的写法是明确指定版本号:
yum install -y kernel-devel-$(uname -r)如果本地源里没有这个确切版本,yum list kernel-devel --showduplicates可以看看到底有哪些可选,实在不行就先yum update把内核和头文件一起升到同一版本,再重启进新内核。这一步偷懒的后果,就是编译 vmhgfs 时跳出一大段红字,然后你花半小时去找原因。
顺便把net-tools装上,纯粹是为了后面敲ifconfig顺手,不是必装项,用ip addr也一样。预装在系统里的perl如果版本够用就不用管,装完perl -v确认一下即可。
2.3 开工前的自检清单和快照习惯
装内核模块这种事,出问题之后回滚的代价远大于重装。动手之前打个虚拟机快照,是我这些年坚持得最好的一条习惯,几十秒的事,能省掉后面几小时的折腾。
自检我一般按这几项过一遍:
uname -r和rpm -q kernel-devel的版本号对得上gcc --version、make --version、perl -v都能正常输出df -h /usr/src剩余空间大于 1 GB,编译过程会产生不少临时文件ls /usr/src/kernels/下面能看到和当前内核同名的目录- 确认虚拟机设置里那个 CD/DVD 设备是“已连接”状态,不然挂载会失败
还有一个环境层面的确认:如果你的虚拟机是用 UEFI 引导的,装完 Tools 之后重启时偶尔会遇到引导顺序的困惑,这个和 Tools 本身无关,但排查问题的时候容易被误导,心里有数就行。
清单过完,再往下走基本就是顺着流程点回车的事了。
3. 正式安装:从挂载镜像到编译通过
3.1 挂载 VMware Tools 的安装镜像
在虚拟机软件的菜单里点“安装 VMware Tools”,这一步的本质是把一个 ISO 塞进虚拟光驱,客户机操作系统这边会多出一个光驱设备。CentOS 7 上通常是/dev/sr0,/dev/cdrom是指向它的软链接,两个都能用。
mkdir -p /mnt/vmtools mount -o ro /dev/sr0 /mnt/vmtools ls /mnt/vmtools正常情况下能看到VMwareTools-10.3.22-15902021.tar.gz和一个manifest.txt。如果mount提示no medium found,说明虚拟光驱里没东西,回到虚拟机设置里确认 ISO 是不是真的挂上了,有些版本需要先点“连接”再点“确定”。如果提示device is busy,多半是之前挂过别的东西没卸载,umount /mnt/vmtools或者umount /dev/sr0先清一下。
也有人图省事,把 tar.gz 直接通过共享目录或者别的方式拷到/tmp再装,效果一样。但既然虚拟光驱就在那,挂一下更直接。
3.2 解包到 /tmp 并启动安装脚本
不要在原目录里解包,/mnt/vmtools是只读的,解不开。拷到/tmp下去:
cd /tmp tar -xzf /mnt/vmtools/VMwareTools-*.tar.gz cd /tmp/vmware-tools-distrib ls目录里能看到vmware-install.pl和一堆vmware-*脚本。启动安装有两种方式,一种是完全交互式地一路点回车,另一种是加-d参数全部走默认值。我一般推荐第一次装的时候老老实实走交互式,因为你会看到脚本问了哪些问题、默认值是什么,心里有底;后面批量部署再换成-d。
./vmware-install.pl想走全默认的写法是./vmware-install.pl -d,注意-d不会跳过编译,只是把交互问答全部用默认答案填掉。如果你的安装目录、日志目录需要定制,就别用-d。
3.3 安装脚本的交互问答逐条拆解
脚本跑起来之后会连续问十几个问题,绝大多数直接回车就行,但有几个值得说清楚它问的是什么,答错了后面会麻烦。
前面几个问题是安装路径:二进制文件放/usr/bin,守护进程放/usr/sbin,库文件放/usr/lib/vmware-tools,文档放/usr/share/doc/vmware-tools。这些默认值都是符合 CentOS 7 文件系统规范的,一律回车。中间会问“这个目录当前不存在,要不要现在创建”,答yes。
接着会问是否安装 VMware Tools 服务、是否安装客户机操作系统守护进程,这两个都选yes,它们是核心组件。后面会问是否启用 Guest Authentication(vgauth),这个和客户机内的身份验证有关,选yes不影响使用,选no也能跑,我习惯选yes保持功能完整。至于 Common Agent 那一项,选no就行,最小化环境用不上。
再往后脚本会开始编译内核模块,这一步是整个安装里最耗时的部分,通常几十秒到两三分钟,屏幕上会滚动一堆make的输出。中间如果出现类似Unable to build the vmhgfs module的错误,不要急着继续,先看错误里提到的路径和版本号,九成是kernel-devel版本没对上,或者gcc没装全。中断之后修正依赖,重新跑一遍./vmware-install.pl是可以的,脚本对重复安装有一定的容错。
最后会提示Enjoy, --the VMware team,并且自动启动服务。看到这句话基本就成功了,但别急着关终端,下一步的验证才是确认它真的在工作的关键。
3.4 装完必须做的五项验证
安装脚本说成功不等于真的能用,我一般按下面五项过一遍。
第一项,看服务状态:
/etc/init.d/vmware-tools status输出里应该能看到vmware-guestd is running和vmware-vmblock-fuse之类的字样。CentOS 7 上这套服务是 SysV 脚本形式,用systemctl status vmware-tools也能查,但底层还是那个脚本。
第二项,看版本号:
vmware-toolbox-cmd -v能输出版本号说明命令行工具链是通的。
第三项,测共享目录。先在虚拟机设置里启用一个共享文件夹,然后在客户机里执行:
vmware-hgfsclient这条命令会列出所有已启用的共享名。能列出来说明 vmhgfs 这条路是通的。接着挂载:
mkdir -p /mnt/hgfs mount -t vmhgfs .host:/ /mnt/hgfs ls /mnt/hgfs如果mount报no such device,说明 vmhgfs 模块没编译成功或者没加载,lsmod | grep vmhgfs看一眼,没有的话就是编译阶段的事。有些新版本官方 Tools 的 vmhgfs 在内核兼容性上有问题,可以退回用 fuse 方式:/usr/bin/vmhgfs-fuse .host:/ /mnt/hgfs -o subtype=vmhgfs-fuse,allow_other。
第四项,测时间同步:
vmware-toolbox-cmd timesync status vmware-toolbox-cmd timesync enable返回 enabled 就生效了。这里有个冲突要处理:CentOS 7 默认开着 chronyd,两套时间同步机制同时跑会互相拉扯,表现是时间偶尔跳一下。我的做法是,能连时间源的就保留 chronyd、关掉 Tools 的时间同步;纯内网没有时间源的,反过来,关掉 chronyd 用 Tools 同步。
第五项,确认网卡。用ethtool -i ens33看驱动的driver字段,显示vmxnet3就说明用的是半虚拟化网卡,性能比模拟的 e1000 好一截。这一项其实和 Tools 关系不大,但排查网络问题时经常会一起看。
4. 常见问题与排查技巧实录
4.1 编译阶段的报错怎么定位
编译报错是最高频的问题,症状通常是脚本跑到一半停下来,屏幕上出现The kernel headers for this kernel were not found或者一堆No such file or directory。第一种情况几乎百分百是kernel-devel版本不匹配,解决方式前面说过,用yum install -y kernel-devel-$(uname -r)精确安装,装完再核对/lib/modules/$(uname -r)/build的软链接指向。
第二种情况要看具体是哪个模块编译失败。如果是 vmhgfs 挂了,很可能是 Tools 版本太老,内核里的文件系统相关接口变了。CentOS 7 的内核是 3.10 系列,比较新的 Tools 版本对它支持都不错,反倒是很老的 Tools 10.0.x 在某些更新过的内核上会出问题,这种时候换一个更新的 Tools 版本比死磕编译错误划算。
还有一种报错是gcc: command not found或者make: *** No targets specified,纯粹是工具链没装齐,回到 2.2 节重来一遍。装完记得source /etc/profile或者重开一个终端,让 PATH 生效。
4.2 装完了但功能不生效
最常见的是服务起来了但共享目录挂不上。先lsmod | grep vmhgfs,模块在的话看挂载点权限,不在的话手动modprobe vmhgfs试试,报错会告诉你缺什么。如果模块加载时提示版本不匹配,那还是内核头文件的事,回去重装一遍。
时间同步不生效的情况一般是 chronyd 在抢,systemctl status chronyd看它是不是在跑,timedatectl能看到当前的同步状态和同步源。两套机制打架的时候,表现往往不是时间不准,而是时间在几秒内反复跳,看日志会发现两边的同步记录交替出现。
还有一种情况是装完之后重启,虚拟机软件那边显示 Tools 状态是“未运行”,但客户机里服务明明是 running。这种通常是不同版本之间的状态上报机制差异,实际功能正常,不用管它。判断标准以客户机里的实际功能为准,别被外面的图标骗了。
4.3 网络相关的坑
装 Tools 之前网卡是 e1000,装完之后有时会变成 vmxnet3,设备名从ens33变成ens34之类,配置文件对不上,网络就断了。处理方法是在/etc/sysconfig/network-scripts/下找到新设备名对应的配置文件,把NAME和DEVICE改对,HWADDR删掉或者改成新网卡的 MAC,然后systemctl restart network。
另一个坑是装完 Tools 之后ifconfig输出里看不到 IP,但ip addr能看到。这通常不是网络问题,是net-tools和 NetworkManager 之间的显示差异,用ip命令为准。真要确认连通性,ping一下网关最直接。
4.4 常见问题速查表
| 现象 | 可能原因 | 处理方式 |
|---|---|---|
| 脚本提示找不到内核头 | kernel-devel 版本与 uname -r 不一致 | 按 uname -r 精确安装 kernel-devel |
| gcc 或 make 找不到 | 工具链没装 | yum install -y gcc make |
| perl 找不到 | 极简镜像裁剪了 perl | yum install -y perl |
| vmhgfs 编译失败 | Tools 版本与内核不兼容 | 换新版 Tools,或改用 vmhgfs-fuse |
| 共享目录挂载报 no such device | 模块未加载 | modprobe vmhgfs,查 dmesg |
| 时间反复跳 | chronyd 与 Tools 同步冲突 | 关掉其中一个 |
| 装完网卡名变了 | 驱动从 e1000 换成 vmxnet3 | 修改网卡配置文件中的设备名 |
| 光驱挂载 device is busy | 之前挂载未卸载 | umount 后重新挂载 |
| 内核升级后 Tools 失效 | 内核模块未重新编译 | 重跑 vmware-config-tools.pl |
表里最下面那条值得单独说一下。/usr/bin/vmware-config-tools.pl这个脚本很多人不知道,它专门用来重新配置已安装的 Tools,内核升级之后重跑一遍就能把模块重新编译对齐,不用卸载重装。这条命令救过我不少次。
5. 长期维护:内核一升级就重来一遍的应对
5.1 内核更新之后的正确姿势
CentOS 7 默认会保留旧内核,yum update升级内核后如果没重启进新内核,uname -r还是老的,Tools 一切正常,容易给人错觉。一旦重启切到新内核,共享目录立刻失效,因为模块是针对老内核编译的。
处理方式就是重跑配置脚本:
/usr/bin/vmware-config-tools.pl脚本会检测当前运行的内核,重新编译需要的模块。前提是新内核对应的kernel-devel也在系统里,所以我的习惯是内核和头文件一起升级,yum install -y kernel kernel-devel一条命令搞定,别分开弄。
如果你用的是 open-vm-tools,内核升级后一般不需要手动干预,因为 vmxnet3、vsock 这些核心模块已经进主线内核了,open-vm-tools 本身走的是用户态工具加 fuse,不依赖现场编译。这也是我推荐 open-vm-tools 的主要原因之一。
5.2 把整个流程写成脚本,批量部署时省事
单台虚拟机手动敲一遍问题不大,十几台一起装就难受了。我整理过一版脚本,前提是把系统 ISO 已经放到/root下、虚拟光驱里已经挂好了 Tools 镜像:
#!/bin/bash set -e ISO=/root/CentOS-7-x86_64-DVD-1810.iso # 1. 搭本地源 mkdir -p /mnt/dvd mount -o loop,ro "$ISO" /mnt/dvd cat > /etc/yum.repos.d/local-dvd.repo <<'EOF' [dvd-base] name=CentOS 7 DVD Base baseurl=file:///mnt/dvd gpgcheck=0 enabled=1 EOF yum clean all # 2. 装依赖 yum install -y gcc make perl kernel-devel-$(uname -r) kernel-headers # 3. 挂载 Tools 镜像并安装 mkdir -p /mnt/vmtools mount -o ro /dev/sr0 /mnt/vmtools cd /tmp tar -xzf /mnt/vmtools/VMwareTools-*.tar.gz cd /tmp/vmware-tools-distrib ./vmware-install.pl -d # 4. 重启服务并验证 /etc/init.d/vmware-tools restart vmware-toolbox-cmd -v脚本里用set -e有个好处,任何一步失败就立刻停下来,不会带着半截状态继续往下跑,排查起来清楚。-d参数在这里是必要的,批量场景下没人守着一台台点回车。
有一处细节值得改:脚本里没有处理/dev/sr0已经被占用的情况。稳妥的写法是在mount之前加一句umount /dev/sr0 2>/dev/null || true,吞掉“本来就没挂载”这个报错,避免脚本中断。
5.3 我个人的几个偏好和踩过的坑
关于装哪种,我现在基本是这么分的:能连本地源的一律yum install -y open-vm-tools,五秒钟搞定,后续内核升级也不用管;完全离线的老系统,才走官方 ISO 这条路。CentOS 7 已经比较老了,官方 Tools 的版本也停留在 10.x,能用 open-vm-tools 就别折腾编译。
踩得最深的一个坑是-d参数。有次图快,用-d装完之后发现共享目录死活挂不上,最后查出来是某个交互项默认选了不启用某功能,具体哪一项记不太清了,结论是:功能不对的时候,老老实实跑一次交互式安装,把每个问题都看清楚。宁可多花五分钟。
还有一条:装之前一定打快照。这听起来像废话,但我见过装到一半把/usr/lib搞乱、系统起不来、只能重装的情况。快照回滚三十秒的事,重装半小时,这笔账很好算。另外装完之后别急着删/tmp里的解包目录,万一要重装或者换版本,现成的脚本还在,省得重新解压。
最后一个容易被忽略的点:虚拟机软件的版本和 Tools 版本是对应关系,太老的 Tools 配太新的平台,或者反过来,都可能出现奇怪的问题。装之前顺手看一眼虚拟机软件关于页面里的版本号,和 ISO 里 tar.gz 的名字对一下,心里大致有数就行,不用非得追求完全一致。