Linux常用命令-lvm

命令

lvm

描述

LVM2 tools
逻辑卷管理器LVM可以通过物理设备来创建虚拟块设备,可以动态的调整分区大小,更便于管理多块磁盘

用法

1
2
lvm [command|file]
lvm help [command]

选项

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
lvm子命令
pv相关命令:
pvchange 更改pv属性
pvresize 调整pv大小
pvck 检查pv一致性
pvcreate 创建pv
pvdisplay 显示pv属性
pvmove 迁移pv数据
pvremove 删除pv
pvs 显示pv属性
pvscan 显示所有pv

vg相关命令:
vgcfgbackup 备份vg配置
vgcfgrestore 还原vg配置
vgchange 更改vg属性
vgck 检查vg一致性
vgconvert 更改vg元数据格式
vgcreate 创建vg
vgdisplay 显示vg信息
vgexport 在系统中取消vg
vgextend 添加pv到vg
vgimport 在系统中注册vg
vgimportclone 从克隆的pv导入vg
vgmerge 合并vg
vgmknodes 在/dev中为vg创建特殊文件
vgreduce 从vg中移除pv
vgremove 删除vg
vgrename 重命名vg
vgs 显示vg属性
vgscan 显示所有vg
vgsplit 将pv移动到新的或现有的vg中

lv相关命令:
lvchange 更改lv属性
lvconvert 更改lv格式
lvcreate 创建lv
lvdisplay 显示lv属性
lvextend 扩容lv
lvreduce 压缩lv
lvremove 删除lv
lvrename 重命名lv
lvresize 调整lv大小
lvs 显示lv属性
lvscan 显示所有lv

注意

1.对磁盘或分区操作前,一定要确认盘符,路径,分区等相关信息,避免误操作导致数据丢失
2.ext4文件系统支持增大和减小分区空间,但是xfs只支持增大,不支持减小空间,建议预先分配xfs分区时尽可能小,后续再逐步增加
3.取消lvm分区挂载时一定要删除fstab中的配置,否则会导致系统重启后无法启动

示例

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
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
123
124
125
126
127
128
129
130
131
132
133
134
135
136
137
138
139
140
141
142
143
144
145
146
147
148
149
150
151
152
153
154
155
156
157
158
159
160
161
162
163
164
165
166
167
168
169
170
171
172
173
174
175
176
177
178
179
180
181
182
183
184
185
186
187
188
189
190
191
192
193
194
195
196
197
198
199
200
201
202
203
204
205
206
207
208
209
210
211
212
213
214
215
216
217
218
219
220
221
222
223
224
225
226
227
228
229
230
231
232
233
234
235
# 部分lvm子命令可以独立使用,如`lvm vgs`可以直接执行`vgs`命令
$ lvm vgs
VG #PV #LV #SN Attr VSize VFree
centos 1 2 0 wz--n- <19.00g 0
$ vgs
VG #PV #LV #SN Attr VSize VFree
centos 1 2 0 wz--n- <19.00g 0
# 可以看到vgs是lvm命令的软链接
$ ll /usr/sbin/vgs
lrwxrwxrwx. 1 root root 3 May 21 02:28 /usr/sbin/vgs -> lvm
# 其他相关的子命令vg*,pv*,lv*多数都是lvm命令的软链接
$ ll /usr/sbin/vg*
lrwxrwxrwx. 1 root root 3 May 21 02:28 /usr/sbin/vgcfgbackup -> lvm
lrwxrwxrwx. 1 root root 3 May 21 02:28 /usr/sbin/vgcfgrestore -> lvm
lrwxrwxrwx. 1 root root 3 May 21 02:28 /usr/sbin/vgchange -> lvm
lrwxrwxrwx. 1 root root 3 May 21 02:28 /usr/sbin/vgck -> lvm
lrwxrwxrwx. 1 root root 3 May 21 02:28 /usr/sbin/vgconvert -> lvm
lrwxrwxrwx. 1 root root 3 May 21 02:28 /usr/sbin/vgcreate -> lvm
...
$ ll /usr/sbin/pv*
$ ll /usr/sbin/lv*

# 新加了sdb,sdc,sdd三块硬盘
$ lsblk
NAME MAJ:MIN RM SIZE RO TYPE MOUNTPOINT
sda 8:0 0 20G 0 disk
├─sda1 8:1 0 1G 0 part /boot
└─sda2 8:2 0 19G 0 part
├─centos-root 253:0 0 17G 0 lvm /
└─centos-swap 253:1 0 2G 0 lvm [SWAP]
sdb 8:16 0 5G 0 disk
sdc 8:32 0 10G 0 disk
sdd 8:48 0 20G 0 disk
# 当前lvm分区情况如下
$ pvs
PV VG Fmt Attr PSize PFree
/dev/sda2 centos lvm2 a-- <19.00g 0
$ vgs
VG #PV #LV #SN Attr VSize VFree
centos 1 2 0 wz--n- <19.00g 0
$ lvs
LV VG Attr LSize Pool Origin Data% Meta% Move Log Cpy%Sync Convert
root centos -wi-ao---- <17.00g
swap centos -wi-ao---- 2.00g
# 创建pv
$ pvcreate /dev/sdb
Physical volume "/dev/sdb" successfully created.
# 查看pv
$ pvs /dev/sdb
PV VG Fmt Attr PSize PFree
/dev/sdb lvm2 --- 5.00g 5.00g
$ pvdisplay /dev/sdb
"/dev/sdb" is a new physical volume of "5.00 GiB"
--- NEW Physical volume ---
PV Name /dev/sdb
VG Name
PV Size 5.00 GiB
Allocatable NO
PE Size 0
Total PE 0
Free PE 0
Allocated PE 0
PV UUID 9vPLxu-s0qb-Ko1D-QsB9-maB1-R0xR-liIDA8
# 创建vg
$ vgcreate vg_data /dev/sdb
Volume group "vg_data" successfully created
# 查看vg
$ vgs vg_data
VG #PV #LV #SN Attr VSize VFree
vg_data 1 0 0 wz--n- <5.00g <5.00g
$ vgdisplay vg_data
--- Volume group ---
VG Name vg_data
System ID
Format lvm2
Metadata Areas 1
Metadata Sequence No 1
VG Access read/write
VG Status resizable
MAX LV 0
Cur LV 0
Open LV 0
Max PV 0
Cur PV 1
Act PV 1
VG Size <5.00 GiB
PE Size 4.00 MiB
Total PE 1279
Alloc PE / Size 0 / 0
Free PE / Size 1279 / <5.00 GiB
VG UUID BJLto4-ZwX3-BGdN-mutx-5n15-GDb2-tdqpTC
# 创建lv
$ lvcreate -l +100%FREE -n lv_data vg_data
Logical volume "lv_data" created.
# 查看lv,注意查看指定lv时指定的是vg的名称或者指定完整路径
$ lvs vg_data
LV VG Attr LSize Pool Origin Data% Meta% Move Log Cpy%Sync Convert
lv_data vg_data -wi-a----- <5.00g
$ lvs /dev/vg_data/lv_data
LV VG Attr LSize Pool Origin Data% Meta% Move Log Cpy%Sync Convert
lv_data vg_data -wi-a----- <5.00g
$ lvdisplay vg_data
--- Logical volume ---
LV Path /dev/vg_data/lv_data
LV Name lv_data
VG Name vg_data
LV UUID xeWHZw-OjkW-Dtbm-TnSl-5ahH-oxVK-qAfTae
LV Write Access read/write
LV Creation host, time centos7, 2021-08-02 21:42:31 +0800
LV Status available
# open 0
LV Size <5.00 GiB
Current LE 1279
Segments 1
Allocation inherit
Read ahead sectors auto
- currently set to 8192
Block device 253:2
# 格式化lv并挂载到/data分区
$ mkfs.xfs /dev/mapper/vg_data-lv_data
meta-data=/dev/mapper/vg_data-lv_data isize=512 agcount=4, agsize=327424 blks
= sectsz=512 attr=2, projid32bit=1
= crc=1 finobt=0, sparse=0
data = bsize=4096 blocks=1309696, imaxpct=25
= sunit=0 swidth=0 blks
naming =version 2 bsize=4096 ascii-ci=0 ftype=1
log =internal log bsize=4096 blocks=2560, version=2
= sectsz=512 sunit=0 blks, lazy-count=1
realtime =none extsz=4096 blocks=0, rtextents=0
$ lsblk /dev/sdb
NAME MAJ:MIN RM SIZE RO TYPE MOUNTPOINT
sdb 8:16 0 5G 0 disk
└─vg_data-lv_data 253:2 0 5G 0 lvm
# 查看分区的uuid
$ blkid /dev/sdb
/dev/sdb: UUID="9vPLxu-s0qb-Ko1D-QsB9-maB1-R0xR-liIDA8" TYPE="LVM2_member"
$ blkid /dev/mapper/vg_data-lv_data
/dev/mapper/vg_data-lv_data: UUID="ebd64a45-66f6-4826-8b3c-81d16d40e392" TYPE="xfs"
$ mkdir /data
$ mount /dev/mapper/vg_data-lv_data /data/
$ df -hT /data
Filesystem Type Size Used Avail Use% Mounted on
/dev/mapper/vg_data-lv_data xfs 5.0G 33M 5.0G 1% /data
# 添加挂载信息到fstab,开机自动挂载
$ echo "/dev/mapper/vg_data-lv_data /data xfs defaults 0 0" >> /etc/fstab
# 取消挂载
$ umount /data
# 删除lv
$ lvremove /dev/mapper/vg_data-lv_data
Do you really want to remove active logical volume vg_data/lv_data? [y/n]: y
Logical volume "lv_data" successfully removed
# 删除vg
$ vgremove vg_data
Volume group "vg_data" successfully removed
# 删除pv
$ pvremove /dev/sdb
Labels on physical volume "/dev/sdb" successfully wiped.

# 重复以上步骤到自动挂载,然后进行如下的扩容操作
# 注意以下操作为全盘扩容,并没有对新硬盘sdc进行分区,适用于虚拟机环境,即按需添加一块对应大小的硬盘进行全盘扩容
$ df -hT /data
Filesystem Type Size Used Avail Use% Mounted on
/dev/mapper/vg_data-lv_data xfs 5.0G 33M 5.0G 1% /data
$ lsblk /dev/sdb
NAME MAJ:MIN RM SIZE RO TYPE MOUNTPOINT
sdb 8:16 0 5G 0 disk
└─vg_data-lv_data 253:2 0 5G 0 lvm /data
# 添加pv-sdc
$ pvcreate /dev/sdc
Physical volume "/dev/sdc" successfully created.
$ pvs
PV VG Fmt Attr PSize PFree
/dev/sda2 centos lvm2 a-- <19.00g 0
/dev/sdb vg_data lvm2 a-- <5.00g 0
/dev/sdc vg_data lvm2 a-- <10.00g <10.00g
# 添加sdc到vg_data
$ vgextend vg_data /dev/sdc
Volume group "vg_data" successfully extended
$ vgs vg_data
VG #PV #LV #SN Attr VSize VFree
vg_data 2 1 0 wz--n- 14.99g <10.00g
# 扩展lv_data空间,即扩容/data分区
$ lvextend -r -l +100%FREE /dev/mapper/vg_data-lv_data
Size of logical volume vg_data/lv_data changed from <5.00 GiB (1279 extents) to 14.99 GiB (3838 extents).
Logical volume vg_data/lv_data successfully resized.
meta-data=/dev/mapper/vg_data-lv_data isize=512 agcount=4, agsize=327424 blks
= sectsz=512 attr=2, projid32bit=1
= crc=1 finobt=0 spinodes=0
data = bsize=4096 blocks=1309696, imaxpct=25
= sunit=0 swidth=0 blks
naming =version 2 bsize=4096 ascii-ci=0 ftype=1
log =internal bsize=4096 blocks=2560, version=2
= sectsz=512 sunit=0 blks, lazy-count=1
realtime =none extsz=4096 blocks=0, rtextents=0
data blocks changed from 1309696 to 3930112
# 查看/data分区由5G增加到了15G
$ df -hT /data
Filesystem Type Size Used Avail Use% Mounted on
/dev/mapper/vg_data-lv_data xfs 15G 33M 15G 1% /data
$ lsblk /dev/sdb /dev/sdc
NAME MAJ:MIN RM SIZE RO TYPE MOUNTPOINT
sdb 8:16 0 5G 0 disk
└─vg_data-lv_data 253:2 0 15G 0 lvm /data
sdc 8:32 0 10G 0 disk
└─vg_data-lv_data 253:2 0 15G 0 lvm /data

# 如果是物理机或者添加了一块较大的硬盘,可以考虑先分区再扩容,避免磁盘空间的浪费
# 如下操作为分区扩容,从sdd硬盘中划分出10G的分区,扩容到/data
# 以下fdisk命令为非交互式分区命令,从sdd中划分一个10G的分区sdd1
$ echo -e "n\np\n1\n\n+10G\nt\n8e\nw\n" | fdisk /dev/sdd
$ lsblk /dev/sdd
NAME MAJ:MIN RM SIZE RO TYPE MOUNTPOINT
sdd 8:48 0 20G 0 disk
└─sdd1 8:49 0 10G 0 part
$ pvcreate /dev/sdd1
Physical volume "/dev/sdd1" successfully created.
$ vgextend vg_data /dev/sdd1
Volume group "vg_data" successfully extended
$ vgs vg_data
VG #PV #LV #SN Attr VSize VFree
vg_data 3 1 0 wz--n- <24.99g <10.00g
$ lvextend -r -l +100%FREE /dev/mapper/vg_data-lv_data
Size of logical volume vg_data/lv_data changed from 14.99 GiB (3838 extents) to <24.99 GiB (6397 extents).
Logical volume vg_data/lv_data successfully resized.
# /data分区大小由15G增加到了25G
$ df -hT /data
Filesystem Type Size Used Avail Use% Mounted on
/dev/mapper/vg_data-lv_data xfs 25G 34M 25G 1% /data

# 注意xfs文件系统的lvm分区只能增加,不能减小
$ lvreduce -r -L 20G /dev/vg_data/lv_data
Size of logical volume vg_data/lv_data unchanged from 20.00 GiB (5120 extents).
Logical volume vg_data/lv_data successfully resized.
fsadm: Xfs filesystem shrinking is unsupported.
/usr/sbin/fsadm failed: 1