实践LVM

逻辑盘卷管理(LVM,Logical Volume Manager)是磁盘管理的一种工具,就目前基本上所有操作系统均支持,LVM是建立在硬盘和分区之上的一个逻辑层,来提高磁盘分区管理的灵活性。通过LVM系统管理员可以轻松管理磁盘分区,如:将若干个磁盘分区连接为一个整块的卷组(volume group),形成一个存储池。管理员可以在卷组上随意创建逻辑卷组(logical volumes),并进一步在逻辑卷组上创建文件系统。管理员通过LVM可以方便的调整存储卷组的大小,并且可以对磁盘存储按照组的方式进行命名、管理和分配,例如按照使用用途进行定义:“DBdata”和“DBSoft”,而不是使用物理磁盘名“sda”和“sdb”或”hda”和”hdb”。而且当系统添加了新的磁盘,通过LVM管理员就不必将磁盘的文件移动到新的磁盘上以充分利用新的存储空间,而是直接扩展文件系统跨越磁盘即可,架构可以参考如下图:

lvm-architecture

lvm-architecture1

概述

物理存储介质(The physical media)

这里指系统的存储设备:硬盘,如:/dev/hda、/dev/sda等等,是存储系统最低层的存储单元。

物理卷(PV physical volume)

物理卷就是指磁盘磁盘分区或从逻辑上与磁盘分区具有同样功能的设备(如RAID),是LVM的基本存储逻辑块,但和基本的物理存储介质(如分区、磁盘等)比较,却包含有与LVM相关的管理参数。

卷组(VG Volume Group)

LVM卷组类似于非LVM系统中的物理硬盘,其由物理卷组成。可以在卷组上创建一个或多个“LVM分区”(逻辑卷),LVM卷组由一个或多个物理卷组成。

逻辑卷(LV logical volume)

LVM的逻辑卷类似于非LVM系统中的硬盘分区,在逻辑卷之上可以建立文件系统(比如/home或者/usr等)。

PE(physical extent)

每一个物理卷被划分为称为PE(Physical Extents)的基本单元,具有唯一编号的PE是可以被LVM寻址的最小单元。PE的大小是可配置的,默认为4MB。

LE(logical extent)

逻辑卷也被划分为被称为LE(Logical Extents) 的可被寻址的基本单位。在同一个卷组中,LE的大小和PE是相同的,并且一一对应。

命令

卷管理常用命令集合:

  查看显示 创建 删除 扩容 激活 扫描查找
LV lvdisplay lvcreate lvremove lvextend lvchange lvscan
PV pvdisplay pvcreate pvremove   pvchange pvscan
VG vgdisplay vgcreate vgremove vgextend vgchange vgscan

PV

既可以基于分区,也可以基于磁盘,来新建PV。

基于分区的方式,需要事先通过fdisk或者其他方式对磁盘分区,分区之后不格式化文件系统,然后再用pvcreate来创建物理卷。

基于磁盘的方式,直接对磁盘创建物理卷(PV),然后分配卷组(VG),再在卷组里面创建逻辑卷(LV)

pvdisplay

1
2
3
4
5
6
7
8
9
10
11
$ pvdisplay
--- Physical volume ---
  PV Name               /dev/vda2
  VG Name               centos
  PV Size               <39.00 GiB / not usable 3.00 MiB
  Allocatable           yes 
  PE Size               4.00 MiB
  Total PE              9983
  Free PE               1
  Allocated PE          9982
  PV UUID               qko7Iy-N1He-yxcS-Jr5B-Dskf-HYN8-S6PocD

pvscan

1
2
3
4
$ pvscan 
  PV /dev/vda2   VG centos          lvm2 [<39.00 GiB / 4.00 MiB free]
  PV /dev/vdb                       lvm2 [120.00 GiB]
  Total: 2 [<159.00 GiB] / in use: 1 [<39.00 GiB] / in no VG: 1 [120.00 GiB]

pvcreate

1
2
3
# 格式:pvcreate 磁盘或分区
$ pvcreate /dev/vdb
  Physical volume "/dev/vdb" successfully created.

pvremove

pvresize

pvchange

pvmove

pvck

pvs

VG

vgdisplay

显示vg信息,比如已用空间,空闲空间等

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
$ vgdisplay
  --- Volume group ---
  VG Name               centos
  System ID             
  Format                lvm2
  Metadata Areas        2
  Metadata Sequence No  5
  VG Access             read/write
  VG Status             resizable
  MAX LV                0
  Cur LV                3
  Open LV               3
  Max PV                0
  Cur PV                2
  Act PV                2
  VG Size               158.99 GiB
  PE Size               4.00 MiB
  Total PE              40702
  Alloc PE / Size       9982 / 38.99 GiB
  Free  PE / Size       30720 / 120.00 GiB
  VG UUID               Uy8nyY-8eaZ-mLkf-TFpy-fKfE-3a4a-XqiPaV

vgscan

1
2
3
$ vgscan 
  Reading volume groups from cache.
  Found volume group "centos" using metadata type lvm2

vgcreate

新建vg

1
2
# 格式:vgcreate 卷组名 物理卷名1 物理卷名2
$ vgcreate vgzx /dev/vda

vgextend

扩展vg,加入新的pv

1
2
# 格式:vgextend 卷组名 物理卷名1 物理卷名2
$ vgextend vgzx /dev/vdb

命令:

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
$ vgextend --help
  vgextend - Add physical volumes to a volume group

  vgextend VG PV ...
	[ -A|--autobackup y|n ]
	[ -f|--force ]
	[ -Z|--zero y|n ]
	[ -M|--metadatatype lvm2|lvm1 ]
	[    --labelsector Number ]
	[    --metadatasize Size[m|UNIT] ]
	[    --pvmetadatacopies 0|1|2 ]
	[    --metadataignore y|n ]
	[    --dataalignment Size[k|UNIT] ]
	[    --dataalignmentoffset Size[k|UNIT] ]
	[    --reportformat basic|json ]
	[    --restoremissing ]
	[ COMMON_OPTIONS ]

  Common options for lvm:
	[ -d|--debug ]
	[ -h|--help ]
	[ -q|--quiet ]
	[ -v|--verbose ]
	[ -y|--yes ]
	[ -t|--test ]
	[    --commandprofile String ]
	[    --config String ]
	[    --driverloaded y|n ]
	[    --lockopt String ]
	[    --longhelp ]
	[    --profile String ]
	[    --version ]

  Use --longhelp to show all options and advanced commands.

vgreduce

1
2
# 格式:vgreduce 卷组名 物理卷名1 物理卷名2
$ vgreduce centos /dev/vdb

命令:

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
$ vgreduce --help
  vgreduce - Remove physical volume(s) from a volume group

  Remove a PV from a VG.
  vgreduce VG PV ...
	[ COMMON_OPTIONS ]

  Remove all unused PVs from a VG.
  vgreduce -a|--all VG
	[ COMMON_OPTIONS ]

  Remove all missing PVs from a VG.
  vgreduce --removemissing VG
	[    --mirrorsonly ]
	[ COMMON_OPTIONS ]

  Common options for command:
	[ -A|--autobackup y|n ]
	[ -f|--force ]
	[    --reportformat basic|json ]

  Common options for lvm:
	[ -d|--debug ]
	[ -h|--help ]
	[ -q|--quiet ]
	[ -v|--verbose ]
	[ -y|--yes ]
	[ -t|--test ]
	[    --commandprofile String ]
	[    --config String ]
	[    --driverloaded y|n ]
	[    --lockopt String ]
	[    --longhelp ]
	[    --profile String ]
	[    --version ]

  Use --longhelp to show all options and advanced commands.

vgremove

vgrename

vgchange

LV

lvdisplay

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
$ lvdisplay 
  --- Logical volume ---
  LV Path                /dev/centos/app
  LV Name                app
  VG Name                centos
  LV UUID                XFs5Ra-6gtE-9kiq-Ig0o-Rpow-mNHN-yJx6qa
  LV Write Access        read/write
  LV Creation host, time localhost, 2019-07-31 15:22:41 +0800
  LV Status              available
  # open                 1
  LV Size                27.99 GiB
  Current LE             7166
  Segments               1
  Allocation             inherit
  Read ahead sectors     auto
  - currently set to     8192
  Block device           253:2
   
  --- Logical volume ---
  LV Path                /dev/centos/root
  LV Name                root
  VG Name                centos
  LV UUID                4JRWqT-tI14-LQRT-1LEc-JGsv-02rc-XxnPii
  LV Write Access        read/write
  LV Creation host, time localhost, 2019-07-31 15:22:42 +0800
  LV Status              available
  # open                 1
  LV Size                9.00 GiB
  Current LE             2304
  Segments               1
  Allocation             inherit
  Read ahead sectors     auto
  - currently set to     8192
  Block device           253:0
   
  --- Logical volume ---
  LV Path                /dev/centos/swap
  LV Name                swap
  VG Name                centos
  LV UUID                YIVOFM-h0U6-igj7-XKYZ-L8ho-nnt0-3F9j4R
  LV Write Access        read/write
  LV Creation host, time localhost, 2019-07-31 15:22:42 +0800
  LV Status              available
  # open                 2
  LV Size                2.00 GiB
  Current LE             512
  Segments               1
  Allocation             inherit
  Read ahead sectors     auto
  - currently set to     8192
  Block device           253:1

lvcreate

创建lv

1
2
# 格式:lvcreate -L 逻辑卷大小 -n 逻辑卷名 卷组名
$ lvcreate -L 2G -n lvzx01 vgzx

命令

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
$ lvcreate --help
  lvcreate - Create a logical volume

  Create a linear LV.
  lvcreate -L|--size Size[m|UNIT] VG
	[ -l|--extents Number[PERCENT] ]
	[    --type linear ]
	[ COMMON_OPTIONS ]
	[ PV ... ]

  Create a striped LV (infers --type striped).
  lvcreate -i|--stripes Number -L|--size Size[m|UNIT] VG
	[ -l|--extents Number[PERCENT] ]
	[ -I|--stripesize Size[k|UNIT] ]
	[ COMMON_OPTIONS ]
	[ PV ... ]

  Create a raid1 or mirror LV (infers --type raid1|mirror).
  lvcreate -m|--mirrors Number -L|--size Size[m|UNIT] VG
	[ -l|--extents Number[PERCENT] ]
	[ -R|--regionsize Size[m|UNIT] ]
	[    --mirrorlog core|disk ]
	[    --minrecoveryrate Size[k|UNIT] ]
	[    --maxrecoveryrate Size[k|UNIT] ]
	[ COMMON_OPTIONS ]
	[ PV ... ]

  Create a raid LV (a specific raid level must be used, e.g. raid1).
  lvcreate --type raid -L|--size Size[m|UNIT] VG
	[ -l|--extents Number[PERCENT] ]
	[ -m|--mirrors Number ]
	[ -i|--stripes Number ]
	[ -I|--stripesize Size[k|UNIT] ]
	[ -R|--regionsize Size[m|UNIT] ]
	[    --minrecoveryrate Size[k|UNIT] ]
	[    --maxrecoveryrate Size[k|UNIT] ]
	[ COMMON_OPTIONS ]
	[ PV ... ]

  Create a raid10 LV.
  lvcreate -m|--mirrors Number -i|--stripes Number -L|--size Size[m|UNIT] VG
	[ -l|--extents Number[PERCENT] ]
	[ -I|--stripesize Size[k|UNIT] ]
	[ -R|--regionsize Size[m|UNIT] ]
	[    --minrecoveryrate Size[k|UNIT] ]
	[    --maxrecoveryrate Size[k|UNIT] ]
	[ COMMON_OPTIONS ]
	[ PV ... ]

  Create a COW snapshot LV of an origin LV.
  lvcreate -s|--snapshot -L|--size Size[m|UNIT] LV
	[ -l|--extents Number[PERCENT] ]
	[ -i|--stripes Number ]
	[ -I|--stripesize Size[k|UNIT] ]
	[ -c|--chunksize Size[k|UNIT] ]
	[    --type snapshot ]
	[ COMMON_OPTIONS ]
	[ PV ... ]

  Create a thin pool.
  lvcreate --type thin-pool -L|--size Size[m|UNIT] VG
	[ -l|--extents Number[PERCENT] ]
	[ -c|--chunksize Size[k|UNIT] ]
	[ -i|--stripes Number ]
	[ -I|--stripesize Size[k|UNIT] ]
	[    --thinpool LV_new ]
	[    --poolmetadatasize Size[m|UNIT] ]
	[    --poolmetadataspare y|n ]
	[    --discards passdown|nopassdown|ignore ]
	[    --errorwhenfull y|n ]
	[ COMMON_OPTIONS ]
	[ PV ... ]

  Create a cache pool.
  lvcreate --type cache-pool -L|--size Size[m|UNIT] VG
	[ -l|--extents Number[PERCENT] ]
	[ -H|--cache ]
	[ -c|--chunksize Size[k|UNIT] ]
	[    --poolmetadatasize Size[m|UNIT] ]
	[    --poolmetadataspare y|n ]
	[    --cachemode writethrough|writeback|passthrough ]
	[    --cachepolicy String ]
	[    --cachesettings String ]
	[    --cachemetadataformat auto|1|2 ]
	[ COMMON_OPTIONS ]
	[ PV ... ]

  Create a thin LV in a thin pool (infers --type thin).
  lvcreate -V|--virtualsize Size[m|UNIT] --thinpool LV_thinpool VG
	[ -T|--thin ]
	[    --type thin ]
	[    --discards passdown|nopassdown|ignore ]
	[    --errorwhenfull y|n ]
	[ COMMON_OPTIONS ]

  Create a thin LV that is a snapshot of an existing thin LV 
  (infers --type thin).
  lvcreate -s|--snapshot LV_thin
	[    --type thin ]
	[    --discards passdown|nopassdown|ignore ]
	[    --errorwhenfull y|n ]
	[ COMMON_OPTIONS ]

  Create a thin LV that is a snapshot of an external origin LV.
  lvcreate --type thin --thinpool LV_thinpool LV
	[ -T|--thin ]
	[ -c|--chunksize Size[k|UNIT] ]
	[    --poolmetadatasize Size[m|UNIT] ]
	[    --poolmetadataspare y|n ]
	[    --discards passdown|nopassdown|ignore ]
	[    --errorwhenfull y|n ]
	[ COMMON_OPTIONS ]

  Create a thin LV, first creating a thin pool for it, 
  where the new thin pool is named by the --thinpool arg.
  lvcreate --type thin -V|--virtualsize Size[m|UNIT] -L|--size Size[m|UNIT] --thinpool LV_new
	[ -l|--extents Number[PERCENT] ]
	[ -T|--thin ]
	[ -c|--chunksize Size[k|UNIT] ]
	[ -i|--stripes Number ]
	[ -I|--stripesize Size[k|UNIT] ]
	[    --poolmetadatasize Size[m|UNIT] ]
	[    --poolmetadataspare y|n ]
	[    --discards passdown|nopassdown|ignore ]
	[    --errorwhenfull y|n ]
	[ COMMON_OPTIONS ]
	[ PV ... ]

  Create a cache LV, first creating a new origin LV, 
  then combining it with the existing cache pool named 
  by the --cachepool arg.
  lvcreate --type cache -L|--size Size[m|UNIT] --cachepool LV_cachepool VG
	[ -l|--extents Number[PERCENT] ]
	[ -H|--cache ]
	[ -c|--chunksize Size[k|UNIT] ]
	[ -i|--stripes Number ]
	[ -I|--stripesize Size[k|UNIT] ]
	[    --poolmetadatasize Size[m|UNIT] ]
	[    --poolmetadataspare y|n ]
	[    --cachemode writethrough|writeback|passthrough ]
	[    --cachepolicy String ]
	[    --cachesettings String ]
	[    --cachemetadataformat auto|1|2 ]
	[ COMMON_OPTIONS ]
	[ PV ... ]

  Common options for command:
	[ -a|--activate y|n|ay ]
	[ -A|--autobackup y|n ]
	[ -C|--contiguous y|n ]
	[ -M|--persistent y|n ]
	[ -j|--major Number ]
	[ -k|--setactivationskip y|n ]
	[ -K|--ignoreactivationskip ]
	[ -n|--name String ]
	[ -p|--permission rw|r ]
	[ -r|--readahead auto|none|Number ]
	[ -W|--wipesignatures y|n ]
	[ -Z|--zero y|n ]
	[    --addtag Tag ]
	[    --alloc contiguous|cling|cling_by_tags|normal|anywhere|inherit ]
	[    --ignoremonitoring ]
	[    --metadataprofile String ]
	[    --minor Number ]
	[    --monitor y|n ]
	[    --nosync ]
	[    --noudevsync ]
	[    --reportformat basic|json ]

  Common options for lvm:
	[ -d|--debug ]
	[ -h|--help ]
	[ -q|--quiet ]
	[ -v|--verbose ]
	[ -y|--yes ]
	[ -t|--test ]
	[    --commandprofile String ]
	[    --config String ]
	[    --driverloaded y|n ]
	[    --lockopt String ]
	[    --longhelp ]
	[    --profile String ]
	[    --version ]

  Use --longhelp to show all options and advanced commands.

格式化

1
2
# mkfs.ext4 /dev/卷组名/逻辑卷名
$ mkfs.ext4 /dev/vgzx/lvzx01

lvextend

扩展lv,改变lv大小

1
2
3
4
5
6
7
8
9
# 扩展到40G
$ lvextend -L 40G /dev/centos/root
  Size of logical volume centos/root changed from 9.00 GiB (2304 extents) to 40.00 GiB (10240 extents).
  Logical volume centos/root successfully resized.
  
# 增加10G
$ lvextend -L +10G /dev/centos/root
  Size of logical volume centos/root changed from 40.00 GiB (10240 extents) to 50.00 GiB (12800 extents).
  Logical volume centos/root successfully resized.

扩展完成后,还需扩展文件系统,否则df -hl是看不到扩展的大小的

redhat7

1
$ xfs_growfs /dev/centos/root

redhat6

1
$ resize2fs /dev/centos/root

参考LVM逻辑卷管理LVM PV VG LV 理解