定义:LVM是Linux环境中对磁盘分区进行管理的一种机制, 是建立在硬盘和分区之上、文件系统之下的一个逻辑层,可提高磁盘分区管理的灵活性。RHEL5默认安装的分区格式就是LVM逻辑卷的格式, 需要注意的是/boot分区不能基于LVM创建,必须独立出来。
作用:生成逻辑卷,动态扩容文件空间的大小。
基本的LVM术语:
PV :物理卷,是LVM的逻辑存储块,与磁盘分区是逻辑对应关系。
VG:卷组,是LVM的逻辑概念上的磁盘设备,由一个或多个物理卷组合形成。(物理的磁盘分区)
PE:物理长度,是逻辑上的最小存储单元,默认是 4MB。PE是将物理卷组合为卷组后,所划分的最小存储单元。
LE:LV上的最小存储单元,与PE大小对应。
LV:逻辑卷,物理意义上的分区。逻辑卷上可以建立文件系统(/home或/usr等)。
pvcreate:创建PV(一个物理卷组)
[root@localhost ~]# pvcreate /dev/sdb1 /dev/sdb2
Physical volume "/dev/sdb1" successfully created
Physical volume "/dev/sdb2" successfully created
pvs:查看PV信息
pvdisplay:查看PV的详细信息
pvremove:移除物理卷
[root@localhost ~]# pvremove /dev/sdb1 /dev/sdb2
Labels on physical volume "/dev/sdb1" successfully wiped
Labels on physical volume "/dev/sdb2" successfully wiped
pvscan:列出系统中的物理卷
-e:仅显示属于卷组的物理卷
-n:仅显示不属于任何卷组的物理卷
-s:短格式输出
-u:显示UiD
[root@localhost ~]# pvscan
PV /dev/sdb1 lvm2 [1.01 GiB]
PV /dev/sdb2 lvm2 [1.01 GiB]
Total: 2 [2.02 GiB] / in use: 0 [0 ] / in no VG: 2 [2.02 GiB]
pvmove:移除物理卷中的PE,即将硬盘上的数据移动到其他硬盘上(将原本PV上的数据移动到其他的PV上)。此命令存在的前提条件是LVM创建成功,可用于VG的缩减
vgcreate:创建卷组
vgcreate 创建卷组的名称 /dev/sd{c,d,e}
-s:指定PE的大小
vgcreate -s 8M vgname /dev/device
[root@localhost ~]# vgcreate myvg /dev/sdb1 /dev/sdb2
Volume group "myvg" successfully created
[root@localhost ~]# vgcreate -s 8M myvg /dev/sdb1 /dev/sdb2
Volume group "myvg" successfully created
vgextend:将物理卷添加到卷组中
vgesxtend vgname pvname
vgreduce:删除卷组中的物理卷,缩减
[root@localhost ~]# vgreduce myvg /dev/sdb3
vgremove:删除卷组
vgremove vgname
[root@localhost ~]# vgremove myvg
Volume group "myvg" successfully removed
vgs:查看卷组
vgdisply:查看卷组的详细信息
vgrename:更改卷组名称
vgchange:改变卷组的工作状态
lvcreate:创建逻辑卷
-n:指定逻辑卷名称
-L:指定逻辑卷大小,以空间大小指定(小于卷组)
数字:表示绝对容量
+数字:新增容量(增量)
-l:指定逻辑卷大小,是以 PE 为单位进行指定
-s:指定创建逻辑卷快照
lvcreate -s -n 快照名 -L 大小 创建快照的逻辑卷 -p r
-p:设置属性
r:只读属性
lvextend:扩展逻辑卷标大小
resize2fs :给新增的 lv(逻辑卷)创建文件系统
lvreduce:缩减逻辑卷大小
lvs:查看信息
lvdisplay:查看LV的详细信息
lvrename:修改逻辑卷名称
lvremove:删除
lvconvert:恢复快照
lvconvert --merge 快照路径
创建逻辑卷详细步骤:
1、分区
2、下载包
yum install lvm2
3、创建物理卷组pv
[root@localhost ~]# pvcreate /dev/sdb1 /dev/sdb2
Physical volume "/dev/sdb1" successfully created.
Physical volume "/dev/sdb2" successfully created.
[root@localhost ~]# pvs
4、创建卷组vg
[root@localhost ~]# vgcreate -s 10M myvg /dev/sdb1 /dev/sdb2
Volume group "myvg" successfully created
[root@localhost ~]# vgs
5、创建逻辑卷lv
[root@localhost ~]# lvcreate -L 300M -n mylv myvg
Logical volume "mylv" created.
[root@localhost ~]# lvs
[root@localhost ~]# lvscan
ACTIVE '/dev/myvg/mylv' [1.49 GiB] inherit
6、格式化
[root@localhost ~]# mkfs.ext4 /dev/myvg/mylv
7、挂载
[root@localhost ~]# mkdir /tmp/mylv
[root@localhost ~]# mount /dev/myvg/mylv /tmp/mylv/
8、查看
[root@localhost ~]# df -h
/dev/mapper/myvg-mylv 283M 2.1M 262M 1% /tmp/mylv
//扩大vg
[root@localhost ~]# vgextend myvg /dev/sdb3
Physical volume "/dev/sdb3" successfully created.
Volume group "myvg" successfully extended
[root@localhost ~]# vgs
//减少vg
[root@localhost ~]# pvs
PV VG Fmt Attr PSize PFree
/dev/sdb1 myvg lvm2 a--u 1.01g 8.00m
/dev/sdb2 myvg lvm2 a--u 1.01g 1.01g
/dev/sdb4 myvg lvm2 a--u 1.95g 1.95g
[root@localhost ~]# dd if=/dev/zero of=/mnt/mylv1/file bs=1M count=20
记录了20+0 的读入
记录了20+0 的写出
20971520字节(21 MB)已复制,0.159131 秒,132 MB/秒
[root@localhost ~]# pvs
PV VG Fmt Attr PSize PFree
/dev/sdb1 myvg lvm2 a--u 1.01g 8.00m
/dev/sdb2 myvg lvm2 a--u 1.01g 1.01g
/dev/sdb4 myvg lvm2 a--u 1.95g 1.95g
[root@localhost ~]# pvmove /dev/sdb1
/dev/sdb1: Moved: 1.6%
/dev/sdb1: Moved: 76.6%
/dev/sdb1: Moved: 100.0%
## 将数据移动到其他PV上
[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 1 0 wz--n- 2.96g 1.96g
## 将/dev/sdb1从myvg卷组中删除
保证有LV,拉伸LV,对文件系统进行拉伸
[root@localhost mylv]# lvextend -L +500M /dev/myvg/mylv
Size of logical volume myvg/mylv changed from 500.00 MiB (50 extents) to 1000.00 MiB (100 extents).
Logical volume myvg/mylv successfully resized.
[root@localhost mylv]# df -h
Filesystem Size Used Avail Use% Mounted on
/dev/mapper/myvg-mylv 477M 2.3M 445M 1% /tmp/mylv
## 虽然LV进行了扩容,但挂载磁盘大小依旧是477M,我们还需要给新增的LV创建文件系统,这样系统才能识别到。
[root@localhost ~]# resize2fs /dev/myvg/mylv
resize2fs 1.42.9 (28-Dec-2013)
Filesystem at /dev/myvg/mylv is mounted on /tmp/mylv; on-line resizing required
old_desc_blocks = 1, new_desc_blocks = 13
The filesystem on /dev/myvg/mylv is now 1646592 blocks long.
[root@localhost ~]# df -h
Filesystem Size Used Avail Use% Mounted on
/dev/mapper/myvg-mylv 1.6G 2.7M 1.5G 1% /tmp/mylv
一定按照下面步骤一步步进行,一步错、步步错。
1、卸载逻辑卷
2、检查逻辑卷空间,使用 e2fsck 命令,
-f:强制执行检测
3、使用 resize2fs 命令,将文件系统大小缩减
4、使用 lvreduce 缩减逻辑卷大小
1、卸载逻辑卷
[root@localhost /]# umount /dev/myvg/mylv
[root@localhost /]# df -h
2、查看文件系统的大小,方便下面缩减计算
[root@localhost ~]# lvs
LV VG Attr LSize Pool Origin Data% Meta% Move Log Cpy%Sync Convert
root centos -wi-ao---- <18.51g
swap centos -wi-ao---- 1.00g
mylv myvg -wi-a----- 800.00m
3、检测逻辑卷空间
[root@localhost /]# e2fsck -f /dev/myvg/mylv
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/mylv: 11/254000 files (0.0% non-contiguous), 42817/1024000 blocks
4、缩减文件系统大小
[root@localhost ~]# resize2fs /dev/myvg/mylv 500M
resize2fs 1.42.9 (28-Dec-2013)
Resizing the filesystem on /dev/myvg/mylv to 512000 (1k) blocks.
The filesystem on /dev/myvg/mylv is now 512000 blocks long.
5、缩减逻辑卷大小
[root@localhost ~]# lvreduce -L 700M /dev/myvg/mylv
Rounding size to boundary between physical extents: 704.00 MiB.
WARNING: Reducing active logical volume to 704.00 MiB.
THIS MAY DESTROY YOUR DATA (filesystem etc.)
Do you really want to reduce myvg/mylv? [y/n]: y
Size of logical volume myvg/mylv changed from 800.00 MiB (100 extents) to 704.00 MiB (88 extents).
Logical volume myvg/mylv successfully resized.
6、查看逻辑卷的大小是否改变
[root@localhost ~]# lvs
LV VG Attr LSize Pool Origin Data% Meta% Move Log Cpy%Sync Convert
root centos -wi-ao---- <18.51g
swap centos -wi-ao---- 1.00g
mylv myvg -wi-ao---- 704.00m
7、挂载使用
[root@localhost /]# mount /dev/myvg/mylv /tmp/mylv
[root@localhost ~]# df -h
Filesystem Size Used Avail Use% Mounted on
/dev/mapper/myvg-mylv 481M 2.3M 454M 1% /tmp/mylv
注意:
1、逻辑卷大小 >= 文件系统,可以用;逻辑卷大小 < 文件系统大小,数据会出问题。而当逻辑卷 > 文件系统时,由于部分区域未格式化成文件系统会造成空间的浪费。
2、lvs命令查找到的是逻辑卷的大小;
df -h:挂在后使用该命令,查到的是文件系统的大小
3、在执行第5步的 lvreduce -L 参数,最好不要写减多少M 。因为PE计算时,存在数值差距。(eg:源文件系统大小800M,后将文件系统大小改为500M,此处执行lvreduce -L -300M,然后PE进行操作,逻辑卷大小本应是800-300=500M,但PE在运算后逻辑卷大小可能是499M(甚至更小),小于文件系统500M大小,(逻辑卷小于文件系统的大小)然后你再进行重新挂载时就会出现错误。)
4、PE运算:
以例题讲解:
PE大小 8Mib,当文件系统大小为 100M 时,100/8 约等于12点多,有小数,所以PE将其按13进行运算,此时逻辑卷大小实际为13*8=104M。
设定文件系统50M,PE大小依旧为 8Mib,50/8=7,需占用 8*7=56M空间,所以逻辑卷104-56=48M,48<56不能用了。
1、先通过 umount 命令卸载掉逻辑卷
2、修改 /etc/fstab 里面逻辑卷的挂载信息(如有添加)否则系统有可能启动不起来。
3、通过 lvremove 删除逻辑卷
4、通过 vgremove 删除卷组
5、通过 pvremove 将物理卷转化成普通分区。
[root@localhost /]# umount /dev/myvg/mylv
[root@localhost /]# lvremove /dev/myvg/mylv
[root@localhost /]# vgcreate myvg
[root@localhost /]# vgcreate /dev/myvg
[root@localhost /]# vgremove /dev/myvg
[root@localhost /]# pvremove /dev/sdb1 /dev/sdb2
Ivm快照有多种实现方法,其中一种是COW (Copy-On-Write) ,不用停止服务或将逻辑卷设为只读就可以进行备份,当一个snapshot创建的时候只是拷贝原始卷里的元数据,而不是物理上的数据,所以snapshot的创建特别快。原始卷写入数据snapshot记录哪些数据发生变化,并备份旧数据,当恢复的时候就可以把旧数据恢复到对应位置。
注意三点:
1、VG中需要预留存放快照本身的空间,不能全部被占满。
2、快照所在的VG必须与被备份的LV相司,也就是说,快照存放的位置必须与被照卷存放在同个VG上。否则快照会失败。
3、如果快照卷满了,则会自动失效,因为快照区记录的是数据变化前的数据,也就是说数据的修改量不能超过快照区的大小,否则这个快照就不能用了。
## 创建快照
[root@localhost ~]# lvcreate -L 20M -s -n mysnop /dev/myvg/mylv
Logical volume "mysnop" created.
## 查看lv
[root@localhost ~]# lvdisplay
--- Logical volume ---
LV Path /dev/myvg/mysnop
LV Name mysnop
VG Name myvg
LV UUID kodJE7-tcp8-l2u6-jAHq-Yvca-ZCKy-DTA2VM
LV Write Access read/write
LV Creation host, time localhost.localdomain, 2019-08-10 23:18:23 +0800
LV snapshot status active destination for mylv
LV Status available
# open 0
LV Size 500.00 MiB
Current LE 50
COW-table size 20.00 MiB (#快照实际容量)
COW-table LE 2
Allocated to snapshot 0.00% (#快照已使用百分比)
Snapshot chunk size 4.00 KiB
Segments 1
Allocation inherit
Read ahead sectors auto
- currently set to 8192
Block device 253:5
## 删除快照
[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
例题:创建一个快照并通过快照恢复数据
1、分区
[root@localhost ~]# fdisk /dev/sdb
Device Boot Start End Blocks Id System
/dev/sdb1 2048 2099199 1048576 83 Linux
/dev/sdb2 2099200 4196351 1048576 83 Linux
/dev/sdb3 4196352 6293503 1048576 83 Linux
/dev/sdb4 6293504 10485759 2096128 83 Linux
2、创建物理卷
[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/sda2 centos lvm2 a-- 12.00g 4.00m
/dev/sdb1 lvm2 --- 1.00g 1.00g
/dev/sdb2 lvm2 --- 1.00g 1.00g
3、创建卷组
[root@localhost ~]# vgcreate myvg /dev/sdb1 /dev/sdb2
Volume group "myvg" successfully created
[root@localhost ~]# vgs
VG #PV #LV #SN Attr VSize VFree
centos 1 2 0 wz--n- 12.00g 4.00m
myvg 2 0 0 wz--n- 1.99g 1.99g
[root@localhost ~]# vgdisplay
4、创建逻辑卷
[root@localhost ~]# lvcreate -L 300M -n mylv myvg
Logical volume "mylv" created.
[root@localhost ~]# lvs
LV VG Attr LSize Pool Origin Data% Meta% Move Log Cpy%Sync Convert
root centos -wi-ao---- 10.00g
swap centos -wi-ao---- 2.00g
mylv myvg -wi-a----- 300.00m
[root@localhost ~]# lvdisplay
5、格式化
[root@localhost ~]# mkfs.ext4 /dev/myvg/mylv
6、挂载
[root@localhost ~]# mkdir /tmp/mylv
[root@localhost ~]# mount /dev/myvg/mylv /tmp/mylv/
[root@localhost ~]# df -h
Filesystem Size Used Avail Use% Mounted on
/dev/mapper/myvg-mylv 283M 2.1M 262M 1% /tmp/mylv
7、进入逻辑卷挂载的路径下,并创建文件写入数据
[root@localhost ~]# cd /tmp/mylv/
[root@localhost mylv]# ls
lost+found
[root@localhost mylv]# echo "hello" > mysnop_file
[root@localhost mylv]# cat mysnop_file
hello
[root@localhost mylv]# ls
lost+found mysnop_file
8、创建快照
[root@localhost mylv]# lvcreate -L 20M -s -n mysnop /dev/myvg/mylv
Logical volume "mysnop" created.
[root@localhost mylv]# lvdisplay | grep %
Allocated to snapshot 0.06%
[root@localhost mylv]# ll
total 14
drwx------. 2 root root 12288 Aug 12 22:17 lost+found
-rw-r--r--. 1 root root 6 Aug 12 22:18 mysnop_file
9、再次创建文件
[root@localhost mylv]# echo "hello" > mysnop_file1
[root@localhost mylv]# ls
lost+found mysnop_file mysnop_file1
10、退出当前目录,卸载逻辑卷
[root@localhost mylv]# cd ..
[root@localhost mylv]# umount /dev/myvg/mylv
11、恢复快照
[root@localhost tmp]# lvconvert --merge /dev/myvg/mysnop
Merging of volume myvg/mysnop started.
myvg/mylv: Merged: 100.00%
12、重新挂载逻辑卷,进入挂载目录下查看
[root@localhost ~]# mount /dev/myvg/mylv /tmp/mylv/
[root@localhost ~]# cd /tmp/mylv/
[root@localhost mylv]# ls
lost+found mysnop_file
## 此时,原始卷的数据就恢复到备份前的状态