VirtualBox 虚拟机磁盘扩容完整指南
本文详细记录了将 VirtualBox 虚拟机的系统盘从 40GB 扩展到 100GB 的完整过程,适用于 CentOS 7 操作系统。内容包括前置准备、两种扩容方案、详细操作步骤、故障排查以及数据安全建议。
目录
前置知识
什么是虚拟磁盘?
VirtualBox 的虚拟磁盘是宿主机上的一个文件(.vdi 或 .vmdk),模拟真实硬盘供虚拟机使用。
| 虚拟磁盘格式 | 说明 | 能否直接 resize |
|---|---|---|
.vdi |
VirtualBox 原生格式 | 支持(通过 modifymedium --resize) |
.vmdk |
VMware 兼容格式 | 不支持,需要转换 |
.vhd |
Hyper-V 兼容格式 | 不支持,需要转换 |
为什么需要扩容?
虚拟机磁盘满分为两种情况:
| 情况 | 表现 | 解决方案 |
|---|---|---|
| 根分区空间不足 | df -h / 显示 100% |
扩容根分区 |
| 磁盘文件大小限制 | VirtualBox 限制 | 扩展虚拟磁盘文件后再扩分区 |
基本概念
物理磁盘(宿主机)
└── 虚拟磁盘文件(.vdi)
└── 磁盘分区(/dev/sda1, /dev/sda2)
└── 文件系统(ext4/xfs)
└── 挂载点(/)
| 概念 | 说明 |
|---|---|
| 分区(partition) | 磁盘的逻辑划分,类比Windows的C盘、D盘 |
| 文件系统(filesystem) | 存储数据的格式,CentOS 7默认xfs,之前默认ext4 |
| 挂载点(mount point) | Linux中访问分区的路径,根分区挂载在 / |
| 起始扇区(start sector) | 分区起始位置,扩展时必须保持一致 |
扩容方案对比
| 方案 | 优点 | 缺点 | 适用场景 |
|---|---|---|---|
| 方案一:新加磁盘 | 不影响原数据,操作简单 | 数据分散在两个磁盘 | 快速解决存储问题 |
| 方案二:扩展现有磁盘 | 整合到一块盘 | 需要分区重建,有风险 | 长期使用,磁盘整合 |
思维导图:扩容方案选择
磁盘扩容
├── 新加磁盘(数据不动)
│ ├── 虚拟机存储设置中新增 vdi
│ ├── Linux 内分区格式化
│ ├── 挂载到目录
│ └── 迁移数据
│
└── 扩展现有磁盘(一步到位)
├── vmdk 需转 vdi(vdi 可直接 resize)
├── 扩展 vdi 文件大小
├── 替换虚拟机磁盘
├── Linux 内重建分区(保持起始扇区)
└── 扩展文件系统
方案一:新加磁盘(推荐)
适用场景
- 不想冒险动现有分区
- 快速解决存储问题
- 有多个服务需要分离存储
优点
- 100% 不影响原数据
- 操作步骤少
- 失败概率极低
缺点
- 数据分散在多个磁盘
- 需要额外挂载步骤
操作流程
宿主机(Windows)
├── 关闭虚拟机
├── VirtualBox GUI 添加新虚拟磁盘
└── 启动虚拟机
│
▼
Linux 内
├── fdisk 分区 /dev/sdb
├── mkfs.ext4 格式化
├── mkdir 挂载点
├── mount 挂载
├── /etc/fstab 永久挂载
└── 完成
方案二:扩展现有磁盘
适用场景
- 磁盘资源紧张,需要整合
- 长期使用,不想管理多块磁盘
- 有足够时间操作并验证
优点
- 所有数据在一块磁盘
- 磁盘资源集中管理
缺点
- 操作步骤多
- 有一定数据风险
- vmdk 格式需要转换
详细操作步骤
以下为方案二(扩展现有磁盘)的完整步骤。
阶段一:宿主机操作
步骤 1:关闭虚拟机
# 在宿主机上执行
vagrant halt
# 或在虚拟机内
sudo shutdown -h now
步骤 2:确认虚拟磁盘格式和路径
# 在 Windows CMD 或 PowerShell 执行
cd "D:\Oracle\VirtualBox VMs\CentOS7-Dev"
dir
查看 .vdi 或 .vmdk 文件,记住文件名。
步骤 3:克隆 vmdk 为 vdi(仅 vmdk 需要)
如果你的磁盘已经是
.vdi格式,跳过此步。
VBoxManage clonemedium disk "原文件名.vmdk" "新文件名.vdi" --format VDI
示例:
VBoxManage clonemedium disk "CentOS7-Dev-disk001.vmdk" "CentOS7-Dev-expanded.vdi" --format VDI
参数说明:
| 参数 | 说明 |
|---|---|
clonemedium disk |
克隆磁盘 |
--format VDI |
输出为 VDI 格式 |
0%...100% |
显示克隆进度 |
注意:克隆会复制整个磁盘内容,大文件需要等待较长时间。
步骤 4:扩展 vdi 文件大小
VBoxManage modifymedium disk "虚拟磁盘文件名.vdi" --resize 102400
参数说明:
| 参数 | 说明 |
|---|---|
--resize 102400 |
单位 MB,102400 = 100GB |
--resize 51200 |
51200 = 50GB |
注意:此命令只能扩展到虚拟磁盘文件的大小限制,不能超过物理磁盘的实际可用空间。
步骤 5:在 VirtualBox GUI 中替换磁盘
操作路径:
- 打开 VirtualBox GUI
- 选中要操作的虚拟机 → 设置
- 左侧选择 存储
- 中间区域 控制器:SATA 下找到当前磁盘
- 选中磁盘 → 点击右侧 X(移除)
- 点击 控制器:SATA 下的 +号(添加虚拟硬盘)
- 选择 使用现有磁盘
- 浏览找到新的
.vdi文件 - 点击 确定
示意图:
存储设置
├── 控制器: SATA
│ ├── [磁盘图标] CentOS7-Dev-disk001.vmdk ← 选中移除
│ └── [+] ← 点击添加
└── 确定
步骤 6:启动虚拟机
vagrant up
vagrant ssh
阶段二:Linux 内操作
步骤 7:查看当前分区状态
sudo fdisk -l /dev/sda
输出示例及说明:
Disk /dev/sda: 107.4 GB, 107374182400 bytes ← 磁盘总大小(已扩展到100GB)
Units = sectors of 1 * 512 = 512 bytes
Sector size (logical/physical): 512 bytes / 512 bytes
I/O size (minimum/optimal): 512 bytes / 512 bytes
Disk label type: dos
Disk identifier: 0x0009ef1a
Device Boot Start End Blocks Id System
/dev/sda1 * 2048 83886079 41942016 83 Linux
关键信息:
| 字段 | 当前值 | 说明 |
|---|---|---|
| Disk 大小 | 107.4 GB | 已扩展成功 |
| /dev/sda1 Start | 2048 | 起始扇区,扩展时必须保持一致 |
| /dev/sda1 End | 83886079 | 当前结束扇区,对应40GB |
| /dev/sda1 Blocks | 41942016 | 约40GB |
步骤 8:备份分区表(推荐)
sudo sfdisk -d /dev/sda > ~/partition_backup.txt
cat ~/partition_backup.txt
备份内容示例:
label: dos
device: /dev/sda
unit: sectors
/dev/sda1 : start= 2048, size= 41942016, type=83
注意:备份文件保存在 HOME 目录,重启后会丢失,建议复制到挂载的新磁盘保存一份。
步骤 9:备份重要数据
# 备份 HOME 目录(如有重要数据)
tar -czvf /mnt/oceanbase_data/backup_home.tar.gz /home
# 或备份整个根分区(不推荐,数据量大)
tar -czvf /mnt/backup_root.tar.gz --exclude=/proc --exclude=/sys --exclude=/dev --exclude=/run --exclude=/mnt /
步骤 10:重建分区
进入 fdisk 交互界面:
sudo fdisk /dev/sda
完整交互流程:
Command (m for help): d # 删除分区
Selected partition 1
Partition 1 is deleted
Command (m for help): n # 新建分区
Partition type:
p primary (0 primary, 0 extended, 4 free)
e extended
Select (default p): p # 选择主分区
Partition number (1-4, default 1): 1 # 分区号 1
First sector (2048-209715199, default 2048): 2048 # 起始扇区(必须与原分区一致!)
Last sector, +sectors or +size{K,M,G} (2048-209715199, default 209715199): # 默认用满整个盘
Partition 1 of type Linux and of size 100 GiB is set
Command (m for help): w # 保存并退出
The partition table has been altered!
Syncing disks.
关键点:
起始扇区 2048必须与原分区完全一致,否则数据丢失Last sector留空则默认用满整个盘
步骤 11:重启使新分区表生效
sudo reboot
警告:必须重启。
partprobe在根分区正在使用时无法重读分区表,会报 "Device or resource busy"。
步骤 12:重启后检查分区
vagrant ssh
sudo fdisk -l /dev/sda
确认输出:
Device Boot Start End Blocks Id System
/dev/sda1 * 2048 209715199 104856576 83 Linux
| 字段 | 扩展前 | 扩展后 |
|---|---|---|
| Blocks | 41942016(约40GB) | 104856576(约100GB) |
| End | 83886079 | 209715199 |
步骤 13:检查文件系统类型
df -T /
输出示例:
Filesystem Type 1K-blocks Used Available Use% Mounted on
/dev/sda1 xfs 41942016 7774204 34167812 19% /
| 操作系统 | 默认文件系统 |
|---|---|
| CentOS 6 及之前 | ext4 |
| CentOS 7 | xfs |
| CentOS 8 / Rocky 8 / AlmaLinux 8+ | xfs |
| Ubuntu | ext4 |
步骤 14:扩展文件系统
对于 xfs 文件系统(CentOS 7):
sudo xfs_growfs /dev/sda1
对于 ext4 文件系统:
sudo resize2fs /dev/sda1
步骤 15:验证扩展结果
df -h /
成功输出示例:
Filesystem Size Used Avail Use% Mounted on
/dev/sda1 100G 7.4G 93G 8% /
| 项目 | 扩展前 | 扩展后 |
|---|---|---|
| Size | 40G | 100G |
| Available | 33G | 93G |
步骤 16:清理临时文件
sudo rm ~/partition_backup.txt
阶段三:完成后清理(可选)
删除废弃的旧磁盘文件
cd "D:\Oracle\VirtualBox VMs\CentOS7-Dev"
# 确认新磁盘正常工作后再执行
Remove-Item "CentOS7-Dev.vdi"
Remove-Item "CentOS7-Dev-disk001.vmdk"
警告:仅在确认所有数据已正常迁移到新分区后再删除旧文件。
故障排查
问题一:resize2fs 报 "Bad magic number in super-block"
原因: 文件系统是 xfs,不是 ext4
症状:
resize2fs: Bad magic number in super-block while trying to open /dev/sda1
Couldn't find valid filesystem superblock.
解决方案:
sudo xfs_growfs /dev/sda1
问题二:fdisk 报 "Re-reading the partition table failed"
原因: 分区正在使用中,Kernel 无法重读分区表
症状:
WARNING: Re-reading the partition table failed with error 16: Device or resource busy.
The kernel still uses the old table. The new table will be used at the next reboot.
解决方案: 重启即可
sudo reboot
问题三:分区起始扇区填错导致数据丢失
原因: 重建分区时起始扇区填了错误的数字
症状: 重启后无法挂载根分区,VM 无法启动
解决方案:
# 使用备份的分区表恢复
sudo sfdisk /dev/sda < ~/partition_backup.txt
sudo reboot
前提:之前已执行
sfdisk -d /dev/sda > ~/partition_backup.txt备份过。
问题四:partprobe 报 "Device or resource busy"
原因: 要重读分区表的分区正在被使用
解决方案: 重启
sudo reboot
问题五:扩展后 df -h / 显示大小没变
原因: 忘记执行扩展文件系统的命令
排查步骤:
# 1. 确认分区已扩展
sudo fdisk -l /dev/sda
# /dev/sda1 应该显示 100GB 大小
# 2. 确认文件系统类型
df -T /
# 3. 执行对应的扩展命令
# 如果是 xfs:
sudo xfs_growfs /dev/sda1
# 如果是 ext4:
sudo resize2fs /dev/sda1
问题六:fdisk 删除分区后无法保存
原因: 在 fdisk 中按了 q(退出)而不是 w(保存)
症状: 退出 fdisk 后分区大小没变
解决方案: 重新执行 fdisk,按 w 保存
问题七:VirtualBox 中找不到 "扩展磁盘" 选项
原因: .vmdk 格式不支持直接扩展
解决方案: 必须先转换为 .vdi 格式
VBoxManage clonemedium disk "文件名.vmdk" "新文件名.vdi" --format VDI
VBoxManage modifymedium disk "新文件名.vdi" --resize 102400
数据安全建议
操作前检查清单
[ ] 确认虚拟机已完全关机(不是暂停)
[ ] 已备份重要数据到外部存储
[ ] 已备份分区表 sfdisk -d
[ ] 已创建 VirtualBox 快照(可选)
[ ] 记录当前磁盘分区布局
[ ] 确认有足够的目标磁盘空间
VirtualBox 快照创建
VBoxManage snapshot CentOS7-Dev take "backup-before-resize"
快照恢复:
VBoxManage snapshot CentOS7-Dev restore "backup-before-resize"
为什么快照不一定保险?
| 快照恢复的内容 | 说明 |
|---|---|
| 虚拟机内存状态 | 关机状态下无意义 |
| 虚拟机磁盘内容 | 可以恢复磁盘,但会丢失快照后的所有更改 |
| VirtualBox 存储设置 | 不会恢复,添加新磁盘的操作不受快照保护 |
结论: 快照可以恢复磁盘数据,但存储配置变更(如添加新磁盘)不在恢复范围内。
附录:常用命令速查
磁盘操作
| 操作 | 命令 |
|---|---|
| 查看所有磁盘 | lsblk |
| 查看分区详情 | sudo fdisk -l /dev/sda |
| 查看文件系统类型 | df -T / |
| 查看磁盘 UUID | sudo blkid /dev/sda1 |
| 查看分区 UUID | sudo blkid /dev/sdb1 |
分区操作
| 操作 | 命令 |
|---|---|
| 分区工具 | sudo fdisk /dev/sdb |
| 查看分区表备份 | cat ~/partition_backup.txt |
| 备份分区表 | sudo sfdisk -d /dev/sda > ~/partition_backup.txt |
| 恢复分区表 | sudo sfdisk /dev/sda < ~/partition_backup.txt |
| 重读分区表 | sudo partprobe |
文件系统操作
| 文件系统 | 扩展命令 |
|---|---|
| ext4 | sudo resize2fs /dev/sda1 |
| xfs | sudo xfs_growfs /dev/sda1 |
| 查看 ext4 superblock | sudo dumpe2fs /dev/sda1 | grep -i superblock |
挂载操作
| 操作 | 命令 |
|---|---|
| 临时挂载 | sudo mount /dev/sdb1 /mnt/data |
| 永久挂载(编辑 fstab) | sudo vi /etc/fstab |
| fstab 示例行 | UUID=xxxx /mnt/data ext4 defaults 0 0 |
| 测试 fstab | sudo mount -a |
| 查看挂载状态 | df -h |
VirtualBox 操作
| 操作 | 命令 |
|---|---|
| 列出所有虚拟机 | VBoxManage list vms |
| 列出所有磁盘 | VBoxManage list hdds |
| 克隆磁盘 | VBoxManage clonemedium disk "src" "dst" --format VDI |
| 扩展磁盘 | VBoxManage modifymedium disk "file.vdi" --resize 102400 |
| 创建快照 | VBoxManage snapshot "VM名" take "快照名" |
| 恢复快照 | VBoxManage snapshot "VM名" restore "快照名" |
| 删除快照 | VBoxManage snapshot "VM名" delete "快照名" |
fdisk 交互命令
| 命令 | 说明 |
|---|---|
d |
删除分区 |
n |
新建分区 |
p |
打印/查看分区表 |
q |
退出(不保存) |
w |
保存并退出 |
m |
显示帮助 |
思维导图汇总
扩容决策树
磁盘不够用了
│
├── df -h / 显示 100%
│ ├── 根分区满 → 扩容根分区(本文内容)
│ └── /home 满 → 扩容 /home 或新增磁盘
│
└── df -h / 还剩很多
├── 想扩到更大磁盘 → vdi resize
└── 想分开存储 → 新增磁盘
操作流程图
宿主机 Windows 虚拟机 CentOS 7
│ │
│ │
▼ ▼
1. vagrant halt 7. sudo fdisk /dev/sda
│ │ │
▼ │ ▼
2. VBoxManage clonemedium │ 删除分区 1
│ │ │
▼ │ ▼
3. VBoxManage modifymedium │ 新建分区 1
│ │ (起始扇区 2048)
▼ │ │
4. VirtualBox GUI │ ▼
替换磁盘 │ w 保存
│ │ │
▼ │ ▼
5. vagrant up │ 重启
│ │ │
▼ │ ▼
┌───────────────────────────────┘ 8. xfs_growfs /dev/sda1
│ │
▼ ▼
┌────────────────────────────────────────┘
│
▼
9. df -h / 验证
参考链接
本文档最后更新于 2026-05-21

浙公网安备 33010602011771号