VirtualBox 虚拟机磁盘扩容完整指南

本文详细记录了将 VirtualBox 虚拟机的系统盘从 40GB 扩展到 100GB 的完整过程,适用于 CentOS 7 操作系统。内容包括前置准备、两种扩容方案、详细操作步骤、故障排查以及数据安全建议。


目录

  1. 前置知识
  2. 扩容方案对比
  3. 方案一:新加磁盘(推荐)
  4. 方案二:扩展现有磁盘
  5. 详细操作步骤
  6. 故障排查
  7. 数据安全建议
  8. 附录:常用命令速查

前置知识

什么是虚拟磁盘?

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 中替换磁盘

操作路径:

  1. 打开 VirtualBox GUI
  2. 选中要操作的虚拟机 → 设置
  3. 左侧选择 存储
  4. 中间区域 控制器:SATA 下找到当前磁盘
  5. 选中磁盘 → 点击右侧 X(移除)
  6. 点击 控制器:SATA 下的 +号(添加虚拟硬盘)
  7. 选择 使用现有磁盘
  8. 浏览找到新的 .vdi 文件
  9. 点击 确定

示意图:

存储设置
├── 控制器: 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

posted @ 2026-06-01 10:51  RK5123153  阅读(33)  评论(0)    收藏  举报