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

至此,磁盘扩容完毕!

参考

pve虚拟机-如何扩容虚拟机磁盘空间?