一、LVM简介(LVM是 Logical Volume Manager(逻辑卷管理)的简写)
可以让分区变得弹性,可以随时随地的扩大和缩小分区大小,前提是该分区是LVM格式的。lvm需要使用的软件包为lvm2,一般在CentOS发行版中都已经预安装了。
PV(Physical Volume)即物理卷
硬盘分区后(还未格式化为文件系统)使用pvcreate命令可以将分区创建为pv,要求分区的system ID为8e,即为LVM格式的系统标识符。
VG(Volume Group)即卷组
将多个PV组合起来,使用vgcreate命令创建成卷组,这样卷组包含了多个PV就比较大了,相当于重新整合了多个分区后得到的磁盘。虽然VG是整合多个PV的,但是创建VG时会将VG所有的空间根据指定的PE大小划分为多个PE,在LVM模式下的存储都以PE为单元,类似于文件系统的Block。
PE(Physical Extend)
PE是VG中的存储单元。实际存储的数据都是存储在这里面的。
LV(Logical Volume)
VG相当于整合过的硬盘,那么LV就相当于分区,只不过该分区是通过VG来划分的。VG中有很多PE单元,可以指定将多少个PE划分给一个LV,也可以直接指定大小(如多少兆)来划分。划分为LV之后就相当于划分了分区,只需再对LV进行格式化即可变成普通的文件系统。
通俗地讲,非LVM管理的分区步骤是将硬盘分区,然后将分区格式化为文件系统。而使用LVM,则是在硬盘分区为特定的LVM标识符的分区后将其转变为LVM可管理的PV,其实PV仍然类似于分区,然后将几个PV整合为类似于磁盘的VG,最后划分VG为LV,此时LV就成了LVM可管理的分区,只需再对其格式化即可成为文件系统。
LE(logical extent)
PE是物理存储单元,而LE则是逻辑存储单元,也即为lv中的逻辑存储单元,和pe的大小是一样的。从vg中划分lv,实际上是从vg中划分vg中的pe,只不过划分lv后它不再称为pe,而是成为le。
LVM之所以能够伸缩容量,其实现的方法就是将LV里空闲的PE移出,或向LV中添加空闲的PE。
LVM的写入机制
LV是从VG中划分出来的,LV中的PE很可能来自于多个PV。在向LV存储数据时,有多种存储机制,其中两种是:
- 线性模式(linear):先写完来自于同一个PV的PE,再写来自于下一个PV的PE。
- 条带模式(striped):一份数据拆分成多份,分别写入该LV对应的每个PV中,所以读写性能较好,类似于RAID 0。
尽管striped读写性能较好也不建议使用该模式,因为lvm的着重点在于弹性容量扩展而非性能,要实现性能应该使用RAID来实现,而且使用striped模式时要进行容量的扩展和收缩将比较麻烦。默认的是使用线性模式。
LVM实现图解
LVM常用命令汇总
动作 | PV阶段 | VG阶段 | LV阶段 |
---|---|---|---|
查找(scan) | pvscan | vgscan | lvscan |
新建(create) | pvcreate | vgcreate | lvcreate |
显示(display) | pvdisplay | vgdisplay | lvdisplay |
增加(extend) | vgextend | lvextend(lvresize) | |
减少(reduce) | vgreduce | lvreduce(lvresize) | |
删除(remove) | pvremove | vgremove | lvremove |
改变容量(resize) | lvresize | ||
改变属性(attribute) | pvchange | vgchange | lvchange |
二、LVM实操
1、物理磁盘
1.1 物理磁盘插入确认
[root@localhost ~]# fdisk -l
……
Disk /dev/sdb: 21.5 GB, 21474836480 bytes, 41943040 sectors # 新加磁盘
Units = sectors of 1 * 512 = 512 bytes
Sector size (logical/physical): 512 bytes / 512 bytes
I/O size (minimum/optimal): 512 bytes / 512 bytes
……
1.2 对物理磁盘进行分区
[root@localhost ~]# fdisk /dev/sdb # 对/dev/sdb进行分区
Command (m for help): p # 打印分区表
Device Boot Start End Blocks Id System
Command (m for help): n # 添加一个新分区
Select (default p): # 默认回车,创建主分区
Partition number (1-4, default 1): # 分区编号
First sector (2048-41943039, default 2048): # 定义起始扇区,直接回车即可
Using default value 2048
Last sector, +sectors or +size{K,M,G} (2048-41943039, default 41943039): +5G # 创建一个5G的分区
Partition 1 of type Linux and of size 5 GiB is set
Command (m for help): p # 打印分区表
Device Boot Start End Blocks Id System
/dev/sdb1 2048 10487807 5242880 83 Linux # 查看新建的 5G 的分区
Command (m for help): w # 保存并退出
[root@localhost ~]# partprobe /dev/vdb # 刷新分区表
1.3 查看磁盘分区信息
[root@localhost ~]# fdisk -l /dev/sdb # 跟上面的分区编辑中的 p 作用一样
Disk /dev/sdb: 21.5 GB, 21474836480 bytes, 41943040 sectors
Units = sectors of 1 * 512 = 512 bytes
Sector size (logical/physical): 512 bytes / 512 bytes
I/O size (minimum/optimal): 512 bytes / 512 bytes
Disk label type: dos
Disk identifier: 0xbb5d8a79
Device Boot Start End Blocks Id System
/dev/sdb1 2048 10487807 5242880 83 Linux # 查看新建的 5G 的分区
You have new mail in /var/spool/mail/root
2、物理卷 pv(跳过此步骤也可行)
2.3 创建物理卷
[root@localhost ~]# pvcreate /dev/sdb1
Physical volume "/dev/sdb1" successfully created.
2.4 可以通过pvs和pvdisplay查看物理卷相关信息(不加参,查看所有)
[root@localhost ~]# pvs
PV VG Fmt Attr PSize PFree
/dev/sda2 centos lvm2 a-- <19.00g 0
/dev/sdb1 lvm2 --- 5.00g 5.00g
[root@localhost ~]# pvdisplay
……
"/dev/sdb1" is a new physical volume of "5.00 GiB"
--- NEW Physical volume ---
PV Name /dev/sdb1
VG Name
PV Size 5.00 GiB
Allocatable NO
PE Size 0
Total PE 0
Free PE 0
Allocated PE 0
PV UUID 9CYPtz-2KS6-I1jb-fRbO-y61A-dwHZ-VPyMpA
3、卷组 vg
物理卷 pv 创建好之后,才可以创建卷组
3.1 创建卷组
[root@localhost ~]# vgcreate myvg /dev/sdb1 # 创建名字是myvg的卷组,磁盘空间来自sdb1
Volume group "myvg" successfully created
3.2 查看卷组
[root@localhost ~]# vgs
VG #PV #LV #SN Attr VSize VFree
……
myvg 1 0 0 wz--n- <5.00g <5.00g
[root@localhost ~]# vgdisplay
--- Volume group ---
VG Name myvg
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 <5.00 GiB
PE Size 4.00 MiB
Total PE 1279
Alloc PE / Size 0 / 0
Free PE / Size 1279 / <5.00 GiB
VG UUID QzgxDN-RxIP-xtez-mH4f-xfe6-H1Kr-gHSrso
……
4、逻辑卷 lv
卷组 vg 创建好之后,才可以创建逻辑卷 LV
4.1 创建逻辑卷
[root@localhost ~]# lvcreate -L 4.9G -n mylv myvg # 创建逻辑卷,名为mylv,大小4.9G,空间来自myvg这个卷组
Rounding up size to full physical extent 4.90 GiB
4.2 查看逻辑卷
[root@localhost ~]# lvs
LV VG Attr LSize Pool Origin Data% Meta% Move Log Cpy%Sync Convert
……
mylv myvg -wi-a----- 4.90g
[root@localhost ~]# lvdisplay
--- Logical volume ---
LV Path /dev/myvg/mylv
LV Name mylv
VG Name myvg
LV UUID 93TIxH-XRek-4M5U-lyNs-QnUy-ZuJw-dnS2QK
LV Write Access read/write
LV Creation host, time localhost.localdomain, 2022-02-23 00:46:27 +0800
LV Status available
# open 0
LV Size 4.90 GiB
Current LE 1255
Segments 1
Allocation inherit
Read ahead sectors auto
- currently set to 8192
Block device 253:2
……
5、格式化逻辑卷并挂载
[root@localhost ~]# mkfs.xfs /dev/myvg/mylv # 格式化逻辑卷为xfs格式
meta-data=/dev/myvg/mylv isize=512 agcount=4, agsize=321280 blks
= sectsz=512 attr=2, projid32bit=1
= crc=1 finobt=0, sparse=0
data = bsize=4096 blocks=1285120, 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
[root@localhost ~]# blkid /dev/myvg/mylv # TYPE="xfs"既格式化成功
/dev/myvg/mylv: UUID="df286dba-435d-495e-9708-0e66e2414efa" TYPE="xfs"
[root@localhost ~]# mkdir /test
[root@localhost ~]# mount /dev/myvg/mylv /test/ # 挂载逻辑卷mylv到 /test
[root@localhost ~]# vim /etc/fstab # 设置开机挂载
/dev/myvg/mylv /test xfs defaults 0 0
[root@localhost ~]# mount -a # 启用&测试开机挂载
6、扩展逻辑卷
[root@localhost ~]# lvscan # 找出要扩展的逻辑卷
ACTIVE '/dev/myvg/mylv' [4.90 GiB] inherit
……
[root@localhost ~]# blkid /dev/myvg/mylv # 原lvm卷 TYPE="xfs"
/dev/myvg/mylv: UUID="df286dba-435d-495e-9708-0e66e2414efa" TYPE="xfs"
[root@localhost ~]# fdisk /dev/sdb # 创建物理卷 pv
Command (m for help): n
Select (default p):
Partition number (2-4, default 2):
First sector (10487808-41943039, default 10487808):
Last sector, +sectors or +size{K,M,G} (10487808-41943039, default 41943039): +10G
Command (m for help): p
Device Boot Start End Blocks Id System
/dev/sdb1 2048 10487807 5242880 83 Linux
/dev/sdb2 10487808 31459327 10485760 83 Linux
Command (m for help): w
[root@localhost ~]# partprobe /dev/sdb
[root@localhost ~]# vgextend myvg /dev/sdb2 # 扩展卷组 vg
Physical volume "/dev/sdb2" successfully created.
[root@localhost ~]# lsblk
sdb 8:16 0 20G 0 disk
├─sdb1 8:17 0 5G 0 part
│ └─myvg-mylv 253:2 0 4.9G 0 lvm /test
└─sdb2 8:18 0 10G 0 part
[root@localhost ~]# lvextend -L 9.9G /dev/myvg/mylv # 扩展逻辑卷 lvm
Rounding size to boundary between physical extents: 9.90 GiB.
New size given (2535 extents) not larger than existing size (2560 extents)
xfs_growfs /dev/myvg/mylv # 刷新,适用于xfs文件系统
resize2fs /dev/myvg/mylv # 刷新,适用于ext文件系统
7、添加交换分区
为你的系统额外添加一个 512MiB 的交换分区,此交换分区应在系统启动时自动挂载,不要删除或以任何方式改动系统上原有的交换分区。
[root@localhost ~]# fdisk /dev/sdb # 修改磁盘 vdb
Command (m for help): n # 添加新分区
Partition number (3,4, default 3): # 直接回车(默认)
First sector (31459328-41943039, default 31459328): # 直接回车(默认)
Last sector, +sectors or +size{K,M,G} (31459328-41943039, default 41943039): +512M
Command (m for help): w # 保存分区表,并退出
[root@localhost ~]# partprobe /dev/sdb # 刷新分区表
[root@localhost ~]# mkswap /dev/sdb3 # 格式化自建分区 sdb3
[root@localhost ~]# vim /etc/fstab
/dev/sdb3 swap swap defaults 0 0
[root@localhost ~]# swapon -a # 启用 fstab 中的交换设备
[root@localhost ~]# swapon -s # 查看交换分区信息
Filename Type Size Used Priority
/dev/dm-1 partition 2097148 1239352 -2
/dev/sdb3 partition 524284 0 -3
8、最终结果
[root@localhost ~]# lsblk
sdb 8:16 0 20G 0 disk
├─sdb1 8:17 0 5G 0 part
│ └─myvg-mylv 253:2 0 10G 0 lvm /test
├─sdb2 8:18 0 10G 0 part
│ └─myvg-mylv 253:2 0 10G 0 lvm /test
└─sdb3 8:19 0 512M 0 part [SWAP]