From: ME dugan@passwall.com
To: vox-tech@lists.lugod.org
Cc: talk@nblug.org
Subject: [vox-tech] quotas and kernel v2.4
Date: Thu, 12 Sep 2002 09:15:32 -0700 (PDT)

keywords: quota, aquota.user, aquota.group, quota.user, quota.group, 2.4,
2.2, quotactl, edquota, quotacheck, setquota

I recall someone asking about quotas and having a tough time getting them
to work. At the time, I was using kernel v2.2 and had no problems with
it. However, they were using a 2.4 series kernel.

Now that I have setup a v2.4 box yesterday evening with quotas, and wanted
to share this for others...

Here is a brief summary or micro-mini-howto on how to make this work, at
least on my Debian 3.0 system though most, if not all, can be applied to
most any other modern Linux distro. (There is more information that should
be included, and links to other docs too.)

NOTE: I have read users have been able to get quotas to work with ext3,
and Hans Reiser stated that at least one version of his ReiserFS *did*
support quotas too, but the focus in this e-mail is on ext2. (Much may
apply to use on ext3, and reiserfs but YMMV.)


0) Prepare and boot from a quota enabled kernel...
Compile and install a kernel with the "QUOTA" option enabled. You
should have booted from or be using a kernel with quota support before you
continue.
(Showing how to set this kernel option is beyond scope of this doc)

1) The quota package...
Install the quota tools for your distro. For my Debian 3.0 system, the
package was called, "quota" and was v 3.04.

You should have this installed before you go on.

(You are left to figure this step on your own based on your distro and
packaging system.)

This package includes (or should include) the various tools you will need
for setting up the quota support, manipulating user/group quotas, and for
scaning filesystems at boot for disk use and freshening up the
file(s) with the most up-to-date info on disk space and who is using
it.

2.0) Tell filesystem/mount/kernel about where quotas should be used...
Presently, AFAIK, you can only enable quotas from the root of a mounted
partition in its mountpoint.

This means, if you have one monolithic filesystem for "/" then you can
only enable quotas for the *whole filesystem*.

This means, if you have /var, /tmp, /usr, /home and /usr/local mounted
from different disks and/or different partitions to the local filesystem,
*each and every one* of the mentioned volumes will need to have their
respective "options" in /etc/fstab modified and lead to the user/group to
have disk space computations done on a per-volume basis. (Say, give mike
50MB in /home but 100MB in /var/spool/mail.) If you don't want quotas on
/tmp and /tmp is on its own partition/disk,then dont include the option or
dont edit quotas for that user on that volume if you do enable it.

Tell mount/kernel to support quotas will on the filesystem
Modify /etc/fstab to add one or more of the following args to the
options field:
usrquota
grpquota

At this point, you could probably reboot to make sure the filesystem does
include quota support when mounted, *or* you could try something like:
(assuming /var was the mountpoint for the volume you were enabling)
# mount -o remount /var
and it should re-read the new options in your fstab to test your options
or you could try:
# mount -o remount,usrquota,grpquota /var

after chooing one of the above, you can then try:
# mount
to see if the filesystem includes the args you specified above.
(Sample output with just the "/var" volume included:)
/dev/hda3 on /var type ext2 (rw,usrquota,grpquota)

(If you add both (usrquota,grpoquota), you can get support for both. If
you add only one, you will only be able to have support for one.)

Sample entry from /etc/fstab
(assuming I am doing quotas on /dev/hda3 which is for /var):
/dev/hda3 /var ext2 defaults,usrquota,grpquota 0 2

2.5) (quota.users quota.group) OR (aquota.users aquota.group)

When using a v2.2 series kernel the files "quota.user" and
"quota.group" should be placed at the root level of the mounted volume. In
the above example, "/var" is the directory to place these files, but yours
will likely be different.

When using a v2.4 series kernel the files "aquota.user" and "aquota.group"
should be placed at the root level of the mounted volume. In the above
example, "/var" is the directory to place these files.

It is ok to have both sets of files (files for v2.4 and v2.2) in the same
mounted volume.

Create these files and set ownership with touch and chmod.

(If you have files "there" before you start, and you delete them, you will
lose previous quota information you set for each user (limits) and disk
space used by each user. Certainly, the disk space and user file use can
be recomputed, but the user settings and restrictions are not so easily
rebuilt. A useful tool "setquota" to specify quota settings from a
command line - great for scripting!)

Sample with "/var" as the arg and a v2.2 kernel:
# touch /var/quota.user /var/quota.group
# chmod 600 /var/quota.user /var/quota.group

Sample with "/var" as the arg and a v2.4 kernel:
# touch /var/aquota.user /var/aquota.group
# chmod 600 /var/aquota.user /var/aquota.group

3.0) "Build" or "grow" the required quota files....

Preparation for build (Choose A or B):

Once you finish with "A" or "B" (below) you can go to step "3.1"
-----------------------------------------------------------------

A) (This first one is not the "easier" of the two, but better for
production environment and maintaining good uptime.)
When these file have been created, you can choose one of two routes. If
the mountpoint for the filesystem contains any files that could be
open, you will need to make sure processes with access to those files
close them. (lsof is a *very* useful tool for this.)

With the above example, I had plenty of things using "/var". I had to
shut down my mailing services (qmail), logging services (syslog),
DNS server (bind), and exit some admin programs. (use of
# lsof | grep "var"
was helpful in identifying processes that still had files open in
/var so i could shut them down.

B) Reboot your machine in single user mode with no services running.
(This is easier and limits risk of users opening files in the
volume you are setting up.)
(how to boot in single user mode is beyond scope of this doc)

3.1) Build the quota files:
Use the quotacheck tool with appropriate args to build the respective
files.
For either the 2.2 or 2.4 series kernel, you should be able to try this:
(for the 2.2 series kernel, the files that would be changed would be the
quota.user and/or quota.group, while if booted from a 2.4 series kernel,
the files that would be changed would be aquota.user and/or
aquota.group .)

A sample using the same /var volume as above that has both group and user
quotas enabled: (one or both are critical steps to perform without one or
both, you will not be able to edit/modify quotas on the included mounted
filesystem.)
# quotacheck -c -d -u /dev/hda3
# quotacheck -c -d -g /dev/hda3
(The -c flag is for creating the index/db in the related file.)
(The -d flag above is optional and is useful for debugging. You may choose
to drop it if you dont like watch stuff scroll by your screen really
fast.;-)
(The -u OR -g flag specifies to build and check for user or group
respectively.)
(The last arg, is of course the devof the filesystem that contains my /var
in the sample.)

4.) Checking your work...
If there is success, then you should note the sizes of the files should
not longer be zero:
(For 2.2 series kernel)
# ls -l /var/quota.user
# ls -l /var/quota.group
(For 2.4 series kernel)
# ls -l /var/aquota.user
# ls -l /var/aquota.group

Also, you can try:
# quota -v SOMEUSERNAME
# quota -v -g SOMEGROUPNAME
depending on you check for a user or group. If they have no quota
restrictions, the soft and hard should be reported as zero (0) while their
disk space in blocks should be reported for the quota enabled volumes.

5.) Return the system to a state ready for use...

If you chose 3.0,A, then you will want to reverse the shutting down of
services and re-enable them, or you could try to just reboot.

If you chose 3.0,B, then you may wish to call sync:
# sync (and then reboot in multiuser mode.)

6.) Set up your user quota or group quotas with your favorite quota
editing tool. (sample: edquota)

simple examples...
(edit quota on user named mike)
# edquota -u mike
(edit quota on group named mike)
# edquota -g mike

7.) Go be a ruthless admin and imposed heavy quota restrictions on your
users and be sure to read plenty of BOFH. (To be very explicit, "I am
joking about the heavy restrictions, but not the reading of the BOFH.")

END)
Hope this helps someone "out there"

I will take the general content, and be placing it on a web page. It
should be located on http://mike.passwall.com/linux.quotas.html when I get
around to it. This way changes to fix my typos and inclusion of other
ideas can be added and make the document "living" as opposed to this
e-mail which is static and dead. (Links to other docs that discuss items
beyond this docs scope for example...)

-ME

-----BEGIN GEEK CODE BLOCK-----
Version: 3.12
GCS/CM$/IT$/LS$/S/O$ !d--(++) !s !a+++(-----) C++$(++++) U++++$(+$) P+$>+++
L+++$(++) E W+++$(+) N+ o K w+$>++>+++ O-@ M+$ V-$>- !PS !PE Y+ PGP++
t@-(++) 5+@ X@ R- tv- b++ DI+++ D+ G--@ e+>++>++++ h(++)>+ r*>? z?
------END GEEK CODE BLOCK------
decode: http://www.ebb.org/ungeek/ about: http://www.geekcode.com/geek.html