VMDK格式扩容

估计是因为vmdk是VMWare的格式,所以VirtualBox并不直接支持对vmdk扩容,所以需要先转为vdi格式进行扩容。

VBoxManage clonehd "virtualdisk.vmdk" "new-virtualdisk.vdi" --format vdi
VBoxManage modifyhd "new-virtualdisk.vdi" --resize 51200
//如果需要还可以转回去
VBoxManage clonehd "new-virtualdisk.vdi" "virtualdisk.vmdk" --format vmdk

VDI格式扩容

C:\Program Files\Oracle\VirtualBox> VBoxManage modifyhd /full/path/to/xxx.vdi --resize 40960 //注意单位是MB

更改完之后,可以通过下面命令查看:

C:\Program Files\Oracle\VirtualBox> VBoxManage showhdinfo path/to/Centos.vdi
UUID:           e04c5354-2196-43f8-98b5-9111b11e3b7c
Parent UUID:    base
State:          locked write
Type:           normal (base)
Location:       path/to/Centos.vdi
Storage format: vdi
Format variant: dynamic default
Capacity:       51200 MBytes
Size on disk:   29784 MBytes
Encryption:     disabled
In use by VMs:  Centos7 (UUID: 35797940-ddab-43bc-b33e-830de59775c8)

当然也可以用VBoxManage list hdds查看

# df -h
文件系统             容量  已用  可用 已用% 挂载点
/dev/mapper/cl-root   26G   24G  2.9G   90% /
devtmpfs             3.9G     0  3.9G    0% /dev
tmpfs                3.9G     0  3.9G    0% /dev/shm
tmpfs                3.9G     0  3.9G    0% /sys/fs/cgroup
tmpfs                3.9G   20K  3.9G    1% /tmp
/dev/sda1           1014M  165M  850M   17% /boot

查看系统的分区情况:

# fdisk -l
...

   设备 Boot      Start         End      Blocks   Id  System
/dev/sda1            2048     2099199     1048576   83  Linux
/dev/sda2   *     2099200    62914559    30407680   8e  Linux LVM

....

我们发现目前系统有一块盘/dev/sda,这块盘有两个分区:/dev/sda1/dev/sda2,这两个分区的大小才62914559512bytes=30G62914559*512bytes=30G,显然在这个分区后面应该还有空间,而且我们我们第二个分区是由Linux LVM进行管理的,LVM是什么呢?

LVM(Logical Volume Manager)逻辑卷管理,是一种将一个或多个硬盘的分区在逻辑上进行合并到一个逻辑卷中,作为大的逻辑空间来使用,这对于空间的扩充来说非常灵活。

有几个概念:

  • 物理卷(PV):可以在上面创建卷组的媒介,可以是硬盘分区,也可是硬盘本身

  • 卷组(VG):将一组物理卷收集为一个管理单元,从而使得众多硬盘空间看起来像一块打的硬盘。

  • 逻辑卷(LV):虚拟分区,由物理区域组成

  • 物理区域(PV):硬盘可供指派给逻辑卷的最小单元

所以我们需要做的就是62914559之后的空间可见,也就是创建磁盘分区:

# fdisk /dev/sda
命令(输入 m 获取帮助):n
Partition type:
   p   primary (2 primary, 0 extended, 2 free)
   e   extended
Select (default p): p #创建主分区
分区号 (3,4,默认 3):3
起始 扇区 (62914560-104857599,默认为 62914560): #默认回车即可
Last 扇区, +扇区 or +size{K,M,G} (62914560-104857599,默认为 104857599): #默认回车即可
命令(输入 m 获取帮助):w //写入分区信息

这里容易忽略对分区格式的修改,因为后面需要进行LVM扩容,所以需要修改为:8e

# fdisk /dev/sda
命令(输入 m 获取帮助):t
分区号 (1-3,默认 3):3
Hex 代码(输入 L 列出所有代码):8e
已将分区“Linux”的类型更改为“Linux LVM”

命令(输入 m 获取帮助):W
The partition table has been altered!

执行partprobe使分区表生效,否则得需要重启。

LVM管理新的分区

其实不使用LVM扩容也可以,直接将新的分区挂载即可使用,但是对我们后面使用有些麻烦,很多工作都是在之前的分区中进行,后面还得切换路径,比较折腾,所以选择LVM进行分卷合并。

再将新的分区加入LVM卷组之前,我们先要知道系统现有的卷组名称,以及现有的逻辑分卷:

# vgdisplay
--- Volume group ---
  VG Name               cl
  Format                lvm2
  ....
  VG Size               <29.00 GiB
  
# lvdisplay
--- Logical volume ---
  LV Path                /dev/cl/swap
  LV Name                swap
  VG Name                cl
....
--- Logical volume ---
  LV Path                /dev/cl/root
  LV Name                root
  VG Name                cl

将物理分区加入卷组,并将该分区的物理元旦扩展到逻辑分区root中:

//创建物理卷
# pvcreate /dev/sda3
  Physical volume "/dev/sda3" successfully created.
// 创建完可以通过pvdisplay命令查看,确实多了/dev/sda3
# pvdisplay
--- Physical volume ---
  PV Name               /dev/sda2
  VG Name               cl
  PV Size               <29.00 GiB / not usable 3.00 MiB
  Allocatable           yes (but full)
  PE Size               4.00 MiB
  Total PE              7423
  Free PE               0
  Allocated PE          7423
  PV UUID               hJCE4d-Q2Xc-3qGP-6kY1-TPBJ-NwWP-sHP22y
   
  "/dev/sda3" is a new physical volume of "20.00 GiB"
  --- NEW Physical volume ---
  PV Name               /dev/sda3
  VG Name               
  PV Size               20.00 GiB
  Allocatable           NO
  PE Size               0   
  Total PE              0
  Free PE               0
  Allocated PE          0
  PV UUID               PeQ7eZ-YPsT-RdyR-bAsm-FjEE-cEUg-eKocD0

# vgextend cl /dev/sda3
  Volume group "cl" successfully extended

# lvextend /dev/cl/root /dev/sda3

到这边其实还是没有OK,因为df -lh检查发现原分区大小还是没有变化,究其原因还需要需要xfs进行同步:

xfs_growfs /dev/cl/root 
meta-data=/dev/mapper/cl-root    isize=512    agcount=4, agsize=1703680 blks
         =                       sectsz=512   attr=2, projid32bit=1
         =                       crc=1        finobt=0 spinodes=0
data     =                       bsize=4096   blocks=6814720, imaxpct=25
         =                       sunit=0      swidth=0 blks
naming   =version 2              bsize=4096   ascii-ci=0 ftype=1
log      =internal               bsize=4096   blocks=3327, version=2
         =                       sectsz=512   sunit=0 blks, lazy-count=1
realtime =none                   extsz=4096   blocks=0, rtextents=0
data blocks changed from 6814720 to 12056576

最后查看发现,OK!