一、简介

   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