Linux的磁盘配额设置

2023-05-16

不管磁盘空间有多么大,磁盘空间不够使用似乎是一个永远的事实。而且Linux系统在默认情况下,并不限制每个用户使用磁盘空间的大小,如果某个用户疏忽或恶意将磁盘占满,将导致系统无法进行写操作甚至崩溃。因此Linux提供了限制用户磁盘空间的手段,以便促使每个用户合理有效地使用分配给他的空间。

设置用户和组配额的分配量对磁盘配额的限制一般是从一个用户占用磁盘大小和所有文件的数量两个方面来进行的。设置磁盘配额时,“某用户在系统中共计只能使用50MB磁盘空间”,这样的限制要求是无法实现的;只能设置“某用户在/home分区能使用30MB,在/backup分区能使用20MB”。磁盘配额的设置单位是分区,针对分区启用配额限制功能后才可以对用户设置,而不理会用户文件放在该文件系统中的哪个目录中,其他系统,如Unix、Windows,原理与Linux相同。在具体操作之前,我们先了解一下磁盘配额的两个基本概念:软限制和硬限制。

  • 软限制:一个用户在一定时间范围内(默认为一周,可以使用命令“edquota -t”重新设置,时间单位可以为天、小时、分钟、秒)超过其限制的额度,在不超出硬限制的范围内可以继续使用空间,系统会发出警告(警告信息设置文件为“/etc/warnquota.conf”),但如果用户达到时间期限仍未释放空间到限制的额度下,系统将不再允许该用户使用更多的空间。
  • 硬限制:一个用户可拥有的磁盘空间或文件的绝对数量,绝对不允许超过这个限制。

明白了上面的基本概念,我们就可以配置磁盘配额了。设置磁盘配额的步骤:
(1)启动分区配额功能;
(2)生成配额信息文件;
(3)设置用户和组配额;
(4)启动磁盘配额服务。

1. 启动分区配额功能

用管理员身份登录系统,编辑系统配置文件/etc/fstab中相应分区(以/home分区为例)的设置选项,若开启用户配额添加选项“usrquota”,用户组配额添加选项“grpquota”,中间以逗号隔开。

LABEL=/home  /home  ext3  defaults,usrquota  1  2

用户组配额用以限定一组用户共计可以使用的空间数,一般应用较少,本例只启动用户配额。

分区配额功能生效需要重新启动系统,或者简单一点,重新挂载此分区,让其新加参数生效:

# mount -o remount /home

2. 生成配额信息文件

检测分区中当前用户空间使用情况,并生成保存配额信息的数据库文件:

# quotacheck -F vfsv0 -uv /home (生成符合系统要求的 aquota.usr)
# quotacheck -g /home (生成符合系统要求的 aquota.group)

选项“-F vfsv0”指定磁盘配额功能实现的软件版本,当前流行的Linux版本基本都为Quota 2.0 ,可以使用命令“man quotacheck”查看到此信息,不必像绝大多数的文章和书籍资料中手工“touch”创建。

选项“-u”指定生成用户配额信息文件“aquota.user”(Quota 1.0为quota.user),如果设置了用户组配额则添加选项“-g”生成配额信息文件“aquota.group”,选项“-v”表示执行时显示详细信息。执行结果中自动报告了分区/home的空间使用情况,并自动生成了配额信息文件“aquota.user”,其权限为600 。

若较老的Linux系统(Quota 1.0)要升级到Quota 2.0 ,可以使用命令“convertquota”将老格式文件“quota.user”和“quota.group”转换为新格式“aquota.user”和“aquota.group”。

3. 设置用户和组配额

使用edquota命令为每个用户设置磁盘配额,如下例为用户Sam设置配额:

# edquota Sam

系统会调用Vim/Vi生成一临时文件,编辑方法与vi完全相同,以ZZ或:wq命令退出。在此文件中可对用户Sam配额信息进行编辑,默认文件内容如下:

Disk quotas for user Sam (uid 500):
Filesystem     blocks       soft       hard     inodes     soft     hard
/dev/hda3        5          0         0         5        0       0

其中“Filesystem”字段表明使用磁盘配额的分区对应的设备名称,“blocks”和“inodes”分别表明了用户当前已经使用的磁盘空间(以KB为单位)和建立的文件数(此限制一般较少应用),“soft”和“hard”即为前文提及的软限制和硬限制(大多数应用不设置软限制)。

编辑此文件,把软、硬限制设置到合适的数值,保存退出,可以看到“aquota.user”文件的大小改变,说明用户的配额已经储存。设置组配额可以使用命令“edquota -g 组名”。

设置大量用户的磁盘配额,若分配给用户的配额相同,可以使用命令edquota的“-p”选项在用户之间复制配额设置,可用下面的命令给这些用户赋予与protuser相同的限额:

# edquota [-u] -p protuser user1 user2 user3
# edquota -g -p protgroup group1 group2 group3

例如将用户Sam的配额信息复制给Helen和Jack:

# edquota -p Sam Helen Jack

这样可将配额模板用户设置复制给任意多用户,或可利用此命令编写shell脚本批量复制。此外,也可以使用命令“setquota”来设置磁盘配额,如:

# setquota Mary 0 20480 0 0 /home

这样可以限定用户Mary可以在/home分区使用空间20MB ,具体用法在此不在赘述。

在第三步中设置用户Sam配额为10MB ,如下:

Disk quotas for user Sam (uid 500):
Filesystem     blocks       soft       hard     inodes     soft     hard
/dev/hda3        5          0        10240      5        0       0

切换到用户Sam ,做磁盘爆满测试:

# dd if=/dev/zero of=quotatest bs=1024k count=10240000
hda3: write failed, user block limit reached.
dd: writing `quotatest': Disk quota exceeded
1+0 records in
0+0 records out
1036288 bytes (1.0 MB) copied, 0.0174559 seconds, 59.4 MB/s

用户Sam达到限定的磁盘空间,出现了上面的提示信息,他将不能再创建文件,有效的控制了用户磁盘空间的使用。

4. 启动磁盘配额服务

使用命令quotaon用来激活配额系统并允许配额检查:

# quotaon /home

若关闭配额服务则使用命令“quotaoff”。分区的磁盘配额功能设置后,每次开机会自动加载并启动服务,务须另行在启动脚本中设置。

5. 其他功能设置:设定soft quota和hard quota之间的时间

# edquota -t

出现一个 vi 窗口:

Grace period before enforcing soft limits for users:
Time units may be: days, hours, minutes, or seconds
Filesystem Block grace period Inode grace period
/dev/hda7 7days 7days

修改成自己所需要的,并保存退出就设置这个时间啦。在这之后可能需要重新启动,以使磁盘限额生效。

6. 检查磁盘空间限制的一致性

系统会自动每次重新启动时,在检查硬盘后进行( /etc/rc.sysinit ),无须亲自进行。假若分区已经以“读写”方式挂上时要小心,例如:

# quotacheck /home
quotacheck: Quota for users is enabled on mountpoint /home so quotacheck might damage the file.
Please turn quotas off or use -f to force checking.

这时, 由于某种需要,或者在某种情况,“不得不”运行这个命令 :

# quotacheck -mf [-u] /dev/hda7
# quotacheck -mf -g /dev/hda7

参数 -m[M] 意思是:强迫在“读、写”模式下检查硬盘的 quota (有一定的“正在写”的数据丢失可能,应确保没有进程在写这个分区。建议在单用户模式下进行。

例如:(在平时检查)

# quotacheck /var/spool/ -f
quotacheck: Cannot remount filesystem mounted on /var/spool read-only so counted values might not be right.
Please stop all programs writing to filesystem or use -m flag to force checking.

# quotacheck /var/spool/ -m
quotacheck: Quota for users is enabled on mountpoint /var/spool so quotacheck might damage the file.
Please turn quotas off or use -f to force checking.

7. 取消磁盘空间和i节点数目的限制

# quotaoff /home (取消磁盘空间限制。)
# quotaon /home (现在启动磁盘空间限制。)
# quotaon /home (如果已经启动磁盘空间限制,会出现以下错误:)
quotaon: using /home/aquota.group on /dev/hda7: Device or resource busy
quotaon: using /home/aquota.user on /dev/hda7: Device or resource busy

8. 查看磁盘配额

用户查看自己当前的配额信息,可使用命令“quota”:

# quota
Disk quotas for user Sam (uid 500):
Filesystem  blocks   quota   limit   grace   files   quota   limit   grace
/dev/hda3    1022     0    1024            6      0      0    

其中“quota”字段为软限制,“limit”字段为硬限制,“grace”字段为软限制达到后宽限期(前文“edquota -t”设定的时间)。

若管理员查看各个用户的磁盘配额使用情况,可以使用命令“repquota”:

# repquota /home
*** Report for user quotas on device /dev/hda3
Block grace time: 7days; Inode grace time: 7days
Block limits                File limits
User        used        soft        hard  grace        used        soft        hard  grace
-----------------------------------------------------------------
root  --        10545        0        0        4        0        0     
sam  --                1024        0        1024        8        0        0     
helen  --        5        0        10240        5        0        0

从结果中可以方便的查看到用户的配额使用情况。如果想获得其他更多信息还可以执行命令“quotastats”,详见帮助。

inode与block使用说明

磁盘配额限制空间使用的方法有两种,即分别对inode和block进行限制。磁盘配额可以限定用户在分区中使用的空间大小(blocks),也可以限定用户可以在分区中最多创建的文件数(inodes),需要注意的是,只要用户所创建的文件超过他可以使用的inode数额,即使这些文件是空的,他再次创建文件的行为也将被限制。

此处说明一下inode的概念。在Linux中创建一个文件,系统就为该文件分配一个惟一的inode ,文件的inode用于访问文件的属性。也就是说,Linux系统中每个文件都要对应一个inode,通俗点说Linux内核不认识字母,所以用户要有UID、用户组要有GID、进程要有PID……,文件要有inode ,一旦inode丢失文件将无法被访问。

使用命令“ls -i”可以查看到文件的inode号。

# ls -i
163523 inittab  163524 services  163525 a b

Linux系统中的硬链接文件与原文件大小一样,且可同步更新,因为硬链接是一个指向文件的指针,它与原文件的inode相同。

如果系统中有名称特殊的文件,如“a b”,使用“rm”命令无法对其操作(因“rm”会判断为要删除两个文件“a”和“b”),此时可以利用inode的原理,假设“a b”的inode为163535,查看详细信息执行:

# find . -inum 163535 -exec ls -l {} \;
-rw-r--r-- 1 root root 0 Nov 27 15:21 ./a b

删除此文件执行:

# find . -inum 163535 -exec rm {} \;

选项“-inum”即为查找文件的inode ,选项“-exec”为find命令的连接符。

另外,在部署磁盘配额前,要考虑哪些分区需要设置。一般而言,保存用户宿主目录的分区(一般为/home)一定要设置磁盘配额,公共存储用户数据的分区要设置磁盘配额(如公司的网络备份应用服务器)。

磁盘爆满测试

一个没有设置磁盘配额的Linux系统中,使用某一普通用户登录,执行命令:

# dd if=/dev/zero of=quotatest bs=1024k count=10240000

命令将生成一个固定大小的文件。其中“if”表示输入,伪设备/dev/zero不断生成字符串“0”,初始化文件;“of”表示输出,此例为在用户当前 目录下生成文件“quotatest”;“bs”为“block size”指定数据块大小,单位设定为“1024k”即1MB;“count”为总计生成的文件(“quotatest”)大小,若“bs”为1MB,则 “10240000”为10000GB。

大多数服务器磁盘空间没有这么大,上面的命令没执行完空间就耗光了。笔者用一台一般配置的笔记本电脑测试,写入速度约为60MB/s,一分钟就可以写 3GB,如果您的服务器是100GB的,半个小时后磁盘空间就会达到100%,此时用户无法创建文件、管理员无法添加用户、系统无法写入日志……甚至系统 重启后将无法正常启动,因为磁盘空间爆满,启动过程中临时文件无法生成。

如果您真的做了上述的测试,系统无法正常启动,可以使用Linux安装光盘引导,在安装界面输入“linux rescue”进入修复模式后删掉文件“quotatest”,即可恢复。

由此可见,若不设置磁盘配额,即使不是黑客,任一普通用户都可以随时摧毁我们的系统。

本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)

Linux的磁盘配额设置 的相关文章

随机推荐

  • 挂载别的系统挂掉的磁盘解决步骤,mount: unknown filesystem type ‘LVM2_member‘ 报错

    挂载别的系统挂掉的磁盘解决步骤 1 在新的虚机添加磁盘 按照下边操作步骤即可使linux系统重新读取并识别到新硬盘 xff1a 1 1 确定主机总线号 xff1a root 64 iNeedle ls sys class scsi host
  • 序设计思维与实践 CSP-M4

    A 题意 xff1a 题目描述 这一天 xff0c TT因为疫情在家憋得难受 xff0c 在云吸猫一小时后 xff0c TT决定去附近自家的山头游玩 TT来到一个小湖边 xff0c 看到了许多在湖边嬉戏的鸭子 xff0c TT顿生羡慕 此时
  • C++ 构造函数详解

    目录 0 什么是构造函数 1 默认构造函数 2 一般构造函数 3 拷贝构造函数 4 转换构造函数 5 移动构造函数 0 什么是构造函数 在定义类的成员函数的时候 xff0c 一般的成员函数与普通的全局函数没有太大的区别 xff0c 在定义函
  • Copilot 简单测评

    年初的时候通过了Copilot的试用申请资格 xff0c 试用到现在也几个月了 xff0c 说一下使用的感受 最开始理解Copilot xff0c 是通过注释来生成代码 xff0c 在这个想法下 xff0c 感觉自己又又又又要失业了 xff
  • iPhone开发【十四】多线程开发之NSThread——子线程模拟耗时操作

    转载请注明出处 xff0c 原文网址 xff1a http blog csdn net m changgong article details 8213964 作者 xff1a 张燕广 实现的功能 xff1a 1 xff09 演示多线程开发
  • 学习c语言的总结

    学习时间 xff1a 早上9点 晚上9点 学习内容 xff1a 利用c语言对 的代码学习 xff0c 并根据自己的理解编写代码 xff0c 最后整合学习的代码和自己理解的代码 xff0c 编写出更优的代码 学习体会 xff1a 对一个问题举
  • Makefile使用细节

    变量及通配符 A 61 C 即时变量 xff0c 此时C未定义 xff0c A为空 B 61 C 延时变量 xff0c 用到B时再确定具体的值 C 61 abc C 61 123 C不是第一次定义 xff0c 被忽略 C 43 61 789
  • Debian修改桌面系统

    今天 xff0c 装了Debian xff0c 发现其桌面不好看 xff0c 感觉就像瘟逗死系统 xff0c 寻思着更换一下 xff0c 于是就度娘 xff0c 但遗憾的是没有找到 xff0c 想一下不如自个儿研究哈哈 xff0c 所以记录
  • csp 序列查询新解 解决70分超时和错误的思路

    这个题的代码我再也不会看的 因为这题就是一个发现数与数之间联系的一道题 xff0c 不会再看了 总结一下 xff1a 这道题别人AC是用了两层for循环 但内层的for里第三个条件不是i 43 43 是i 43 61 一个区间长度 这就过了
  • bat批处理文件建立和打开

    一 新建bat文件 1 1新建文本文件 xff0c 在文本文件写入如下内容 xff1a xff08 注意不要有中文路径和中文名称 xff09 格式 xff1a start 目录路径 app exe 具体的实例如下所示 xff1a start
  • 安装树莓派vnc或者xrdp出错解决办法(树莓派ping不同Windows、但是Windows可以ping通树莓派)(树莓派上搭建好了vnc环境和xrdp环境)

    1 1出现问题 博主按照这篇教程https blog csdn net naibozhuan3744 article details 84961041搭建树莓派vnc环境或者xrdp环境时 xff0c 一直出现win10系统ping不通树莓
  • C++可变参数模板函数基本用法

    可变参数模板可以创建任意个参数的模板函数和模板类 xff0c 本文主要介绍可变参数模板函数 1 1可变参数模板函数声明和定义 template lt typename Args gt Args是一个模板参数包 void Show Args
  • python+KLT光流法匹配

    span class token comment 光立法匹配 span span class token function import span numpy as np span class token function import s
  • python3 最长公共前缀

    给定一个大小为 n 的字符串数组 strs xff0c 其中包含n个字符串 编写一个函数来查找字符串数组中的最长公共前缀 xff0c 返回这个公共前缀 import random import re class Solution def l
  • Android Studio 设置阿里云镜像代理(如果设置之后还是远程仓库下载失败,请仔细阅读其内容就可以解决了)

    1 在project的build gradle文件的repositories标签和allprojects标签的repositories标签下加入以下阿里云镜像代理 xff08 如下图一和图二 xff0c 记得要把阿里云镜像代理放在repos
  • scnprintf()和snprintf()、vscnprintf()和vsnprintf()

    写过Linux驱动或者内核态程序的人应该都知道 xff0c 编译时会有这样一个警告 xff1a use scnprintf instead of snprintf 为什么在编译驱动或者内核态程序的时候会有这个警告呢 xff1f 据说因为sn
  • CentOS 8.5安装-解决Error setting up base repository问题

    CentOS 8 5安装 解决Error setting up base repository CentOS 8简介 1 CentOS 8 版本介绍CentOS 8 的新特性CentOS 8所需硬件配置 CentOS 8 5安装CentOS
  • stdout, stdin, stderr的区别

    stdin stdout stderr的中文名字分别是标准输入 xff0c 标准输出和标准错误 当一个用户进程被创建的时候 xff0c 系统会自动为该进程创建三个数据流 xff0c 一个程序要运行 xff0c 需要有输入 输出 xff0c
  • Linux服务器安全之禁止root用户通过ssh登录(基于CentOS 7.0系统)

    Linux系统默认情况下 xff0c 是可以通过ssh以root权限登录的 但出于安全考虑 xff0c 这样的权限是不合适的 xff0c 因为黑客可能通过暴力破解你的root密码 xff0c 然后进入你的系统 为了保证服务器安全 xff0c
  • Linux的磁盘配额设置

    不管磁盘空间有多么大 xff0c 磁盘空间不够使用似乎是一个永远的事实 而且Linux系统在默认情况下 xff0c 并不限制每个用户使用磁盘空间的大小 xff0c 如果某个用户疏忽或恶意将磁盘占满 xff0c 将导致系统无法进行写操作甚至崩