一、简介
LVM是 Logical Volume Manager(逻辑卷管理)的简写,它是基于内核的一种逻辑卷管理器,LVM适合于管理大存储设备,并允许用户动态调整文件系统大小。此外,LVM的快照功能可以帮助我们快速备份数据。LVM为我们提供了逻辑概念上的磁盘,使得文件系统不在关心底层物理磁盘的概念。并且它是Linux环境下对磁盘分区进行管理的一种机制,使用lvm用户可以在无需停机的情况下方便地调整各个分区大小。
看图识LVM
二、LVM基本概念
1、Physical Volume(PV),物理卷:创建分区时,标记分区类型为8e后,就可以将该分区做成物理卷供LVM使用了。可以用任意块设备做成物理卷,单个分区、整块硬盘、RAID设备都可以。
2、Volume Group(VG),卷组:顾名思义,就是将一个或多个PV组合为一个卷组,以PE为存储单位。一个VG至少包含一个PV,VG可以创建多个。
3、Physical Extent(PE),物理区域:PE是整个LVM中可分配的最小存储单元,大小在创建卷组时指定且确定后不能更改;同一卷组的PE大小需一致。新的PV加入卷组后,PE的大小会自动更改为原卷组PE的大小。
4、Logical Volume(LV),逻辑卷:建立在卷组的基础上,卷组中空闲的PE可分配给LV使用,创建LV后可通过增加或减少PE来动态扩展和缩小空间大小。LV可以直接创建文件系统并挂载使用。两种写入模式:线性模式(linear)、交错模式(triped)。
三、LVM常用管理工具
准备工作:
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
|
# fdisk /dev/sda #创建分区并调整分区格式(lvm格式为8e)
WARNING: DOS-compatible mode is deprecated. It's strongly recommended to
switch off the mode (
command
'c'
) and change display
units
to
sectors (
command
'u'
).
Command (m
for
help): n
Command action
e extended
p primary partition (1-4)
e
Selected partition 4
First cylinder (1632-26108, default 1632):
Using default value 1632
Last cylinder, +cylinders or +size{K,M,G} (1632-26108, default 26108):
Using default value 26108
Command (m
for
help): n
First cylinder (1632-26108, default 1632):
Using default value 1632
Last cylinder, +cylinders or +size{K,M,G} (1632-26108, default 26108): +5G
Command (m
for
help): n
First cylinder (2286-26108, default 2286):
Using default value 2286
Last cylinder, +cylinders or +size{K,M,G} (2286-26108, default 26108): +5G
Command (m
for
help): n
First cylinder (2940-26108, default 2940):
Using default value 2940
Last cylinder, +cylinders or +size{K,M,G} (2940-26108, default 26108): +5G
Command (m
for
help): n
First cylinder (3594-26108, default 3594): +5G
Value out of range.
First cylinder (3594-26108, default 3594):
Using default value 3594
Last cylinder, +cylinders or +size{K,M,G} (3594-26108, default 26108): +5G
Command (m
for
help): t
Partition number (1-8): 5
Hex code (
type
L to list codes): 8e
Changed system
type
of partition 5 to 8e (Linux LVM)
Command (m
for
help): t
Partition number (1-8): 6
Hex code (
type
L to list codes): 8e
Changed system
type
of partition 6 to 8e (Linux LVM)
Command (m
for
help): t
Partition number (1-8): 7
Hex code (
type
L to list codes): 8e
Changed system
type
of partition 7 to 8e (Linux LVM)
Command (m
for
help): t
Partition number (1-8): 8
Hex code (
type
L to list codes): 8e
Changed system
type
of partition 8 to 8e (Linux LVM)
Command (m
for
help): w
The partition table has been altered!
Calling ioctl() to re-
read
partition table.
WARNING: Re-reading the partition table failed with error 16: Device or resource busy.
The kernel still uses the old table. The new table will be used at
the next reboot or after you run partprobe(8) or kpartx(8)
Syncing disks.
# kpartx -af /dev/sda
# partx -a /dev/sda (centos6.7需要这两步才能读取硬盘)
# cat /proc/partitions (查看磁盘情况)
major minor
#blocks name
8 0 209715200 sda
8 1 819200 sda1
8 2 10240000 sda2
8 3 2048000 sda3
8 4 31 sda4
8 5 5246007 sda5
8 6 5253223 sda6
8 7 5253223 sda7
8 8 5253223 sda8
# fdisk -l
Disk
/dev/sda
: 214.7 GB, 214748364800 bytes
255 heads, 63 sectors
/track
, 26108 cylinders
Units = cylinders of 16065 * 512 = 8225280 bytes
Sector size (logical
/physical
): 512 bytes / 512 bytes
I
/O
size (minimum
/optimal
): 512 bytes / 512 bytes
Disk identifier: 0x000711d9
Device Boot Start End Blocks Id System
/dev/sda1
* 1 103 819200 83 Linux
Partition 1 does not end on cylinder boundary.
/dev/sda2
103 1377 10240000 83 Linux
/dev/sda3
1377 1632 2048000 82 Linux swap / Solaris
/dev/sda4
1632 26108 196604286 5 Extended
/dev/sda5
1632 2285 5246007 8e Linux LVM
/dev/sda6
2286 2939 5253223+ 8e Linux LVM
/dev/sda7
2940 3593 5253223+ 8e Linux LVM
/dev/sda8
3594 4247 5253223+ 8e Linux LVM
|
1、物理卷(PV)的常用管理命令
1
2
3
4
5
6
7
8
|
pvcreate
#创建一个物理卷
pvchange
#修改物理卷的属性
pvresize
#调整一个PV的大小
pvremove
#删除一个PV
pvdisplay
#显示PV的属性信息
pvmove
#移动PE到指定物理卷
pvscan
#搜索所有磁盘上的物理卷
pvs
#显示PV的简要信息
|
示例1:创建4个PV
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
|
# pvcreate /dev/sda{5..8}
Physical volume
"/dev/sda5"
successfully created
Physical volume
"/dev/sda6"
successfully created
Physical volume
"/dev/sda7"
successfully created
Physical volume
"/dev/sda8"
successfully created
# pvs #查看磁盘PV情况
PV VG Fmt Attr PSize PFree
/dev/sda5
lvm2 --- 5.00g 5.00g
/dev/sda6
lvm2 --- 5.01g 5.01g
/dev/sda7
lvm2 --- 5.01g 5.01g
/dev/sda8
lvm2 --- 5.01g 5.01g
# pvdisplay #查看PV详细信息
"/dev/sda5"
is a new physical volume of
"5.00 GiB"
--- NEW Physical volume ---
#新PV
PV Name
/dev/sda5
#物理卷名称
VG Name
PV Size 5.00 GiB
#物理卷大小
Allocatable NO
PE Size 0
Total PE 0
Free PE 0
Allocated PE 0
PV UUID F4waZ4-gQtM-lrZm-RN7O-1HFX-axqe-M5IdE0
"/dev/sda6"
is a new physical volume of
"5.01 GiB"
--- NEW Physical volume ---
PV Name
/dev/sda6
VG Name
PV Size 5.01 GiB
Allocatable NO
PE Size 0
Total PE 0
Free PE 0
Allocated PE 0
PV UUID fykqC3-4PPg-lgfR-iWQO-WzPK-goRT-W4S7uy
"/dev/sda7"
is a new physical volume of
"5.01 GiB"
--- NEW Physical volume ---
PV Name
/dev/sda7
VG Name
PV Size 5.01 GiB
Allocatable NO
PE Size 0
Total PE 0
Free PE 0
Allocated PE 0
PV UUID xakBcc-U6lL-vLC7-WIc1-X2Td-tetj-GKBlOu
"/dev/sda8"
is a new physical volume of
"5.01 GiB"
--- NEW Physical volume ---
PV Name
/dev/sda8
VG Name
PV Size 5.01 GiB
Allocatable NO
PE Size 0
Total PE 0
Free PE 0
Allocated PE 0
PV UUID OOr5Dh-i7ZW-UjsC-rTxW-MrnP-USMI-XQcmOO
|
示例2:删除PV
1
2
3
4
5
6
7
8
|
# pvmove /dev/sda5 /dev/sda6 #注意:两个PV必须在同一卷组内
# pvremove /dev/sda5 #删除PV前要确保该PV没有在任何卷组中
Labels on physical volume
"/dev/sda5"
successfully wiped
# pvs
PV VG Fmt Attr PSize PFree
/dev/sda6
lvm2 --- 5.01g 5.01g
/dev/sda7
lvm2 --- 5.01g 5.01g
/dev/sda8
lvm2 --- 5.01g 5.01g
|
2、卷组(VG)的常用管理命令
1
2
3
4
5
6
7
8
9
10
11
12
|
vgcreate
#创建卷组
-l:设置可容纳的LV最大数,默认为255
-p:设置包含PV的最大数,默认为255
-s:设置PE大小,默认为4M
vgextend
#扩展VG大小
vgdisplay
#显示VG属性信息
vgchange
#修改VG属性信息
vgreduce
#缩减VG大小
vgremove
#删除VG
vgscan
#搜索所有磁盘上的卷组
vgs
#显示VG简要信息
vgck
#检查VG元数据
|
示例1:创建一个卷组,要求PE大小为8M,名称为bjwf,最大支持LV不能超过10个,包含的PV不能超过2个
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
|
# vgcreate -s 8M -l 10 -p 2 bjwf /dev/sda{7,8}
Volume group
"bjwf"
successfully created
# vgdisplay bjwf #查看VG属性信息验证结果
--- Volume group ---
VG Name bjwf
#VG名称
System ID
Format lvm2
Metadata Areas 2
Metadata Sequence No 1
VG Access
read
/write
VG Status resizable
MAX LV 10
#可以看到,支持最大LV数为10个
Cur LV 0
Open LV 0
Max PV 2
#支持最大PV数为2个
Cur PV 2
Act PV 2
VG Size 10.02 GiB
#卷组大小
PE Size 8.00 MiB
#PE的大小
Total PE 1282
Alloc PE / Size 0 / 0
Free PE / Size 1282 / 10.02 GiB
#剩余容量
VG UUID 7q5Lka-cnTN-qqlh-eIg1-Fpr2-2IPY-yrHA1S
|
示例2:扩展bjwf的大小
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
|
# vgextend bjwf /dev/sda6 #这块由于此前定义了VG的最大PV数,所以无法扩展
No space
for
'/dev/sda6'
- volume group
'bjwf'
holds max 2 physical volume(s).
Unable to add physical volume
'/dev/sda6'
to volume group
'bjwf'
.
# vgchange -p 3 bjwf #修改VG属性
Volume group
"bjwf"
successfully changed
# vgextend bjwf /dev/sda6 #扩展VG
Volume group
"bjwf"
successfully extended
#显示成功
# vgdisplay bjwf #查看新扩展的VG
--- Volume group ---
VG Name bjwf
System ID
Format lvm2
Metadata Areas 3
Metadata Sequence No 3
VG Access
read
/write
VG Status resizable
MAX LV 10
Cur LV 0
Open LV 0
Max PV 3
#最大PV数已经改为3个
Cur PV 3
Act PV 3
VG Size 15.02 GiB
#VG大小也已经改变
PE Size 8.00 MiB
Total PE 1923
Alloc PE / Size 0 / 0
Free PE / Size 1923 / 15.02 GiB
VG UUID 7q5Lka-cnTN-qqlh-eIg1-Fpr2-2IPY-yrHA1S
|
示例3:缩减bjwf大小,然后删除bjwf
1
2
3
4
5
6
7
8
|
# vgreduce bjwf /dev/sda8 #注意:把PV移除卷组时要保证该PV数据已经迁移或未使用
Removed
"/dev/sda8"
from volume group
"bjwf"
# vgchange -an bjwf #标记bjwf为不可用状态
0 logical volume(s)
in
volume group
"bjwf"
now active
# vgremove bjwf
#不论VG包含多少PV都可以删除,前提是该VG上没有任何LV,如果有就需要先删除LV
Volume group
"bjwf"
successfully removed
# vgs #查看VG情况
|
3、逻辑卷(LV)的常用管理命令
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
|
lvcreate
#创建LV
-l:设置LV大小,以PE为单位
-L:设置LV大小,以字节为单位
-n:设置LV名称
-p:设置LV权限读写权限,默认为可读可写
-s:设置一个快照卷,对一个已存在的LV做快照
lvextend
#扩展LV大小
lvreduce
#缩减LV大小
lvchange
#修改LV属性信息
-ay:标记LV为可用状态
-an:标记LV为不可用状态
lvremove
#删除LV
lvdisplay
#显示LV属性信息
lvscan
#搜索所有磁盘上的逻辑卷
lvs
#显示LV简要信息
|
示例1:创建一个LV,要求大小为10G,名称为mylv,指定卷组为bjwf,并挂载到/data上
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
|
# lvcreate -L 10G -n mylv bjwf
Logical volume
"mylv"
created.
# lvdisplay #LV详细情况
--- Logical volume ---
LV Path
/dev/bjwf/mylv
#逻辑卷mylv的陆佳
LV Name mylv
#逻辑卷名称为mylv
VG Name bjwf
#基于bjwf卷组
LV UUID gvQMEB-1Zzo-IVth-KV7v-O6QH-8Nxw-IK1RIf
LV Write Access
read
/write
LV Creation host,
time
mail.bjwf.com, 2016-02-01 17:16:57 +0800
LV Status available
# open 0
LV Size 10.00 GiB
Current LE 2560
Segments 2
Allocation inherit
Read ahead sectors auto
- currently
set
to 256
Block device 253:0
# mke2fs -t ext4 /dev/bjwf/mylv #格式化mylv
# mkdir /data #创建目录
# mount /dev/bjwf/mylv /data #挂载到指定目录
# df -h
Filesystem Size Used Avail Use% Mounted on
/dev/sda2
9.5G 6.6G 2.5G 73% /
tmpfs 3.9G 0 3.9G 0%
/dev/shm
/dev/sda1
772M 39M 693M 6%
/boot
/dev/mapper/bjwf-mylv
9.8G 23M 9.2G 1%
/data
#大小为10G的/data
|
示例2:扩展mylv的大小,增加5G空间
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
|
# lvextend -L 15G /dev/bjwf/mylv #方法一,扩展物理边界增加到15G
# lvextend -L +5G /dev/bjwf/mylv #方法二,扩展物理边界增加5G
# df -h
Filesystem Size Used Avail Use% Mounted on
/dev/sda2
9.5G 6.6G 2.5G 73% /
tmpfs 3.9G 0 3.9G 0%
/dev/shm
/dev/sda1
772M 39M 693M 6%
/boot
/dev/mapper/bjwf-mylv
9.8G 23M 9.2G 1%
/data
#仍然为10G,逻辑卷没有增加
# resize2fs /dev/bjwf/mylv
#扩展逻辑边界。 注:只对ext文件系统使用。这里也可以指定扩展逻辑边界大小,默认物理边界大小。
resize2fs 1.41.12 (17-May-2010)
Filesystem at
/dev/bjwf/mylv
is mounted on
/data
; on-line resizing required
old desc_blocks = 1, new_desc_blocks = 1
Performing an on-line resize of
/dev/bjwf/mylv
to 3932160 (4k) blocks.
The filesystem on
/dev/bjwf/mylv
is now 3932160 blocks long.
# lvs
LV VG Attr LSize Pool Origin Data% Meta% Move Log Cpy%Sync
Convert
mylv bjwf -wi-ao---- 15.00g
# df -h
Filesystem Size Used Avail Use% Mounted on
/dev/sda2
9.5G 6.6G 2.5G 73% /
tmpfs 3.9G 0 3.9G 0%
/dev/shm
/dev/sda1
772M 39M 693M 6%
/boot
/dev/mapper/bjwf-mylv
15G 25M 14G 1%
/data
#大小已经增加到15G
|
示例三:缩减mylv的大小,减少9G空间(缩减的顺序与创建时的顺序相反,也就是先卸载文件系统,缩减逻辑卷,缩减物理卷。缩减很危险,不到最后一步千万不要缩减,缩减需要离线。)
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
|
# umount /data/ #卸载,住:卸载前先将数据拿走,血的教训
# e2fsck -f /dev/bjwf/mylv #强制检查
e2fsck 1.41.12 (17-May-2010)
Pass 1: Checking inodes, blocks, and sizes
Pass 2: Checking directory structure
Pass 3: Checking directory connectivity
Pass 4: Checking reference counts
Pass 5: Checking group summary information
/dev/bjwf/mylv
: 12
/983040
files (0.0% non-contiguous), 100865
/3932160
blocks
# resize2fs /dev/bjwf/mylv 7G #缩减逻辑边界至7G
resize2fs 1.41.12 (17-May-2010)
Resizing the filesystem on
/dev/bjwf/mylv
to 1835008 (4k) blocks.
The filesystem on
/dev/bjwf/mylv
is now 1835008 blocks long.
# lvreduce -L 7G /dev/bjwf/mylv #缩减物理边界至7G
WARNING: Reducing active logical volume to 7.00 GiB
THIS MAY DESTROY YOUR DATA (filesystem etc.)
Do you really want to reduce mylv? [y
/n
]: y
#确认,后果自负
Size of logical volume bjwf
/mylv
changed from 15.00 GiB (3840 extents) to
7.00 GiB (1792 extents).
Logical volume mylv successfully resized
# mount /dev/bjwf/mylv /data/ #重新挂载
# df -h
Filesystem Size Used Avail Use% Mounted on
/dev/sda2
9.5G 6.6G 2.5G 73% /
tmpfs 3.9G 0 3.9G 0%
/dev/shm
/dev/sda1
772M 39M 693M 6%
/boot
/dev/mapper/bjwf-mylv
6.8G 23M 6.4G 1%
/data
#已经缩减至7G
|
示例四:对mylv创建一个快照卷,快照恢复后,卸载快照卷并删除
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
|
# lvcreate -L 50M -n mylv_snap -p r -s /dev/bjwf/mylv
#对mylv做快照,首先要确定逻辑卷里面暂用的空间大小小于50M,不然快照没意义
Rounding up size to full physical extent 52.00 MiB
Logical volume
"mylv_snap"
created.
# lvs
LV VG Attr LSize Pool Origin Data% Meta% Move Log Cpy%Sync
C onvert
mylv bjwf owi-a-s--- 10.00g
mylv_snap bjwf sri-a-s--- 52.00m mylv 0.00
#快照卷
# mkdir /snap #创建挂载点
# mount /dev/bjwf//mylv_snap /snap/ #挂载快照至指定目录
mount
: block device
/dev/mapper/bjwf-mylv_snap
is write-protected, mounting
read
-only
# umount /snap/ #卸载,一定要确定数据是否移除
# lvremove /dev/bjwf/mylv_snap #删除快照卷
Do you really want to remove active logical volume mylv_snap? [y
/n
]: y
#确认
Logical volume
"mylv_snap"
successfully removed
|
示例五:删除mylv
1
2
3
|
# lvchange -an /dev/bjwf/mylv #标记mylv为不可用状态
# lvremove /dev/bjwf/mylv #删除LV
Logical volume
"mylv"
successfully removed
|