LVM相关概念
LVM是 Logical Volume Manager(逻辑卷管理)的简写,它是Linux环境下对磁盘分区进行管理的一种机制。LVM是在磁盘分区和文件系统之间添加的一个逻辑层,来为文件系统屏蔽下层磁盘分区布局,提供一个抽象的存储卷,在存储卷上建立文件系统。
/boot分区不能基于LVM创建,必须独立出来
LVM术语
- PE (Physical Extend) 每一个物理卷被划分为称为PE(Physical Extents)的基本单元,具有唯一编号的PE是可以被LVM寻址的最小单元。PE的大小是可配置的,默认为4MB。
- PV (Physical Volume) 物理卷就是指硬盘分区或从逻辑上与磁盘分区具有同样功能的设备(如RAID),是LVM的基本存储逻辑块,但和基本的物理存储介质(如分区、磁盘等)比较,却包含有与LVM相关的管理参数。
- VG (Volume Group) LVM卷组类似于非LVM系统中的物理硬盘,其由物理卷组成。可以在卷组上创建一个或多个“LVM分区”(逻辑卷),LVM卷组由一个或多个物理卷组成。
- LV (Logical Volume) LVM的逻辑卷类似于非LVM系统中的硬盘分区,在逻辑卷之上可以建立文件系统(比如/home或者/usr等)。
- LE (Logical Extent) 逻辑卷也被划分为被称为LE(Logical Extents) 的可被寻址的基本单位。在同一个卷组中,LE的大小和PE是相同的,并且一一对应。
LV取代分区,通过对逻辑卷进行格式化,然后进行挂载使用
术语 | 含义 |
---|---|
PV | 物理的磁盘分区 |
VG | LVM中的物理的磁盘分区,PV必须加入VG |
LV | 从VG中划分的逻辑分区 |
LVM管理命令
PV相关命令
命令 | 含义 |
---|---|
pvcreate | 创建pv |
pvs | 查看pv的信息 |
pvdisplay | 查看pv的详细信息 |
pvscan | 在系统中扫描硬盘,列出找到的物理卷列表 |
pvremove | 移除物理卷 |
pvmove | 移除物理卷中的PE |
vg相关命令
命令 | 含义 |
---|---|
vgcreate | 创建卷组 |
vgextend | 向卷组中添加成员 |
vgreduce | 从卷组中删除成员 |
cgremove | 删除卷组 |
vgs | 查看卷组信息 |
vgdisplay | 查看卷组的详细信息 |
vgrename | 更改卷组的名称 |
vgchange | 改变卷组的工作状态 |
vgexport | 导出卷组 |
vgimport | 导入卷组 |
lv相关命令
命令 | 含义 |
---|---|
lvcreate | 创建逻辑卷 |
lvextend | 扩展逻辑卷的大小 |
lvreduce | 缩减逻辑卷的大小 |
lvrename | 更改逻辑卷的名称 |
lvs | 查看lv信息 |
lvdisplay | 查看lv的详细信息 |
lvremove | 删除逻辑卷 |
lvconvert | 恢复快照,快照在恢复后被删除 |
创建LVM
- 准备物理磁盘
[root@localhost ~]# ll /dev/sdb{1,2,5}
brw-rw----. 1 root disk 8, 17 Nov 12 21:07 /dev/sdb1
brw-rw----. 1 root disk 8, 18 Nov 12 21:07 /dev/sdb2
brw-rw----. 1 root disk 8, 21 Nov 12 21:07 /dev/sdb5
- 创建PV
pvcreate
[root@localhost ~]# yum install lvm2 -y
[root@localhost ~]# pvcreate /dev/sdb1 /dev/sdb2
Physical volume "/dev/sdb1" successfully created.
Physical volume "/dev/sdb2" successfully created.
[root@localhost ~]# pvs
PV VG Fmt Attr PSize PFree
/dev/sdb1 myvg lvm2 a-- <5.00g <5.00g
/dev/sdb2 myvg lvm2 a-- <5.00g <5.00g
[root@localhost ~]# pvscan
[root@localhost ~]# pvdisplay
- 创建vg
vgcreate
[root@localhost ~]# vgcreate myvg /dev/sdb1 /dev/sdb2
Volume group "myvg" successfully created
[root@localhost ~]# vgs
VG #PV #LV #SN Attr VSize VFree
myvg 2 0 0 wz--n- 9.99g 9.99g
[root@localhost ~]# vgscan
[root@localhost ~]# vgdisplay
--- Volume group ---
……
PE Size 4.00 MiB ;没有指定默认4M
……
- 创建lv
lvcreate
-n 指定逻辑卷的名称
-L 使用空间容量指定逻辑卷的大小 -L ## 绝对容量 ,-L +## 增量容量
-l 使用PE的个数指定逻辑卷的大小 -l ## 绝对数量 ,-l +## 增量个数,%##free,%##vg
-s 指明创建的逻辑卷为快照
-p 设置只读r属性
[root@localhost ~]# lvcreate -l 10 -n mylv1 myvg ;使用PE数量设置大小
Logical volume "mylv1" created.
[root@localhost ~]# lvcreate -L 100M -n mylv2 myvg ;直接指定大小
Logical volume "mylv2" created.
[root@localhost ~]# lvs
[root@localhost ~]# lvdisplay
[root@localhost ~]# lvscan
ACTIVE '/dev/myvg/mylv1' [40.00 MiB] inherit
ACTIVE '/dev/myvg/mylv2' [100.00 MiB] inherit
- 创建文件系统并挂载
[root@localhost ~]# mkfs.ext4 /dev/myvg/mylv1
[root@localhost ~]# mkfs.ext4 /dev/myvg/mylv2
[root@localhost ~]# mount /dev/myvg/mylv1 /mydir/mylv1
[root@localhost ~]# mount /dev/myvg/mylv2 /mydir/mylv2
[root@localhost ~]# df -Th
Filesystem Type Size Used Avail Use% Mounted on
……
/dev/mapper/myvg-mylv1 ext4 35M 782K 32M 3% /mydir/mylv1
/dev/mapper/myvg-mylv2 ext4 93M 1.6M 85M 2% /mydir/mylv2
VG管理
1.vgextend 扩大VG(卷组)
[root@localhost ~]# pvcreate /dev/sdb5
Physical volume "/dev/sdb5" successfully created.
[root@localhost ~]# vgextend myvg /dev/sdb5
Volume group "myvg" successfully extended
[root@localhost ~]# vgs
VG #PV #LV #SN Attr VSize VFree
myvg 3 2 0 wz--n- <14.99g 14.85g
2.vgreduce 减小VG
[root@localhost ~]# pvs
PV VG Fmt Attr PSize PFree
/dev/sdb1 myvg lvm2 a-- <5.00g <4.86g
/dev/sdb2 myvg lvm2 a-- <5.00g <5.00g
/dev/sdb5 myvg lvm2 a-- <5.00g <5.00g
[root@localhost ~]#
[root@localhost ~]# dd if=/dev/zero of=/mydir/mylv1/file bs=1M count=20
20+0 records in
20+0 records out
20971520 bytes (21 MB) copied, 0.304384 s, 68.9 MB/s
[root@localhost ~]# pvs
PV VG Fmt Attr PSize PFree
/dev/sdb1 myvg lvm2 a-- <5.00g <4.86g
/dev/sdb2 myvg lvm2 a-- <5.00g <5.00g
/dev/sdb5 myvg lvm2 a-- <5.00g <5.00g
[root@localhost ~]# pvmove /dev/sdb1 ;将数据挪到其他pv上
/dev/sdb1: Moved: 28.57%
/dev/sdb1: Moved: 100.00%
[root@localhost ~]# pvs
PV VG Fmt Attr PSize PFree
/dev/sdb1 myvg lvm2 a-- <5.00g <5.00g
/dev/sdb2 myvg lvm2 a-- <5.00g <4.86g
/dev/sdb5 myvg lvm2 a-- <5.00g <5.00g
[root@localhost ~]# vgreduce myvg /dev/sdb1
Removed "/dev/sdb1" from volume group "myvg"
[root@localhost ~]# vgs
VG #PV #LV #SN Attr VSize VFree
myvg 2 2 0 wz--n- 9.99g <9.86g
lvextent LVM扩展
有足够的VG就可以来扩展lv
[root@localhost ~]# lvextend -L +60M /dev/myvg/mylv1
Size of logical volume myvg/mylv1 changed from 40.00 MiB (10 extents) to 100.00 MiB (25 extents).
Logical volume myvg/mylv1 successfully resized.
[root@localhost ~]# lvs
LV VG Attr LSize Pool Origin Data% Meta% Move Log Cpy%Sync Convert
mylv1 myvg -wi-ao---- 100.00m
mylv2 myvg -wi-ao---- 100.00m
[root@localhost ~]# df -h | grep mylv1
/dev/mapper/myvg-mylv1 35M 21M 12M 66% /mydir/mylv1 ;虽然lv扩容了,但是挂载磁盘大小依然是40M,我们需要给新增的lv创建文件系统,这样系统才能识别
[root@localhost ~]# resize2fs /dev/myvg/mylv1
resize2fs 1.42.9 (28-Dec-2013)
Filesystem at /dev/myvg/mylv1 is mounted on /mydir/mylv1; on-line resizing required
old_desc_blocks = 1, new_desc_blocks = 1
The filesystem on /dev/myvg/mylv1 is now 102400 blocks long.
[root@localhost ~]# df -h | grep mylv1
/dev/mapper/myvg-mylv1 93M 22M 66M 25% /mydir/mylv1
lvreduce LV缩减
注意:文件系统大小和逻辑卷大小一定要保持一致才行。如果逻辑卷大于文件系统,由于部分区域未格式化成文
件系统会造成空间的浪费。如果逻辑卷小于文件系统,哪数据就会出问题。
文件系统大小和逻辑卷一定要保持一致
- umount卸载逻辑卷 必须卸载逻辑卷才能缩减
[root@localhost ~]# umount /mnt/mylv1
[root@localhost ~]# df -h|grep mylv1
- 通过e2fsck命令检测逻辑卷上空余的空间
[root@localhost ~]# e2fsck -f /dev/myvg/mylv1 ;必须强制检测,否则缩减的时候会提示
e2fsck 1.42.9 (28-Dec-2013)
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/myvg/mylv1: 12/26624 files (8.3% non-contiguous), 29494/102400 blocks
- 使用resize2fs将文件系统减少
[root@localhost ~]# resize2fs /dev/myvg/mylv1 50M
resize2fs 1.42.9 (28-Dec-2013)
Resizing the filesystem on /dev/myvg/mylv1 to 51200 (1k) blocks.
The filesystem on /dev/myvg/mylv1 is now 51200 blocks long.
- 使用lvreduce命令将逻辑卷减少
[root@localhost ~]# lvreduce -L -50M /dev/myvg/mylv1
Rounding size to boundary between physical extents: 48.00 MiB.
WARNING: Reducing active logical volume to 252.00 MiB.
THIS MAY DESTROY YOUR DATA (filesystem etc.)
Do you really want to reduce myvg/mylv1? [y/n]: y
Size of logical volume myvg/mylv1 changed from 300.00 MiB (75 extents) to 252.00 MiB (63 extents).
Logical volume myvg/mylv1 successfully resized.
- 挂载使用
[root@localhost ~]# mount /dev/myvg/mylv1 /mydir/mylv1
[root@localhost ~]# df -Th|grep mylv1
/dev/mapper/myvg-mylv1 ext4 45M 22M 21M 52% /mydir/mylv1
删除逻辑卷
- umount卸载逻辑卷
[root@localhost ~]# umount /mydir/mylv1
[root@localhost ~]# df -Th|grep mylv1
- 修改/etc/fstab里面逻辑卷的挂载信息(如有添加),否则系统有可能启动不起来。
- lvremove删除逻辑卷
[root@localhost ~]# lvremove /dev/myvg/mylv1
Do you really want to remove active logical volume myvg/mylv1? [y/n]: y
Logical volume "mylv1" successfully removed
- vgremove删除卷组
[root@localhost ~]# vgremove myvg
- pvremove将物理卷转化成普通分区
[root@localhost ~]# pvremove /dev/sdb1 /dev/sdb2
LVM快照 lvm snapshot
注意事项
- VG中需要预留存放快照本身的空间
- 快照所在的VG必须与被备份的LV相同,即快照存放的位置必须与被照卷存放在同一个VG上,否则快照会失败
- 如果快照卷满了,自动失效
- 创建快照
[root@localhost ~]# lvcreate -L 20M -s -n mysnop /dev/myvg/mylv2
Logical volume "mysnop" created.
[root@localhost ~]# lvdisplay
……
--- Logical volume ---
LV Path /dev/myvg/mysnop
LV Name mysnop
VG Name myvg
……
COW-table size 20.00 MiB ;快照实际容量
COW-table LE 5
Allocated to snapshot 0.06% ;快照已使用百分比
Snapshot chunk size 4.00 KiB
Segments 1
Allocation inherit
Read ahead sectors auto
- currently set to 8192
Block device 253:3
- 删除快照
[root@localhost ~]# lvremove /dev/myvg/mysnop
Do you really want to remove active logical volume myvg/mysnop? [y/n]: y
Logical volume "mysnop" successfully removed
示例:创建快照并通过快照恢复数据
- 首先给创建好的lv中写入数据
[root@localhost ~]# cd /mydir/mylv2
[root@localhost mylv2]# echo "hello" > myspon_file
[root@localhost mylv2]# cat myspon_file
hello
- 创建快照
[root@localhost mylv2]# lvcreate -L 20M -s -n mysnop1 /dev/myvg/mylv2
Logical volume "mysnop1" created.
- 原始卷中写入数据,快照卷的使用率会增加
[root@localhost mylv2]# lvdisplay |grep %
Allocated to snapshot 0.29%
Allocated to snapshot 0.06%
[root@localhost mylv2]# dd if=/dev/zero of=/mydir/mylv2/file bs=1M count=5
5+0 records in
5+0 records out
5242880 bytes (5.2 MB) copied, 0.00892103 s, 588 MB/s
[root@localhost mylv2]# lvdisplay |grep %
Allocated to snapshot 0.31%
Allocated to snapshot 0.10%
[root@localhost mylv2]# echo "hello" > myspon_file2
[root@localhost mylv2]# ls
file lost+found myspon_file myspon_file2
- 恢复原始数据
[root@localhost ~]# umount /myfile/mylv2 ;必须卸载
[root@localhost ~]# lvconvert --merge /dev/myvg/mysnop1
Merging of volume myvg/mysnop1 started.
myvg/mylv2: Merged: 99.86%