文章目录
一、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. 物理磁盘
- 物理磁盘插入确认
[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
- 对物理磁盘进行分区
[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 # 刷新分区表
- 查看磁盘分区信息
[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
- 创建物理卷
[root@localhost ~]# pvcreate /dev/sdb1
Physical volume "/dev/sdb1" successfully created.
- 可以通过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 创建好之后,才可以创建卷组
1. 创建卷组
[root@localhost ~]# vgcreate myvg /dev/sdb1 # 创建名字是myvg的卷组,磁盘空间来自sdb1
Volume group "myvg" successfully created
- 查看卷组
[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
1. 创建逻辑卷
[root@localhost ~]# lvcreate -L 4.9G -n mylv myvg # 创建逻辑卷,名为mylv,大小4.9G,空间来自myvg这个卷组
Rounding up size to full physical extent 4.90 GiB
- 查看逻辑卷
[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. 格式化逻辑卷并挂载
```shell
[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)
[root@localhost ~]# lvextend -l +100%FREE /dev/myvg/mylv # 扩展vg中剩余的所有空间到lv
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]