Using Disk Quotas
Part of managing storage is determining how the available storage can be used. Although setting the size of filesystems such as /tmp and /home can limit storage for certain types of data, it is sometimes necessary to enable disk usage per user or per user group. This is possible with disk quotas. To use quotas, the quota RPM package must be installed. Refer to Chapter 3 for details on installing packages.
Enabling Quotas
To use quotas, they must be enabled in /etc/fstab, which is read at boot time to mount filesystems. This enables quotas in the kernel booted for the system. To add as an option in /etc/fstab, for example (as the root user):
/dev/VolGroup00/LogVol01 /home ext3 usrquota,grpquota 1 2
The usrquota mount option enables user quotas, and the grpquota option enables group quotas. One or both can be used. Either reboot the system to enable the quotas or remount each filesystem as root with the following command:
mount -o remount,acl,usrquota,grpquota,rw <mountpoint>
Once again, one or both of usrquota or grpquota can be used. In our example, <mountpoint> would be /home. To verify that the remount enabled quotas, execute the following command:
mount | grep <mountpoint>
or use such as mount | grep home if you are following the example. The output shows which mount options were used to mount the filesystem:
/dev/VolGroup00/LogVol01 on /home type ext3 (rw,acl,acl,usrquota,grpquota)
Creating Quota Database Files
The first time the system is booted with quotas enabled in /etc/fstab, quotas are not turned on because the quota database files for the filesystem do not exist. The quotacheck command is used to create these files.
After rebooting with quotas enabled in /etc/fstab and before executing the quotaon command to turn on quotas, the filesystem must be initialized to use quotas. If they do not already exist, the aquota.user and aquota.group files are created in the root directory of the filesystem. These are database files used to enforce quotas.
Refer to the quotacheck man page for a list of all options and determine which options are best for your situation. By default, only user quotas are checked and initialized. If you need to initialize user group quotas as well, specify it with the -g option. A typical command to run with options, as the root user, would be:
quotacheck -uvg <devicename>
such as:
quotacheck -uvg /dev/VolGroup00/LogVol02
Because disk usage can change when the filesystem is mounted in read-write mode, it is recommended that quotacheck be run when the filesystem is mounted read-only. If the filesystem is mounted when quotacheck is run, quotacheck will try to mount it read-only before starting the scan. It then remounts it in read-write mode after the scan is complete.
If it is unable to mount it read-only, a message similar to the following appears:
quotacheck: Cannot remount filesystem mounted on /home read-only so counted values might not be right. Please stop all programs writing to filesystem or use -m flag to force checking.
If quotacheck can’t remount the filesystem read-only before starting, you can force the quota check anyway by using the -m command-line option.
The quotacheck utility should be run on a regular basis to keep quotas accurate or after a system crash in which the filesystem was not unmounted cleanly. To make sure it is done on a schedule, setup a cron task that is run automatically at set times. Refer to Chapter 11, “Automating Tasks with Scripts,” for details on setting up a cron task.
After creating the quota database files, be sure to turn quotas on as described in the next section. After the quota database files are created, subsequent boots with the usrquota and/or grpquota mount options in /etc/fstab will automatically have quotas turned on for those filesystems.
Turning Quotas On and Off
Quotas can be turned on and off without rebooting the system with the quotaon and quotaoff commands, but only for filesystems that meet two conditions: The filesystem must be mounted at boot time with the usrquota and/or grpquota mount options in /etc/fstab, and the filesystem must have the aquota.user and/or aquota.group files in the root of the filesystem.
To turn quotas on for an already mounted filesystem, the quotaon utility can be used. As root, use the following to enable user and group quotas:
quotaon -vug <devicename>
To temporarily turn off quotas, execute the following command as root:
quotaoff -vug <devicename>
The -vug options specify that messages should be displayed showing that the quotas are being turned off as well as error messages if they exist and that both the user and group quotas should be turned off.
To verify that the quotas have been turned on or off, execute the mount command and read the mount options used such as the following:/dev/VolGroup00/LogVol01 on /home type ext3 (rw,acl,acl,usrquota,grpquota)
Setting and Modifying Quotas
Quotas can be set per user, group, or filesystem with the edquota command. The user or group name can be used or the UID or GID for the user or group. To set or modify the quota for a user, execute the following as root:
edquota <username>
To set or modify the quota for a user group, execute the following as root:
edquota -g <groupname>
When the edquota command is executed, the default text editor is opened as determined by the $EDITOR environment variable. In Red Hat Enterprise Linux, the default editor is Vi. To set the default editor to a different editor, execute the following command, replacing emacs with the editor of your choice (this setting is per user):
export EDITOR="emacs"
When this command is executed, it only changes the default editor for that login session. When the system is rebooted, this setting is lost. To permanently change the default editor, add the command as a line to your .bashrc file in your home directory. The .bashrc file is only read when a user logs in, so to enable changes to the file after you have already logged in, execute the source ~/.bashrc command.
When setting quotas, there are two types of limits: soft limits and hard limits. When the soft limit is reached, the user is warned and allowed to exceed the soft limit for a grace period, which is set to 7 days by default in Red Hat Enterprise Linux. This grace period allows the user or group time to reduce disk usage and return to below the soft limit. A hard limit is the absolute maximum amount of disk usage the user or group is allowed. After it is reached, no more disk space is allocated to the user or group.
If a user or group still exceeds the soft limit after the grace period has expired, the soft limit is treated as a hard limit, and the user or group is not allowed additional disk usage until the disk usage falls below the soft limit.
When the edquota command is executed, the output looks similar to Listing 7.13, which shows content for modifying quotas for the user tfox.
Listing 7.13. Setting Disk Quotas
Disk quotas for user tfox (uid 501): Filesystem blocks soft hard inodes soft hard /dev/mapper/VolGroup00-LogVol02 59403 0 0 0 0 0
There are seven columns of information. The first column shows the filesystem in question. The next three columns are for setting quotas according to block size, with the first being the current block usage for the user or group. The next two are for setting the soft and hard limits for block usage. The last three columns are for inode usage, with the first being the current usage for the user or group, and the last two being the soft and hard limits. Setting any of these limits to 0, the default, means there is no limit. The block and inode usage columns are for reference only and should not be modified. Change the values of the limits, save the file, and exit.
To modify the grace period for a filesystem, execute the following as root:
edquota -t
This grace period is used for all users and groups. To set the grace period for a specific user, execute the following as root, where <username> is a username or UID:
edquota -T <username>
To set the grace period for a specific user group, execute the following as root, where <groupname> is a group name or GID:
edquota -T -g <groupname>
Displaying Quotas
To display all quotas along with user and group usage, execute the following as root:
repquota -a
The output should look similar to Listing 7.14.
Listing 7.14. Reporting Disk Usage and Quotas
*** Report for user quotas on device /dev/mapper/VolGroup00-LogVol01 Block grace time: 7days; Inode grace time: 7days Block limits File limits User used soft hard grace used soft hard grace --------------------------------------------------------------------------- root -- 189192 0 0 336 0 0 bfox -- 3216936 40000000 45000000 26383 0 0 tfox -- 36329868 40000000 45000000 56253 0 0