Linux磁盘容量配额
硬件资源是固定且有限的,如果某些用户不断地在 Linux 系统上创建文件或者存放电影,硬盘空间总有一天会被占满。针对这种情况,root管理员就需要使用磁盘容量配额服务来限制某位用户或某个用户组针对特定文件夹可以使用的最大硬盘空间或最大文件个数,一旦达到这个最大值就不再允许继续使用。可以使用 quota技术进行磁盘容量配额管理,从而限制用户的硬盘可用容量或所能创建的最大文件个数。quota技术还有软限制和硬限制的功能。
- 软限制:当达到软限制时会提示用户,但仍允许用户在限定的额度内继续使用。
- 硬限制:当达到硬限制时会提示用户,且强制终止用户的操作。
RHEL 8 系统中已经安装了 quota 磁盘容量配额服务程序包,但存储设备却默认没有开启对 quota 技术的支持,此时需要手动编辑配置文件并重启系统,让系统中的启动目录(/boot)能够支持 quota 磁盘配额技术。
[root@RS ~]# yum -y install quota //安装quota服务
[root@RS ~]# vim /etc/fstab //编辑配置文件予以支持quota
UUID=0301e567-d6fc-4a64-aaf5-1265542b1ed7 /boot xfs defaults,uquota 0 0
早期的 Linux 系统要想让硬盘设备支持 quota 磁盘容量配额服务,使用的是usrquota 参数,RHEL 7/8 系统使用的则是 uquota 参数。
在重启系统后使用 mount 命令查看,即可发现/boot 目录已经支持 quota 磁盘配额技术了:
[root@RS ~]# mount | grep boot //查看是否配置成功,最后usrquota
/dev/sda1 on /boot type xfs (rw,relatime,seclabel,attr2,inode64,usrquota)
创建一个用于检查 quota 磁盘容量配额效果的用户,并针对/boot 目录增加其他人的写权限,保证用户能够正常写入数据:
[root@RS ~]# useradd tom //新建一个用于测试的用户
[root@RS ~]# chmod -R o+w /boot //给予其他用户写入权限
xfs_quota管理磁盘配额
xfs_quota 命令用于管理设备的磁盘容量配额,语法格式为“ xfs_quota [参数] 配额 文件系统 ”。这是一个专门针对 XFS 文件系统来管理 quota 磁盘容量配额服务而设计的命令。
- -c 参数用于以参数的形式设置要执行的命令;
- -x 参数是专家模式,让运维人员能够对 quota 服务进行更多复杂的配置。
使用 xfs_quota 命令来设置用户 tom 对/boot 目录的 quota 磁盘容量配额。具体的限额控制包括:硬盘使用量的软限制和硬限制分别为 3MB 和 6MB;创建文件数量的软限制和硬限制分别为 3 个和 6 个。选项与参数如下:
limit : | 实际限制的项目,可以针对 user/group 来限制,限制的项目有 |
---|---|
bsoft/bhard | block (块大小) 的 soft(软限制)/hard(硬限制) 限制值,可以加单位 |
isoft/ihard | inode(文件数) 的 soft(软限制)/hard(硬限制)限制值 |
name | 用户/群组的名称 |
查询当前目录下得用户限额:xfs_quota -x -c report /boot/
//以下对用户配置磁盘配额
[root@RS ~]# xfs_quota -x -c 'limit bsoft=3m bhard=6m isoft=3 ihard=6 tom' /boot
//查询当前目录下的用户限制
[root@RS ~]# xfs_quota -x -c report /boot
/*
User quota on /boot (/dev/sda1)
Blocks
User ID Used Soft Hard Warn/Grace
---------- --------------------------------------------------
root 115048 0 0 00 [--------]
tom 0 3072 6144 00 [--------]
*/
[tom@RS boot]$ dd if=/dev/zero of=/boot/tom bs=1M count=1 //写入块,用于测试
edquota修改磁盘配额
edquota 命令用于管理系统的磁盘配额,英文全称为“edit quota”,语法格式为“ edquota [参数] 用户名 ”。
在为用户设置了 quota 磁盘容量配额限制后,可以使用 edquota 命令按需修改限额的数值。-u 参数表示要针对哪个用户进行设置;-g 参数表示要针对哪个用户组进行设置。
参数 | 作用 |
---|---|
-u | 对某个用户进行设置 |
-g | 对某个用户组进行设置 |
-p | 复制原有的规则到新的用户/组 |
-t | 限制宽限期限 |
edquota 命令会调用 Vi 或 Vim 编辑器来让 root 管理员修改要限制的具体细节,修改完用 wq 保存退出。下面把用户 tom 的硬盘使用量的硬限额从 5MB 提升到 8MB:
[root@RS ~]# edquota -u tom //修改tom用户的磁盘配额信息
Disk quotas for user tom (uid 1001):
Filesystem blocks soft hard inodes soft hard
/dev/sda1 8192 3072 8192 8 8 8
本来要写入9M的块,最后写完只有 8M
[tom@RS boot]$ dd if=/dev/zero of=/boot/tom bs=1M count=9 //写入块,用于测试
/*
dd: error writing '/boot/tom': Disk quota exceeded
9+0 records in
8+0 records out
8388608 bytes (8.4 MB, 8.0 MiB) copied, 0.00441771 s, 1.9 GB/s
[tom@RS boot]$ ls -lh tom
-rw-rw-r--. 1 tom tom 8.0M Sep 26 01:42 tom
*/
VDO(虚拟数据优化)
VDO(Virtual Data Optimize,虚拟数据优化)是一种通过压缩或删除存储设备上的数据来优化存储空间的技术。
VDO 是红帽公司收购了 Permabit 公司后获取的新技术,并与2019-2020 年前后,多次在 RHEL 7.5/7.6/7.7 上进行测试,最终随 RHEL 8 系统正式公布。VDO技术的关键就是对硬盘内原有的数据进行删重操作,它有点类似于我们平时使用的网盘服务,在第一次正常上传文件时速度特别慢,在第二次上传相同的文件时仅作为一个数据指针,几乎可以达到“秒传”的效果,无须再多占用一份空间,也不用再漫长等待。除了删重操作,VDO 技术还可以对日志和数据库进行自动压缩,进一步减少存储浪费的情况。
VDO 针对各种类型文件的压缩效果如表所示。
文件名 | 描述 | 类型 | 原始大小(KB) | 实际占用空间(KB) |
---|---|---|---|---|
dickens | 狄更斯文集 | 英文原文 | 9953 | 9948 |
mozilla | Mozilla 的 1.0 可执行文件 | 可执行程序 | 50020 | 33228 |
mr | 医用 resonanse 图像 | 图片 | 9736 | 9272 |
nci | 结构化的化学数据库 | 数据库 | 32767 | 10168 |
ooffice | OpenOffice 1.01 DLL | 可执行程序 | 6008 | 5640 |
osdb | 基准测试用的 MySQL 格式示例数据库 | 数据库 | 9849 | 9824 |
reymont | 瓦迪斯瓦夫·雷蒙特的图书 | 6471 | 6312 | |
samba | samba 源代码 | src 源码 | 21100 | 11768 |
sao | 星空数据 | 天文格式的 bin文件 | 7081 | 7036 |
webster | 辞海 | HTML | 40487 | 40144 |
xml | XML 文件 | HTML | 5220 | 2180 |
x-ray | 透视医学图片 | 医院数据 | 8275 | 8260 |
VDO 技术支持本地存储和远程存储,可以作为本地文件系统、iSCSI 或 Ceph 存储下的附加存储层使用。简而言之,VDO 技术能省空间!红帽公司在 VDO 介绍页面中提到
- 在部署虚拟机或容器时,建议采用逻辑存储与物理存储为 10∶1 的比例进行配置,即 1TB 物理存储对应 10TB 逻辑存储;
- 而部署对象存储时(例如使用 Ceph)则采用逻辑存储与物理存储为 3∶1 的比例进行配置,即使用 1TB物理存储对应 3TB 逻辑存储。
有两种特殊情况。
- 其一公司服务器上已有的 dm-crypt 之类的技术是可以与 VDO 技术兼容的,但记得要先对卷进行加密再使用 VDO。因为加密会使重复的数据变得有所不同,因此删重操作无法实现。要始终记得把加密层放到 VDO 之下,如图所示。
- 其二,VDO 技术不可叠加使用,1TB 的物理存储提升成 10TB 的逻辑存储没问题,但是再用 10TB 翻成 100TB 就不行了。左脚踩右脚,真的没法飞起来。
实验效果:
添加一块容量为 20GB 的新 SATA 硬盘进来,开机后就能看到这块名称为 /dev/sdb 的新硬盘了:
RHEL/CentOS 8 系统中默认已经启用了 VDO 技术。VDO 技术现在是红帽公司自己的技术,兼容性自然没得说。如果系统没有安装 VDO 的话用 dnf 命令 dnf install kmod-kvdo vdo
即可完成安装:
首先,创建一个全新的 VDO 卷。新添加进来的物理设备就是使用 vdo 命令来管理的,其中 name 参数代表新的设备卷的名称;device 参数代表由哪块磁盘进行制作;vdoLogicalSize 参数代表制作后的设备大小。依据红帽公司推荐的原则,20GB 硬盘将翻成 200GB 的逻辑存储:Linux 命令行严格区别大小写,vdoLogicalSize 参数中的 L 与 S 字母必须大写。
//创建一个全新的VDO卷,设备卷名为storage,指定/dev/sdb磁盘进行制作,--vdoLogicalSize制作设备后的大小
[root@RS ~]# vdo create --name=storage --device=/dev/sdb --vdoLogicalSize=200G
Creating VDO storage
Starting VDO storage
Starting compression on VDO storage
VDO instance 0 volume is ready at /dev/mapper/storage
创建成功后使用 vdo status --name=设备名称
参数查看新建卷的概述信息:
[root@RS ~]# vdo status --name=storage
VDO status:
Date: '2022-09-26 02:05:52-04:00' //VDO卷创建的时间
Node: RS.zxbke.cn //VDO卷创建的主机名
Kernel module:
Loaded: true
Name: kvdo
Version information:
kvdo version: 6.2.0.293 //版本
Configuration:
File: /etc/vdoconf.yml
Last modified: '2022-09-26 02:03:27'
VDOs:
storage:
Acknowledgement threads: 1
Activate: enabled
Bio rotation interval: 64
Bio submission threads: 4
Block map cache size: 128M
Block map period: 16380
Block size: 4096
CPU-work threads: 2
Compression: enabled //是否压缩
Configured write policy: auto
Deduplication: enabled //是否删重
......省略部分信息
对新建卷进行格式化操作并挂载使用。新建的 VDO 卷设备会被存放在/dev/mapper 目录下,并以设备名称命名,对它操作就行。
[root@RS ~]# mkfs.xfs /dev/mapper/storage //格式化卷
meta-data=/dev/mapper/storage isize=512 agcount=4, agsize=13107200 blks
= sectsz=4096 attr=2, projid32bit=1
= crc=1 finobt=1, sparse=1, rmapbt=0
= reflink=1
data = bsize=4096 blocks=52428800, imaxpct=25
= sunit=0 swidth=0 blks
naming =version 2 bsize=4096 ascii-ci=0, ftype=1
log =internal log bsize=4096 blocks=25600, version=2
= sectsz=4096 sunit=1 blks, lazy-count=1
realtime =none extsz=4096 blocks=0, rtextents=0
另外,挂载前可以用 udevadm settle
命令对设备进行一次刷新操作,避免刚才的配置没有生效:
[root@RS ~]# udevadm settle //刷新操作
[root@RS ~]# mkdir /storage //新建目录
[root@RS ~]# mount /dev/mapper/storage /storage //挂载目录
想查看设备的实际使用情况,使用 vdostats
命令即可。human-readable
参数的作用是将存储容量自动进位,以更易读的方式输出(比如,显示 20G 而不是 20971520K):
[root@RS ~]# vdostats --human-readable //查看设备实际使用情况
Device Size Used Available Use% Space saving%
/dev/mapper/storage 20.0G 4.0G 16.0G 20% 99%
想看逻辑存储空间,可以使用 df -Th 命令进行查看:
[root@RS ~]# df -Th //查看逻辑空间
......省略
/dev/mapper/storage xfs 200G 1.5G 199G 1% /storage
随便复制一个大文件过来,看看占用了多少容量,以及空间节省率(Space saving)是多少:
[root@RS ~]# cp /mnt/cdrom/images/install.img /storage
[root@RS ~]# cp /mnt/cdrom/images/install.img /storage/rhel8.img
[root@RS ~]# cp /mnt/cdrom/images/install.img /storage/rhel.img
[root@RS ~]# vdostats --human-readable //查看使用空间
Device Size Used Available Use% Space saving%
/dev/mapper/storage 20.0G 4.5G 15.5G 22% 68%
原先 448MB 的文件这次只占用了不到 100MB 的容量,空间节省率也从 18%提升到了 55%。当然这还仅仅是两次操作而已,好处就已经如此明显了。最后,将设备设置成永久挂载生效,一直提供服务。编辑/etc/fstab 文件后才能在下一次重启后自动挂载生效。
[root@RS ~]# blkid /dev/mapper/storage //查看卷的UUID
/dev/mapper/storage: UUID="b817289e-758f-4872-8ce0-afc1db2d0bce" TYPE="xfs"
[root@RS ~]# vim /etc/fstab //写入配置文件
UUID="b817289e-758f-4872-8ce0-afc1db2d0bce" /storage xfs defaults,_netdev 0 0