LVM简介
LVM是逻辑盘卷管理(Logical Volume Manager)的简称,它是Linux环境下对磁盘分区进行管理的一种机制,LVM是建立在硬盘和分区之上的一个逻辑层,来提高磁盘分区管理的灵活性。
传统分区使用固定大小分区,重新调整大小十分麻烦。但是,LVM可以创建和管理“逻辑”卷,而不是直接使用物理硬盘。可以弹性的管理逻辑卷的扩大缩小,操作简单,而不损坏已存储的数据。可以随意将新的硬盘添加到LVM,以直接扩展已经存在的逻辑卷。LVM并不需要重启就可以让内核知道分区的存在。
LVM工作机制
LVM通过将底层的物理硬盘封装起来,以逻辑卷的方式呈现给上层应用。在传统的磁盘管理机制中,我们的上层应用是直接访问文件系统,从而对底层的物理硬盘进行读取。而在LVM中,其通过对底层的硬盘进行封装,当我们对底层的物理硬盘进行操作时,其不再是针对于分区进行操作,而是通过一个叫做逻辑卷的东西来对其进行底层的磁盘管理操作。
LVM相关概念
物理卷(PV, Physical Volume)
物理卷就是指磁盘、磁盘分区或从逻辑上和磁盘分区具有同样功能的设备(如RAID),是LVM的基本存储逻辑块,但和基本的物理存储介质(如分区、磁盘等)比较,却包含有和LVM相关的管理参数。
- 使用
pvcreate /dev/sdb1
来基于sdb1分区创建PV
卷组(VG, Volume Group)
VG由若干PV组成,能在VG上创建一个或多个LV。VG是PV和LV中间的层,可以通过调整VG中的PV来调整VG的容量,进而调整LV的分配情况。
- 使用
vgcreate vg01 /dev/sdb1
创建vg并添加sdb1对应的pv
- 使用
vgextend vg01 /dev/sdb2
向vg中继续添加pv
逻辑卷(LV, Logical Volume)
LV是从VG上分配出的一块空间,用于建立文件系统,相当于非LVM模式的磁盘分区。
- 使用
lvcreate -L 10M -n lv01 vg01
在vg上创建lv并指定初始大小为10M
- 使用
lvextend -L +200M /dev/vg01/lv01
扩展lv01的大小为100M,前提是vg01中有未使用的空间
- 创建出的lv需要格式化成指定文件系统,才能进行挂载操作
注意:
- VG不一定要把全部空间分给LV,可以有剩余空间。LV仍可用这些剩余空间进行扩容,此时文件系统需要使用resize2fs 重新激活才能获得扩容后的大小。
- 如果VG空间不足以对LV和文件系统扩容,需要向VG添加新的PV。这些PV来自新的磁盘分区。
在已有磁盘上扩容LV
模拟利用磁盘上的未使用空间对已存在的LV进行扩容的场景。
VM的初始磁盘情况为:
可以看到/dev/sda容量20G,在/dev/sda3上存在一个lv /dev/ubuntu-vg/ubuntu-lv
容量18G,并将根目录/
挂载在这个lv上。
(ubuntu-vg是VG名,ubuntu-lv是LV名)
我们要做的是,将磁盘/dev/sda扩容10G,并将新空间扩容进ubuntu-lv这个lv,使其容量达到28G,满足根目录需求。
在VMWare中扩容磁盘,制造未使用空间
在VM中将虚拟机关机,将sda磁盘扩容10G,最终扩展到30G。
可以看到,sda磁盘已经变为30G,但是分区sda3的大小没变,上面lv的大小仍然是18G。需要将sda继续分区,并将新分区扩容进lv。
创建新分区
fdisk -l
查看磁盘情况
看到待分区的设备/dev/sda。使用fdisk /dev/sda
继续分区
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
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
|
root@common:~# fdisk /dev/sda
Welcome to fdisk (util-linux 2.34).
Changes will remain in memory only, until you decide to write them.
Be careful before using the write command.
GPT PMBR size mismatch (41943039 != 62914559) will be corrected by write.
Command (m for help): m ## 查看指令说明
Help:
GPT
M enter protective/hybrid MBR
Generic
d delete a partition
F list free unpartitioned space
l list known partition types
n add a new partition
p print the partition table
t change a partition type
v verify the partition table
i print information about a partition
Misc
m print this menu
x extra functionality (experts only)
Script
I load disk layout from sfdisk script file
O dump disk layout to sfdisk script file
Save & Exit
w write table to disk and exit
q quit without saving changes
Create a new label
g create a new empty GPT partition table
G create a new empty SGI (IRIX) partition table
o create a new empty DOS partition table
s create a new empty Sun partition table
Command (m for help): n ## 新建分区
Partition number (4-128, default 4): ## 回车,使用默认分区号
First sector (41940992-62914526, default 41940992): ## 回车,使用默认起始位置
Last sector, +/-sectors or +/-size{K,M,G,T,P} (41940992-62914526, default 62914526): ## 回车,默认结束位置,使用剩余全部空间
Created a new partition 4 of type 'Linux filesystem' and of size 10 GiB.
Command (m for help): p ## 打印当前分区结果
Disk /dev/sda: 30 GiB, 32212254720 bytes, 62914560 sectors
Disk model: VMware Virtual S
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: E53D0CFF-41A4-4AA5-83A4-2CBC9478AF63
Device Start End Sectors Size Type
/dev/sda1 2048 4095 2048 1M BIOS boot
/dev/sda2 4096 3719167 3715072 1.8G Linux filesystem
/dev/sda3 3719168 41940991 38221824 18.2G Linux filesystem
/dev/sda4 41940992 62914526 20973535 10G Linux filesystem ## 看到新增的分区sda4大小正好是10G
Command (m for help): w ## 保存分区并退出
The partition table has been altered.
Syncing disks.
root@common:~#
|
检查分区结果
新增的分区为/dev/sda4,大小为10G
将新分区加入到原来的lv
在新分区创建pv
1
2
|
root@common:~# pvcreate /dev/sda4
Physical volume "/dev/sda4" successfully created.
|
扩容VG
查看VG当前情况
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
|
root@common:~# vgdisplay
--- Volume group ---
VG Name ubuntu-vg
System ID
Format lvm2
Metadata Areas 1
Metadata Sequence No 2
VG Access read/write
VG Status resizable
MAX LV 0
Cur LV 1
Open LV 1
Max PV 0
Cur PV 1
Act PV 1
VG Size 18.22 GiB
PE Size 4.00 MiB
Total PE 4665
Alloc PE / Size 4608 / 18.00 GiB
Free PE / Size 57 / 228.00 MiB
VG UUID aDRUun-9KCE-ohgP-hhex-qFlC-urdy-hXFRL4
|
使用vgextend将新pv加入到原来的vg
1
2
|
root@common:~# vgextend ubuntu-vg /dev/sda4
Volume group "ubuntu-vg" successfully extended
|
再次查看vg
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
|
root@common:~# vgdisplay
--- Volume group ---
VG Name ubuntu-vg
System ID
Format lvm2
Metadata Areas 2
Metadata Sequence No 3
VG Access read/write
VG Status resizable
MAX LV 0
Cur LV 1
Open LV 1
Max PV 0
Cur PV 2
Act PV 2
VG Size <28.22 GiB ## vg已扩容
PE Size 4.00 MiB
Total PE 7224
Alloc PE / Size 4608 / 18.00 GiB
Free PE / Size 2616 / <10.22 GiB
VG UUID aDRUun-9KCE-ohgP-hhex-qFlC-urdy-hXFRL4
|
扩容LV
查看之前的lv
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
|
root@common:~# lvdisplay
--- Logical volume ---
LV Path /dev/ubuntu-vg/ubuntu-lv
LV Name ubuntu-lv
VG Name ubuntu-vg
LV UUID oXiGwK-ggOt-ZFh2-b9qX-H2mV-HAgm-cgVGU6
LV Write Access read/write
LV Creation host, time ubuntu-server, 2022-09-11 22:08:21 +0000
LV Status available
# open 1
LV Size 18.00 GiB # 之前大小为18G
Current LE 4608
Segments 1
Allocation inherit
Read ahead sectors auto
- currently set to 256
Block device 253:0
|
扩容lv
1
2
3
|
root@common:~# lvextend -L +10G /dev/ubuntu-vg/ubuntu-lv
Size of logical volume ubuntu-vg/ubuntu-lv changed from 18.00 GiB (4608 extents) to 28.00 GiB (7168 extents).
Logical volume ubuntu-vg/ubuntu-lv successfully resized.
|
再次查看lv
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
|
root@common:~# lvdisplay
--- Logical volume ---
LV Path /dev/ubuntu-vg/ubuntu-lv
LV Name ubuntu-lv
VG Name ubuntu-vg
LV UUID oXiGwK-ggOt-ZFh2-b9qX-H2mV-HAgm-cgVGU6
LV Write Access read/write
LV Creation host, time ubuntu-server, 2022-09-11 22:08:21 +0000
LV Status available
# open 1
LV Size 28.00 GiB ## lv已扩容
Current LE 7168
Segments 2
Allocation inherit
Read ahead sectors auto
- currently set to 256
Block device 253:0
|
激活扩容后的LV
LV扩容后,文件系统显示的大小还未改变,需要使用resize2fs
激活扩容后的LV。
1
2
3
4
5
6
7
|
root@common:~# resize2fs /dev/ubuntu-vg/ubuntu-lv
resize2fs 1.45.5 (07-Jan-2020)
Filesystem at /dev/ubuntu-vg/ubuntu-lv is mounted on /; on-line resizing required
old_desc_blocks = 3, new_desc_blocks = 4
The filesystem on /dev/ubuntu-vg/ubuntu-lv is now 7340032 (4k) blocks long.
root@common:~#
|
检查扩容结果
可以看到:
- 新分区
/dev/sdb4
的容量为10G
- 分区
/dev/sdb4
和/dev/sdb3
共同组成了LV /dev/ubuntu-vg/ubuntu-lv
,这个LV大小为28G,挂载了根目录/
- 根目录容量已经达到28G
在新磁盘上使用LV
演示在新的磁盘上使用LVM分区
VMWare上挂载新的硬盘
在虚拟机上可以看到新增的20G磁盘
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
|
root@common:~# lsblk
NAME MAJ:MIN RM SIZE RO TYPE MOUNTPOINT
fd0 2:0 1 4K 0 disk
loop0 7:0 0 62M 1 loop /snap/core20/1611
loop1 7:1 0 67.8M 1 loop /snap/lxd/22753
loop2 7:2 0 47M 1 loop /snap/snapd/16292
sda 8:0 0 30G 0 disk
├─sda1 8:1 0 1M 0 part
├─sda2 8:2 0 1.8G 0 part /boot
├─sda3 8:3 0 18.2G 0 part
│ └─ubuntu--vg-ubuntu--lv 253:0 0 28G 0 lvm /
└─sda4 8:4 0 10G 0 part
└─ubuntu--vg-ubuntu--lv 253:0 0 28G 0 lvm /
sdb 8:16 0 20G 0 disk ## 新增的磁盘
sr0 11:0 1 1024M 0 rom
sr1 11:1 1 1024M 0 rom
|
对新磁盘分区
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
|
root@common:~# fdisk /dev/sdb
Welcome to fdisk (util-linux 2.34).
Changes will remain in memory only, until you decide to write them.
Be careful before using the write command.
Device does not contain a recognized partition table.
Created a new DOS disklabel with disk identifier 0x496d280f.
Command (m for help): n
Partition type
p primary (0 primary, 0 extended, 4 free)
e extended (container for logical partitions)
Select (default p): p
Partition number (1-4, default 1):
First sector (2048-41943039, default 2048):
Last sector, +/-sectors or +/-size{K,M,G,T,P} (2048-41943039, default 41943039): # 默认配置,新分区使用全部空间
Created a new partition 1 of type 'Linux' and of size 20 GiB.
Command (m for help): w
The partition table has been altered.
Calling ioctl() to re-read partition table.
Syncing disks.
|
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
|
root@common:~# lsblk
NAME MAJ:MIN RM SIZE RO TYPE MOUNTPOINT
fd0 2:0 1 4K 0 disk
loop0 7:0 0 62M 1 loop /snap/core20/1611
loop1 7:1 0 67.8M 1 loop /snap/lxd/22753
loop2 7:2 0 47M 1 loop /snap/snapd/16292
sda 8:0 0 30G 0 disk
├─sda1 8:1 0 1M 0 part
├─sda2 8:2 0 1.8G 0 part /boot
├─sda3 8:3 0 18.2G 0 part
│ └─ubuntu--vg-ubuntu--lv 253:0 0 28G 0 lvm /
└─sda4 8:4 0 10G 0 part
└─ubuntu--vg-ubuntu--lv 253:0 0 28G 0 lvm /
sdb 8:16 0 20G 0 disk
└─sdb1 8:17 0 20G 0 part ## 新分区
sr0 11:0 1 1024M 0 rom
sr1 11:1 1 1024M 0 rom
root@common:~#
|
创建逻辑卷
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
|
root@common:~# pvcreate /dev/sdb1
Physical volume "/dev/sdb1" successfully created.
root@common:~# vgcreate vg-data /dev/sdb1
Volume group "vg-data" successfully created
root@common:~# lvcreate -L 5G -n lv-data vg-data # 使用VG中的一部分空间创建LV
Logical volume "lv-data" created.
root@common:~# lvdisplay vg-data ## 查看vg vg-data下的lv
--- Logical volume ---
LV Path /dev/vg-data/lv-data
LV Name lv-data
VG Name vg-data
LV UUID aE1kTJ-fZAK-GNWf-2q3w-klR9-oXB2-cad4LC
LV Write Access read/write
LV Creation host, time common, 2022-09-18 08:29:03 +0000
LV Status available
# open 0
LV Size 5.00 GiB
Current LE 1280
Segments 1
Allocation inherit
Read ahead sectors auto
- currently set to 256
Block device 253:1
|
格式化逻辑卷
1
2
3
4
5
6
7
8
9
10
|
root@common:~# mkfs.ext4 /dev/vg-data/lv-data
Creating filesystem with 1310720 4k blocks and 327680 inodes
Filesystem UUID: e3c869d1-14f7-4b71-8741-3f585e9196e6
Superblock backups stored on blocks:
32768, 98304, 163840, 229376, 294912, 819200, 884736
Allocating group tables: done
Writing inode tables: done
Creating journal (16384 blocks): done
Writing superblocks and filesystem accounting information: done
|
挂载逻辑卷
1
2
|
root@common:~# mkdir /data
root@common:~# mount /dev/vg-data/lv-data /data
|
查看结果
可以看到:
- 新磁盘容量20G,sdb1分区大小10G,LV用了5G,挂载了
/data
目录
配置自动挂载
在/etc/fstab 中添加新的挂载信息,防止重启丢失挂载点
1
2
3
4
5
6
7
8
9
10
11
12
13
14
|
root@common:~# cat /etc/fstab
# /etc/fstab: static file system information.
#
# Use 'blkid' to print the universally unique identifier for a
# device; this may be used with UUID= as a more robust way to name devices
# that works even if disks are added and removed. See fstab(5).
#
# <file system> <mount point> <type> <options> <dump> <pass>
# / was on /dev/ubuntu-vg/ubuntu-lv during curtin installation
/dev/disk/by-id/dm-uuid-LVM-aDRUun9KCEohgPhhexqFlCurdyhXFRL4oXiGwKggOtZFh2b9qXH2mVHAgmcgVGU6 / ext4 defaults 0 1
# /boot was on /dev/sda2 during curtin installation
/dev/disk/by-uuid/3f643662-d868-4bf6-83d9-ad31aed0366a /boot ext4 defaults 0 1
/swap.img none swap sw 0 0
/dev/vg-data/lv-data /data ext4 defaults 0 2 ## 新的挂载点信息
|
扩展逻辑卷
vg-data的容量有20G,目前lv-data只分配了5G,接下来再扩容进去5G。
查看vg-data和lv-data
扩容LV
目前vg有足够的空闲空间,直接扩容LV即可
1
2
3
4
|
root@common:~# lvextend -L +5G /dev/vg-data/lv-data
Size of logical volume vg-data/lv-data changed from 5.00 GiB (1280 extents) to 10.00 GiB (2560 extents).
Logical volume vg-data/lv-data successfully resized.
root@common:~#
|
激活扩容后的LV
1
2
3
4
5
6
|
root@common:~# resize2fs /dev/vg-data/lv-data
Filesystem at /dev/vg-data/lv-data is mounted on /data; on-line resizing required
old_desc_blocks = 1, new_desc_blocks = 2
The filesystem on /dev/vg-data/lv-data is now 2621440 (4k) blocks long.
root@common:~#
|
查看结果
Reference
LVM基础操作步骤梳理
Linux LVM简明教程