LVM
LVM是 Logical Volume Manager(逻辑卷管理)的简写,它是Linux环境下对磁盘分区进行管理的一种机制,它由Heinz Mauelshagen在Linux 2.4内核上实现。
Linux用户安装Linux操作系统时遇到的一个常见的难以决定的问题就是如何正确地评估各分区大小,以分配合适的硬盘空间。普通的磁盘分区管理方式在逻辑分区划分好之后就无法改变其大小,当一个逻辑分区存放不下某个文件时,这个文件因为受上层文件系统的限制,也不能跨越多个分区来存放,所以也不能同时放到别的磁盘上。而遇到出现某个分区空间耗尽时,解决的方法通常是使用符号链接,或者使用调整分区大小的工具,但这只是暂时解决办法,没有从根本上解决问题。随着Linux的逻辑卷管理功能的出现,这些问题都迎刃而解,用户在无需停机的情况下可以方便地调整各个分区大小。
LVM是在磁盘分区和文件系统之间添加的一个逻辑层,来为文件系统屏蔽下层磁盘分区布局,提供一个抽象的存储卷,在存储卷上建立文件系统。首先我们讨论以下几个LVM术语:
物理存储介质(PhysicalStorageMedia):指系统的物理存储设备:磁盘,如:/dev/hda、/dev/sda等,是存储系统最底层的存储单元。
物理卷(Physical Volume,PV):指磁盘分区或从逻辑上与磁盘分区具有同样功能的设备(如RAID),是LVM的基本存储逻辑块,但和基本的物理存储介质(如分区、磁盘等)比较,却包含有与LVM相关的管理参数。
卷组(Volume Group,VG):类似于非LVM系统中的物理磁盘,其由一个或多个物理卷PV组成。可以在卷组上创建一个或多个LV(逻辑卷)。
逻辑卷(Logical Volume,LV):类似于非LVM系统中的磁盘分区,逻辑卷建立在卷组VG之上。在逻辑卷LV之上可以建立文件系统(比如/home或者/usr等)。
物理块(Physical Extent,PE):PE是物理卷PV的基本划分单元,具有唯一编号的PE是可以被LVM寻址的最小单元。PE的大小是可配置的,默认为4MB。所以物理卷(PV)由大小等同的基本单元PE组成。
逻辑块(Logical Extent,LE):逻辑卷LV也被划分为可被寻址的基本单位,称为LE。在同一个卷组中,LE的大小和PE是相同的,并且一一对应。
LVM抽象模型,展示了PV、VG、LV三者之间关系:
创建虚拟机
1
2
3
4
5
6
7
8
9
10
11
12
virt-install \
--connect=qemu:///system \
--virt-type=kvm \
--name=ubuntu-22.04-server-test \
--vcpus=4 \
--memory=8192 \
--location=/kvm/iso/ubuntu-22.04.4-live-server-amd64.iso \
--disk path=/kvm/vm/ubuntu-22.04-server-test.qcow2,size=40,format=qcow2 \
--network bridge=br0 \
--graphics none \
--extra-args='console=ttyS0' \
--force
创建虚拟机在创建分区的时候选择使用LVM(ubuntu 22.04默认就是 LVM 全部选择默认)。
1、选择使用整个磁盘,并勾选使用 LVM
2、可以看到他留了19G空闲空间。
3、分区中有一个新驱动 ubuntu-vg
,下面有一个分区 ubuntu-lv
挂载到/
,这个新驱动ubuntu-vg
就是卷组VG,ubuntu-lv
就是逻辑卷 LV。
说明: ubuntu-22.04.4-live-server-amd64.iso在安装的时候默认使用的就是 LVM,而且不会使用所有磁盘空间,而是留一半空闲。其他的系统没有测试过。这里先不管他,扩容的时候一并扩进去。
扩容
如果发现磁盘不足(暂不考虑空闲的19G),需要增加60G空间到根目录,有两个方法。
1、如果/dev/vda磁盘还有剩余,可以直接创建扩展。
2、如果磁盘空间不足,可以增加新的磁盘。
说明:这里使用 KVM 模拟 有剩余空间使用
qemu-img resize
来增加空间。 增加新磁盘使用qemu-img create
来创建新磁盘
方法一:有剩余空间
1、模拟虚拟机有剩余空间,现在宿主机给虚拟机增加磁盘空间
1
2
3
4
5
6
7
8
# 需要先关闭虚拟机
virsh shutdown ubuntu-22.04-server-test
# 增加60G空间
qemu-img resize /kvm/vm/ubuntu-22.04-server-test.qcow2 +30G
# 虚拟机开机
virsh start ubuntu-22.04-server-test
# 进入虚拟机
virsh console ubuntu-22.04-server-test
2、查看磁盘是否扩展成功
1
2
# 查看磁盘
fdisk -l
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
Disk /dev/vda: 70 GiB, 75161927680 bytes, 146800640 sectors
Units: sectors of 1 * 512 = 512 bytes
Sector size (logical/physical): 512 bytes / 512 bytes
I/O size (minimum/optimal): 512 bytes / 512 bytes
Disklabel type: gpt
Disk identifier: B1803813-6523-4E24-966C-BE23A7A324CB
Device Start End Sectors Size Type
/dev/vda1 2048 4095 2048 1M BIOS boot
/dev/vda2 4096 4198399 4194304 2G Linux filesystem
/dev/vda3 4198400 83884031 79685632 38G Linux filesystem
Disk /dev/mapper/ubuntu--vg-ubuntu--lv: 19 GiB, 20396900352 bytes, 39837696 sectors
Units: sectors of 1 * 512 = 512 bytes
Sector size (logical/physical): 512 bytes / 512 bytes
I/O size (minimum/optimal): 512 bytes / 512 bytes
现在磁盘已经从之前的40G,扩展到70G
3、创建新的物理分区
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
root@mmy83:~# fdisk /dev/vda
Welcome to fdisk (util-linux 2.37.2).
Changes will remain in memory only, until you decide to write them.
Be careful before using the write command.
GPT PMBR size mismatch (83886079 != 146800639) will be corrected by write.
The backup GPT table is not on the end of the device. This problem will be corrected by write.
This disk is currently in use - repartitioning is probably a bad idea.
It's recommended to umount all file systems, and swapoff all swap
partitions on this disk.
# 打印分区表
Command (m for help): p
Disk /dev/vda: 70 GiB, 75161927680 bytes, 146800640 sectors
Units: sectors of 1 * 512 = 512 bytes
Sector size (logical/physical): 512 bytes / 512 bytes
I/O size (minimum/optimal): 512 bytes / 512 bytes
Disklabel type: gpt
Disk identifier: B1803813-6523-4E24-966C-BE23A7A324CB
Device Start End Sectors Size Type
/dev/vda1 2048 4095 2048 1M BIOS boot
/dev/vda2 4096 4198399 4194304 2G Linux filesystem
/dev/vda3 4198400 83884031 79685632 38G Linux filesystem
# 创建新分区
Command (m for help):n
Partition number (4-128, default 4): 4
First sector (83884032-146800606, default 83884032):
Last sector, +/-sectors or +/-size{K,M,G,T,P} (83884032-146800606, default 146800606):
Created a new partition 4 of type 'Linux filesystem' and of size 30 GiB.
# 调整分区格式为lvm,这里lvm是是别名
Command (m for help):t
Partition number (1-4, default 4):
Partition type or alias (type L to list all): lvm # 这里可以看所有可以调整的格式
Changed type of partition 'Linux filesystem' to 'Linux LVM'.
# 保存修改
Command (m for help):w
The partition table has been altered.
Syncing disks.
4、再次查看分区
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
fdisk -l
Disk /dev/vda: 70 GiB, 75161927680 bytes, 146800640 sectors
Units: sectors of 1 * 512 = 512 bytes
Sector size (logical/physical): 512 bytes / 512 bytes
I/O size (minimum/optimal): 512 bytes / 512 bytes
Disklabel type: gpt
Disk identifier: B1803813-6523-4E24-966C-BE23A7A324CB
Device Start End Sectors Size Type
/dev/vda1 2048 4095 2048 1M BIOS boot
/dev/vda2 4096 4198399 4194304 2G Linux filesystem
/dev/vda3 4198400 83884031 79685632 38G Linux filesystem
/dev/vda4 83884032 146800606 62916575 30G Linux LVM
Disk /dev/mapper/ubuntu--vg-ubuntu--lv: 19 GiB, 20396900352 bytes, 39837696 sectors
Units: sectors of 1 * 512 = 512 bytes
Sector size (logical/physical): 512 bytes / 512 bytes
I/O size (minimum/optimal): 512 bytes / 512 bytes
如果没有更新执行 partprobe 重载分区表
5、创建物理卷(PV)
1
2
3
4
5
6
root@mmy83:~# pvcreate /dev/vda4
Physical volume "/dev/vda4" successfully created.
root@mmy83:~# pvs
PV VG Fmt Attr PSize PFree
/dev/vda3 ubuntu-vg lvm2 a-- <38.00g 19.00g
/dev/vda4 lvm2 --- 30.00g 30.00g
6、加入卷组(VG)
1
2
3
4
5
root@mmy83:~# vgextend ubuntu-vg /dev/vda4
Volume group "ubuntu-vg" successfully extended
root@mmy83:~# vgs
VG #PV #LV #SN Attr VSize VFree
ubuntu-vg 2 1 0 wz--n- 67.99g <49.00g
7、扩展逻辑卷(LV)
1
2
3
root@mmy83:~# lvextend -l +100%FREE /dev/mapper/ubuntu--vg-ubuntu--lv
Size of logical volume ubuntu-vg/ubuntu-lv changed from <19.00 GiB (4863 extents) to 67.99 GiB (17406 extents).
Logical volume ubuntu-vg/ubuntu-lv successfully resized.
8、生效扩展
1
2
3
4
5
6
7
8
9
# xfs格式
# xfs_growfs /dev/ubuntu-vg/ubuntu-lv
# ext4格式
# resize2fs /dev/ubuntu-vg/ubuntu-lv
root@mmy83:~# resize2fs /dev/ubuntu-vg/ubuntu-lv
resize2fs 1.46.5 (30-Dec-2021)
Filesystem at /dev/ubuntu-vg/ubuntu-lv is mounted on /; on-line resizing required
old_desc_blocks = 3, new_desc_blocks = 9
The filesystem on /dev/ubuntu-vg/ubuntu-lv is now 17823744 (4k) blocks long.
9、查看扩展结果
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
root@mmy83:~# df -h
Filesystem Size Used Avail Use% Mounted on
tmpfs 794M 1.1M 793M 1% /run
/dev/mapper/ubuntu--vg-ubuntu--lv 67G 6.9G 57G 11% /
tmpfs 3.9G 0 3.9G 0% /dev/shm
tmpfs 5.0M 0 5.0M 0% /run/lock
/dev/vda2 2.0G 129M 1.7G 8% /boot
tmpfs 794M 4.0K 794M 1% /run/user/1000
root@mmy83:~# fdisk -l
Disk /dev/vda: 70 GiB, 75161927680 bytes, 146800640 sectors
Units: sectors of 1 * 512 = 512 bytes
Sector size (logical/physical): 512 bytes / 512 bytes
I/O size (minimum/optimal): 512 bytes / 512 bytes
Disklabel type: gpt
Disk identifier: B1803813-6523-4E24-966C-BE23A7A324CB
Device Start End Sectors Size Type
/dev/vda1 2048 4095 2048 1M BIOS boot
/dev/vda2 4096 4198399 4194304 2G Linux filesystem
/dev/vda3 4198400 83884031 79685632 38G Linux filesystem
/dev/vda4 83884032 146800606 62916575 30G Linux LVM
Disk /dev/mapper/ubuntu--vg-ubuntu--lv: 67.99 GiB, 73006055424 bytes, 142589952 sectors
Units: sectors of 1 * 512 = 512 bytes
Sector size (logical/physical): 512 bytes / 512 bytes
I/O size (minimum/optimal): 512 bytes / 512 bytes
root@mmy83:~# lsblk
NAME MAJ:MIN RM SIZE RO TYPE MOUNTPOINTS
loop0 7:0 0 63.9M 1 loop /snap/core20/2105
loop1 7:1 0 87M 1 loop /snap/lxd/27037
loop2 7:2 0 40.4M 1 loop /snap/snapd/20671
sr0 11:0 1 1024M 0 rom
vda 252:0 0 70G 0 disk
├─vda1 252:1 0 1M 0 part
├─vda2 252:2 0 2G 0 part /boot
├─vda3 252:3 0 38G 0 part
│ └─ubuntu--vg-ubuntu--lv 253:0 0 68G 0 lvm /
└─vda4 252:4 0 30G 0 part
└─ubuntu--vg-ubuntu--lv 253:0 0 68G 0 lvm /
方法二:增加新的磁盘
1、宿主机创新新磁盘
1
2
# 新建一个60G空间的磁盘
qemu-img create -f qcow2 /kvm/vm/ubuntu-22.04-server-test-2.qcow2 30G
2、宿主机编辑虚拟机
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
# 编辑前先关闭虚拟机
$ virsh shutdown ubuntu-22.04-server-test
Domain 'ubuntu-22.04-server-test' is being shutdown
shxcloud@shxcloud:~$ virsh edit ubuntu-22.04-server-test
# 找到
<disk type='file' device='disk'>
<driver name='qemu' type='qcow2' discard='unmap'/>
<source file='/kvm/vm/ubuntu-22.04-server-test.qcow2'/>
<target dev='vda' bus='virtio'/>
<address type='pci' domain='0x0000' bus='0x04' slot='0x00' function='0x0'/>
</disk>
# 增加
<disk type='file' device='disk'>
<driver name='qemu' type='qcow2' discard='unmap'/>
<source file='/kvm/vm/ubuntu-22.04-server-test-2.qcow2'/>
<target dev='vdb' bus='virtio'/>
<address type='pci' domain='0x0000' bus='0x07' slot='0x00' function='0x0'/>
</disk>
# 保存
# 启动虚拟机
virsh start ubuntu-22.04-server-test
注: 1、增加的新的磁盘,文件为新创建的磁盘文件 2、驱动器编号因为已存在的是vda,这个就是vdb 3、bus不能重复,我的最大是0-6,所有这里是7,这个应该是十六进制
3、虚拟机查看磁盘
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
# 查看文件系统
root@mmy83:~# df -h
Filesystem Size Used Avail Use% Mounted on
tmpfs 794M 1.1M 793M 1% /run
/dev/mapper/ubuntu--vg-ubuntu--lv 67G 6.9G 57G 11% /
tmpfs 3.9G 0 3.9G 0% /dev/shm
tmpfs 5.0M 0 5.0M 0% /run/lock
/dev/vda2 2.0G 129M 1.7G 8% /boot
tmpfs 794M 4.0K 794M 1% /run/user/1000
# 查看分区
root@mmy83:~# fdisk -l
Disk /dev/vda: 70 GiB, 75161927680 bytes, 146800640 sectors
Units: sectors of 1 * 512 = 512 bytes
Sector size (logical/physical): 512 bytes / 512 bytes
I/O size (minimum/optimal): 512 bytes / 512 bytes
Disklabel type: gpt
Disk identifier: B1803813-6523-4E24-966C-BE23A7A324CB
Device Start End Sectors Size Type
/dev/vda1 2048 4095 2048 1M BIOS boot
/dev/vda2 4096 4198399 4194304 2G Linux filesystem
/dev/vda3 4198400 83884031 79685632 38G Linux filesystem
/dev/vda4 83884032 146800606 62916575 30G Linux LVM
# 新的磁盘已经识别到
Disk /dev/vdb: 30 GiB, 32212254720 bytes, 62914560 sectors
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 /dev/mapper/ubuntu--vg-ubuntu--lv: 67.99 GiB, 73006055424 bytes, 142589952 sectors
Units: sectors of 1 * 512 = 512 bytes
Sector size (logical/physical): 512 bytes / 512 bytes
I/O size (minimum/optimal): 512 bytes / 512 bytes
root@mmy83:~#
剩下的操作分别是:磁盘分区、创建物理卷(PV)、加入卷组(VG)、扩展逻辑卷(LV)、生效扩展,这些和上面的操作基本上是一致的,这里不再重复。
注: 通过 LVM 可以很好的实现动态扩展磁盘空间:
- 可以跨分区扩展
- 可以跨磁盘扩展