Linux LVM与磁盘配额
1 Linux管理LVM逻辑卷
1.1 什么是LVM
- LVM,全称Logical Volume Manger,即逻辑卷管理器。
- 它由Linux内核驱动和应用层的管理工具配合划分组成。
- 逻辑卷的划分需要在硬盘分区的基础上创建逻辑层。
1.2 逻辑卷优势
- 灵活性
可以灵活的管理服务器的存储设备,可在在系统运行时添加新的物理卷或移除不再需要的物理卷,逻辑卷大小可以动态调整。 - 恢复快
当某个物理磁盘出现故障,可以迅速更换并重新加入到卷组中,由于数据分布存储在整个卷组中,因此可以减少停机时间和数据丢失风险。
1.3 LVM的组成模块
- 物理卷 (PV,Physical Volume)
- 一个提供存储物理设备,即我们常说的物理磁盘。在物理设备基础上划分的分区称为物理卷。
- 一般供LVM存储的物理卷包括硬盘分区(常见的为MBR和GPT)、SAN 存储盘、RAID或LUN等,它包含一个特殊的LVM头。
- 物理卷一般直接使用设备文件名称,如/dev/sdb1、/dev/sdb2等。
- 对用于转换成物理卷的普通分区,建议先使用fdisk工具将分区类型的 ID 标记号改为“8e”。
- 若是整块硬盘,可以将所有磁盘空间划分为一个主分区后再做相应调整。
- 卷组 (VG,Volume Group)
- 由一个或多个物理卷组合成的组
- 在卷组中可以动态地添加或移除物理卷。
- 许多个物理卷可以分别组成不同的卷组,卷组的名称由用户自行定义。
- 在Linux文件系统中格式为/dev/VG_NAME
- 逻辑卷 (LV,Logical Volume)
- 逻辑卷作为系统存储的最终元设备,在卷组的基础上创建、划分和管理。它作为一个虚拟分区供操作系统使用,我们说的文件系统就是创建在逻辑卷上。
- 逻辑卷在Linux中格式为/dev/VG_NAME/LV_NAME。
- PE(Physical Extent)
- 物理区域是物理卷中可用于分配的最小存储单元,物理区域的大小可根据实际情况在建立物理卷时指定。物理区域大小一旦确定将不能更改,同一卷组中的所有物理卷的物理区域大小需要一致。
- 当多个PV组成一个VG时,LVM会在所有PV上做类似格式化的动作,将每个PV切成一块块的空间,这一块块的空间就称为PE, 通常是4MB。
1.4 LVM创建逻辑图
- 磁盘B划分了物理卷1和2,磁盘C划分了物理卷3
- 物理卷1划分了卷组1,物理卷2和3划分了卷组2
- 卷组1基础上划分了逻辑卷1,卷组2基础上划分了逻辑卷2和3
1.5 逻辑卷的管理方法
- LVM进行逻辑卷的管理时,创建顺序是pv->vg->lv。
- 首先创建一个物理卷(对应一个物理硬盘分区或者一个物理硬盘)
- 然后把这些分区或者硬盘加入到一个卷组中(相当于一个逻辑上的大硬盘)
- 再在这个大硬盘上划分分区lv(逻辑上的分区,就是逻辑卷)
- 最后,把lv逻辑卷格式化以后,就可以像使用一个传统分区那样,把它挂载到一个挂载点上
- 需要的时候,这个逻辑卷可以被动态缩放。
1.6 LVM的管理命令
功能 | 物理卷管理 | 卷组管理 | 逻辑卷管理 |
---|---|---|---|
scan 扫描 | pvscan | vgscan | lvscan |
display 显示 | pvdisplay | vgdisplay | lvdisplay |
create 创建 | pvcreate | vgcreate | lvcreate |
remove 删除 | pvremove | vgremove | lvremove |
extend 扩展 | vgextend | lvextend | |
reduce 缩减 | vgreduce | lvreduce |
- 主要命令的用法
- pvcreate 设备名
- vgcreate [-s 8M ] 卷组名 物理卷名1 物理卷名2…
- lvcreate -L 大小 -n 逻辑卷名 卷组名
- lvextend -L 大小 /dev/卷组名/逻辑卷名
- lvreduce –L 大小 /dev/卷组名/逻辑卷名
- -L参数指定了逻辑卷的大小,-n参数指定了逻辑卷的名称
1.7 创建逻辑卷
- 添加新虚拟硬盘sdb,大小20G。
- 创建顺序:磁盘分区 > 创建pv > 创建vg > 创建lv > 格式化 > 挂载
- 删除顺序:解挂载 > 删除lv > 删除vg > 删除pv > 删除分区
1.7.1 创建分区
fdisk /dev/sdb
1.7.2 修改分区格式
fdisk /dev/sdb
1.7.3 创建pv
# 创建物理卷
pvcreate /dev/sdb1
pvcreate /dev/sdb2 /dev/sdb3 /dev/sdb5
# 删除物理卷
pvremove /dev/sdb1
pvremove /dev/sdb2 /dev/sdb3 /dev/sdb5
# 扫描物理卷
pvs
pvscan
# 查看物理卷详情
pvdisplay
pvdisplay /dev/sdb1
1.7.4 创建vg
# 创建卷组
vgcreate vg1 /dev/sdb1
vgcreate vg2 /dev/sdb2 /dev/sdb3
# 删除卷组
vgremove vg1
# 扫描卷组
vgs
vgscan
# 查看卷组详情
vgdisplay
vgdisplay vg2
# 扩展物理卷
vgextend vg1 /dev/sdb5
# 缩减物理卷
vgreduce vg2 /dev/sdb3
1.7.5 创建lv
# 创建逻辑卷,不写G默认单位是M
lvcreate -L 2G -n lv1 vg1
lvcreate -L 2000 -n lv1 vg1
# 使用pe个数创建lv,1个pe是4MB
lvcreate -l 1000 -n lv1 vg1
# 删除逻辑卷
lvremove /dev/vg1/lv1
# 扫描逻辑卷
lvs
lvscan
# 查看逻辑卷详情
lvdisplay
lvdisplay /dev/vg1/lv1
# 扩展逻辑卷
lvextend -L +2G /dev/vg1/lv1
# 缩减逻辑卷
lvreduce -L -2G /dev/vg1/lv1
1.8 格式化及挂载
# 格式化刚才创建好的lv
mkfs.xfs /dev/vg1/lv1
# 创建测试目录
mkdir /test/lv
# 挂载目录
mount /dev/vg1/lv1 /test/lv
1.9 扩容操作
扩容完成后需要重新加载逻辑卷的大小,挂载才能生效
# 扩容
lvextend -L +2G /dev/vg1/lv1
# 重新加载逻辑卷
xfs_growfs /dev/vg1/lv1
# 查看
xfs_info /dev/myvg/mylv1
- 此处逻辑卷格式为xfs,所以使用xfs_growfs,其它类型可以考虑使用 resizefs2 命令
- 如ext系列:resize2fs /dev/myvg/mylv1
1.10 缩容操作
- 备份文件
- 解挂载
- 缩减逻辑卷
- 创建文件系统(会格式化逻辑卷)
- 重新挂载
- 拷贝回文件
1.11 注意事项
- 仅支持扩展,不支持收缩:XFS文件系统无法缩小容量。
- 依赖底层设备空间:确保存储设备已扩容后再执行xfs_growfs。
- 在线操作:无需卸载文件系统,但建议操作前暂停写入操作。
2 Linux磁盘配额
- 磁盘配额(Disk Quota)是一种在服务器操作系统中实施的控制机制,用于管理和控制用户或群组在文件系统上可以使用的磁盘空间总量。
- 它的主要目的是限制用户对磁盘空间的消耗,防止因个别用户过度使用存储资源而影响到其他用户的正常使用。
- 在多用户环境中,磁盘配额显得尤为重要,因为用户的数量较多,而服务器的存储资源是有限的。
- 没有合理的配额管理,少数用户可能无意或恶意地消耗过多的存储资源,从而导致存储空间不足,影响整个系统的稳定性和性能。
- 通过实施磁盘配额,系统管理员能够均衡资源分配,确保每个用户都有足够的存储空间用于工作和数据存储,同时避免了资源的浪费。
2.1 磁盘配额的工作原理
- 磁盘配额的工作原理依赖于内核级的支持和用户空间的管理工具。
- 在文件系统层面上,配额系统会追踪每个用户或群组对磁盘空间的使用情况,一旦达到预先设定的限制阈值,就会根据配置阻止用户继续写入数据或发出警告。
- 具体到实现上,当一个用户尝试创建或写入文件时,文件系统会向配额系统查询该用户当前的磁盘使用量。
- 如果超出设定的限制,则根据配额类型(软限制或硬限制)采取相应措施:
- 软限制通常伴随一定宽限期,允许临时超出限制
- 硬限制则是绝对的,一旦超过将不再允许使用额外空间
2.2 磁盘配额的类型
磁盘配额的类型主要分为软限制(Soft Limit)和硬限制(HardLimit)两种,它们的主要区别在于超出限制后的处理方式。
- 硬限制:硬限制为用户设置了一个不可逾越的上限。一旦用户达到硬限制,将不能进行任何新的写入操作,直到使用量下降至硬限制以下。
- 软限制:与硬限制相对,软限制为用户提供了额外的宽容空间。用户可以暂时超出软限制的限制,但必须在事先设定的宽限期(GracePeriod)内将使用量降至限制以下。如果宽限期结束后用户还没有将使用量降下来,那么系统会采取和硬限制相同的措施。
2.3 用户级别与群组级别的配额
- 磁盘配额的限制可以针对单个用户设置,也可以针对用户组设置。
- 用户级别的配额直接针对用户的唯一标识符(UID)
- 群组级别的配额则是基于用户组的唯一标识符(GID)
- 用户级别的配额对于资源的管理和分配非常细致,适用于对用户使用存储资源有严格要求的环境。
- 群组级别的配额则更加灵活,尤其适用于同一个项目或团队内的成员使用共享文件的情况。通过配置群组级别的配额,管理员可以为整个项目或团队分配一个总的磁盘空间配额,简化了管理过程。
- 磁盘配额的管理在Linux系统中主要依赖于Quota包,它包含了一套完整的工具来支持配额的设置、监控、调整和报告等操作。
- Quota包中的核心组件包括:
- quota: 查询用户或群组的磁盘配额使用情况的工具。
- quotacheck: 用于检查和修复配额文件的工具。
- quotaon/quotaoff: 用于启动或关闭配额功能的工具。
- edquota: 编辑用户或群组的配额设置的工具。
- 需要apt install quota
2.3.1 edquota命令
- edquota 是 Linux 系统中用于编辑用户磁盘配额(disk quota)的命令。磁盘配额是用来限制和管理用户或组在文件系统上使用的磁盘空间和文件数量。
- 管理员可以使用 edquota 命令来设置或调整用户和组的磁盘配额,以防止单个用户或组占用过多的磁盘空间。
- 语法:edquota [选项] [用户名]
- 参数说明
- 用户名:指定要编辑磁盘配额的用户。
如果未指定用户名,edquota 将会以交互式模式询问要编辑的用户。 - 选项:edquota 支持多个选项,以便对配额进行更细致的控制。
- 用户名:指定要编辑磁盘配额的用户。
- 常用选项
-u:指定编辑用户的磁盘配额(默认选项)。通常不需要显式指定。
-g:指定编辑组的磁盘配额。
-p:复制另一个用户的配额设置,适用于多个用户间共享配额策略。
-h:显示帮助信息。
2.3.2 quotacheck命令
quotacheck [ -gubcfinvdMmR ] [ -F quota-format]-a | filesystem
- -a 检查所有/etc/mtab中挂在的文件系统
- -u 只检查用户的quota
- -g 只检查用户组的quota
2.3.3 quota命令
quota
- 不使用任何参数,查询当前用户的quota信息
- -u username 查询某用户的quota信息
- -g groupname 查询某用户组的quota信息
2.4 配额的设置与管理-实例
- 添加一块新的硬盘,重启后分区出sdb1
- 创建文件系统
- 配置自动挂载,同时配置磁盘配额选项
- 创建quota配置文件
- 添加测试用户,启动配额管理
- 修改quota配置文件
- 修改挂载目录权限,并进行测试
- 查看配额
2.4.1 步骤1-创建分区
可以使用磁盘分区,也可以使用逻辑卷
- 磁盘分区
# 创建分区sdb1,大小为3G
fdisk /dev/sdb
- 逻辑卷
# 创建分区sdb2,大小为5G,设置分区类型为LVM
fdisk /dev/sdb
# 创建物理卷
pvcreate /dev/sdb2
# 创建卷组
vgcreate vg1 /dev/sdb2
# 创建逻辑卷
lvcreate -L 3G -n lv1 vg1
2.4.2 步骤2-创建文件系统
- 磁盘分区
mkfs -t xfs /dev/sdb1
- 逻辑卷
mkfs -t xfs /dev/vg1/lv1
2.4.3 步骤3-自动挂载
- 编辑配置文件:vim /etc/fstab
# 磁盘分区自动挂载
/dev/sdb1 /sdb xfs defaults,usrquota,grpquota 0 0
# 逻辑卷自动挂载
/dev/vg1/lv1 /lv xfs defaults,usrquota,grpquota 0 0
- 重启
reboot
- 查看
mount | grep sdb1
mount | grep /dev/mapper/vg1-lv1
- usrquota和grpquota是Linux系统中用于启用用户和用户组磁盘配额的选项。
- usrquota:启用用户配额,限制单个用户对磁盘空间的使用量。
- grpquota:启用用户组配额,限制用户组内所有用户对磁盘空间的使用总量。
2.4.4 步骤4-创建quota配置文件
touch /quota.user
touch /quota.group
2.4.5 步骤5-创建用户,启动配额管理
# 创建组和用户
groupadd myquota
useradd -g myquota -s /bin/bash quota1
useradd -g myquota -s /bin/bash quota2
# 启动配额管理
quotaon /dev/sdb1
quotaon /dev/vg1/lv1
2.4.6 步骤6- 修改quota配置文件
- 针对用户的配置,只修改soft和hard两项
- quota1,quota2用户在/dev/sdb1磁盘中最多使用150M的磁盘空间,超过100M就发出警告并进入倒计时。
- quota1,quota2用户在/dev/vg1/lv1磁盘中最多使用160M的磁盘空间,超过100M就发出警告并进入倒计时。
edquota -u quota1
# 将quota1的配置同步到quota2
edquota -p quota1 quota2
- 针对组的配置,只修改soft和hard两项
- myquota组(quota1和quota2两个用户)在两块磁盘中都最多只能使用200M的磁盘空间
edquota -g myquota quota2
- 参数说明
Filesystem | blocks | soft | hard | inodes soft hard |
---|---|---|---|---|
该用户可以配额的设备 | block数量,会自动配置 | 分配限额,超过警告 | 分配限额,超过不能使用 | 自动生成,不用填写 |
2.4.7 步骤7-修改权限并测试
# 修改挂载目录的权限
chmod 777 /lv
chmod 777 /sdb
# 测试 /dev/sdb1
su quota1
dd if=/dev/zero of=/sdb/file1 bs=1M count=100
# 弹出错误,quota1用户最多只能使用/dev/sdb1的空间为150M
dd if=/dev/zero of=/sdb/file2 bs=1M count=70
su quota2
# 弹出错误,myquota组最多只能使用/dev/sdb1的空间为200M
dd if=/dev/zero of=/sdb/file3 bs=1M count=70
- dd 命令是一个设备转换和复制命令
- “if=”选项指定输入设备(或文件)
- “of=”选项指定输出设备(或文件)
- “bs=”选项指定读取数据块的大小
- “count=”指定读取数据块的数量
- 修改警告/宽限期时间:edquota -t
2.4.8 步骤8
# 查看quota1的quota信息
quota -u quota1
# 查询myquota组的quota信息
quota -g myquota
2.5 综合查询命令repquota
- repquota [选项]
- -a 报告所有支持quota的文件系统
- -u 报告针对user的quota信息
- -g 包裹针对group的quota信息
- 一般三个参数一起使用
repquota -aug