1. 逻辑卷优势
- 动态扩展
硬盘的标准分区不易扩展, Linux逻辑卷管理器( logical volume manager, LVM)软件包可以通过将另外一个硬盘上的分区加入已有文件系统,动态地添加存储空间。它可以让你在无需重建整个文件系统的情况下,轻松地管理磁盘空间。 - 快照
LVM2允许你创建在线逻辑卷的可读写快照。有了可读写的快照,就可以删除原先的逻辑卷,然后将快照作为替代挂载上。这个功能对快速故障转移或涉及修改数据的程序试验(如果失败,需要恢复修改过的数据)非常有用。 - 条带化
有了条带化,可跨多个物理硬盘创建逻辑卷。当Linux LVM将文件写入逻辑卷时,文件中的数据块会被分散到多个硬盘上。每个后继数据块会被写到下一个硬盘上。
LVM条带化不同于RAID条带化。 LVM条带化不提供用来创建容错环境的校验信息。事实上, LVM条带化会增加文件因硬盘故障而丢失的概率。单个硬盘故障可能会造成多个逻辑卷无法访问。 - 镜像
镜像是一个实时更新的逻辑卷的完整副本。 LVM会为文件系统的每次写操作执行两次写入:一次写入到主逻辑卷,一次写入到镜像副本。这个过程会降低系统的写入性能。
2. 相关概念
概念 | 介绍 |
---|---|
PV(physical volume) | 物理卷,映射到物理磁盘的一个分区 |
VG(volume group) | 卷组,由多个物理卷组成 。 逻辑卷管理系统将卷组视 为一个物理硬盘,但事实上卷组可能是由分布在多个物理硬盘上的多个物理分区组成的。 |
LV(logical volume) | 将卷组进行分区,每个分区就是一个LV |
如上图所示,有三块物理磁盘SDA、SDB、SDC,每块磁盘分别有两个分区。除分区SDC2外,其余每个分区对应一个物理卷,五个物理卷合成一个卷组。然后对卷组进行分区,得到逻辑卷1、逻辑卷2。
3. 使用lvm
3.1 创建分区
在磁盘sdb上创建一个分区,类型为Linux LVM
# 查看sdb分区情况,此时sdb尚未分区,大小为20G
[root@vm14 ~]# lsblk /dev/sdb
NAME MAJ:MIN RM SIZE RO TYPE MOUNTPOINT
sdb 8:16 0 20G 0 disk
# 创建一个10G的lvm分区sdb1
[root@vm14 ~]# fdisk /dev/sdb
# 输入n,按回车
命令(输入 m 获取帮助):n
# 输入p,按回车
Select (default p): p
# 分区号保持默认,按回车
分区号 (1-4,默认 1):
# 起始 扇区保持默认,按回车
起始 扇区 (2048-41943039,默认为 2048):
# 输入+10G,按回车
Last 扇区, +扇区 or +size{K,M,G} (2048-41943039,默认为 41943039):+10G
# 输入t,设置分区类型
命令(输入 m 获取帮助):t
# 输入8e将分区类型设置为Linux LVM (代码对应类型可通过输入l进行查看)
Hex 代码(输入 L 列出所有代码):8e
# 输入p,打印当前分区信息
命令(输入 m 获取帮助):p
磁盘 /dev/sdb:21.5 GB, 21474836480 字节,41943040 个扇区
Units = 扇区 of 1 * 512 = 512 bytes
扇区大小(逻辑/物理):512 字节 / 512 字节
I/O 大小(最小/最佳):512 字节 / 512 字节
磁盘标签类型:dos
磁盘标识符:0x66e7a9e3
设备 Boot Start End Blocks Id System
/dev/sdb1 2048 20973567 10485760 8e Linux LVM
# 由上面输出信息可知,我们已经建立了一个sdb1分区,类型为Linux LVM
# 输入w,按回车,将分区信息写入磁盘
命令(输入 m 获取帮助):w
The partition table has been altered!
Calling ioctl() to re-read partition table.
# 支持分区创建完成,通过以下命令进行查看当前分区情况
[root@vm14 ~]# lsblk /dev/sdb
NAME MAJ:MIN RM SIZE RO TYPE MOUNTPOINT
sdb 8:16 0 20G 0 disk
└─sdb1 8:17 0 10G 0 part
3.2 创建PV
# 创建pv
[root@vm14 ~]# pvcreate /dev/sdb1
Physical volume "/dev/sdb1" successfully created.
# 查看pv信息
[root@vm14 ~]# pvdisplay /dev/sdb1
"/dev/sdb1" is a new physical volume of "10.00 GiB"
--- NEW Physical volume ---
PV Name /dev/sdb1
VG Name
PV Size 10.00 GiB
Allocatable NO
PE Size 0
Total PE 0
Free PE 0
Allocated PE 0
PV UUID HE0gEZ-Oc8D-HiKD-QQD9-k6Tf-b44q-p3Lxty
3. 3 创建VG
# 创建vg1
[root@vm14 ~]# vgcreate vg01 /dev/sdb1
Volume group "vg01" successfully created
# vg1信息查看
[root@vm14 ~]# vgdisplay vg01
--- Volume group ---
VG Name vg01
System ID
Format lvm2
Metadata Areas 1
Metadata Sequence No 1
VG Access read/write
VG Status resizable
MAX LV 0
Cur LV 0
Open LV 0
Max PV 0
Cur PV 1
Act PV 1
VG Size <10.00 GiB
PE Size 4.00 MiB
Total PE 2559
Alloc PE / Size 0 / 0
Free PE / Size 2559 / <10.00 GiB
VG UUID T8ZhvR-XuCX-BU6g-FkXk-c9TZ-HkGC-CyqaOJ
3.4 创建LV并挂载
# 将卷组vg01中全部剩余空间都给新建的lv:lv01
[root@vm14 ~]# lvcreate -l 100%FREE -n lv01 vg01
Logical volume "lv01" created.
# 指定大小创建 lvcreate -L 10G -n lv01 vg01
# lv信息查看,注意传参为vg01
[root@vm14 ~]# lvdisplay vg01
--- Logical volume ---
LV Path /dev/vg01/lv01
LV Name lv01
VG Name vg01
LV UUID nLQqUq-oowY-p4o3-xncN-ydVa-qMaA-7cLx1G
LV Write Access read/write
LV Creation host, time vm14, 2020-03-13 22:43:06 +0800
LV Status available
# open 0
LV Size <10.00 GiB
Current LE 2559
Segments 1
Allocation inherit
Read ahead sectors auto
- currently set to 8192
Block device 253:3
# 格式化lv,此处将lv格式化为xfs格式
[root@vm14 ~]# mkfs.xfs /dev/vg01/lv01
meta-data=/dev/vg01/lv01 isize=512 agcount=4, agsize=655104 blks
= sectsz=512 attr=2, projid32bit=1
= crc=1 finobt=0, sparse=0
data = bsize=4096 blocks=2620416, imaxpct=25
= sunit=0 swidth=0 blks
naming =version 2 bsize=4096 ascii-ci=0 ftype=1
log =internal log bsize=4096 blocks=2560, version=2
= sectsz=512 sunit=0 blks, lazy-count=1
realtime =none extsz=4096 blocks=0, rtextents=0
# 查看格式化情况,从输出信息看,vg01-lv01已被格式化为xfs
[root@vm14 ~]# lsblk -f /dev/sdb
NAME FSTYPE LABEL UUID MOUNTPOINT
sdb
└─sdb1 LVM2_member HE0gEZ-Oc8D-HiKD-QQD9-k6Tf-b44q-p3Lxty
└─vg01-lv01 xfs a93dc811-6fa2-4521-ace6-af256d9aebba
# 挂载
[root@vm14 ~]# mkdir /datalvm
[root@vm14 ~]# mount /dev/vg01/lv01 /datalvm
# 查看挂载情况
[root@vm14 ~]# df -hT
文件系统 类型 容量 已用 可用 已用% 挂载点
/dev/mapper/centos-root xfs 50G 2.0G 49G 4% /
devtmpfs devtmpfs 898M 0 898M 0% /dev
tmpfs tmpfs 910M 0 910M 0% /dev/shm
tmpfs tmpfs 910M 9.6M 901M 2% /run
tmpfs tmpfs 910M 0 910M 0% /sys/fs/cgroup
/dev/sda1 xfs 1014M 146M 869M 15% /boot
/dev/mapper/centos-home xfs 67G 33M 67G 1% /home
tmpfs tmpfs 182M 0 182M 0% /run/user/0
/dev/mapper/vg01-lv01 xfs 10G 33M 10G 1% /datalvm
# 从上面信息可以看出lv01已经成功挂载到/datalvm目录,文件类型为xfs
4. 扩展lvm
# 在sdb上创建第二个分区sdb2(Linux LVM类型),创建过程参照 3.1 创建lvm分区
# 可能会提示需要执行partprobe命令,直接在shell中执行即可,无需参数
[root@vm14 ~]# partprobe
# 创建成功后sdb分区情况如下
[root@vm14 ~]# lsblk /dev/sdb
NAME MAJ:MIN RM SIZE RO TYPE MOUNTPOINT
sdb 8:16 0 20G 0 disk
├─sdb1 8:17 0 10G 0 part
│ └─vg01-lv01 253:3 0 10G 0 lvm /datalvm
└─sdb2 8:18 0 10G 0 part
# 创建pv /dev/sdb2
[root@vm14 ~]# pvcreate /dev/sdb2
Physical volume "/dev/sdb2" successfully created.
# 将pv(/dev/sdb2)扩展到vg01中
[root@vm14 ~]# vgextend vg01 /dev/sdb2
Volume group "vg01" successfully extended
# 通过pvs查看pv信息,/dev/sdb2已经属于vg01
[root@vm14 ~]# pvs
PV VG Fmt Attr PSize PFree
/dev/sda2 centos lvm2 a-- <119.00g 4.00m
/dev/sdb1 vg01 lvm2 a-- <10.00g 0
/dev/sdb2 vg01 lvm2 a-- <10.00g <10.00g
# vg信息查看,此时vg01可用空间已经为20G
[root@vm14 ~]# vgdisplay vg01
--- Volume group ---
VG Name vg01
System ID
Format lvm2
Metadata Areas 2
Metadata Sequence No 3
VG Access read/write
VG Status resizable
MAX LV 0
Cur LV 1
Open LV 1
Max PV 0
Cur PV 2
Act PV 2
VG Size 19.99 GiB
PE Size 4.00 MiB
Total PE 5118
Alloc PE / Size 2559 / <10.00 GiB
Free PE / Size 2559 / <10.00 GiB
VG UUID T8ZhvR-XuCX-BU6g-FkXk-c9TZ-HkGC-CyqaOJ
# 扩展lv01,将卷组vg01中的剩余空间全部扩展到lv01中,命令成功会提示lv01从10G扩展到19.99G
[root@vm14 ~]# lvextend -l +100%FREE /dev/vg01/lv01
Size of logical volume vg01/lv01 changed from <10.00 GiB (2559 extents) to 19.99 GiB (5118 extents).
Logical volume vg01/lv01 successfully resized.
# 查看文件系统信息
[root@vm14 ~]# df -hT
文件系统 类型 容量 已用 可用 已用% 挂载点
/dev/mapper/centos-root xfs 50G 2.0G 49G 4% /
devtmpfs devtmpfs 898M 0 898M 0% /dev
tmpfs tmpfs 910M 0 910M 0% /dev/shm
tmpfs tmpfs 910M 9.6M 901M 2% /run
tmpfs tmpfs 910M 0 910M 0% /sys/fs/cgroup
/dev/sda1 xfs 1014M 146M 869M 15% /boot
/dev/mapper/centos-home xfs 67G 33M 67G 1% /home
tmpfs tmpfs 182M 0 182M 0% /run/user/0
/dev/mapper/vg01-lv01 xfs 10G 33M 10G 1% /datalvm
# 发现/datalvm还是10G空间,我们还需要执行以下命令
[root@vm14 ~]# xfs_growfs /dev/mapper/vg01-lv01
meta-data=/dev/mapper/vg01-lv01 isize=512 agcount=4, agsize=655104 blks
= sectsz=512 attr=2, projid32bit=1
= crc=1 finobt=0 spinodes=0
data = bsize=4096 blocks=2620416, imaxpct=25
= sunit=0 swidth=0 blks
naming =version 2 bsize=4096 ascii-ci=0 ftype=1
log =internal bsize=4096 blocks=2560, version=2
= sectsz=512 sunit=0 blks, lazy-count=1
realtime =none extsz=4096 blocks=0, rtextents=0
data blocks changed from 2620416 to 5240832
# 执行完成后,再次执行df -hT,会发现/datalvm已经是20G空间了
[root@vm14 ~]# df -hT
文件系统 类型 容量 已用 可用 已用% 挂载点
/dev/mapper/centos-root xfs 50G 2.0G 49G 4% /
devtmpfs devtmpfs 898M 0 898M 0% /dev
tmpfs tmpfs 910M 0 910M 0% /dev/shm
tmpfs tmpfs 910M 9.6M 901M 2% /run
tmpfs tmpfs 910M 0 910M 0% /sys/fs/cgroup
/dev/sda1 xfs 1014M 146M 869M 15% /boot
/dev/mapper/centos-home xfs 67G 33M 67G 1% /home
tmpfs tmpfs 182M 0 182M 0% /run/user/0
/dev/mapper/vg01-lv01 xfs 20G 33M 20G 1% /datalvm
5. 自动挂载
[root@vm14 ~]# vim /etc/fstab
# 在最后面添加一行内容如下
/dev/mapper/vg01-lv01 /datalvm xfs defaults 0 0
# 上面内容表示系统启动时,将/dev/mapper/vg01-lv01挂载到/datalvm目录下
# 进行重启测试
[root@vm14 ~]# reboot
# 查看挂载情况,发现/dev/mapper/vg01-lv01已被挂载
[root@vm14 ~]# df -h
文件系统 容量 已用 可用 已用% 挂载点
/dev/mapper/centos-root 50G 2.0G 48G 4% /
devtmpfs 898M 0 898M 0% /dev
tmpfs 910M 0 910M 0% /dev/shm
tmpfs 910M 9.6M 901M 2% /run
tmpfs 910M 0 910M 0% /sys/fs/cgroup
/dev/sda1 1014M 146M 869M 15% /boot
/dev/mapper/vg01-lv01 20G 33M 20G 1% /datalvm
/dev/mapper/centos-home 67G 33M 67G 1% /home
tmpfs 182M 0 182M 0% /run/user/0