文章目录

  • 1、环境说明
  • 2、准备
  • 软、硬件准备
  • 知识储备
  • 3、添加硬盘设备
  • fdisk 命令
  • du 命令



  • 4、添加交换分区



  • 5、磁盘容量配额



  • xfs_quota 命令
  • edquota 命令


1、环境说明

本次实验是在Redhat7虚拟机上进行(CentOS7操作相同)。

2、准备

软、硬件准备

1、Redhat7或CentOS7操作系统机器或虚拟机;

知识储备

本节主要介绍Linux文件系统、存储结构与磁盘划分相关理论知识,方便更好的理解本文,若了解可跳过本节。

1、 物理设备的命名规则;
  在 Linux 系统中一切都是文件,硬件设备也不例外。既然是文件,就必须有文件名称。在 Linux 系统中一切都是文件,硬件设备也不例外。既然是文件,就必须有文件名称。系统内核中的 udev 设备管理器会自动把硬件名称规范起来,目的是让用户通过设备文件的名字可以猜出设备大致的属性以及分区信息等;这对于陌生的设备来说特别方便。另外,udev设备管理器的服务会一直以守护进程的形式运行并侦听内核发出的信号来管理/dev 目录下的设备文件。Linux 系统中常见的硬件设备的文件名称如表所示。在 Linux 系统中一切都是文件,硬件设备也不例外。既然是文件,就必须有文件名称。在 Linux 系统中一切都是文件,硬件设备也不例外。既然是文件,就必须有文件名称。系统内核中的 udev 设备管理器会自动把硬件名称规范起来,目的是让用户通过设备文件的名字可以猜出设备大致的属性以及分区信息等;这对于陌生的设备来说特别方便。另外,udev设备管理器的服务会一直以守护进程的形式运行并侦听内核发出的信号来管理/dev 目录下的设备文件。Linux 系统中常见的硬件设备的文件名称如表所示。

常见的硬件设备及其文件名称:

硬件设备

文件名称

IDE 设备

/dev/hd[a-d]

SCSI/SATA/U 盘

/dev/sd[a-p]

软驱

/dev/fd[0-1]

打印机

/dev/lp[0-15]

光驱

/dev/cdrom

鼠标

/dev/mouse

磁带机

/dev/st0 或/dev/ht0

由于现在的 IDE 设备已经很少见了,所以一般的硬盘设备都会是以“/dev/sd”开头的。

而一台主机上可以有多块硬盘,因此系统采用 a~p 来代表 16 块不同的硬盘(默认从 a 开始

分配),而且硬盘的分区编号也很有讲究:

  ➢ 主分区或扩展分区的编号从 1 开始,到 4 结束;

  ➢ 逻辑分区从编号 5 开始。

/dev 目录中 sda 设备之所以是 a,并不是由插槽决定的,而是由系统内核的识别顺序来决定的,/dev/sda表示内核识别的第一块硬盘/dev/sdb表示内核识别的第二块硬盘。/dev/sda3 表示是第一块硬盘编号为 3 的分区。

centos 添加磁盘 刷新 centos新增硬盘_linux


首先,/dev/目录中保存的应当是硬件设备文件;其次,sd 表示是存储设备;然后,a 表示系统中同类接口中第一个被识别到的设备,最后,5表示这个设备是一个逻辑分区。一言以蔽之,“/dev/sda5”表示的就是“这是系统中第一块被识别到的硬件设备中分区编号为5的逻辑分区的设备文件”。接下来简单科普一下硬盘相关的知识。

正是因为计算机有了硬盘设备,我们才可以在玩游戏的过程中或游戏通关之后随时存档,而不用每次重头开始。硬盘设备是由大量的扇区组成的,每个扇区的容量为512字节。其中第一个扇区最重要,它里面保存着主引导记录与分区表信息。就第一个扇区来讲,主引导记录需要占用446字节,分区表为64字节,结束符占用2字节;其中分区表中每记录一个分区信息就需要16字节,这样一来最多只有4个分区信息可以写到第一个扇区中,这4个分区就是4个主分区。第一个扇区中的数据信息如下图所示。

centos 添加磁盘 刷新 centos新增硬盘_文件系统_02

现在,问题来了——第一个扇区最多只能创建出4个分区?于是为了解决分区个数不够的问题,可以将第一个扇区的分区表中16字节(原本要写入主分区信息)的空间(称之为扩展分区)拿出来指向另外一个分区。也就是说,扩展分区其实并不是一个真正的分区,而更像是一个占用16字节分区表空间的指针——一个指向另外一个分区的指针。这样一来,用户一般会选择使用3个主分区加1个扩展分区的方法,然后在扩展分区中创建出数个逻辑分区,从而来满足多分区(大于4个)的需求。当然,就目前来讲大家只要明白为什么主分区不能超过4个就足够了。主分区、扩展分区、逻辑分区可以像下图那样来规划。

centos 添加磁盘 刷新 centos新增硬盘_文件系统_03

注:
所谓扩展分区,严格地讲它不是一个实际意义的分区,它仅仅是一个指向下一个分区的指针,这种指针结构将形成一个单向链表。

2、文件系统与数据资料
用户在硬件存储设备中执行的文件建立、写入、读取、修改、转存与控制等操作都是依靠文件系统来完成的。文件系统的作用是合理规划硬盘,以保证用户正常的使用需求。Linux 系统支持数十种的文件系统,而最常见的文件系统如下所示。

Ext3:是一款日志文件系统,能够在系统异常宕机时避免文件系统资料丢失,并能自动修复数据的不一致与错误。然而,当硬盘容量较大时,所需的修复时间也会很长,而且也不能百分之百地保证资料不会丢失。它会把整个磁盘的每个写入动作的细节都预先记录下来,以便在发生异常宕机后能回溯追踪到被中断的部分,然后尝试进行修复。
Ext4:Ext3的改进版本,作为 RHEL 6 系统中的默认文件管理系统,它支持的存储容量高达 1EB(1EB=1,073,741,824GB),且能够有无限多的子目录。另外,Ext4 文件系统能够批量分配 block 块,从而极大地提高了读写效率。
XFS:是一种高性能的日志文件系统,而且是 RHEL 7 中默认的文件管理系统,它的优势在发生意外宕机后尤其明显,即可以快速地恢复可能被破坏的文件,而且强大的日志功能只用花费极低的计算和存储性能。并且它最大可支持的存储容量为 18EB,这几乎满足了所有需求。

3、添加硬盘设备

我们先来理清一下添加硬盘设备的操作思路:首先需要在虚拟机中模拟添加入一块新的硬盘存储设备,然后再进行分区、格式化、挂载等操作,最后通过检查系统的挂载状态并真实地使用硬盘来验证硬盘设备是否成功添加。

挂载:当用户需要使用硬盘设备或分区中的数据时,需要先将其与一个已存在的目录文件进行关联,而这个关联动作就是“挂载”。

鉴于我们不需要为了做这个实验而特意买一块真实的硬盘,而是通过虚拟机软件进行硬件模拟,因此这再次体现出了使用虚拟机软件的好处。具体的操作步骤如下。

首先把虚拟机系统关机,稍等几分钟会自动返回到虚拟机管理主界面,然后单击“编辑虚拟机设置”选项,在弹出的界面中单击“添加”按钮,新增一块硬件设备;

centos 添加磁盘 刷新 centos新增硬盘_文件系统_04


centos 添加磁盘 刷新 centos新增硬盘_linux_05


选择想要添加的硬件类型为“硬盘”,然后单击“下一步”按钮就可以了;

centos 添加磁盘 刷新 centos新增硬盘_linux_06


选择虚拟硬盘的类型为 SCSI(默认推荐),并单击“下一步”按钮,这样虚拟机中的设备名称过一会儿后应该为/dev/sdb;

centos 添加磁盘 刷新 centos新增硬盘_linux_07


选中“创建新虚拟磁盘”单选按钮,而不是其他选项,再次单击“下一步”按钮;

centos 添加磁盘 刷新 centos新增硬盘_linux_08


将“最大磁盘大小”设置为默认的 20GB。这个数值是限制这台虚拟机所使用的最大硬盘空间,而不是立即将其填满,因此默认 20GB 就很合适了。单击“下一步”按钮

centos 添加磁盘 刷新 centos新增硬盘_linux_09


设置磁盘文件的文件名和保存位置(这里采用默认设置即可,无需修改),直接单击“完成”按钮;

centos 添加磁盘 刷新 centos新增硬盘_centos 添加磁盘 刷新_10

将新硬盘添加好后就可以看到设备信息了。这里不需要做任何修改,直接单击“确认”按钮后就可以开启虚拟机了。

centos 添加磁盘 刷新 centos新增硬盘_文件系统_11


在虚拟机中模拟添加了硬盘设备后就应该能看到抽象成的硬盘设备文件了。按照前文讲解的 udev 服务命名规则,第二个被识别的 SCSI 设备应该会被保存为/dev/sdb,这个就是硬盘设备文件了。

centos 添加磁盘 刷新 centos新增硬盘_linux_12


但在开始使用该硬盘之前还需要进行分区操作,例如从中取出一个 2GB 的分区设备以供后面的操作使用。

fdisk 命令

在 Linux 系统中,管理硬盘设备最常用的方法就当属 fdisk 命令了。fdisk 命令用于管理磁盘分区,格式为“fdisk [磁盘名称]”,它提供了集添加、删除、转换分区等功能于一身的“一站式分区服务”。不过与前面讲解的直接写到命令后面的参数不同,这条命令的参数(见下表)是交互式的,因此在管理硬盘设备时特别方便,可以根据需求动态调整。

fdisk 命令中的参数以及作用:

参数

作用

m

查看全部可用的参数

n

添加新的分区

d

删除某个分区信息

l

列出所有可用的分区类型

t

改变某个分区的类型

p

查看分区信息

w

保存并退出

q

不保存直接退出

我们首先使用 fdisk 命令来尝试管理/dev/sdb 硬盘设备。在看到提示信息后输入参数 p 来查看硬盘设备内已有的分区信息,其中包括了硬盘的容量大小、扇区个数等信息:


[root@localhost ~]# fdisk /dev/sdb
欢迎使用 fdisk (util-linux 2.23.2)。

更改将停留在内存中,直到您决定将更改写入磁盘。
使用写入命令前请三思。

Device does not contain a recognized partition table
使用磁盘标识符 0x012f51c1 创建新的 DOS 磁盘标签。

命令(输入 m 获取帮助):p

磁盘 /dev/sdb:21.5 GB, 21474836480 字节,41943040 个扇区
Units = 扇区 of 1 * 512 = 512 bytes
扇区大小(逻辑/物理):512 字节 / 512 字节
I/O 大小(最小/最佳):512 字节 / 512 字节
磁盘标签类型:dos
磁盘标识符:0x012f51c1

设备 Boot Start End Blocks Id System


输入参数 n 尝试添加新的分区。系统会要求您是选择继续输入参数 p 来创建主分区,还是输入参数 e 来创建扩展分区。这里输入参数 p 来创建一个主分区:


命令(输入 m 获取帮助):n
Partition type:
p primary (0 primary, 0 extended, 4 free)
e extended
Select (default p): p


在确认创建一个主分区后,系统要求您先输入主分区的编号。我们在前文得知,主分区的编号范围是 1~4,因此这里输入默认的 1 就可以了。接下来系统会提示定义起始的扇区位置,这不需要改动,我们敲击回车键保留默认设置即可,系统会自动计算出最靠前的空闲扇区的位置。最后,系统会要求定义分区的结束扇区位置,这其实就是要去定义整个分区的大小是多少。我们不用去计算扇区的个数,只需要输入+2G 即可创建出一个容量为 2GB 的硬盘分区。


分区号 (1-4,默认 1):1
起始 扇区 (2048-41943039,默认为 2048):此处敲回车键
将使用默认值 2048
Last 扇区, +扇区 or +size{K,M,G} (2048-41943039,默认为 41943039):+2G
分区 1 已设置为 Linux 类型,大小设为 2 GiB


再次使用参数 p 来查看硬盘设备中的分区信息。果然就能看到一个名称为/dev/sdb1、起始扇区位置为 2048、结束扇区位置为 4196351 的主分区了。这时候千万不要直接关闭窗口,而应该敲击参数 w 后回车,这样分区信息才是真正的写入成功啦。


命令(输入 m 获取帮助):p

磁盘 /dev/sdb:21.5 GB, 21474836480 字节,41943040 个扇区
Units = 扇区 of 1 * 512 = 512 bytes
扇区大小(逻辑/物理):512 字节 / 512 字节
I/O 大小(最小/最佳):512 字节 / 512 字节
磁盘标签类型:dos
磁盘标识符:0x012f51c1

设备 Boot Start End Blocks Id System
/dev/sdb1 2048 4196351 2097152 83 Linux

命令(输入 m 获取帮助):w
The partition table has been altered!

Calling ioctl() to re-read partition table.
正在同步磁盘。


在上述步骤执行完毕之后,Linux 系统会自动把这个硬盘主分区抽象成/dev/sdb1 设备文件。

centos 添加磁盘 刷新 centos新增硬盘_linux_13


我们可以使用 file 命令查看该文件的属性,但是工作中发现,有些时候系统并没有自动把分区信息同步给 Linux 内核,而且这种情况似乎还比较常见(但不能算作是严重的 bug)。我们可以输入 partprobe 命令手动将分区信息同步到内核,而且一般推荐连续两次执行该命令,效果会更好。如果使用这个命令都无法解决问题,那么就重启计算机吧,这个杀手锏百试百灵,一定会有用的。


[root@localhost ~]# file /dev/sdb1
 /dev/sdb1: cannot open (No such file or directory)
 [root@localhost ~]# partprobe
 [root@localhost ~]# partprobe
 [root@localhost ~]# file /dev/sdb1
 /dev/sdb1: block

如果硬件存储设备没有进行格式化,则 Linux 系统无法得知怎么在其上写入数据。因此,在对存储设备进行分区后还需要进行格式化操作。在 Linux 系统中用于格式化操作的命令是mkfs。这条命令很有意思,因为在 Shell 终端中输入 mkfs 名后再敲击两下用于补齐命令的 Tab键,会有如下所示的效果:

[root@localhost ~]# mkfs
 mkfs mkfs.btrfs mkfs.cramfs mkfs.ext2 mkfs.ext3 mkfs.ext4 mkfs.minix mkfs.xfs

对!这个 mkfs 命令很贴心地把常用的文件系统名称用后缀的方式保存成了多个命令文件,用起来也非常简单—mkfs.文件类型名称。例如要格式分区为 XFS 的文件系统,则命令应为 mkfs.xfs /dev/sdb1。


[root@localhost ~]# mkfs.xfs /dev/sdb1
 meta-data=/dev/sdb1 isize=256 agcount=4, agsize=131072 blks
 = sectsz=512 attr=2, projid32bit=1
 = crc=0
 data = bsize=4096 blocks=524288, imaxpct=25
 = sunit=0 swidth=0 blks
 naming =version 2 bsize=4096 ascii-ci=0 ftype=0
 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

终于完成了存储设备的分区和格式化操作,接下来就是要来挂载并使用存储设备了。与之相关的步骤也非常简单:首先是创建一个用于挂载设备的挂载点目录;然后使用 mount 命令将存储设备与挂载点进行关联;最后使用 df -h 命令来查看挂载状态和硬盘使用量信息。


[root@localhost ~]# mkdir /newFS
 [root@localhost ~]# mount /dev/sdb1 /newFS
 [root@localhost ~]# df -h
 文件系统 容量 已用 可用 已用% 挂载点
 /dev/mapper/rhel-root 18G 1.1G 17G 6% /
 devtmpfs 1.9G 0 1.9G 0% /dev
 tmpfs 1.9G 0 1.9G 0% /dev/shm
 tmpfs 1.9G 8.6M 1.9G 1% /run
 tmpfs 1.9G 0 1.9G 0% /sys/fs/cgroup
 /dev/sda1 497M 96M 401M 20% /boot
/dev/sdb1 2.0G 33M 2.0G 2% /newFS

du 命令

既然存储设备已经顺利挂载,接下来就可以尝试通过挂载点目录向存储设备中写入文件了。在写入文件之前,先介绍一个用于查看文件数据占用量的 du 命令,其格式为“du [选项] [文件]”。简单来说,该命令就是用来查看一个或多个文件占用了多大的硬盘空间。我们还可以使用 du -sh /*命令来查看在 Linux 系统根目录下所有一级目录分别占用的空间大小。下面,我们先从某些目录中复制过来一批文件,然后查看这些文件总共占用了多大的容量:


[root@localhost ~]# ls /newFS
 [root@localhost ~]# cp -rf /etc/* /newFS/
 [root@localhost ~]# ls /newFS/
 adjtime
 aliases
 aliases.db
 alternatives
 anacrontab
 asound.conf
----省略部分输入信息----
 xinetd.d
 [root@localhost ~]# du -sh /newFS/
20M /newFS/

注:
使用 mount 命令挂载的设备文件会在系统下一次重启的时候失效。如果想让这个设备文件的挂载永久有效,则需要把挂载的信息写入到配置文件中:


#/etc/fstab
 #Created by anaconda on Thu Dec 20 17:33:14 2018#Accessible filesystems, by reference, are maintained under ‘/dev/disk’
 #See man pages fstab(5), findfs(8), mount(8) and/or blkid(8) for more info[root@localhost ~]# vim /etc/fstab
 /dev/mapper/rhel-root / xfs defaults 1 1
 UUID=55e273f1-0964-4670-870b-410eb199f46d /boot xfs defaults 1 2
 /dev/mapper/rhel-swap swap swap defaults 0 0
/dev/sdb1 /newFS xfs defaults 0 0

/etc/fstab文件详解
参考:http://blog.51cto.com/13570193/2070157

该文件中存在六列参数:

第一列:设备文件或UUID或label(三者的区别看下面)
第二列:设备的挂载点(空目录)
第三列:该分区文件系统的格式(可以使用特殊的参数auto,自动识别分区的分区格式)
第四列:文件系统的参数,设置格式的选项
第五列:dump备份的设置(0表示不进行dump备份,1代表每天进行dump备份,2代表不定日期的进行dump备份)
第六列:磁盘检查设置(其实是一个检查顺序,0代表不检查,1代表第一个检查,2后续.一般根目录是1,数字相同则同时检查)

4、添加交换分区

SWAP(交换)分区是一种通过在硬盘中预先划分一定的空间,然后将把内存中暂时不常用的数据临时存放到硬盘中,以便腾出物理内存空间让更活跃的程序服务来使用的技术,其设计目的是为了解决真实物理内存不足的问题。但由于交换分区毕竟是通过硬盘设备读写数据的,速度肯定要比物理内存慢,所以只有当真实的物理内存耗尽后才会调用交换分区的资源。交换分区的创建过程与前文讲到的挂载并使用存储设备的过程非常相似。在对/dev/sdb 存储设备进行分区操作前,有必要先说一下交换分区的划分建议:在生产环境中,交换分区的大小一般为真实物理内存的 1.5~2 倍,为了让大家更明显地感受交换分区空间的变化,这里取出一个大小为 6GB 的主分区作为交换分区资源。在分区创建完毕后保存并退出即可:


[root@localhost ~]# fdisk /dev/sdb
 欢迎使用 fdisk (util-linux 2.23.2)。更改将停留在内存中,直到您决定将更改写入磁盘。
 使用写入命令前请三思。命令(输入 m 获取帮助):n
 Partition type:
 p primary (1 primary, 0 extended, 3 free)
 e extended
 Select (default p): p
 分区号 (2-4,默认 2):2
 起始 扇区 (4196352-41943039,默认为 4196352):此处敲击回车键
 将使用默认值 4196352
 Last 扇区, +扇区 or +size{K,M,G} (4196352-41943039,默认为 41943039):+6G
 分区 2 已设置为 Linux 类型,大小设为 6 GiB命令(输入 m 获取帮助):p
磁盘 /dev/sdb:21.5 GB, 21474836480 字节,41943040 个扇区
 Units = 扇区 of 1 * 512 = 512 bytes
 扇区大小(逻辑/物理):512 字节 / 512 字节
 I/O 大小(最小/最佳):512 字节 / 512 字节
 磁盘标签类型:dos
 磁盘标识符:0x012f51c1设备 Boot Start End Blocks Id System
 /dev/sdb1 2048 4196351 2097152 83 Linux
/dev/sdb2 4196352 16779263 6291456 83 Linux命令(输入 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)
 正在同步磁盘。

使用 SWAP 分区专用的格式化命令 mkswap,对新建的主分区进行格式化操作:


[root@localhost ~]# mkswap /dev/sdb2
正在设置交换空间版本 1,大小 = 6291452 KiB
无标签,UUID=419f58bf-2c07-4948-9e19-ba02203de6da


使用 swapon 命令把准备好的 SWAP 分区设备正式挂载到系统中。我们可以使用 free -m 命令查看交换分区的大小变化(由 2.0G 增加到 8.0G):


[root@localhost ~]# free -h
 total used free shared buffers cached
 Mem: 3.7G 345M 3.4G 8.5M 1.6M 122M
 -/+ buffers/cache: 220M 3.5G
Swap: 2.0G 0B 2.0G[root@localhost ~]# swapon /dev/sdb2
[root@localhost ~]# free -h
 total used free shared buffers cached
 Mem: 3.7G 349M 3.3G 8.5M 1.6M 122M
 -/+ buffers/cache: 224M 3.5G
Swap: 8.0G 0B 8.0G

为了能够让新的交换分区设备在重启后依然生效,需要按照下面的格式将相关信息写入到配置文件中,并记得保存:


[root@localhost ~]# vim /etc/fstab
#/etc/fstab
 #Created by anaconda on Thu Dec 20 17:33:14 2018#Accessible filesystems, by reference, are maintained under ‘/dev/disk’
 #See man pages fstab(5), findfs(8), mount(8) and/or blkid(8) for more info/dev/mapper/rhel-root / xfs defaults 1 1
 UUID=55e273f1-0964-4670-870b-410eb199f46d /boot xfs defaults 1 2
 /dev/mapper/rhel-swap swap swap defaults 0 0
 /dev/sdb1 /newFS xfs defaults 0 0
/dev/sdb2 swap swap defaults 0 0

5、磁盘容量配额

Linux 系统的设计初衷就是让许多人一起使用并执行各自的任务,从而成为多用户、多任务的操作系统。但是,硬件资源是固定且有限的,如果某些用户不断地在 Linux 系统上创建文件或者存放电影,硬盘空间总有一天会被占满。针对这种情况,root 管理员就需要使用磁盘容量配额服务来限制某位用户或某个用户组针对特定文件夹可以使用的最大硬盘空间或最大文件个数,一旦达到这个最大值就不再允许继续使用。

可以使用 quota 命令进行磁盘容量配额管理,从而限制用户的硬盘可用容量或所能创建的最大文件个数。quota命令还有软限制和硬限制的功能。
  ➢ 软限制:当达到软限制时会提示用户,但仍允许用户在限定的额度内继续使用。
  ➢ 硬限制:当达到硬限制时会提示用户,且强制终止用户的操作。
RHEL 7 系统中已经安装了 quota 磁盘容量配额服务程序包,但存储设备却默认没有开启对 quota 的支持,此时需要手动编辑配置文件,让 RHEL 7 系统中的/boot 目录能够支持 quota磁盘配额技术。另外,对于学习过早期的 Linux 系统,或者具有 RHEL 6 系统使用经验的读者来说,这里需要特别注意。早期的 Linux 系统要想让硬盘设备支持 quota 磁盘容量配额服务,使用的是 usrquota 参数,而 RHEL 7 系统使用的则是 uquota 参数。在重启系统后使用 mount命令查看,即可发现/boot 目录已经支持 quota 磁盘配额技术了:


[root@localhost ~]# mount|grep boot
 /dev/sda1 on /boot type xfs (rw,relatime,seclabel,attr2,inode64,noquota)[root@localhost ~]# vim /etc/fstab
#/etc/fstab
 #Created by anaconda on Thu Dec 20 17:33:14 2018#Accessible filesystems, by reference, are maintained under ‘/dev/disk’
 #See man pages fstab(5), findfs(8), mount(8) and/or blkid(8) for more info/dev/mapper/rhel-root / xfs defaults 1 1
 UUID=55e273f1-0964-4670-870b-410eb199f46d /boot xfs defaults,uquota 1 2
 /dev/mapper/rhel-swap swap swap defaults 0 0
 /dev/sdb1 /newFS xfs defaults 0 0
 /dev/sdb2 swap swap defaults 0 0[root@localhost ~]# reboot
[root@localhost ~]# mount|grep boot
 /dev/sda1 on /boot type xfs (rw,relatime,seclabel,attr2,inode64,usrquota)

接下来创建一个用于检查 quota 磁盘容量配额效果的用户 tom,并针对/boot 目录增加其他人的写权限,保证用户能够正常写入数据:


[root@localhost ~]# useradd tom
[root@localhost ~]# chmod -Rf o+w /boot


xfs_quota 命令

xfs_quota命令是一个专门针对XFS文件系统来管理quota磁盘容量配额服务而设计的命令,格式为“xfs_quota [参数] 配额 文件系统”。其中,-c 参数用于以参数的形式设置要执行的命令;-x 参数是专家模式,让运维人员能够对 quota 服务进行更多复杂的配置。接下来我们使用 xfs_quota命令来设置用户 tom 对/boot 目录的 quota 磁盘容量配额。具体的限额控制包括:硬盘使用量的软限制和硬限制分别为 3MB 和 6MB;创建文件数量的软限制和硬限制分别为 3 个和 6 个。


[root@localhost ~]# xfs_quota -x -c ‘limit bsoft=3m bhard=6m isoft=3m ihard=6m tom’ /boot
 [root@localhost ~]# xfs_quota -x -c report /boot
 User quota on /boot (/dev/sda1)
 Blocks
 User ID Used Soft Hard Warn/Grace

root 72360 0 0 00 [--------]
tom 0 3072 6144 00 [--------]


当配置好上述的各种软硬限制后,尝试切换到这个普通用户,然后分别尝试创建一个体积为 5MB 和 8MB 的文件。可以发现,在创建 8MB 的文件时受到了系统限制:


[root@localhost ~]# su - tom
 [tom@localhost ~]$ dd if=/dev/zero of=/boot/tom bs=5M count=1
 记录了1+0 的读入
 记录了1+0 的写出
 5242880字节(5.2 MB)已复制,0.00486121 秒,1.1 GB/秒
 [tom@localhost ~]$ dd if=/dev/zero of=/boot/tom bs=8M count=1
dd: 写入"/boot/tom" 出错: 超出磁盘限额
 记录了1+0 的读入
 记录了0+0 的写出
 6291456字节(6.3 MB)已复制,0.0130212 秒,483 MB/秒

edquota 命令

edquota 命令用于编辑用户的 quota 配额限制,格式为“edquota [参数] [用户] ”。在为用户设置了 quota 磁盘容量配额限制后,可以使用 edquota 命令按需修改限额的数值。其中,-u参数表示要针对哪个用户进行设置;-g 参数表示要针对哪个用户组进行设置。edquota 命令会调用 Vi 或 Vim 编辑器来让 root 管理员修改要限制的具体细节。下面把用户 tom 的硬盘使用量的硬限额从 5MB 提升到 8MB:


[root@localhost ~]# edquota -u tom
 Disk quotas for user tom (uid 1006):
 Filesystem blocks soft hard inodes soft hard
/dev/sda1 8192 3072 8192 1 3 6
 [root@localhost ~]# su - tom
 上一次登录:四 1月 3 01:15:44 CST 2019pts/0 上
 [tom@localhost ~]$ dd if=/dev/zero of=/boot/tom bs=8M count=1
 记录了1+0 的读入
 记录了1+0 的写出
 8388608字节(8.4 MB)已复制,0.0523109 秒,160 MB/秒