欢迎回来
登录你的知识库账户
忘记密码?
还没有账户?立即注册
创建账户
注册你的专属知识库
已有账户?去登录
找回密码
输入注册邮箱获取验证码
返回登录
请输入图片中的验证码以继续注册
加载中...
取消
新建收藏
手动添加你喜欢的内容
取消
编辑头像与昵称
上传新头像或修改你的显示昵称
支持 JPG/PNG,最大 2MB
取消

问题反馈

notebasewww.notebase.cn
控制台
内容库
动态
管理
账户
U
用户
--
在线
v0.8.7 · 知识库
笔记
KnowledgeBase
网络无边,知识有迹。
0笔记
0工具
30推荐

分类导航

按主题直达

编辑精选

站内用户贡献 · 真实笔记

最新收录

每日更新
继续浏览全部内容 →
>
笔记
0
加载中...
工具
0
此页用于记录用户反馈问题后的每一次改进
笔记用法

“写笔记”支持四种格式——Word 文档、Excel 表格、Markdown、纯文本,起稿或二次编辑时都能随时切换,同一篇笔记想用哪种形态来记,都由你说了算。

md、txt、csv、json 这类纯文本则原样载入,不做多余加工。拿一张现成的表倒进来、改几笔、再导出去,等于白用一台免费的格式转换器。

要带走就在右上角点“下载”,可导出 PDF、Word、Markdown、Excel、TXT 等格式;列表卡片“⋯”菜单里,也有同样的下载入口。

工具用法

在“工具”页点“+ 上传工具”即可发布:填好名称与链接,再用 Markdown 把使用方法写清楚——能解决什么问题、怎么装、怎么用,比堆介绍实在。

要分发安装包就一并上传压缩包(ZIP、RAR、7Z、TAR.GZ,最大 35MB),别人在详情页一键下载;只放链接不带附件也可以。

工具按大家的收藏热度排序,好用的自然会被顶上来。发布后可在详情页或卡片菜单里编辑、下架。

隐藏笔记

写笔记时勾上“隐藏”,这篇就只存在于你自己的账号里:不进列表、不进搜索、不上首页精选,也不会出现在任何公开的页面,链接发给别人同样打不开。

适合放密码、草稿、日记这类只给自己看的内容;想公开,去“发布”打开它,把“隐藏”的勾去掉再保存,之后编辑会默认保持原状态,不会悄悄变回公开。

数据安全

你的内容会同时保存在多个副本上,系统定期做备份与完整性校验,再配合异地容灾机制:就算某台机器出问题,数据也不会丢,可以长期放心存放;特别重要的资料,仍建议你另外再留一份备份。

技术

全站跑在容器化、模块化的现代架构上,更新、部署、回滚都很快,扩展性和稳定性都按长期运营的标准来设计(Built for reliability, designed to scale)。

理念

这个网站最早只是一个人的笔记仓库,后来慢慢长成现在的知识中枢。设计上很克制——没有广告、没有追踪、没有推荐算法,只是干干净净地存放一些东西;既然做好了,就公开出来,万一有人用得上呢。

原则

不做大而全,不做平台梦,保持简单、保持克制、保持好奇。所有内容都由用户贡献、由用户维护:不会突然冒出付费墙,不会在角落塞广告位,也不会把你的数据卖给第三方。

更多

产品会持续迭代,站内日志页记录着每一次改动,改了什么都有迹可循;想了解这个站是怎么一步步走到今天的,翻翻日志就能看到来龙去脉。

举报

如果在这里看到涉嫌违规的内容,点对应卡片右侧的“举报”按钮就能提交,我们会尽快核实处理;也谢谢你花一点时间,一起把这里维护干净。

趋势
// 点击导航加载发现
归档
// 归档为空
最近浏览
// 暂无浏览记录
发布
// 加载中...
用户发布
// 加载中...
用户管理
// 加载中...
访问统计
// 加载中...
内容审核
// 加载中...
个人信息
// 加载中...
返回首页

在Windows宿主机上回收VirtualBox虚拟机的空闲磁盘空间

2026/7/5操作系统

前言

用VirtualBox跑虚拟机,最烦人的一件事就是:你在虚拟机里删了一堆文件,明明应该腾出不少空间,结果回头一看宿主机上的.vdi虚拟磁盘文件,大小纹丝不动。这是为啥呢?说白了,虚拟机里的“删除”只是把文件标记为可覆盖,数据还在磁盘上占着位置。宿主机看到的是整个虚拟磁盘文件,它可不知道哪些块是“空的”。

要真正把空间还给宿主机,我们需要手动把虚拟机里那些被标记为“空闲”的磁盘块全部用零覆盖掉,然后让VirtualBox去压缩这些全是零的块。这篇文章就是手把手教你干这个活。


准备工作

你需要什么

  • 一台运行Linux的VirtualBox虚拟机(我假设你用的是常见的发行版,比如Ubuntu、Debian、CentOS之类的)
  • 一个Windows宿主机(用来跑VBoxManage.exe)
  • 虚拟机里装了zerofree工具(后面会讲怎么装)
  • 能编辑GRUB引导参数
  • 基本的命令行操作能力

第一步:安装zerofree

zerofree是一个小工具,专门用来把文件系统里未被使用的块用零填充。它比直接dd if=/dev/zero of=...要高效得多,因为它只处理真正空闲的区域,不会把整个磁盘写一遍。

在虚拟机里执行:

# Debian/Ubuntu系
sudo apt update
sudo apt install zerofree -y

# RHEL/CentOS系
sudo yum install epel-release -y
sudo yum install zerofree -y

装完之后别急着跑,直接运行会报错,因为文件系统必须是只读模式才能用这个工具。


第二步:让根文件系统以只读方式挂载

zerofree要求目标分区是只读挂载的。如果你要清理的是非根分区(比如/home单独分区),直接mount -o remount,ro /dev/sdX就行。但如果是根分区/,你没法在系统运行的时候把它重挂为只读,因为系统本身在读写它。

最靠谱的办法:启动时直接进入单用户模式,把根挂成只读。具体做法是修改GRUB引导参数。

编辑GRUB配置

sudo nano /etc/default/grub

找到这一行:

GRUB_CMDLINE_LINUX_DEFAULT="quiet splash"

改成:

GRUB_CMDLINE_LINUX_DEFAULT="quiet splash init=/bin/bash"

这里加上的init=/bin/bash意思是让内核启动后直接运行bash shell,而不是正常的init系统(systemd或sysvinit)。这样文件系统会被挂载,但因为没有init进程去执行挂载脚本,根分区默认就是只读的。

更新GRUB

sudo update-grub

如果用的是旧版系统,可能是:

sudo grub-mkconfig -o /boot/grub/grub.cfg

重启进入只读模式

sudo reboot

虚拟机重启后,你会直接进入一个bash shell,没有登录提示,没有服务,只有命令行。这时候根文件系统是只读的。

验证一下:

mount | grep " / "

输出里应该能看到ro字样,比如:

/dev/sda1 on / type ext4 (ro,relatime)

如果显示的是rw,说明没生效,检查一下GRUB参数有没有写对。


第三步:运行zerofree

现在确定根是只读的,就可以跑zerofree了。先确认你的根分区设备名:

lsblk

通常第一块磁盘是/dev/sda,根分区可能是/dev/sda1或者/dev/sda2。用df -h也能看到。

然后执行:

zerofree -v /dev/sda1

解释一下参数:

  • -v:verbose模式,显示进度。没有这个参数就只能干等。
  • /dev/sda1:目标分区,根据你的实际情况改。

这个命令跑多久?完全取决于你的虚拟磁盘大小和空闲空间量。一个50GB的磁盘,如果里面有一半是空闲的,可能跑个十几分钟到半小时。如果磁盘很大(比如200GB+),那就去泡杯咖啡再看。

你会看到输出类似:

zerofree: scanned 1024000 blocks, 512000 were zeroed

每一行都在告诉你扫描了多少块,其中多少块被写成了零。

等到命令执行完毕,回到bash提示符,就说明搞定了。


第四步:正常启动系统

zerofree跑完后,你需要让系统正常启动。因为当前是在bash shell里,没有init进程,所以直接执行:

exec init

这会启动系统的init进程,继续正常的引导流程。系统会像平时一样启动,进入登录界面。

登录进去之后,别忘了把GRUB参数改回来,否则每次启动都会进bash shell。

恢复GRUB参数

sudo nano /etc/default/grub

把刚才加的init=/bin/bash删掉,恢复成原来的样子:

GRUB_CMDLINE_LINUX_DEFAULT="quiet splash"

然后更新GRUB:

sudo update-grub

第五步:关闭虚拟机

现在虚拟机里的空闲空间已经被零填满了,但宿主机上的.vdi文件大小还没变。要让VirtualBox知道哪些块可以压缩,虚拟机必须处于关闭状态(不能是保存状态,也不能是休眠)。

sudo shutdown -h now

或者直接在VirtualBox窗口里点“关闭虚拟机” -> “关机”。


第六步:在宿主机上执行压缩命令

这一步在Windows宿主机上操作。打开命令提示符(cmd)或者PowerShell,确保VBoxManage.exe在PATH里。通常它安装在C:\Program Files\Oracle\VirtualBox\。

找到虚拟磁盘路径

先确认你的.vdi文件在哪里。比如我的虚拟机叫Ubuntu20,磁盘文件可能在:

C:\Users\你的用户名\VirtualBox VMs\Ubuntu20\Ubuntu20.vdi

执行压缩

VBoxManage.exe modifymedium "C:\Users\你的用户名\VirtualBox VMs\Ubuntu20\Ubuntu20.vdi" --compact

注意:modifymedium这个命令在旧版VirtualBox里叫modifyvdi或者modifyhd,新版统一成了modifymedium。如果你用的是老版本,试试:

VBoxManage.exe modifyhd "路径" --compact

压缩过程

这个命令会读取.vdi文件,找到那些全是零的块,然后把它们从磁盘镜像里移除。压缩时间取决于磁盘大小和空闲比例。一个40GB的磁盘,如果里面有20GB是零,可能跑10-20分钟。

输出类似于:

0%...10%...20%...30%...40%...50%...60%...70%...80%...90%...100%

压缩完成后,去文件管理器里看看.vdi文件的大小,应该明显变小了。


一些补充说明和踩坑经验

关于zerofree的其他用法

如果你只想清理非根分区(比如/home单独分区),可以不用改GRUB,直接:

sudo mount -o remount,ro /dev/sdX
sudo zerofree -v /dev/sdX
sudo mount -o remount,rw /dev/sdX

但注意:如果该分区上有任何进程在读写,remount,ro会失败。所以最好在单用户模式下操作。

为什么不用dd?

很多人会想到用dd if=/dev/zero of=/bigfile bs=1M,然后删掉大文件。这个方法也能用,但有几个缺点:

  1. 它会写满整个磁盘剩余空间,如果磁盘很大,时间很长。
  2. 如果磁盘剩余空间特别大(比如几百GB),dd可能会把宿主机磁盘也撑爆,因为虚拟机里的写操作会先膨胀虚拟磁盘文件。
  3. 需要确保大文件被正确删除,并且sync一下。

zerofree只处理文件系统里标记为“空闲”的块,更精准,也更快。

VirtualBox的压缩机制

--compact参数并不是对所有虚拟磁盘格式都有效。它只支持动态分配的VDI和VHD格式。如果你用的是固定大小的VDI(Fixed size),或者VMDK格式,这个命令可能不起作用。创建虚拟机时,如果选了“预分配完整大小”,那就没法压缩了。

关于性能

zerofree在只读文件系统上运行,理论上不会损坏数据。但任何涉及磁盘低级操作的工具都有风险,建议操作前备份重要数据,或者给虚拟机拍个快照。

如果zerofree报错

常见错误:

  • zerofree: /dev/sda1: filesystem is not mounted read-only:文件系统不是只读的,检查挂载状态。
  • zerofree: /dev/sda1: failed to open: Device or resource busy:有进程在使用该分区,确保没有其他挂载点。

总结

整个流程可以浓缩为:

  1. 虚拟机内装zerofree
  2. 改GRUB参数,重启进入只读bash
  3. 运行zerofree -v /dev/sdX
  4. exec init正常启动
  5. 恢复GRUB参数,更新GRUB
  6. 关机
  7. 宿主机上执行VBoxManage.exe modifymedium "路径" --compact

这样一套操作下来,虚拟磁盘文件就能瘦身成功。这个过程虽然有点折腾,但比起直接重装虚拟机或者手动删文件,已经省事太多了。而且搞过一次之后,下次就轻车熟路了。

如果你经常需要回收空间,可以考虑写个脚本,把zerofree步骤自动化。但改GRUB那一步还是得手动操作,因为涉及到系统引导。

希望这篇文章能帮到你。如果有任何问题,欢迎在评论区交流。

编写使用方法
Markdown 格式 · Ctrl+Enter 确定
新建笔记
预览
数据表格
点击单元格编辑 · Tab 移动
A1fx
Sheet1
BIH1H2≡🔗</>
隐私提醒

取消
编辑工具
取消