虚拟机硬盘VMDK扩容和缩容(硬盘空间、分区、文件系统)

  • ~2.74K 字

本教程所使用的分区格式为GPT,文件系统为EXT4。LMV的分区扩容方式与GPT方式不同。

1. 扩容

扩容操作可以在线进行,但缩容操作不可以。

扩容分为三个部分。首先是对硬盘进行扩容,此时使用lsblk可以看到硬盘的实际容量变大,但是硬盘下的分区没有变大。之后是对分区进行扩容,此时lsblk可以看到硬盘内的分区也变大,但是df命令看到的可用空间没有变大。最后是对分区内的文件系统进行扩容,此时df命令可以看到分区的可用容量变大。

1.1 硬盘空间扩容

vmdk文件可以直接在虚拟机内修改大小进行扩容。VMWare Workstation Pro以及ESXi都支持这样的操作,但都仅限于对硬盘进行扩容,直接缩小硬盘的大小是不被允许的。

ESXi修改硬盘大小

![Workstation Pro修改硬盘大小](Workstation Pro修改硬盘大小.png)

此时使用lsblk可以看到硬盘被扩容。

1.2 分区扩容

使用parted /dev/<device>命令进行修改,将<device>替换为对应的硬盘设备。

操作过程中可能会提示需要修复,按照提示进行修复即可。

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21

# 设置显示单位为扇区

unit s

# 查看分区详情包含为分配的扇区

p free

# 根据结果选择最后一个分区标号调整分区大小

resizepart <分区号>

# 输入空闲扇区的最后一个扇区号以s结尾

<最后一个扇区编号>s

# 退出

quit

此时再次使用lsblk命令可以看到分区已经被扩容。

1.3 文件系统扩容

使用 resize2fs /dev/<device><num> 对文件系统进行扩容,device为硬盘的编号,num为分区的编号,具体可以在lsblk中进行查看。

此时,使用df命令可以看到可用空间已经顺利变大。

2. 缩容

!!!缩容操作可能会导致数据丢失,必须严格按照步骤进行操作。

!!!最好先把对应的vmdk文件备份一份以免没有办法补救。

2.1 文件系统缩容

使用 resize2fs /dev/<device><num> <size> 对分区进行缩容,<size>可以是xxK/M/G,如10G。

操作之后使用 df -h 命令查看缩小后的空间。

2.2 分区缩容

同样使用parted进行缩容。

unit s 指定的是扇区,也可以使用 unit MB unit MiB 指定单位为数据大小。具体可以参考 parted单位支持详解及使用示例-CSDN博客

!!!由于1000进制和1024进制的问题,GB级别上的容量差异约为95.4%,TB级别上的差异约为93.1%。因此安全起见建议先按照90%差异进行分区缩容,如文件系统缩容后为90GB,那么分区先按照100GB进行缩小。完成后使用lsblk查看分区,然后再决定是否继续缩小。

2.3 新建硬盘并分区

经过测试,此时直接对硬盘空间进行截断依然会导致分区损坏,因此只能按照预期缩小后的硬盘大小新建一块硬盘,然后按照原来的分区重新分区,使用dd命令进行完成分区内容的迁移。

为了保证复制过程的数据一致性,建议不要在硬盘挂载的情况下进行分区复制的操作,如果需要复制的是系统盘建议使用ubuntu的安装镜像以试用方式启动后进行操作。

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45

#启动parted

parted

#设置单位为扇区

unit s

#选择源硬盘

selected /dev/<原始硬盘的编号>

#查看分区,记得将输出的内容保存,新建分区需要参考

print

#选择新建硬盘

selected /dev/<新硬盘编号>

#新建GPT分区表

mklabel gpt

#按照需要依次建立分区,扇区起止直接照抄

mkpart primary <分区类型,File system一行有就填没有就省略> <起始扇区>s <结束扇区>s

#补全分区标记,print时看到部分分区的Flags一列有相关内容,多个标记以逗号进行分割

set <分区编号> <标记> on

# 示例,不要照抄,按照实际情况来

# set 1 bios_grub on

# set 2 boot on

# set 2 esp on

# 最后退出

quit

使用lsblk命令可以看到新硬盘的分区与源硬盘相同。

2.4 分区数据复制

分区复制的命令如下,逐个对分区进行复制。

1
2
3

dd if=/dev/<源硬盘编号><分区编号> of=/dev/<新硬盘编号><分区编号> conv=noerror,sync status=progress

2.5 修改UUID

在2.4完成后,数据已经完成了迁移,但相应的uuid并没有被迁移。部分文件系统的挂载是根据UUID进行的,因此需要对UUID进行复制。

使用blkid可以获取磁盘的UUID、分区的UUID、文件系统的UUID,依次修改新硬盘使其与源硬盘相同。

使用 gdisk /dev/<新硬盘编号> 编辑分区和硬盘。

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33

#进入高级模式

x

# c change partition GUID 修改分区的UUID

# g change disk GUID 修改硬盘的UUID

# 修改硬盘UUID

c

# 输入UUID

<uuid>

# 修改分区UUID

g

# 输入编号

<编号>

# 输入uuid

<uuid>

# 退出

quit

使用 tune2fs /dev/<新硬盘编号><分区编号> -U <uuid> 修改ext4文件系统的uuid,仅针对ext4文件系统,其他的文件系统的分区无需进行该操作。

至此,所有工作完成,移除源硬盘,只使用新硬盘,启动虚拟机。

3. 补充

3.1 空间不够新建硬盘

将vmdk和vmdk-flat文件一同拷贝到其他设备,在新设备上操作。如果是缩容,新建硬盘的操作也要在原始机器上新建后再拷贝出来,否则可能会出现vmdk虚拟机版本不兼容的问题。操作时如果提示需要转换vmdk文件切记不要转换!

分享
分享提示信息