PVE中虚拟机硬盘在线扩容(LVM格式)- 1
Overview
[TOC]
概念
每个虚拟机都是需要一块硬盘的,实际是从宿主机划分出来的给虚拟机使用的。
PVE虚拟机是基于linux的,它使用LVM管理宿主机磁盘,所以每个虚拟机仅仅是从LVM的VG(volume group卷组)中新建一个固定大小的LV(logical volume),提供给特定的一个虚拟机实例作为虚拟化的硬盘使用。
想实现虚拟机硬盘动态扩容,我们必须明白linux的LVM硬盘管理,因为只有LVM可以实现对一个已有的硬盘分区扩容。
- 块设备:插在机器上的一块硬盘。
- 硬盘分区:把块设备分成多个分区,每个分区固定大小。
- 文件系统:如果想要使用硬盘某分区,需要在这个分区上制作文件系统,比如:ext4格式。
- 挂载目录:最终把做好的文件系统通过mount命令挂载到某个目录下,就可以读写分区内的数据了。
传统硬盘分区方案的问题是,一旦我们把操作系统安装到某个分区内,那么这个分区大小就无法改变了,随着数据变多硬盘就塞满了。想要扩容的话,我们只能选定某个目录挂载一块新的硬盘,然后把一些较大的数据手动迁移进去,总之我们会因为容量问题严重影响到使用体验。
LVM则可以对一个已有的文件系统(当然对应一个硬盘分区)进行扩容,这就是它厉害的地方。
LVM硬盘扩容的使用过程是这样的:
- 准备块设备(/dev/sdx):给机器插上新的硬盘。
- 准备硬盘分区(/dev/sdx1):把块设备分成多个硬盘分区(1个分区用尽整块磁盘也可以,无所谓),每个分区的大小也是固定的。
- 新建物理卷(PV):按照LVM的规则,把每个硬盘分区创建为一个物理卷(physical volume)。
- 扩容已有卷池(VG):新建的物理卷就像一桶矿泉水,把它们加入到一个VG大池子里面,这样池子里的水(硬件空间)就会变多。
- 扩容已有逻辑卷(LV):VG扩大了,则可以新增逻辑卷LV或者扩容已有的逻辑卷LV。
- 刷新文件系统(fs):现在可以对LV制作文件系统,比如:ext4格式。
- 挂载目录(已经挂载过的目录则可以跳过):现在可以把在做好文件系统的LV挂载到某个目录,就可以访问了。
案例
查看现状(/dev/sda)
我有一个debian虚拟机,一开始只给了它10G的虚拟化硬盘:
1$ lsblk
2NAME MAJ:MIN RM SIZE RO TYPE MOUNTPOINT
3sda 8:0 0 10G 0 disk
4├─sda1 8:1 0 243M 0 part /boot
5├─sda2 8:2 0 1K 0 part
6└─sda5 8:5 0 9.8G 0 part
7 ├─debian--vg-root 254:0 0 8.8G 0 lvm /
8 └─debian--vg-swap_1 254:1 0 1G 0 lvm [SWAP]
9sr0 11:0 1 1024M 0 rom
sda就是10G的盘,被分成了3个分区:sda1、sd2、sda5
sda1是引导分区,sda2不知道是什么作用,sda5是一个LVM类型的分区,我们详细分析一下这个分区:
1$ pvdisplay
2 --- Physical volume ---
3 PV Name /dev/sda5
4 VG Name debian-vg
5 PV Size <9.76 GiB / not usable 2.00 MiB
6 Allocatable yes (but full)
7 PE Size 4.00 MiB
8 Total PE 2498
9 Free PE 0
10 Allocated PE 2498
11 PV UUID iaVwL9-NGGB-c5zT-ZNze-2KNU-JGql-0hrqi2
pv display就是看PV,可见/dev/sd5分区被创建为了一个PV,它被加入到了VG池子debian-vg中,所以我们再看一下debian-vg这个池子:
1$ vgdisplay
2 --- Volume group ---
3 VG Name debian-vg
4 System ID
5 Format lvm2
6 Metadata Areas 1
7 Metadata Sequence No 3
8 VG Access read/write
9 VG Status resizable
10 MAX LV 0
11 Cur LV 2
12 Open LV 2
13 Max PV 0
14 Cur PV 1
15 Act PV 1
16 VG Size <9.76 GiB
17 PE Size 4.00 MiB
18 Total PE 2498
19 Alloc PE / Size 2498 / <9.76 GiB
20 Free PE / Size 0 / 0
21 VG UUID kGnJvc-zPnf-BYYz-NA6c-O33X-8yp1-3Z6Sey
VG被划分出2个LV供使用,我们看一下是哪些LV:
1$ lvdisplay
2 --- Logical volume ---
3 LV Path /dev/debian-vg/root
4 LV Name root
5 VG Name debian-vg
6 LV UUID GeeBqg-syni-CUpM-XogW-94uV-6b8G-lZB3GJ
7 LV Write Access read/write
8 LV Creation host, time debian, 2020-02-09 12:43:24 +0800
9 LV Status available
10 # open 1
11 LV Size <8.76 GiB
12 Current LE 2242
13 Segments 1
14 Allocation inherit
15 Read ahead sectors auto
16 - currently set to 256
17 Block device 254:0
18
19 --- Logical volume ---
20 LV Path /dev/debian-vg/swap_1
21 LV Name swap_1
22 VG Name debian-vg
23 LV UUID sb3u5h-IBDs-xcvF-cT4f-cxDy-6Ui0-GyvOP7
24 LV Write Access read/write
25 LV Creation host, time debian, 2020-02-09 12:43:24 +0800
26 LV Status available
27 # open 2
28 LV Size 1.00 GiB
29 Current LE 256
30 Segments 1
31 Allocation inherit
32 Read ahead sectors auto
33 - currently set to 256
34 Block device 254:1
可见,2个LV类似于2个块设备,路径分别是/dev/debian-vg/root和/dev/debian-bg/swap_1,这是debian安装操作系统过程中创建好的。
第一个LV安装操作系统的所有内容,所以占了大部分空间,大约是8.76G;后者是作为swap分区使用的,大约是1GB。
有了LV,就可以做文件系统了,我们可以看一下:
1$ df -h
2文件系统 容量 已用 可用 已用% 挂载点
3udev 479M 0 479M 0% /dev
4tmpfs 99M 2.9M 96M 3% /run
5/dev/mapper/debian--vg-root 8.6G 1.3G 6.9G 16% /
6tmpfs 494M 0 494M 0% /dev/shm
7tmpfs 5.0M 0 5.0M 0% /run/lock
8tmpfs 494M 0 494M 0% /sys/fs/cgroup
9/dev/sda1 236M 84M 140M 38% /boot
10tmpfs 99M 0 99M 0% /run/user/1000
可见,root那个LV被挂载到了/根目录,所以整个操作系统都在占用这个LV的空间,后续我们一旦发现硬盘耗尽,就需要对这个LV进行原地扩容即可。
准备块设备(/dev/sdb)
我们通过PVE管理后台增加一块新的60G的硬盘:
1$ lsblk
2NAME MAJ:MIN RM SIZE RO TYPE MOUNTPOINT
3sda 8:0 0 10G 0 disk
4├─sda1 8:1 0 243M 0 part /boot
5├─sda2 8:2 0 1K 0 part
6└─sda5 8:5 0 9.8G 0 part
7 ├─debian--vg-root 254:0 0 8.8G 0 lvm /
8 └─debian--vg-swap_1 254:1 0 1G 0 lvm [SWAP]
9sdb 8:16 0 60G 0 disk
10sr0 11:0 1 1024M 0 rom
准备硬盘分区(/dev/sdb1)
1$ fdisk /dev/sdb
2
3# 新建一个主分区
4Command (m for help): n
5Partition type
6 p primary (0 primary, 0 extended, 4 free)
7 e extended (container for logical partitions)
8Select (default p): p
9Partition number (1-4, default 1):
10First sector (2048-125829119, default 2048):
11Last sector, +/-sectors or +/-size{K,M,G,T,P} (2048-125829119, default 125829119):
12
13Created a new partition 1 of type 'Linux' and of size 60 GiB.
14
15# 转换分区类型为LVM
16Command (m for help): t
17Selected partition 1
18Hex code (type L to list all codes): L
19
20 0 Empty 24 NEC DOS 81 Minix / old Lin bf Solaris
21 1 FAT12 27 Hidden NTFS Win 82 Linux swap / So c1 DRDOS/sec (FAT-
22 2 XENIX root 39 Plan 9 83 Linux c4 DRDOS/sec (FAT-
23 3 XENIX usr 3c PartitionMagic 84 OS/2 hidden or c6 DRDOS/sec (FAT-
24 4 FAT16 <32M 40 Venix 80286 85 Linux extended c7 Syrinx
25 5 Extended 41 PPC PReP Boot 86 NTFS volume set da Non-FS data
26 6 FAT16 42 SFS 87 NTFS volume set db CP/M / CTOS / .
27 7 HPFS/NTFS/exFAT 4d QNX4.x 88 Linux plaintext de Dell Utility
28 8 AIX 4e QNX4.x 2nd part 8e Linux LVM df BootIt
29 9 AIX bootable 4f QNX4.x 3rd part 93 Amoeba e1 DOS access
30 a OS/2 Boot Manag 50 OnTrack DM 94 Amoeba BBT e3 DOS R/O
31 b W95 FAT32 51 OnTrack DM6 Aux 9f BSD/OS e4 SpeedStor
32 c W95 FAT32 (LBA) 52 CP/M a0 IBM Thinkpad hi ea Rufus alignment
33 e W95 FAT16 (LBA) 53 OnTrack DM6 Aux a5 FreeBSD eb BeOS fs
34 f W95 Ext'd (LBA) 54 OnTrackDM6 a6 OpenBSD ee GPT
3510 OPUS 55 EZ-Drive a7 NeXTSTEP ef EFI (FAT-12/16/
3611 Hidden FAT12 56 Golden Bow a8 Darwin UFS f0 Linux/PA-RISC b
3712 Compaq diagnost 5c Priam Edisk a9 NetBSD f1 SpeedStor
3814 Hidden FAT16 <3 61 SpeedStor ab Darwin boot f4 SpeedStor
3916 Hidden FAT16 63 GNU HURD or Sys af HFS / HFS+ f2 DOS secondary
4017 Hidden HPFS/NTF 64 Novell Netware b7 BSDI fs fb VMware VMFS
4118 AST SmartSleep 65 Novell Netware b8 BSDI swap fc VMware VMKCORE
421b Hidden W95 FAT3 70 DiskSecure Mult bb Boot Wizard hid fd Linux raid auto
431c Hidden W95 FAT3 75 PC/IX bc Acronis FAT32 L fe LANstep
441e Hidden W95 FAT1 80 Old Minix be Solaris boot ff BBT
45Hex code (type L to list all codes): 8e
46Changed type of partition 'Linux' to 'Linux LVM'.
47
48# 保存分区并退出
49
50Command (m for help): p
51Disk /dev/sdb: 60 GiB, 64424509440 bytes, 125829120 sectors
52Disk model: QEMU HARDDISK
53Units: sectors of 1 * 512 = 512 bytes
54Sector size (logical/physical): 512 bytes / 512 bytes
55I/O size (minimum/optimal): 512 bytes / 512 bytes
56Disklabel type: dos
57Disk identifier: 0x13622708
58
59Device Boot Start End Sectors Size Id Type
60/dev/sdb1 2048 125829119 125827072 60G 8e Linux LVM
61
62Command (m for help): w
63The partition table has been altered.
64Calling ioctl() to re-read partition table.
65Syncing disks.
新建物理卷(PV)
1$ pvcreate /dev/sdb1
2 Physical volume "/dev/sdb1" successfully created.
扩容已有卷池(VG)
1$ vgextend debian-vg /dev/sdb1
2 Volume group "debian-vg" successfully extended
3
4$ vgdisplay --units B
5 --- Volume group ---
6 VG Name debian-vg
7 System ID
8 Format lvm2
9 Metadata Areas 2
10 Metadata Sequence No 4
11 VG Access read/write
12 VG Status resizable
13 MAX LV 0
14 Cur LV 2
15 Open LV 2
16 Max PV 0
17 Cur PV 2
18 Act PV 2
19 VG Size 74897686528 B
20 PE Size 4194304 B
21 Total PE 17857
22 Alloc PE / Size 2498 / 10477371392 B
23 Free PE / Size 15359 / 64420315136 B
24 VG UUID kGnJvc-zPnf-BYYz-NA6c-O33X-8yp1-3Z6Sey
扩容已有逻辑卷(LV)
1$ lvresize -L 64420315136B /dev/debian-vg/root
2 Size of logical volume debian-vg/root changed from <8.76 GiB (2242 extents) to <60.00 GiB (15359 extents).
3 Logical volume debian-vg/root successfully resized.
4
5# 查看已更新的LV
6$ lsblk
7NAME MAJ:MIN RM SIZE RO TYPE MOUNTPOINT
8sda 8:0 0 10G 0 disk
9├─sda1 8:1 0 243M 0 part /boot
10├─sda2 8:2 0 1K 0 part
11└─sda5 8:5 0 9.8G 0 part
12 ├─debian--vg-root 254:0 0 60G 0 lvm /
13 └─debian--vg-swap_1 254:1 0 1G 0 lvm [SWAP]
14sdb 8:16 0 60G 0 disk
15└─sdb1 8:17 0 60G 0 part
16 └─debian--vg-root 254:0 0 60G 0 lvm /
17sr0 11:0 1 1024M 0 rom
刷新文件系统(fs)
1# 文件系统大小尚未更新
2$ df -h
3文件系统 容量 已用 可用 已用% 挂载点
4udev 479M 0 479M 0% /dev
5tmpfs 99M 2.9M 96M 3% /run
6/dev/mapper/debian--vg-root 8.6G 1.3G 6.9G 17% /
7tmpfs 494M 0 494M 0% /dev/shm
8tmpfs 5.0M 0 5.0M 0% /run/lock
9tmpfs 494M 0 494M 0% /sys/fs/cgroup
10/dev/sda1 236M 84M 140M 38% /boot
11tmpfs 99M 0 99M 0% /run/user/1000
12
13$ resize2fs /dev/debian-vg/root
14resize2fs 1.44.5 (15-Dec-2018)
15Filesystem at /dev/debian-vg/root is mounted on /; on-line resizing required
16old_desc_blocks = 2, new_desc_blocks = 8
17The filesystem on /dev/debian-vg/root is now 15727616 (4k) blocks long.
挂载目录
因为这个LV挂载在/下面(也就是操作系统),所以属于一种在线文件扩容操作。可以直接查看文件系统,已经扩容完成:
1$ df -h
2文件系统 容量 已用 可用 已用% 挂载点
3udev 479M 0 479M 0% /dev
4tmpfs 99M 2.9M 96M 3% /run
5/dev/mapper/debian--vg-root 60G 1.4G 56G 3% /
6tmpfs 494M 0 494M 0% /dev/shm
7tmpfs 5.0M 0 5.0M 0% /run/lock
8tmpfs 494M 0 494M 0% /sys/fs/cgroup
9/dev/sda1 236M 84M 140M 38% /boot
10tmpfs 99M 0 99M 0% /run/user/1000
至此,磁盘扩容完毕!