逻辑卷的概述
LVM 是 Logical Volume Manager 的简称,译为中文就是逻辑卷管理。它是 Linux 下对硬盘分区的一种管理机制。LVM 适合于管理大存储设备,并允许用户动态调整文件系统的大小。此外,LVM 的快照功能可以帮助我们快速备份数据。LVM 为我们提供了逻辑概念上的磁盘,使得文件系统不再关心底层物理磁盘的概念。
- 物理卷(Physical Volume,PV):就是真正的 物理硬盘 或 分区。
- 卷组(Volume Group,VG):将多个物理卷合起来就组成了卷组。组成同一个卷组的物理卷可以是同一块硬盘的不同分区,也可以是不同硬盘上的不同分区。我们可以把卷组想象为一块逻辑硬盘。
- 逻辑卷(Logical Volume,LV):卷组是一块逻辑硬盘,硬盘必须分区之后才能使用,我们把这个分区称作逻辑卷。逻辑卷可以被格式化和写入数据。我们可以把逻辑卷想象为分区。
- 物理扩展(Physical Extend,PE):PE 是用来保存数据的最小单元,我们的数据实际上都是写入 PE 当中的。PE 的大小是可以配置的,默认是 4MB。
LVM的优点
逻辑卷的出现解决了分区无法扩容的问题,在有硬件设备支持的前提下逻辑卷可以做到不影响正常工作的环境下扩容分区容量。动态调整磁盘容量,提高磁盘管理的灵活性。
- 动态调整磁盘容量,从而提高磁盘管理的灵活性
- 允许在多个物理设备间重新组织文件系统
- LVM可以弹性的更改LVM的容量
注意: /boot分区用于存放引导文件(开机启动文件),而LVM逻辑卷属于虚拟技术,只能是开机后才可以使用的,所以不能基于LVM创建。


逻辑卷管理命令
功能 | 物理卷管理 | 卷组管理 | 逻辑卷管理 |
---|---|---|---|
scan 扫描 | pvscan | vgscan | lvscan |
create建立 | pvcreate | vgcreate | lvcreate |
display显示 | pvdisplay | vgdisplay | lvdisplay |
remove删除 | pvremove | vgremove | lvremove |
extend扩展 | vgextend | lvextend | |
reduce减少 | vgreduce | lvreduce |
创建命令格式:
less
pvcreate 设备名1 设备名2 [设备名3]... //创建物理卷
vgcreate 卷组名 物理卷名1 物理卷名2 [物理卷3]... //创建卷组
lvcreate -L 容量大小 -n 逻辑卷名 卷组名 //创建逻辑卷
mkfs.xfs 逻辑卷名(/dev/卷组名/逻辑名) //将逻辑卷格式化
mount 逻辑卷名(/dev/卷组名/逻辑名) 挂载点 //将逻辑卷挂载
演示:
先建立物理卷
把/dev/sdb1 和/dev/sdc1合并建立卷组。
建立逻辑卷
建好的逻辑卷有两种软连接(叫法)
将逻辑卷进行格式化
对建立好的逻辑卷进行最后一步挂载
扩容命令格式:
ruby
vgextend 卷组名 物理卷名4 //扩容卷组
lvextend -L +大小 /dev/卷组名/逻辑卷名 //扩容逻辑卷
xfs_growfs 挂载点(逻辑卷) //XFS文件系统扩容
resize2fs /dev/VG_NAME/LV_NAME //EXT4文件系统扩容
扩容卷组,将/dev/sdb2分区扩容到zhu卷组
扩容逻辑卷
对刚刚扩容的空间加上xfs文件系统
LVM逻辑卷运用
实验步骤
- 创建物理卷:将/dev/sdb1和/dev/sdc1创建成物理卷
- 创建组卷:创建vg1的组卷,将两个物理卷sdb1和sdc合并组建到vg1中
- 创建逻辑卷:从vg1中抽取10G容量用来创建逻辑卷lv1
- 格式化逻辑卷:将逻辑卷lv1格式化为XFS文件系统
- 挂载逻辑卷:将逻辑卷lv1挂载到/mnt目录下
实验内容:
1.使用fdisk工具规划分区,将/dev/sdb1和/dev/sdc1的分区格式设置为Linux LVM(对应系统ID为8e)
scss
[root@localhost ~]# fdisk /dev/sdb
欢迎使用 fdisk (util-linux 2.23.2)。
更改将停留在内存中,直到您决定将更改写入磁盘。
使用写入命令前请三思。
命令(输入 m 获取帮助):t //管理磁盘分区,将sdb1的格式改为lvm
分区号 (1,2,默认 2):1
Hex 代码(输入 L 列出所有代码):8e
已将分区"Linux"的类型更改为"Linux LVM"
命令(输入 m 获取帮助):w
The partition table has been altered!
Calling ioctl() to re-read partition table.
正在同步磁盘。
[root@localhost ~]# fdisk /dev/sdc
欢迎使用 fdisk (util-linux 2.23.2)。
更改将停留在内存中,直到您决定将更改写入磁盘。
使用写入命令前请三思。
Device does not contain a recognized partition table
使用磁盘标识符 0x12cc5dbe 创建新的 DOS 磁盘标签。
命令(输入 m 获取帮助):n
Partition type:
p primary (0 primary, 0 extended, 4 free)
e extended
Select (default p):
Using default response p
分区号 (1-4,默认 1):
起始 扇区 (2048-41943039,默认为 2048):
将使用默认值 2048
Last 扇区, +扇区 or +size{K,M,G} (2048-41943039,默认为 41943039):+19G
分区 1 已设置为 Linux 类型,大小设为 19 GiB
命令(输入 m 获取帮助):t //管理磁盘分区将sdc1改成lvm格式
已选择分区 1
Hex 代码(输入 L 列出所有代码):8e
已将分区"Linux"的类型更改为"Linux LVM"
命令(输入 m 获取帮助):w
The partition table has been altered!
Calling ioctl() to re-read partition table.
正在同步磁盘。

2.pvcreate命令,将/dev/sdb1和/dev/sdc1创建物理卷。
ini
[root@localhost ~]# pvcreate /dev/sdb1 /dev/sdc1 //创建物理卷
Physical volume "/dev/sdb1" successfully created.
Physical volume "/dev/sdc1" successfully created.
[root@localhost ~]# pvscan //扫描查看物理卷
PV /dev/sda2 VG centos lvm2 [14.00 GiB / 4.00 MiB free]
PV /dev/sdc1 lvm2 [19.00 GiB]
PV /dev/sdb1 lvm2 [15.00 GiB]
Total: 3 [48.00 GiB] / in use: 1 [14.00 GiB] / in no VG: 2 [34.00 GiB]

3.vgcreate命令,创建卷组vg1,并将2个物理卷分配给vg1。
sql
[root@localhost ~]# vgcreate vg1 /dev/sdb1 /dev/sdc1 //创建组卷
Volume group "vg1" successfully created
[root@localhost ~]# vgscan //扫描组卷
Reading volume groups from cache.
Found volume group "vg1" using metadata type lvm2
Found volume group "centos" using metadata type lvm2
[root@localhost ~]# vgdisplay vg1 //显示组卷基本信息列表
--- Volume group ---
VG Name vg1
System ID
Format lvm2
Metadata Areas 2
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 2
Act PV 2
VG Size 33.99 GiB
PE Size 4.00 MiB
Total PE 8702
Alloc PE / Size 0 / 0
Free PE / Size 8702 / 33.99 GiB
VG UUID TKiUx6-A7gb-YxYk-dYlo-PrvA-SdfQ-dD702g

4.lvcreate 命令,从vg01中取8G容量创建逻辑卷lvmail
arduino
[root@localhost ~]# lvcreate -L 10G -n lv1 vg1 //从vg1中抽取10G容量来创建一个lv1逻辑卷
Logical volume "lv1" created.
[root@localhost ~]# lvdisplay //显示逻辑卷基本信息
--- Logical volume ---
LV Path /dev/vg1/lv1
LV Name lv1
VG Name vg1
LV UUID hkFaxb-yCQ0-6t3w-2qBZ-apCN-CkcC-vMN7sc
LV Write Access read/write
LV Creation host, time localhost.localdomain, 2024-04-10 16:55:46 +0800
LV Status available
# open 0
LV Size 10.00 GiB //逻辑卷容量
Current LE 2560
Segments 1
Allocation inherit
Read ahead sectors auto
- currently set to 8192
Block device 253:2

5.mkfs命令,将逻辑卷lv1格式化为XFS文件系统。
ini
[root@localhost ~]# mkfs.xfs /dev/vg1/lv1 //将lv1格式化为fxs文件系统
meta-data=/dev/vg1/lv1 isize=512 agcount=4, agsize=655360 blks
= sectsz=512 attr=2, projid32bit=1
= crc=1 finobt=0, sparse=0
data = bsize=4096 blocks=2621440, 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
6.将逻辑卷lv1挂载到/mnt 目录下

逻辑卷扩容示例
情况演示:
lv1现只有1G的容量 不够用现在需要再扩展10G。 而卷组也只剩2G容量不足扩容10G的需求,所以要向组卷添加新的物理卷,物理卷至少要超过8G容量,并且现在要1加物理卷的话需要在/dev/sdc盘下再重新分一区。
实验步骤:
使用fdisk工具,为硬盘 /dev/sdc 创建第二个分区。分区类型设置为LVM,系统ID为8e
sql
[root@localhost ~]# fdisk /dev/sdc //管理磁盘分区,建立第二分区
欢迎使用 fdisk (util-linux 2.23.2)。
更改将停留在内存中,直到您决定将更改写入磁盘。
使用写入命令前请三思。
命令(输入 m 获取帮助):n //建立新分区
Partition type:
p primary (1 primary, 0 extended, 3 free)
e extended
Select (default p):
Using default response p
分区号 (2-4,默认 2):
起始 扇区 (10487808-41943039,默认为 10487808):
将使用默认值 10487808
Last 扇区, +扇区 or +size{K,M,G} (10487808-41943039,默认为 41943039):+10G //容量为10G
分区 2 已设置为 Linux 类型,大小设为 10 GiB
命令(输入 m 获取帮助):t //更改文件系统类型
分区号 (1,2,默认 2):
Hex 代码(输入 L 列出所有代码):8e //选择8e,将分区类型修改为LVM
已将分区"Linux"的类型更改为"Linux LVM"
命令(输入 m 获取帮助):w //保存退出
The partition table has been altered!
Calling ioctl() to re-read partition table.
WARNING: Re-reading the partition table failed with error 16: 设备或资源忙.
The kernel still uses the old table. The new table will be used at
the next reboot or after you run partprobe(8) or kpartx(8)
正在同步磁盘。
[root@localhost ~]# partprobe //刷新分区
Warning: 无法以读写方式打开 /dev/sr0 (只读文件系统)。/dev/sr0 已按照只读方式打开
pvcreate 命令,创建新的物理卷 /dev/sdc2。
csharp
[root@localhost ~]# pvcreate /dev/sdc2 //添加创建物理卷
Physical volume "/dev/sdc2" successfully created.
[root@localhost ~]# pvdisplay /dev/sdc2 //查看物理卷内容
"/dev/sdc2" is a new physical volume of "10.00 GiB"
--- NEW Physical volume ---
PV Name /dev/sdc2
VG Name
PV Size 10.00 GiB
Allocatable NO
PE Size 0
Total PE 0
Free PE 0
Allocated PE 0
PV UUID 3gZeWq-7NHn-AkLH-AEz0-STMI-c5px-mz45jK
vgextend 命令,将物理卷 /dev/sdc2 加入卷组 gv1。
arduino
[root@localhost ~]# vgextend gv1 /dev/sdc2 //将物理卷/dev/sdc2加入卷组 gv1
Volume group "gv1" successfully extended
[root@localhost ~]# vgdisplay gv1 //显示卷组gv1的信息
--- Volume group ---
VG Name gv1
System ID
Format lvm2
Metadata Areas 3
Metadata Sequence No 3
VG Access read/write
VG Status resizable
MAX LV 0
Cur LV 1
Open LV 0
Max PV 0
Cur PV 3
Act PV 3
VG Size <24.99 GiB //卷组总容量
PE Size 4.00 MiB
Total PE 6397
Alloc PE / Size 3584 / 14.00 GiB //卷组中已被分配的容量
Free PE / Size 2813 / <10.99 GiB //卷组中的空余容量
VG UUID 6qS7lo-3zWR-pR3s-g0dF-jI7L-HN1g-9UCkKw
lvextend 命令,为逻辑卷/dev/gv1/lv1 增加10的容量。
arduino
[root@localhost ~]# lvextend -L +10G /dev/gv1/lv1 //为逻辑卷扩容10G
Size of logical volume gv1/lv1 changed from 14.00 GiB (3584 extents) to 24.00 GiB (6144 extents).
Logical volume gv1/lv1 successfully resized.
[root@localhost ~]# lvdisplay /dev/gv1/lv1 //显示逻辑卷信息
--- Logical volume ---
LV Path /dev/gv1/lv1
LV Name lv1
VG Name gv1
LV UUID Pj3itm-GhyP-wrja-CvlU-Ra7K-2oTA-xuCn3G
LV Write Access read/write
LV Creation host, time localhost.localdomain, 2024-04-10 18:23:25 +0800
LV Status available
# open 0
LV Size 24.00 GiB //逻辑卷总容量变为24G
Current LE 6144
Segments 3
Allocation inherit
Read ahead sectors auto
- currently set to 8192
Block device 253:2
xfs_growfs 命令,使XFS文件系统识别到新增的空间,实现文件系统扩容。
csharp
[root@localhost ~]# xfs_growfs /dev/gv1/lv1 //将文件系统扩容新增部分格式化
磁盘配额
一、磁盘配额管理概述
磁盘配额(Quota)就是 Linux 系统中用来限制特定的普通用户或用户组在指定的分区上占用的磁盘空间或文件个数的。
在此概念中,有以下几个重点需要注意:
- 磁盘配额限制的用户和用户组,只能是普通用户和用户组,也就是说超级用户 root 是不能做磁盘配额的;
- 磁盘配额限制只能针对分区,而不能针对某个目录,换句话说,磁盘配额仅能针对文件系统进行限制,举个例子,如果你的 /dev/sda5 是挂载在 /home 底下,那么,在 /home 下的所有目录都会受到磁盘配额的限制;
- 我们可以限制用户占用的磁盘容量大小(block),当然也能限制用户允许占用的文件个数(inode)
二、磁盘配额的使用条件
磁盘配额要想正常使用,有以下几个前提条件:
- 内核必须支持磁盘配额。
- 系统中必须安装了 Quota 工具。我们的 Linux 中默认安装了 Quoted 工具
- 要支持磁盘配额的分区必须开启磁盘配额功能。这项功能可以手动开启,不再是默认开启的。