虚拟机跑 Ubuntu 卡顿这件事,几乎每个用 VirtualBox 的人都撞过:鼠标一动一顿、窗口拖动像在拉橡皮筋、终端敲命令要等半秒才回显。我前后在三台机器上折腾过 VirtualBox 里的 Ubuntu,从最初的"能跑就行"到后来把开机时间从两分半压到二十多秒、把桌面滑动从幻灯片压到基本跟手,踩的坑足够写一篇长文。这篇就把 VirtualBox 运行 Ubuntu 系统卡顿提速的完整思路摊开讲:卡顿到底卡在哪个环节、哪些参数是必须改的、哪些操作看着有用其实白费劲、出问题怎么排查。不管你是第一次装 Ubuntu 虚拟机的新手,还是已经装好但嫌慢想调优的老手,都能直接照着做。
需要先说明一点,卡顿从来不是单一原因,它是宿主机硬件、VirtualBox 全局配置、客户机系统设置、磁盘与图形路径四层叠加的结果。只改一层,往往收效甚微,甚至产生"我改了没用"的错觉。所以下面的顺序是:先定位,再分层动手,最后给一套可以直接抄的配置模板。
1. 虚拟机卡顿到底卡在哪里:先定位再动手
1.1 四类卡顿的不同表现与判断方法
很多人说"虚拟机卡",其实说的不是同一件事。最常见的四类表现,对应的瓶颈完全不同,如果一上来就瞎调参数,很可能把 CPU 那层优化到极致,结果真正卡的是磁盘 I/O。
第一类是界面卡。表现是窗口拖动有拖影、菜单弹出有延迟、鼠标移动不跟手、最大化最小化有动画残影。这类基本是图形渲染路径的问题,跟 CPU 核数关系不大,重点在显存、显卡控制器类型和 3D 加速开关。
第二类是磁盘卡。表现是打开文件慢、apt install卡在解包、编译时硬盘灯狂闪、解压大压缩包像过年。这类是 I/O 瓶颈,根源通常在宿主机用的是机械盘,或者虚拟磁盘用了动态分配且从来不做压缩整理。
第三类是CPU 卡。表现是编译代码时风扇狂转、系统整体像慢动作、top里%sy(系统态占用)特别高。常见原因是分配的核数不够,或者 VT-x 硬件加速没真正启用,VirtualBox 退回到软件模拟执行。
第四类是网络卡。表现是git clone慢、下载软件包龟速、SSH 上去敲命令回显一顿一顿的。这类跟虚拟机设置里的网卡类型和宿主机网络环境有关。
判断方法很简单,在 Ubuntu 里开个终端跑top,再同时进行你平时觉得卡的操作,看哪个指标飙红。如果是%wa(等待 I/O)高,那就是磁盘;如果是%sy高而%us不高,往往是虚拟化加速没开;如果 CPU 和磁盘都很闲但界面还是卡,那就是图形层的问题。
提示:先装上 Guest Additions 再谈优化。没装增强功能的虚拟机,图形、剪贴板、分辨率全都是半残状态,这时候调参数属于给瘸腿的人换跑鞋。
1.2 宿主机的资源账本:CPU 和内存到底该怎么分
分资源有个很朴素的逻辑:虚拟机不是凭空创造算力,它是在跟宿主机抢资源。所以分配的原则是"够用且不挤占宿主机",而不是"越多越快"。
CPU 这块,我的经验值是:分配的虚拟 CPU 数不要超过宿主机物理核心数的一半。比如宿主机是 8 核 16 线程,给虚拟机 4 个 vCPU 比较舒服;4 核 8 线程的机器,给 2 个。为什么不是越多越好?因为 VirtualBox 的虚拟 CPU 需要跟宿主机的物理核心做调度映射,分配的核数超过物理核数时,宿主机得靠时间片轮转来"假装"有那么多核,上下文切换开销反而拖慢整体响应。
内存同理。宿主机 16GB 内存,给虚拟机 4GB 是常见的合理值;32GB 给 8GB。低于 2GB 跑带桌面环境的 Ubuntu 会很痛苦,因为 GNOME 本身空闲状态就要吃掉 1.2GB 左右。高于宿主机内存的一半,宿主机会开始频繁换页,导致宿主机和虚拟机一起变慢,属于双输。
还有一个隐蔽的坑:宿主机上的虚拟化平台冲突。Windows 上如果开了 Hyper-V、WSL2、Windows 沙盒、内核隔离(内存完整性),这些功能会独占处理器的虚拟化扩展。VirtualBox 拿不到 VT-x,就只能用软件模拟执行指令,性能会掉到原来的十分之一量级。这是很多人"配置明明不低但虚拟机就是慢"的真正原因。
验证方法:VirtualBox 里选中虚拟机,看"设置 - 系统 - 加速"标签页,如果"启用 VT-x/AMD-V"是灰色不可勾选,或者启动后右下角出现一个蜗牛图标,就说明硬件虚拟化没生效。解决办法是在 Windows 的"启用或关闭 Windows 功能"里关掉 Hyper-V 和虚拟机平台,再用bcdedit /set hypervisorlaunchtype off关闭引导级虚拟化,重启生效。
1.3 图形渲染路径:为什么界面滑动像放幻灯片
图形这块值得单独说,因为它是最多人抱怨的"卡",也是最容易误诊的。
虚拟机的图形渲染链路是这样的:Ubuntu 的桌面合成器把画面渲染到虚拟显卡的显存,VirtualBox 再把这块显存的内容搬运到宿主机的窗口上。中间多了一层搬运,如果显存不够、显卡控制器类型选错、或者 3D 加速没开,这一层搬运就会变成瓶颈。
显存默认值往往只有 16MB,这个值跑现代桌面环境是不够的。Ubuntu 20.04 之后的 GNOME 在 1080p 分辨率下,光桌面合成就需要 50MB 以上的显存。所以第一步就是把显存拉到 128MB(VirtualBox 的上限),这一步基本是无脑操作。
显卡控制器有几种选择:VBoxVGA 是老控制器,兼容性最好但不支持 3D 加速;VBoxSVGA 是新版默认,支持 3D 但对 Wayland 支持一般;VMSVGA 是模拟 VMware 的显卡,对 Linux 客户机的兼容性最好,Ubuntu 官方镜像默认走的就是这条路。所以 Linux 客户机我一般选 VMSVGA。
3D 加速这个开关要分情况。开了之后 GNOME 的动画会明显顺畅,但在某些 VirtualBox 版本加某些内核版本的组合下,会出现花屏、黑屏、窗口闪烁的毛病。我的做法是:先开启试跑,如果一切正常就留着;如果出现画面异常,就关掉 3D 加速,改用轻量桌面环境来补足流畅度,而不是硬扛。
另外提醒一句,Ubuntu 从某个版本开始默认使用 Wayland 显示服务器,而 VirtualBox 的增强功能对 Wayland 的支持一直不如 Xorg 完善。如果你遇到分辨率不能自动调整、剪贴板共享失效、窗口拖拽异常,可以切回 Xorg:在登录界面点右下角的齿轮图标,选择"Ubuntu on Xorg"再登录。
2. VirtualBox 全局配置:装机前就该定好的参数
2.1 版本选择与扩展包安装
VirtualBox 的版本差异比你想象的大。老版本比如 5.2.44,很多年前确实流行,因为某些网络设备模拟软件锁定了这个版本。但 5.2 系列对新版 Linux 内核的支持已经跟不上,装 Ubuntu 22.04 之后经常出现增强功能编译失败、共享文件夹挂不上、图形驱动不匹配的问题。
如果你没有特殊的软件兼容性要求,我建议用 6.1 的后期版本或者 7.0 系列。这两个系列在 Linux 客户机上的稳定性、图形驱动、NVMe 控制器支持都好了不少。7.0 之后还改进了音频和 USB 的处理。
扩展包(Extension Pack)是另一个必装的东西。它提供 USB 2.0/3.0 控制器支持和远程桌面协议支持。不装扩展包,虚拟机的 USB 只能跑 1.1 速度,插个 U 盘拷数据能让你怀疑人生。装的方法很简单:下载对应版本的扩展包文件,双击,VirtualBox 会自动调起安装向导。注意扩展包的版本号必须跟主程序完全一致,否则会拒绝安装。
2.2 芯片组、I/O APIC、EFI 这些开关怎么选
系统设置标签页里有一堆开关,名字看着很硬核,其实逻辑不复杂。
芯片组选 PIIX3 还是 ICH9。PIIX3 是老式芯片组,兼容性最好;ICH9 支持更多 PCI 设备槽位,如果你需要挂多个虚拟磁盘或者要用到 PCI 直通,选 ICH9。日常用 Ubuntu 桌面,PIIX3 完全够,而且出问题的概率更低。
I/O APIC这个开关,只要你的虚拟机分配的 CPU 数量大于 1,就必须勾上。它负责中断的分发,不勾的话多核虚拟机的中断会全压在 CPU0 上,表现为系统整体响应迟钝但负载看着不高,很容易误判。
EFI启用与否要看客户机系统。Ubuntu 的 ISO 同时支持传统 BIOS 和 EFI 引导,两种都行。但要注意:如果你一开始用 BIOS 模式装了系统,后来把 EFI 打开,系统会启动不了,因为引导记录的位置不一样。这个开关装系统前定好,之后别乱动。
指点设备(鼠标)选"USB 平板"比"PS/2 鼠标"体验好,前者的鼠标定位更精准,不会出现鼠标飘或者点不准的问题。
2.3 处理器与加速:真正决定性能的两个标签页
处理器标签页里,除了核数,还有人容易忽略的执行功能:PAE/NX 保持默认勾选,嵌套分页(Nested Paging)必须勾上。嵌套分页让虚拟机的内存地址转换由硬件直接完成,不勾的话每次内存访问都要经过两层页表翻译,性能损失肉眼可见。
加速标签页是重中之重,三个选项:
- 启用 VT-x/AMD-V:核心开关,必须勾,勾不上说明宿主机虚拟化被占用。
- 启用嵌套分页:必须勾,硬件辅助内存管理。
- 半虚拟化接口:这个选项很多人空着。对 Linux 客户机建议选 KVM,对 Windows 客户机选 Hyper-V。半虚拟化接口能让客户机知道自己跑在虚拟机里,从而使用更高效的虚拟化调用路径,减少特权指令陷入的开销。实测在 Ubuntu 上选 KVM 之后,
sysbench的 CPU 得分能提升一成左右。
注意:如果加速标签页里的选项全是灰的,不要硬着头皮往下装系统,先把宿主机层面的虚拟化冲突解决掉,否则后面所有优化都是徒劳。
2.4 磁盘控制器与镜像格式:I/O 性能的地基
存储设置是很多人完全跳过的地方,但它对流畅度的影响极大。
控制器类型上,VirtualBox 现在支持 IDE、SATA、SAS、NVMe、virtio-scsi。老教程都教选 SATA,这没错,SATA 兼容性好,Linux 内核自带驱动。但如果你用的 VirtualBox 版本在 6.0 以上,客户机是 Ubuntu 20.04 之后的版本,可以考虑 NVMe 控制器。NVMe 在虚拟化下的命令队列更深,大量小文件读写的表现比 SATA 好一截,编译和包管理的体感差异明显。
勾选"固态驱动器"这个选项。它不会让你的虚拟磁盘真的变成 SSD,但它会告诉客户机系统这是一块 SSD,Ubuntu 收到这个信号后会启用 TRIM 支持和不同的 I/O 调度策略,对响应速度有帮助。
"宿主 I/O 缓存"建议勾上。它让宿主机把虚拟磁盘的读写先缓存在内存里,能显著减少磁盘等待。代价是万一宿主机突然断电,虚拟机数据可能有损坏风险。如果是开发测试环境,勾上换取性能是划算的;如果有重要数据,可以定期做备份而不是关掉缓存。
镜像格式方面,VDI 是 VirtualBox 的原生格式,性能最好;VMDK 是兼容 VMware 用的;VHD 是兼容微软的。没有跨平台需求就用 VDI。至于"动态分配"和"固定大小",固定大小的镜像在写入时少了扩展文件的开销,性能略好,占用空间也直观。但如果你磁盘空间紧张,动态分配更灵活。我的做法是:常用虚拟机用固定大小,临时测试的用动态分配。
3. Ubuntu 客户机侧的提速操作
3.1 增强功能安装:所有优化的前提
增强功能(Guest Additions)是 VirtualBox 提供的一套客户机驱动,包含显卡驱动、鼠标集成、剪贴板共享、共享文件夹、时间同步等模块。不装它,前面所有配置的收益都要打对折。
安装流程是这样:先启动虚拟机,等系统起来后在 VirtualBox 菜单里点"设备 - 安装增强功能",这会把一个 ISO 挂载进客户机。然后在 Ubuntu 里打开终端,先装编译依赖:
sudo apt update sudo apt install -y build-essential dkms linux-headers-$(uname -r) gcc make perl这一步经常被跳过,导致后面的安装脚本因为找不到内核头文件而失败。装完依赖后,挂载并运行安装脚本:
sudo mkdir -p /mnt/cdrom sudo mount /dev/cdrom /mnt/cdrom cd /mnt/cdrom sudo ./VBoxLinuxAdditions.run安装完重启虚拟机。重启后可以跑lsmod | grep vbox检查模块是否加载,正常应该能看到vboxguest、vboxsf、vboxvideo这几个。
如果安装过程中报错说"找不到内核头文件",通常是linux-headers-$(uname -r)这个包版本对不上,因为 Ubuntu 内核更新后头文件包可能没同步装上。解决办法是先跑sudo apt install linux-headers-generic,或者先sudo apt full-upgrade升级内核后重启再装。
3.2 内核参数与内存管理调优
Ubuntu 默认的内存管理参数是按物理机场景定的,放在虚拟机里不一定合适。几个值得调的:
vm.swappiness。默认值 60,意思是内存压力还没那么大的时候就开始往交换分区倒数据。虚拟机里磁盘本来就慢,一旦开始交换就是灾难。建议降到 10:
echo 'vm.swappiness=10' | sudo tee -a /etc/sysctl.conf sudo sysctl -pvm.dirty_ratio 和 vm.dirty_background_ratio。这两个控制脏页回写阈值。虚拟机磁盘写入慢,如果一次攒太多脏页,回写时会有一个明显的卡顿尖峰。可以把后台回写阈值调低,让写入更早、更平滑地发生:
sudo tee -a /etc/sysctl.conf <<EOF vm.dirty_background_ratio=5 vm.dirty_ratio=15 EOF sudo sysctl -p交换分区大小。Ubuntu 默认创建的 swap 文件在内存小的虚拟机里会频繁被使用。如果宿主机内存充足,建议给虚拟机多分点内存,而不是靠 swap 撑着。如果确实需要 swap,把它放在 SSD 所在的虚拟磁盘上。
另外,如果虚拟机内存分配得比较小,可以考虑启用 zram,用压缩内存代替磁盘交换:
sudo apt install -y zram-tools在/etc/default/zramswap里设置PERCENT=50,这样最多用一半内存做压缩交换。内存压缩的读写速度比磁盘交换快两三个数量级,在内存紧张的虚拟机里效果立竿见影。
3.3 关掉那些你不知道在跑的后台服务
Ubuntu 桌面版默认装了一堆后台服务,在物理机上没什么感觉,在虚拟机里就是白白的资源消耗。
unattended-upgrades是自动更新服务,它会在后台悄悄下载更新包,占用网络和磁盘 I/O。如果你不希望虚拟机在你干活时突然卡一下,可以关掉自动下载:
sudo systemctl disable --now unattended-upgradesapport是崩溃上报服务,会在程序崩溃时收集大量信息并写盘。开发环境下不需要:
sudo systemctl disable --now apporttracker是 GNOME 的文件索引服务,它会遍历你的整个家目录建立索引。如果你的项目目录里有一堆node_modules,这个索引过程能持续好几分钟,期间磁盘持续高负载。可以直接禁掉:
systemctl --user mask tracker-store tracker-miner-fs-3snapd的自动刷新也值得注意。Ubuntu 会定期检查并更新 snap 包,这个过程会占用相当多的资源。可以在设置里把自动刷新时间改到你不用虚拟机的时候,或者直接禁用:
sudo systemctl disable --now snapd.refresh.timer3.4 桌面环境:GNOME 太重就换掉
如果你把上面这些都做完还是觉得界面不跟手,那瓶颈很可能就是桌面环境本身。GNOME 3 之后的版本是围绕现代硬件设计的,特效、动画、布局计算都很吃资源,在虚拟机的软件渲染路径下容易力不从心。
切换轻量桌面的思路是:保留 Ubuntu 系统基础,只换桌面。装 Xfce 是最常见的做法:
sudo apt install -y xubuntu-desktop安装时如果提示选择显示管理器,选 lightdm。装完重新登录,在登录界面选择 Xfce 会话。Xfce 在虚拟机里的流畅度通常比 GNOME 高一个档次,内存占用也从 1.2GB 降到 400MB 左右。
如果还嫌重,LXQt 或 IceWM 更轻,但界面观感会朴素一些。我的建议是:开发主力虚拟机用 Xfce,够用且熟悉;临时的测试环境可以考虑 Ubuntu Server 版本加最小化桌面,甚至只用命令行。
还有一个小技巧,即使不换桌面,也可以关掉 GNOME 的动画:
gsettings set org.gnome.desktop.interface enable-animations false动画一关,窗口切换和菜单弹出会立刻感觉"跟手"了很多,这是性价比最高的一步。
4. 磁盘与共享目录:最容易被忽略的性能黑洞
4.1 虚拟磁盘的预分配与压缩整理
虚拟磁盘用久了会有一个问题:文件只增不减。你今天写了 10GB 数据又删掉了,虚拟磁盘文件依然是 10GB 之后的大小,而且这些"空洞"会让 I/O 变得碎片化。
压缩虚拟磁盘分两步。先在 Ubuntu 里把空闲空间用零填满,让 VirtualBox 知道这些块可以回收:
dd if=/dev/zero of=/zerofill bs=1M status=progress sync rm -f /zerofill sync注意dd会一直写到磁盘满然后报错退出,这是正常的。填完之后关机,在宿主机上跑:
VBoxManage modifymedium disk "路径/xxx.vdi" --compact这个命令会扫描全零块并回收,通常能省下不少空间,同时减少碎片。我的经验是,一个用了半年的开发虚拟机,压缩后体积能缩掉三成,启动速度也有改善。
如果你的虚拟磁盘是动态分配的,还可以考虑转换成固定大小。转换需要克隆一份,时间较长,但从动态转固定之后,写入延迟会明显降低:
VBoxManage clonemedium disk "源.vdi" "目标.vdi" --variant Standard4.2 共享文件夹的真实性能与替代方案
共享文件夹是 VirtualBox 很方便的功能,但它的性能真的不怎么样。它走的是 VirtualBox 自己实现的一套文件系统协议,大量小文件读写时延迟高得离谱。我实测过在一个共享目录里跑npm install,比在虚拟机本地目录跑慢了大概四倍。
所以第一条原则是:不要把项目代码放在共享文件夹里编译。正确做法是把代码放在虚拟机的本地磁盘,用共享文件夹只做文件交换。
如果确实需要频繁在宿主机和虚拟机之间同步代码,有几个更好的选择。一是用 SSHFS 挂载,性能比共享文件夹好一些,而且支持缓存;二是用 rsync 做单向同步,改动后触发一次同步,速度最快;三是用 Git 仓库做中转,宿主机和虚拟机各自 clone 一份,通过网络推送拉取。
宿主机的共享目录也要注意放在哪个盘。如果共享目录在机械盘上,虚拟机读它的时候速度会很慢。放在 SSD 上体验好很多。
4.3 快照管理:方便但不免费的代价
快照是 VirtualBox 的一个好用功能,可以在任意时刻保存虚拟机状态,出问题了回滚。但快照的代价经常被低估。
快照的原理是记录磁盘的增量变化,每创建一个快照,后续的写入都会先写到增量文件里。快照链越长,读写路径就越复杂,性能下降越明显。我见过有人给虚拟机打了几十个快照,最后虚拟机慢得像在泥里走路。
我的做法是保持快照链不超过两层,用完就删。删除快照时选择"合并"而不是"删除",把增量数据合并回主磁盘。如果某个快照不再需要,尽早合并掉。
另外,快照不要当备份用。快照文件跟原磁盘是绑定关系,一旦主磁盘文件损坏或者丢失,快照也就废了。真正的备份应该是把虚拟磁盘文件复制到另一块盘上。
5. 常见问题排查速查表
5.1 启动报 Kernel driver not installed (rc=-1908) 怎么办
这个报错几乎每个 Linux 用户都遇到过,意思是 VirtualBox 的内核模块没有正确编译或加载。原因通常是系统内核更新了,但 VirtualBox 的模块还是为旧内核编译的。
标准的修复流程是重新编译内核模块:
sudo /sbin/vboxconfig如果这一步报错,说明编译环境不全。先装头文件和编译工具:
sudo apt install -y linux-headers-$(uname -r) build-essential sudo /sbin/vboxconfig还有一个隐蔽的原因:Secure Boot。如果宿主机开了安全启动,未签名的内核模块会被拒绝加载。这时候vboxconfig会提示你需要给模块签名。解决办法是要么在 BIOS 里关掉 Secure Boot,要么按照提示用 MOK 工具注册密钥。用 MOK 的流程是:vboxconfig会提示你设置一个密码,然后重启,在启动过程中会出现蓝屏界面,选择 Enroll MOK,输入刚才的密码,完成后模块就能加载了。
如果以上都试过还是不行,检查一下是不是宿主机装了多个版本的内核,当前启动的内核版本和头文件版本不一致。用uname -r看当前内核,用dpkg -l | grep linux-headers看装了哪些头文件,对不上就补装。
5.2 剪贴板、分辨率、拖拽失效的组合处理
这三个问题经常一起出现,因为它们都依赖增强功能里的同一个模块。
先确认增强功能装没装、装对没有。在 Ubuntu 里跑lsmod | grep vbox,如果vboxguest和vboxsf都在,说明模块加载正常。然后检查 VirtualBox 的"设备 - 共享剪贴板"是不是设成了"双向"。这两步都对,剪贴板还是不通,多半是显示服务器的问题。
如果用的是 Wayland 会话,切到 Xorg 试试。登录界面点右下角齿轮,选 Ubuntu on Xorg。切过去之后剪贴板、拖拽、自动调整分辨率通常都能恢复正常。
分辨率不能跟随窗口大小变化,还有一个可能是增强功能里的显示驱动没生效。可以手动设置一个固定分辨率,在 VirtualBox 的"视图 - 虚拟屏幕"里调整,或者用命令注入自定义分辨率:
VBoxManage setextradata "虚拟机名称" "CustomVideoMode1" "1920x1080x32"5.3 网络卡顿与网卡类型的选择
虚拟机网络模式有几种:NAT、桥接、仅主机、内部网络、NAT 网络。性能上差别不大,但使用场景不同。
NAT 是最省事的,虚拟机通过宿主机上网,宿主机不用做任何配置,但外部设备访问不到虚拟机。桥接模式让虚拟机直接从路由器拿 IP,网速通常比 NAT 略快,因为少了一层地址转换,适合需要被外部访问的场景,比如虚拟机里跑个 Web 服务让手机测试访问。
网卡类型建议选"半虚拟化网络(virtio-net)"。它比默认的 Intel PRO/1000 效率高,CPU 占用低。但要注意,选 virtio-net 之前必须先装好增强功能或者系统自带 virtio 驱动,否则虚拟机起来之后会看不到网卡。Ubuntu 从 18.04 之后的内核都自带 virtio 驱动,所以直接选没问题。
如果发现虚拟机里下载速度只有宿主机的几分之一,先检查是不是被宿主机的安全软件限速了,再检查网卡类型。另外,如果你用的是无线网络,桥接模式下偶尔会有兼容性问题,可以试试切回 NAT。
5.4 与其他虚拟化软件的冲突处理
宿主机上同时装多个虚拟化软件是常见的冲突来源。VirtualBox 和 Hyper-V 抢处理器虚拟化扩展是最典型的,前面已经说过关闭方法。
另一个真实存在的情况是,某些网络设备模拟软件会锁定特定版本的 VirtualBox。比如老版本的网络模拟器要求 VirtualBox 必须是 5.2.x,而你为了跑 Ubuntu 装了 7.0,结果两边都启动不了。这种冲突没有银弹,可行的方案是装两个版本的 VirtualBox 到不同目录,用哪个启动哪个,但要注意驱动程序会互相覆盖,切换时需要重新跑一次vboxconfig。
还有一个容易忽略的点:Windows 上的"内核隔离"和"内存完整性"功能。它们在设置 - 隐私和安全性 - Windows 安全中心 - 设备安全性里。这两个功能开启后会用虚拟化技术保护系统内核,代价就是 VirtualBox 的性能大幅下降。如果你的机器不需要这个额外的安全层,关掉它对虚拟机的提速效果非常明显。
6. 一套可以直接抄的配置模板与实测记录
6.1 关键参数速查表
下面这张表是我在一台 8 核 16 线程、32GB 内存、NVMe 固态的 Windows 机器上,跑 Ubuntu 22.04 桌面版的实际配置,可以直接照着填。
| 配置项 | 位置 | 建议值 | 说明 |
|---|---|---|---|
| 内存 | 系统 - 主板 | 8192MB | 不超过宿主机内存一半 |
| CPU 核数 | 系统 - 处理器 | 4 | 不超过物理核心数一半 |
| 嵌套分页 | 系统 - 处理器 | 勾选 | 硬件内存管理,必开 |
| 半虚拟化接口 | 系统 - 加速 | KVM | Linux 客户机专用 |
| 显存 | 显示 | 128MB | 拉到上限 |
| 显卡控制器 | 显示 | VMSVGA | Linux 兼容性最好 |
| 3D 加速 | 显示 | 先开后测 | 花屏则关闭 |
| 磁盘控制器 | 存储 | NVMe 或 SATA | 6.0 以上可选 NVMe |
| 固态驱动器 | 存储 | 勾选 | 启用 TRIM 和优化调度 |
| 宿主 I/O 缓存 | 存储 | 勾选 | 提升 I/O 响应 |
| 网卡类型 | 网络 | virtio-net | CPU 占用低 |
| 磁盘格式 | 存储 | VDI 固定大小 | 性能优于动态分配 |
客户机系统侧的调优项,整理成一张对照表:
| 调优项 | 命令或位置 | 效果 |
|---|---|---|
| 安装增强功能 | 设备菜单 + 脚本 | 图形和共享功能的基础 |
| swappiness | /etc/sysctl.conf | 减少交换,降低卡顿尖峰 |
| 脏页回写阈值 | /etc/sysctl.conf | 写入更平滑 |
| 禁用 tracker | systemctl --user mask | 减少磁盘索引负载 |
| 禁用自动更新 | systemctl disable | 避免后台抢占 I/O |
| 关闭动画 | gsettings | 界面立刻跟手 |
| 换 Xfce 桌面 | apt install | 内存占用降六成 |
6.2 提速前后的实测对比
为了有个直观参考,我记录了一组数据。测试环境是同一台机器、同一个 Ubuntu 22.04 镜像,唯一变量是配置。
优化前:开机到登录界面 148 秒,内存占用 3.1GB,apt install一个中等大小的包耗时 26 秒,拖动窗口有明显拖影,终端回显有可感知延迟。
优化后:开机到登录界面 23 秒,内存占用 1.4GB,同样的apt install耗时 8 秒,窗口拖动跟手,终端回显基本无感。
这里面贡献最大的三项分别是:关闭宿主机的内核隔离和 Hyper-V(这一项单独就贡献了接近一半的提升)、安装增强功能并把显存拉到 128MB、以及禁用 tracker 和自动更新。剩下的内核参数微调和桌面环境切换属于锦上添花,但累积起来也有明显体感。
需要提醒的是,不同硬件平台的数据差异会很大。机械硬盘的机器,磁盘 I/O 会是绝对瓶颈,优化上限明显低于固态硬盘;内存只有 8GB 的机器,把虚拟机内存压到 2GB 以内、同时用 zram 压缩交换会更实际。
6.3 一个被我踩过的坑:别迷信"全核心分配"
我早期有个错误认知,觉得给虚拟机分配越多核越流畅,于是一台 8 核机器给虚拟机分了 8 个 vCPU。结果虚拟机比之前更卡,宿主机也变得一顿一顿。
后来才想明白:VirtualBox 的虚拟 CPU 是要和物理核心做映射的,当 vCPU 数等于物理核心数时,VirtualBox 在调度某个虚拟 CPU 时需要等待一个完整的物理核心空闲,等待时间反而变长。更糟的是宿主机自己还要运行,抢占之后双方都在等。
正确做法是留出余量。给虚拟机分配物理核心数的一半左右,让宿主机始终有空闲核心可用,整体响应反而最好。这个规律在内存分配上也成立。
还有个相关的坑是"CPU 执行上限"这个设置。它的本意是限制虚拟机最多占用多少宿主机 CPU 时间,默认 100% 表示不限制。有些人为了"让虚拟机别太快影响宿主机"把它调到 50%,结果虚拟机性能直接砍半。除非你确实需要做资源隔离,否则保持 100%。
6.4 长期使用的维护习惯
虚拟机提速不是一次性的活,用的时间长了性能会慢慢退化,有几个习惯能帮你维持状态。
第一,每两三个月做一次磁盘压缩,把删除文件留下的空洞回收掉。前面给过dd填零加VBoxManage --compact的组合,做完重启一次。
第二,定期清理快照。检查有没有忘记删的旧快照,快照链超过两层就该合并了。
第三,给虚拟磁盘留足空间。宿主机的物理磁盘使用率超过 90% 之后,写入性能会断崖式下降。保持至少 15% 的可用空间,虚拟机的 I/O 表现才正常。
第四,如果虚拟机长期不用,别只是挂起,直接关机。挂起状态会持续占用宿主机内存和一部分后台资源。
第五,定期更新增强功能。升级了 VirtualBox 主程序之后,客户机里的增强功能也要跟着重装一遍,否则可能出现驱动不匹配的问题。
我个人在实际操作中的体会是,虚拟机提速最忌讳"到处试参数"。先花十分钟用top定位瓶颈在哪一层,然后针对那一层动手,比盲目调二十个选项有效得多。另外,宿主机侧的准备工作往往比虚拟机内部调优更重要,尤其是关闭 Hyper-V 和内核隔离这一步,很多人跳过了它,然后在虚拟机里折腾半天内核参数,最后效果甚微。如果你现在正准备装第一台 Ubuntu 虚拟机,建议按照本文的配置表先把参数填好再装系统,能省掉后面大量的返工。