手头只有一台开发机,想搭一套跟生产环境对得上的 Linux 服务,又不想把主机系统折腾得千疮百孔,最省事的办法就是在 VMware 里开一台 CentOS 7 虚拟机。这套组合我前后装过不下五十次,从最早给团队做新人培训环境,到后来做数据库实验、写自动化脚本、跑老项目的编译链,几乎都靠它撑着。CentOS 7 的官方常规维护早就结束了,但大量存量项目、教学课件、企业内部脚本依然以它为准,尤其是那一批基于 7.x 编译出来的 RPM 包,换到别的发行版上能让你调一整天。所以哪怕到了现在,问"VMware 下 CentOS 7 虚拟机怎么装"的人还是一抓一大把。
这篇东西写给三类人:完全没碰过虚拟化的新手、装过一次但被网络和 yum 源折磨过的半熟手、以及需要批量给团队发环境的老手。我不会只给你点"下一步",而是把每个选项背后的取舍讲清楚——为什么网络模式要这么选、磁盘为什么要拆成多个文件、CentOS 7 停服之后源到底该怎么修。这些坑我都踩着过来,写下来省得你再走一遍。
1. 为什么这套组合到现在还值得装
1.1 CentOS 7 在真实工作里还剩下多少价值
先摆明一个事实:CentOS 7 已经进入生命周期的最后阶段,官方不再提供常规安全更新,很多公共镜像站也已经把它从主同步列表里挪走。按理说早该换 Rocky、Alma 或者 Ubuntu Server。但现实是,我经手的项目里至少还有三成跑在 7.x 上,原因很朴素——有些老的商业软件只提供 7.x 的 RPM 包,有些自研系统用的是 CentOS 7 时代的 glibc 和 OpenSSL 版本,直接升发行版意味着整条依赖链要重验。教学场景就更不用说了,教材、课件、实验指导书全是按 7 写的。
所以装它的目的不是"我要长期用",而是"我要一个跟存量环境一致的沙箱"。这个定位决定了后面所有选择:配置可以糙一点,但必须能一键回滚;不追求最新,追求和线上一致。心里装着这个前提,你在选软件包、改配置的时候就不会纠结要不要顺手升个级——答案是不要。
提示:CentOS 7 只适合做本地实验、兼容性验证和离线开发环境,不要把它接进对外的生产网络。
1.2 硬件底线与资源分配怎么算
很多人装虚拟机第一件事就是"内存拉满、CPU 拉满",然后在主机上开浏览器和 IDE,结果主机开始疯狂读写交换分区,整台机器卡成幻灯片。虚拟机的资源是从主机借的,不是凭空多出来的,这里有个我习惯用的经验公式。
内存方面,给单台虚拟机的内存不要超过主机物理内存的 50%,同时主机侧至少留 4GB 给系统本身和常用软件;如果你打算同时开两台以上虚拟机,那么每台分到的内存之和最好控制在物理内存的 60% 以内。举个例子,16GB 内存的主机,开一台做日常实验的 CentOS 7,给 4GB 就很舒服;如果要在这台虚拟机里跑单机版的容器编排环境,给 6GB 到 8GB,但这时候主机上就别再开重型 IDE 了。
CPU 方面,虚拟处理器的总核心数不要超过物理逻辑处理器数量,比较稳妥的做法是控制在逻辑核心数的一半左右。一台 8 核 16 线程的机器,给虚拟机 2 vCPU 到 4 vCPU 足够跑绝大多数服务;超过物理核心数的超配会让调度器频繁切换,反而更慢。值得注意的是,VMware 里填的是"每个插槽的核心数"和"插槽数量",总核心数是两者相乘,新手容易在这里填出 8 核来。
磁盘是另一个容易被忽略的点。做纯命令行实验,20GB 起步;要装 GNOME 桌面,40GB;要跑数据库和容器,直接给 60GB 以上。另外,如果你主机用的是固态硬盘,建议选"将虚拟磁盘存储为单个文件",减少随机读写的碎片;如果主机是机械硬盘,选"拆分成多个文件"在复制和迁移时反而更灵活。
还有一件事必须提前确认:物理机的 CPU 虚拟化技术在 BIOS 里有没有打开。Windows 上按 Ctrl+Shift+Esc 打开任务管理器,性能标签页里的 CPU 一项会写明"虚拟化:已启用/已禁用"。如果这里是禁用状态,VMware 在创建 64 位虚拟机时会直接报错,或者装好之后运行慢得离谱。这个开关不在 VMware 里,在 BIOS 里,改完记得保存重启。
2. 安装前必须定下来的三件事
2.1 镜像文件怎么选、怎么校验
CentOS 7 的最后一个小版本是 7.9.2009,做实验直接认准它就对了,别去追那些中间版本。ISO 本身分几种形态,选错会浪费很多时间。完整版 DVD ISO 大约 4.7GB,包含常用软件包和图形界面组件,是绝大多数人的首选;Everything ISO 接近 9GB,把仓库里所有 RPM 都塞进去了,做完全离线的本地源特别方便;最小化 Minimal ISO 只有 1GB 出头,只有基础系统,剩下的包全靠 yum 拉;还有一种网络安装镜像 NetInstall,安装过程中要联网下载所有包,网络不稳会直接失败,我不推荐新手用。
下载完第一件事是校验哈希值,别嫌麻烦。文件在传输过程中损坏,安装过程中会以"卡在某个界面不动""包解压报错"的形式表现出来,你根本想不到是 ISO 的问题,能查半天。Windows 上打开命令行执行certutil -hashfile 文件名.iso SHA256,Linux 上执行sha256sum 文件名.iso,把结果跟官方发布页上的值比对,不一致就重新下载。
这里要提前说一个后面会反复用到的关键点:CentOS 7 进入归档状态之后,系统里默认的 yum 源地址已经连不通了,装完系统第一次执行 yum 命令大概率会报Cannot find a valid baseurl for repo: base/7/x86_64。这不是你的网络坏了,是源地址变了。解决办法在第四章详细写,但你要知道,如果下载的是 Everything ISO,这个问题的解法会变得非常简单——直接拿 ISO 当本地源,完全不需要联网。
2.2 网络模式选择:NAT、桥接还是仅主机
这是新手最容易随便选的一项,也是后期问题最多的源头。VMware 提供了几种网络模式,本质区别在于虚拟机在网络上"站在哪个位置"。
| 网络模式 | 虚拟机能否上外网 | 主机能否访问虚拟机 | 局域网其他设备能否访问 | 典型用途 |
|---|---|---|---|---|
| NAT | 能 | 能 | 不能(默认) | 日常学习、临时环境 |
| 桥接 | 能 | 能 | 能 | 对外提供服务、多人联调 |
| 仅主机 | 不能 | 能 | 不能 | 隔离实验、内外网模拟 |
NAT 是默认选项,虚拟机的流量经过主机的 NAT 服务转发出去,相当于虚拟机躲在主机后面。它的好处是省心,装完几乎不用配置就能上网,主机也能直接访问虚拟机;缺点是局域网里的同事访问不到你的虚拟机,除非你手动配端口转发。如果你只是自己写代码、跑数据库,NAT 完全够用。
桥接模式则是把虚拟机直接接到主机所在的物理网络里,虚拟机会从局域网的 DHCP 拿到一个跟主机同网段的 IP,别的设备能直接 ping 到它。好处是省去了端口转发的麻烦,适合把服务给同事用、或者做多台虚拟机互通的实验;坏处是,如果公司或学校的网络做了 MAC 地址绑定、或者对陌生设备有限制,桥接可能直接不通,这时候你会以为是 VMware 坏了。
仅主机模式(Host-only)只在主机和虚拟机之间建一条私有链路,虚拟机上不了外网。它特别适合做网络隔离实验,比如你想模拟一台内网数据库服务器,就给它挂一张仅主机的网卡。我的习惯做法是给重要的实验机配两块网卡,一块 NAT 负责上网装包,一块仅主机负责内网实验,两条路互不干扰。
注意:VMnet1 对应仅主机模式,VMnet8 对应 NAT 模式,这两个虚拟网卡由 VMware 在主机上自动创建。如果安装时被安全软件拦截,可能出现"虚拟机没有网络适配器"的现象,后面第五章有排查方法。
选定模式之后还有个小决定:用 DHCP 还是静态 IP。学习机我一般先用 DHCP 快速验证网络通不通,确认没问题后立刻改成静态 IP,因为 NAT 的 DHCP 每次重启可能给不同的地址,你写死的连接配置和脚本全部失效,这种问题排查起来很浪费时间。改静态地址的方法在 4.1 节。
2.3 磁盘与分区规划:别用默认的自动分区
安装界面里的"自动创建分区"确实省事,但它给你分出来的布局经常不合用——最常见的是 LVM 把大部分空间划给 /home,根分区只留 50GB,等你装数据库或者镜像仓库的时候就直接写满了。做实验我更推荐手动分区,方案不复杂,记住下面这套就行。
| 挂载点 | 建议大小 | 文件系统 | 说明 |
|---|---|---|---|
| /boot | 1GB | xfs | 放内核和引导文件,必须单独分且不能用 LVM |
| swap | 4GB | swap | 内存大于 8GB 时,4GB 足够做保险 |
| / | 剩余全部 | xfs | 根分区,尽量给足 |
顺序上先分 /boot,再分 swap,最后把剩下的全部给根分区。为什么 /boot 必须单独分?因为引导加载程序在启动的早期阶段还没有能力识别 LVM 逻辑卷和某些高级文件系统,引导文件必须放在一个能被直接读取的简单分区上。为什么 swap 不用给到内存的两倍?那是十几年前内存以 MB 计算的年代留下规矩,现在 8GB 内存的机器给 4GB swap 只是为了防止极端情况下的内存溢出导致内核直接杀进程,日常根本用不到。
至于 /home 要不要单独分,纯实验环境无所谓,如果你想让这台虚拟机更接近真实服务器的布局,可以把 /home 单独分 10GB 到 20GB,这样万一某个用户往家目录里塞了几十 GB 垃圾,也不会把根分区撑爆。LVM 用不用?建议用,好处是以后磁盘不够了可以给虚拟机扩磁盘,再在线扩容逻辑卷,不用重装系统。装的时候选 LVM 的分区类型就行。
3. VMware 里从头建一台 CentOS 7 的完整流程
3.1 新建向导里几个容易选错的选项
打开 VMware Workstation,文件菜单里选新建虚拟机。第一步会让你选典型还是自定义,很多人图快选典型,但典型模式会把一堆选项替你决定好,尤其是硬件兼容版本。做学习环境我强烈建议选自定义,整个流程多花不了两分钟,但你能清楚地知道每一步在干什么。
硬件兼容性这一步,选跟当前 VMware 版本对应的那个。比如你装的是 Workstation 17,就选 17.x。选低版本兼容(比如 15.x)的好处是这台虚拟机可以在别人的老版本 VMware 上打开,代价是某些新硬件特性用不了,比如更高版本支持的虚拟 NVMe 控制器。如果这台机器只是你自己用,选当前版本;如果要在团队里传阅,降一档更保险。
到了客户机操作系统这一步,有个关键操作:不要直接选 ISO 文件走简易安装,而是选"稍后安装操作系统",然后在客户机操作系统里选 Linux,版本选 CentOS 7 64 位。为什么?因为如果你在向导里就挂载 ISO,VMware 会识别出这是 CentOS 并触发"简易安装",它会用一个预设模板自动完成分区和软件包选择——整个过程快到让你怀疑人生,但你也完全没机会配置分区、选软件包、设置网络。学安装这件事,流程本身就是重点,绕过它就白装了。等你熟练之后,追求效率再用简易安装不迟。
虚拟机的存放位置也要留意:路径里不要出现中文和空格,有些构建工具和脚本对空格路径处理得很差;放在非系统盘,同时确认那个分区至少有 80GB 的余量,因为虚拟磁盘是会随着使用慢慢膨胀的。
3.2 硬件参数调整:内存、CPU、磁盘怎么填
处理器页面填的是插槽数量和每插槽核心数,总核心数等于两者相乘。给一台日常实验机 2 核到 4 核就够了,别填超过主机逻辑处理器的数量。内存按 1.2 节算出来的值填。网络类型选你在 2.2 节定下来的那个。
接下来是 I/O 控制器和磁盘类型,这两项保持默认基本没问题。磁盘页面有几个选择要留神:容量按前面规划填,比如 60GB;下面有两个单选,"将虚拟磁盘存储为单个文件"和"拆分成多个文件",我在 1.2 节讲过怎么取舍——固态盘选单个文件,机械盘选拆分。
向导的最后一步可以点"自定义硬件",这里有几个我习惯关掉的东西:声卡、打印机、USB 控制器。这些设备在服务器用途的虚拟机上根本用不到,留着只会让开机时多加载几个驱动,还会在某些情况下引起设备冲突。显示器的"加速 3D 图形"也关掉,纯命令行环境不需要它,开了反而增加图形渲染的开销。
回到虚拟机界面后,还有一件事没做:挂载 ISO。右键虚拟机设置,找到 CD/DVD 一项,选"使用 ISO 映像文件",浏览到你下载并校验过的那个文件,然后务必勾选"启动时连接"。不勾这一项,开机之后虚拟机找不到安装介质,会直接报找不到引导设备。这个复选框每年能坑掉一批人。
3.3 安装界面上的关键动作
启动虚拟机,进入引导菜单,选第一项 Install CentOS 7,回车。接下来几个界面按顺序走。
语言选择我建议英文。中文界面不是不能用,但老版本的安装程序在中文字体渲染上偶有问题,某些字符显示成方框,你反而看不明白;而且生产服务器上统一英文,习惯早点养成更好。接下来进入安装总览页面,这个页面上有几个必须点进去配置的项目,不能直接点开始安装。
第一是"安装位置"。点进去选"我要配置分区",然后在分区方案里选标准分区或者 LVM,按 2.3 节的表手动分。分完点完成,它会弹出一个摘要确认,确认后返回总览。
第二是"网络和主机名"。这是最容易漏的一项。页面右上角有个开关,默认是关闭状态,你必须手动打开它,网卡才会在系统启动时自动激活。很多人装完系统发现只有一个 lo 口,就是这里没开。同时把主机名设成一个有意义的名字,比如 dev-db-01 或者 test-node-01,别用 localhost,后面做多机实验时你会需要区分它们。
第三是"软件选择"。最小安装加开发工具这一组合我用了很多年,兼顾了轻量和实用。如果你只跑服务,最小安装本身也够;需要图形界面就选 GNOME Desktop,但要有心理准备,它会多吃掉一两个 GB 的内存和不少磁盘。这里还有一个"兼容库"选项,如果要跑一些老旧的 32 位程序,可以顺手勾上。
第四是 root 密码和用户创建。root 密码设一个你能记住的复杂密码;更重要的是创建一个普通用户,并勾选"将此用户设为管理员",这样这个用户会被加进 wheel 组,可以用 sudo 提权。日常操作不要用 root,这个习惯值一千块钱的教训。
配置完这四项,点开始安装,等待复制文件完成,然后重启。重启前记得在虚拟机设置里把 CD/DVD 的连接方式改成"使用物理驱动器"或者取消"启动时连接",否则它可能又从 ISO 引导进安装界面。
3.4 第一次开机后立刻要做的两件事
重启进入系统,用刚才创建的普通用户登录,第一件事是验证网络:
ip addr ping -c 4 主机所在网关或者一个公共地址如果ip addr里能看到 ens33 之类的网卡并且拿到了 IP,说明网络通了。如果只有 lo,回到 3.3 节检查网卡开关。这一步通过之后,立刻给虚拟机拍一个快照,命名成"clean-install-日期"。这是我所有经验的浓缩:后面无论你把系统折腾成什么样——改坏了 yum、装崩了数据库、误删了系统文件——只要回滚到这个快照,三分钟回到干净状态。没有快照的虚拟机,装崩一次就得重装一小时。
快照的用法也要说清楚。快照不是备份,它记录的是磁盘在某个时刻的状态,虚拟机运行时会往增量文件里写数据,快照开得越多,磁盘链越长,性能越差,占用的空间也可能超过虚拟磁盘本身。我的习惯是只保留两到三个关键节点的快照,做完一轮实验就清理掉不用的,清理之后记得让 VMware 执行一次整合,把增量文件合并回主盘。
对于需要反复做实验的场景,更推荐的做法是克隆而不是快照。完整克隆出来的虚拟机是完全独立的,占的空间大但互不影响;链接克隆依赖父盘,省空间,但父盘一动它就有风险。给团队发环境的话,把配置好的虚拟机当模板,让每个人克隆一份,比让每个人从头装一遍靠谱得多。
4. 装完必做的初始化配置
4.1 网络:固定 IP 和主机访问虚拟机
DHCP 分配的地址会变,这对开发环境来说是灾难。装完系统确认网络通了之后,第一件事就是改成静态 IP。在 CentOS 7 里编辑网卡配置文件:
vi /etc/sysconfig/network-scripts/ifcfg-ens33把内容改成这样(地址按你的网络实际网段调整):
TYPE=Ethernet BOOTPROTO=static IPADDR=192.168.10.101 PREFIX=24 GATEWAY=192.168.10.2 DNS1=223.5.5.5 DNS2=119.29.29.29 ONBOOT=yes NAME=ens33 DEVICE=ens33这里的 GATEWAY 在 NAT 模式下通常是 VMnet8 那个虚拟网卡的地址,你可以在主机的虚拟网络编辑器里看到;桥接模式下就是你所在局域网的真实网关。改完之后重启网络服务:
systemctl restart networkCentOS 7 里同时存在 network 和 NetworkManager 两套网络服务,混用会出现配置不生效的诡异现象。我的做法是统一用 network,把 NetworkManager 关掉:
systemctl stop NetworkManager systemctl disable NetworkManagerNAT 模式下主机访问虚拟机不需要额外配置,因为主机本身就有一张 VMnet8 的网卡,和虚拟机在同一网段。反过来,如果你想让局域网里的其他设备访问虚拟机上的 Web 服务,把网络模式改成桥接是最省事的。如果坚持用 NAT,就得在虚拟网络编辑器里做端口转发,把主机的某个端口映射到虚拟机的 80 或 443,配置入口在 NAT 设置的端口转发里。
防火墙和 SELinux 这两个是排查问题的头号干扰源。实验环境我一般先关掉,减少变量:
systemctl stop firewalld systemctl disable firewalld setenforce 0 sed -i 's/^SELINUX=.*/SELINUX=disabled/' /etc/selinux/configsetenforce 0只对当前会话生效,改配置文件才能永久关闭。这里必须强调一句,这只是实验环境的做法,任何对外的服务器都不能这么干,防火墙和 SELinux 是安全底线,线上环境要做的是学会配置它们,而不是关掉它们。我见过太多人在本地养成关防火墙的习惯,到了线上照搬,最后出安全事故。
4.2 yum 源修复:停服之后的正确姿势
这是我每次装 CentOS 7 必做的一步,也是最容易卡住新手的一步。系统自带的 repo 文件指向的地址已经失效,直接执行 yum 会报Cannot find a valid baseurl for repo: base/7/x86_64。几种解法我按推荐程度排一下。
最稳的是拿 Everything ISO 当本地源,完全离线,不受任何网络影响。把 ISO 挂到虚拟机(虚拟机设置里挂载那个 Everything 镜像文件),然后:
mkdir -p /mnt/cdrom mount /dev/sr0 /mnt/cdrom创建/etc/yum.repos.d/local.repo:
[local] name=CentOS 7 Local Repo baseurl=file:///mnt/cdrom enabled=1 gpgcheck=0然后把其他 repo 文件临时移走,避免它们干扰:
mkdir -p /etc/yum.repos.d/bak mv /etc/yum.repos.d/CentOS-*.repo /etc/yum.repos.d/bak/ yum clean all yum makecache为了让挂载在重启后依然有效,把它写进/etc/fstab:
/dev/sr0 /mnt/cdrom iso9660 loop,ro 0 0第二种是在线方案,需要找仍在同步 7.x 归档的国内公共镜像站,把 repo 文件里的 baseurl 改成它提供的历史归档路径。这个方案的缺点是依赖网络,而且随着时间推移,还在同步 7.x 的站点只会越来越少,今天能用不代表半年后还能用。所以我的建议是:能拿到 Everything ISO 就用本地源,这是唯一不会因为外部变化而失效的方案。
顺便说说离线装软件这件事。经常有需求是在完全没网的机器上装容器运行时或者数据库。思路是在一台同版本、能联网的机器上先把 RPM 包连同依赖一起下载下来:
yum install --downloadonly --downloaddir=/root/rpms docker-ce把整个 rpms 目录拷到离线机器上,要么直接用rpm -ivh *.rpm按依赖顺序装(用yum localinstall更省心,它会自动算依赖),要么用 createrepo 做成一个本地仓库。这套方法对付任何离线安装场景都通用,学一次管很久。
4.3 一套可以复用的初始化脚本
新系统装好、网络通了之后,我习惯跑一遍下面这套动作,把通用设置一次性做掉。
# 设置时区并同步时间 timedatectl set-timezone Asia/Shanghai systemctl enable --now chronyd # 装常用工具 yum install -y vim wget curl net-tools bash-completion tree lsof unzip git # 记录带时间戳的命令历史 echo 'export HISTTIMEFORMAT="%F %T "' >> /etc/profile # 关闭不需要的服务 systemctl disable --now postfix关于 Python 有一个必须单独拎出来说的坑:CentOS 7 的 yum 是用 Python 2 写的,系统里的/usr/bin/python指向 python2.7。如果你手一动把它改成 python3,yum 会直接崩掉,报一堆语法错误,修复起来相当麻烦。正确做法是系统级的 python 保持原样,需要 Python 3 的时候用 pyenv 或者源码编译装到 /usr/local,再用虚拟环境隔离项目。这个坑我身边至少五个人踩过。
MySQL 的安装也有类似的注意事项。CentOS 7 自带的是 MariaDB,要装 MySQL 8 得先卸掉 mariadb-libs,但这个包被很多系统组件依赖着,删的时候会牵连一批东西,建议用官方的 yum 仓库来装,让依赖关系自动处理。如果是离线环境,下载 RPM 包的时候要留意 glibc 版本,MySQL 8 的新版本对 glibc 有最低要求,在 CentOS 7 上可能要选稍微旧一点的版本。
5. 常见故障与排查实录
5.1 故障速查表
装虚拟机的过程中,问题基本集中在几类。我整理了一张速查表,遇到现象直接对号入座。
| 现象 | 大概率原因 | 处理思路 |
|---|---|---|
| 安装时一直黑屏或卡住 | ISO 损坏、虚拟化引擎未开、内存给得太大 | 校验 ISO 哈希、检查主机虚拟化开关、内存降到 2GB 试 |
| 装完只有 lo,没有网卡 | 安装时网卡开关没打开、VMnet 被禁用 | 改 ifcfg 里 ONBOOT=yes、检查虚拟网络编辑器 |
| yum 报 Cannot find a valid baseurl | 源地址失效 | 改用本地 ISO 源或归档地址 |
| 主机 Windows 蓝屏 | 与其他虚拟化平台冲突 | 关闭系统的虚拟化平台功能,或升级 VMware 版本 |
| 提示需要管理员权限修复 | VMware 服务未正常安装或被拦截 | 以管理员身份运行安装程序,检查服务状态 |
| 找不到侧栏的配置选项 | 界面布局被折叠或安装受损 | 重置界面布局,必要时修复安装 |
| 虚拟机时钟越走越慢 | 未安装工具组件 | 装 open-vm-tools |
| 主机和虚拟机剪贴板不通 | 同上 | 装 open-vm-tools 后重启 |
| 克隆后网络异常 | MAC 地址冲突、网卡名变化 | 生成新 MAC,检查网卡配置文件里的设备名 |
| 主机磁盘突然满了 | 精简置备膨胀、快照堆积 | 清理快照并整合,检查虚拟磁盘目录大小 |
5.2 几个我踩过的深坑
坑一:改了主机名却没改 hosts。有次装完系统顺手把主机名改成了一个自定义名字,结果某几个 Java 服务和 MySQL 启动时卡了十几秒。原因是服务启动时会做一次主机名到 IP 的解析,hosts 文件里没有对应记录,就得走 DNS 查询,超时之后才继续。解决办法是在/etc/hosts里加一行127.0.0.1 你的主机名,这个改动成本极低,收益很高。
坑二:直接复制虚拟机文件夹。很多人图省事,直接把整个虚拟机目录拷贝一份当第二台机器用。两台的 MAC 地址和 UUID 完全一样,同时开机就会出现网络地址冲突、网络时通时断的诡异现象。正确做法是用 VMware 的克隆功能;如果已经复制了,就在虚拟机设置里点"生成新的 MAC 地址",同时把 vmx 配置文件里的 uuid 那几行删掉,让它重新生成。
坑三:主机杀毒软件的实时扫描。这个是性能杀手,但很少有人想到。Windows 上的实时防护会扫描虚拟机磁盘文件的每一次读写,虚拟机里的 IO 操作会被放大成主机上的磁盘扫描,编译和数据库操作能慢好几倍。把虚拟机所在的目录加进排除列表,效果立竿见影。
坑四:快照链越滚越长。有个朋友的虚拟机用了半年,主机盘告急,一查发现虚拟磁盘文件上百 GB。原因是他在不同节点拍了七八个快照,每次都是"删掉"的念头一闪而过但没执行。快照删掉之后还要等 VMware 把增量数据合并回主盘,这个过程很慢,但必须做,不做的话空间不会真正释放。
坑五:安装时选自动分区留给根分区的空间太小。后来的实验要装容器镜像仓库,几百 MB 的镜像一层层堆上去,根分区写满,系统各种服务开始报错。这个只能重装或者在线扩容(先给虚拟磁盘扩容,再用 LVM 把新空间分给根逻辑卷并扩文件系统),都比较折腾,不如一开始就手动分够。
5.3 性能调优的几个开关
虚拟机装好之后,装一套工具组件是提升体验最直接的一步。CentOS 7 里用:
yum install -y open-vm-tools systemctl enable --now vmtoolsd装完之后,主机和虚拟机之间的剪贴板共享、鼠标无缝切换、时间同步就都正常了。如果要用图形界面,再装上 open-vm-tools-desktop。注意,别去装 VMware 菜单里那个"安装 VMware Tools"挂载出来的老版本,用开源的 open-vm-tools 更适配现代内核。
其他几个我常调的开关:不需要图形界面的时候,把显示里的"加速 3D 图形"关掉;如果这台虚拟机只是做一次性实验,磁盘模式可以设成"非持久",关机后所有改动自动丢弃,每次开机都是全新的,特别适合做那些可能会搞坏系统的操作;把虚拟机不需要的声卡、打印机、USB 控制器统统移除,开机速度快一点,也没了设备冲突的可能。
还有一个进阶玩法:如果你的主机内存和时间都充裕,把虚拟机磁盘放到一块独立的固态硬盘上,或者放到内存盘里做临时实验,IO 性能会有肉眼可见的提升。这招在做数据库压力测试的时候尤其管用。
6. 把环境当成资产来管
6.1 做一套自己的基线模板
装了这么多次之后,我的做法变了:不再每次都从零开始装,而是维护一份"基线虚拟机"。这台机器上装好了系统、修好了 yum 源、配好了时区、装好了常用工具、关掉了无用服务、设置了 SSH 密钥登录,然后关机,拍一个快照,再导出一份 OVF 格式当成备份。以后任何新实验,都是从这台基线克隆出来的,五分钟就能开工,省下来的时间全用在正事上。
导出 OVF 的好处是它是标准格式,可以跨 VMware 产品导入,也能当作真正的备份用——放在移动硬盘里,主机重装系统了也不怕。导出的文件是一组 .ovf、.vmdk 和一个清单文件,导入的时候选 .ovf 那个就行。
基线维护起来也不麻烦。每当你在一台克隆机上摸索出一套新的配置,觉得以后还会用到,就把这套配置补到基线里:把基线开机、执行配置、关机、重新拍快照、重新导出。一年下来,这套基线就成了你个人经验的实体化积累。
6.2 迁移与跨版本兼容的注意点
虚拟机用久了总会遇到迁移的需求:换主机、换工作、或者把环境搬到服务器上。有几个点必须留意。
跨 VMware 版本迁移时,向下兼容的规则是虚拟硬件版本不能高于目标产品的支持范围。如果你在 Workstation 17 上创建的虚拟机,硬件版本是 17,想拿到一台只装了 Workstation 15 的机器上打开,就会失败。解决方法是在虚拟机设置里降级硬件兼容版本,VMware 会提示你这样做之后某些功能不可用,一般不影响使用。
如果要把虚拟机从桌面版挪到服务器虚拟化平台上,也要做同样的检查。迁入前先在目标平台上确认它支持的最高虚拟硬件版本,然后把源虚拟机降到那个版本,导出的 OVF 才能顺利导入。
主机之间直接拷虚拟机目录的做法,前面在坑二里说过一次,这里再强调:拷贝之前一定确保虚拟机是关机状态且没有挂起的快照,拷完之后一定要改 MAC 地址和清掉 UUID,这两步不做,你可能会花半天时间在一个根本不存在的问题上。至于主机和虚拟机之间传文件,安装好工具组件之后可以用共享文件夹,配好 SSH 之后可以直接用 scp,都比在 VMware 窗口里拖拽大文件靠谱得多。
6.3 一些零碎但省时间的习惯
虚拟机装好之后,用 SSH 客户端连上去操作,别在 VMware 那个小窗口里打字。窗口里没有像样的复制粘贴,没有滚动缓冲,终端配色也容易出问题。配好静态 IP 之后,在主机上写一个 SSH 配置项,起个别名,以后ssh vm1就能连上去,几分钟的配置能省掉未来几百次输地址。
给每台虚拟机起有意义的机器名,再在主机 hosts 文件里加一份映射,用域名代替 IP。等你手上有五六台虚拟机的时候,这招能救命。另一个习惯是准备一份 markdown 笔记,记下每台虚拟机做了什么改动、装了什么、有哪些坑,三周之后你自己都记不清了,那份笔记就是唯一的线索。
我个人在实际操作中的体会是,装虚拟机这件事本身的技术难度并不高,真正拉开差距的是你有没有把它当成一个可复用的资产来对待。从第一次装的时候顺手拍个快照,到后来把整理好的基线导出备份,这些动作加起来花的时间不多,但它们决定了你后面每一次实验是"五分钟开工"还是"一小时重装"。最后再分享一个小技巧:给虚拟机的虚拟磁盘单独放一个目录,所有虚拟机文件都归拢在那里,定期看一眼这个目录的总大小,顺手清理掉不用的克隆和快照,主机的空间就一直都不会告急。