In this lesson we’re going to talk about Disk Quotas.
Now disk quotas are a very valuable management tool when you’re administering a multi-user Linux system.
Here’s the problem because Linux is a true multi-user operating system.
It is possible for one or two users on that system to completely hog up all the disk space available on the file system.
This is especially a problem today where it’s not uncommon for a user to download very large music files from the internet and even larger movie files.
Now you can keep these users from consuming more than their fair share of the disk space on the system by implementing Disk Quotas.
And these Quotas establish space limitations to specify how much space a particular user is allowed to use.
For example, you can specify with these quotas that a user is only allowed to use a certain amount of disk space or you can limit the number of files that they’re allowed to create by setting a Quota on the number of Inode they’re allowed to consume.
Now Quotas can be configured to either temporarily allow users to exceed limits or you may specify that they’re not allowed to exceed those limits at all.
Installing quota Package
In order to implement quotas on your Linux file system you first need to install the quota package on your system.
Some distributions will install this package as part of the base installation.
Right now I am using the CentOS 8 operating system and it has a Quota package already installed.
# rpm -qa | grep quota quota-4.04-10.el8.x86_64
My experience has been however that most distributions do not and you’ll have to install it separately after the system’s all been installed and set up.
To see if quota has already been installed on your system you can use the appropriate package management utility for your distribution to see if the quota package has been installed.
And if it hasn’t been installed then you need to use
apt-get to go out and get it and install it.
If you are on a Debian based Linux machine and don’t have quota installed then you can install that with the help of the following command.
# sudo apt-get update # sudo apt-get install quota
and If you are on an
RPM based Linux machine like Redhat or CentOS then you can install this with the help of the following command.
# yum -y install quota
Now once that package has been installed there are several tasks you need to complete in order to establish Quotas.
Let’s take a look at what they are.
Enabling the Quotas on a File System
The first thing we need to do is go in to our
/etc/fstab configuration file on the system where we want to establish quotas and open it up in a text editor and add these two parameters to our mount options
Suggested Read: How to Create Disk Partitions (MBR) in Linux
Here I am enabling the quota on the
# cat /etc/fstab # # /etc/fstab # Created by anaconda on Sun Jan 24 10:20:39 2021 # # 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. # # After editing this file, run 'systemctl daemon-reload' to update systemd # units generated from this file. # UUID=b119d862-07b7-4842-a6ea-cd2da64f8eae / xfs defaults 0 0 UUID=e9f23f2d-118e-4a5e-94ab-b08afb78a3be /boot ext4 defaults 1 2 UUID=d3e3cc9a-6c24-4d58-9d33-4aeaa2eef5d1 swap swap defaults 0 0 /dev/sdc1 /mydata ext4 defaults,usrquota,grpquota 0 0
Remounting the File Systems
Now before these will take effect the
/etc/fstab file has to be reread, probably the easiest way to do this is to simply just restart the system.
You can run the following command to restart the system.
# shutdown -r
Or you can remount the file system using following command.
# mount -o remount /dev/sdc1
Enable quota on a file system (Temporary Method)
If you want to temporarily enable quota on a file system, type the following command.
# mount -o remount,usrquota,grpquota /mydata/
Creating the Quota Database Files
Then after the system’s been rebooted you need to create your quota files.
You do this using the command that you see here.
# quotacheck -amvug
quotacheck command will scan the file system and establish what the current disk usage looks like and it will also create our quota files.
Let’s try to understand all the options that we are using with the
-a– Check all File Systems
-m– Check all mounted file system
-v– Operate in Verbose mode
-u– Check User Files
-g– Check Group Files
quotacheck command is complete, you will see two files created at the mount point of the device in your file system that is
Here I have mounted the
/dev/sdc1 partition in the
/mydata directory and as you can see the quota files have been created.
# ls /mydata/ aquota.group aquota.user lost+found
And this is important because if these two files don’t exist then we can’t create quotas on that file system.
Now if those two files in place, the next thing we need to do is enable quotas on the file system.
We do that using the
quotaon command with the
# quotaon -av /dev/sdc1 [/mydata]: group quotas turned on /dev/sdc1 [/mydata]: user quotas turned on
Reporting on Disk Quotas
Once that command has been run you can then view the current disk space used by all the users on your system using
repquota command with the
When you run this command, a report is displayed on the screen showing how much space each user is consuming and you can see that right here.
# repquota -av *** Report for user quotas on device /dev/sdc1 Block grace time: 7days; Inode grace time: 7days Block limits File limits User used soft hard grace used soft hard grace ---------------------------------------------------------------------- root -- 20 0 0 2 0 0 helpdesk -- 2048 0 0 2 0 0 linuxadmin -- 4096 0 0 4 0 0 Statistics: Total blocks: 7 Data blocks: 1 Entries: 3 Used average: 3.000000
As you can see, we have the
root user, we have the
helpdesk user and a user named
In this report, you can see such a symbol(
--) in front of every user.
If the limit of one of the
inodes is exceeded, then here (
--) you will get a
Out of two Hyphen’s (
- represents the block limit, and the second
- represents the inode limit.
This report is also showing how much disk space they have used here and how many inodes each user has used.
Now notice over here we have columns named
These are the quotas that have been set for each user.
Now you’ll notice here that all the quotas are set to
0 which means there aren’t any quotas configured for each user we need to change that.
Assigning Disk Quotas per User and Group
You create this quota for user using the commands shown here.
Assigning Quotas per User
edquota -u followed by the username of the user that we want to create a quota for.
In this case I have decided to create a disk quota for the
# edquota -u helpdesk
Essentially what this will do is open up the
vi editor and load the quota file for the user specified.
Disk quotas for user helpdesk (uid 1000): Filesystem blocks soft hard inodes soft hard /dev/sdc1 2048 0 0 2 0 0
What you need to do is then specify what quotas you want to set.
We have our
blocks quota and we have our
inode quotas that we can set.
blocks it tells us how many have currently been consumed and
inode tells us how many Inode have been consumed on this file system for this particular user.
So don’t be too worried about those parameters.
What we do want to be concerned with is the
hard parameters or
inodes and for
You can go ahead and replace these zeros(
0) with a number, and you can set a
hard quota for
blocks and a
hard quota for
Now be aware that
soft quotas can be temporarily exceeded for a period of time but
hard quotas on the other hand cannot be exceeded at all.
So when we set a
block quota we are specifying how many blocks on the disk the user is allowed to consume.
And if you do the math you can figure out how much space equates to how many
inode quota on the other hand specifies how many files the user can own on that filesystem.
So let’s set the quota for the helpdesk.
Disk quotas for user helpdesk (uid 1000): Filesystem blocks soft hard inodes soft hard /dev/sdc1 2048 10000 15000 2 800 1000
After making the necessary changes, press the
ESCAPE button on your keyboard then type
:wq! and press
ENTER button to save your changes.
Confirming Quotas configuration
To check whether the quota is configured, you can run the following command.
# quota helpdesk Disk quotas for user helpdesk (uid 1000): Filesystem blocks quota limit grace files quota limit grace /dev/sdc1 2048 10000 15000 2 800 1000
Copy Quotas from one User to other User
Now before we go on be aware that if you have a lot of users on the system then this process right here can be somewhat time consuming.
Going in and editing quotas for each and every individual user.
If the users on your system all have very similar quotas that you want to set, in other words the the
block and the
inode quotas that you want to set are pretty much the same across multiple users.
You can go through this process here using the
edquota command to setup a quota for one user on the system and then you can use the
edquota -p command to then say please copy the quotas that are set for this user and copy them over to this other user.
Step #1 Setup a quota for one user
Here I am setting quota for helpdesk user.
# edquota -u helpdesk
isk quotas for user helpdesk (uid 1000): Filesystem blocks soft hard inodes soft hard /dev/sdc1 2048 10000 15000 2 800 1000
Step #2 Copy the quotas from one user to other user
edquota -p source_user destination_user
So let’s apply the quota we set for the
helpdesk user over
# edquota -p helpdesk linuxadmin
And as you can see the quotes have been applied and if you notice, the quota settings of both users are the same.
Disk quotas for user linuxadmin (uid 1005): Filesystem blocks soft hard inodes soft hard /dev/sdc1 4096 10000 15000 4 800 1000
So, basically you only have to edit the file once and then copy the quotas that are set to all the other users. It’s a lot faster that way.
Assigning Quotas per Group
Another option for getting around this issue is to establish quotas for groups instead of individual users.
So, you can put all the users that have a similar quota requirement in to the same group.
And then you can use this command
edquota -g followed by the group name in order to establish the quota for the group which will then be automatically applied to all members of that group.
Here in this example I’m setting quota for a group called
# edquota -g developer
When you do, you see basically the same interface that you see here you just set the quotas for a group name instead of a user name.
Disk quotas for group developer (gid 1002): Filesystem blocks soft hard inodes soft hard /dev/sdc1 0 10000 15000 0 800 1000
Managing the Grace Period
Now before we end, we need to talk about managing the grace period.
Now the grace period is the amount of time that the end user is allowed to exceed a
soft quota limit that you set.
The default is to allow users to exceed a
soft quota for a maximum of
If you don’t like this grace period, you can change it.
This is done by running the following command.
# edquota -t
When you run this command, you see this interface right here.
For the given file system, you can specify what the block grace period is and what the inode grace period is and is again you can see it’s set to 7 days by default.
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/sdc1 7days 7days
If you want to be shorter or longer you can enter that value here.
Let’s change the grace period to 10 days.
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/sdc1 10days 10days
Once you’re done you can then check your new quotas by running the same command again that we ran earlier.
Note: Following report will display the disk usage report for all (option
-a) quota enabled file systems
# repquota -av *** Report for user quotas on device /dev/sdc1 Block grace time: 10days; Inode grace time: 10days Block limits File limits User used soft hard grace used soft hard grace ---------------------------------------------------------------------- root -- 20 0 0 2 0 0 helpdesk -- 2048 10000 15000 2 800 1000 linuxadmin -- 4096 10000 15000 4 800 1000 Statistics: Total blocks: 7 Data blocks: 1 Entries: 3 Used average: 3.000000
This time you’ll notice that some thing is different in the output of the command.
And notice that from my helpdesk user now have a soft and hard limit set for my
block usage, I also have a
hard limit set for my
inode usage effectively.
helpdesk now has quota is set on the
So, at this point my system is now protected from disk space hogs.
To check the quota report of a particular file system, you can run the following command.
Here I am checking the quota report of the
/mydata file system.
# repquota /mydata/ *** Report for user quotas on device /dev/sdc1 Block grace time: 10days; Inode grace time: 10days Block limits File limits User used soft hard grace used soft hard grace ---------------------------------------------------------------------- root -- 20 0 0 2 0 0 helpdesk -- 2048 10000 15000 2 800 1000 linuxadmin -- 4096 10000 15000 4 800 1000
Enabling and Disabling Quotas
If you want to turn the quotas on or off, you can do so.
Type the following command to disable quota for all users and groups.
# quotaoff -vaug /dev/sdc1 [/mydata]: group quotas turned off /dev/sdc1 [/mydata]: user quotas turned off
Run the following command to disable quotas only for users.
# quotaoff -vau /dev/sdc1 [/mydata]: user quotas turned off
You can use the following command to disable quotas only for groups.
# quotaoff -vag /dev/sdc1 [/mydata]: group quotas turned off
Following command will enable quota for all users and groups.
# quotaon -vaug /dev/sdc1 [/mydata]: group quotas turned on /dev/sdc1 [/mydata]: user quotas turned on
To enable quotas for a specific file system, such as
/mydata, use the following command.
# quotaon -vug /mydata
I hope that now you have a good understanding of How to Implement and Manage Disk Quotas in Linux.
If anyone does have any questions about what we covered in this guide then feel free to ask in the comment section below and I will do my best to answer those.