Linux: управление квотами дискового пространства

В случаях использования большим количеством пользователей одной системы достаточно часто возникает вопрос, как же организовать в Linux управление квотами. Квота - это ограничение на объем дискового пространства, который может использовать пользователь или группа пользователей. Такая потребность может возникнуть, например, при организации файлового хранилища организации или при организации shared-хостинга. В операционных системах на базе ядра Linux такие ограничения реализуются достаточно просто.

Управление квотами дискового пространства осуществляется под пользователем root. Существуют два вида квот: мягкие (soft quota) и жесткие (hard quota).

Мягкая квота определяет максимальный объем дискового пространства, разрешенный квотой. При превышении квоты пользователь получает сообщение о том, что квота превышена.

Жесткая квота определяет абсолютный максимальный объем дискового пространства, который пользователь не может превышать. Пользователю не разрешено будет занять больше дискового пространства, чем определено жесткой квотой.

Установка пакета

Перед началом работы с квотами нужно установить пакет quota

apt-get install quota

Настройка файловых систем на работу с квотами

Для файловой системы, для которой мы хотим включить управление квотами, нужно указать опции монтирования usrquota и grpquota для поддержки пользовательских и групповых квот соответственно. Эти параметры нужно указать в файле /etc/fstab, например, так:

/dev/sdb1    /mnt/storage    ext3    defaults,usrquota,grpquota    0 0

После указания опций надо перемонтировать файловую систему:

mount /mnt/sdb1 -o remount

После этого в корне файловой системы нужно создать файлы aquota.user и aquota.group. Это файлы базы данных квот. Создать их можно следующей командой:

quotacheck -cuvg /dev/sdb1

Опции: | | | |-|-| |-c, –create-files|Создать базу данных| |-u, –user|Проверить квоты для пользователей| |-g, –group|Проверить квоты для групп| |-v, –verbose|Выводить подробную информацию| |-a, –all|Проверить все не-NFS файловые системы|

После этого можно включить квоты

quotaon /dev/sdb1

У этой команды тоже есть опции командной строки, вот некоторые из них: | | | |-|-| |-a, –all|Включить квоты для всех файловых систем| |-f, –off|Выключить квоты| |-u, –user|Работать с пользовательскими квотами| |-g, –group|Работать с групповыми квотами| |-p, –print-state|Вывести информацию о квотах| |-v, –verbose|Выводить подробную информацию о работе|

После включения квот можно приступать к их настройке.

Управление квотами

Настройка лимитов квот (непосредственное управление квотами) производится при помощи команды edquota. Формат команды:

edquota [опции] [пользователь|группа]

Несколько опций команды edquota: | | | |-|-| |-u, –user|Редактировать пользовательские квоты| |-g, –group|Редактировать групповые квоты| |-r, –remote|Редактировать квоты на удаленной системе| |-f, –file-system=<файловая-система>|Редактировать квоты только на указанной файловой системе| |-t, --edit-period|Редактировать временные лимиты для мягких квот, которые указываются в единицах времени — минутах, секундах, и так далее|

После редактирования квот может потребоваться перезапустить сервис quota

service quota restart

Теперь давайте создадим пользователя и настроим для него квоты

# adduser user1
Adding user `user1' ...
Adding new group `user1' (1003) ...
Adding new user `user1' (1004) with group `user1' ...
Creating home directory `/home/user1' ...
Copying files from `/etc/skel' ...
Enter new UNIX password: 
Retype new UNIX password: 
passwd: password updated successfully
Changing the user information for user1
Enter the new value, or press ENTER for the default
        Full Name []: 
        Room Number []: 
        Work Phone []: 
        Home Phone []: 
        Other []: 
Is the information correct? [Y/n] 
#

Пользователь создан. Добавим для него следующие ограничения: пусть он не может использовать больше 1 мегабайта и может создать только 3 файла на файловой системе, смонтированной в /mnt/storage.

Выполним команду

edquota -u user1

В редакторе вы увидите следующее:

Disk quotas for user user1 (uid 1004):
  Filesystem    blocks       soft       hard     inodes     soft     hard
  /dev/sdb1          0          0          0          0        0        0

Выставим следующие значения для квот по пространству: soft - 768, hard - 1024, по inodes: soft - 2, hard - 3.

Disk quotas for user user1 (uid 1004):
  Filesystem    blocks       soft       hard     inodes     soft     hard
  /dev/sdb1          0        768       1024          0        2        3

И выйдем с сохранением. Теперь посмотрим, сохранились ли квоты. Залогинимся под пользователем user1 и перейдем в директорию /mnt/storage. Попробуем создать файл большого размера:

$ cd /mnt/storage
$ cat /dev/urandom > file.dat
sdb1: warning, user block quota exceeded.
sdb1: write failed, user block limit reached.
cat: write error: Disk quota exceeded

Как видите, квота пользователя исчерпана. Посмотрим, что у нас есть на дисковой системе:

$ ls -l
total 1056
-rw------- 1 root  root     7168 Apr 23 16:03 aquota.group
-rw------- 1 root  root     7168 Apr 23 15:59 aquota.user
-rw-r--r-- 1 user1 user1 1044480 Apr 23 16:03 file.dat
drwx------ 2 root  root    16384 Apr 23 15:33 lost+found

Как видите, размер файла 1 мегабайт. Теперь надо проверить, работает ли ограничение на количество файлов. Удалим file.dat и попробуем создать четыре файла.

$ rm file.dat
$ touch file1 file2 file3 file4
sdb1: warning, user file quota exceeded.
sdb1: write failed, user file limit reached.
touch: cannot touch `file4': Disk quota exceeded

Файл file4 мы не смогли создать, потому что сработало ограничение на количество файлов. Смотрим, какие файлы у нас есть:

$ ls -l
total 32
-rw------- 1 root  root   7168 Apr 23 16:07 aquota.group
-rw------- 1 root  root   7168 Apr 23 16:06 aquota.user
-rw-r--r-- 1 user1 user1     0 Apr 23 16:07 file1
-rw-r--r-- 1 user1 user1     0 Apr 23 16:07 file2
-rw-r--r-- 1 user1 user1     0 Apr 23 16:07 file3
drwx------ 2 root  root  16384 Apr 23 15:33 lost+found

Как видите, управление квотами работает.

Просмотреть установленные квоты можно при помощи команды quota. Вот несколько опций: |-u, –user|Вывод информации для пользователя| |-g, –group|Вывод информации для группы| |-v, –verbose|Вывод подробной информации| |-s, –human-readable|Вывод информации в удобном для чтения человеком виде| |-l, –local-only|Выводить информацию только по локальным файловым системам, то есть не выводить информацию о сетевых файловых системах|

Давайте посмотрим информацию для пользователя user1:

# quota -u user1
Disk quotas for user user1 (uid 1004): 
     Filesystem  blocks   quota   limit   grace   files   quota   limit   grace
      /dev/sdb1       0     768    1024               3*      2       3   6days

По поводу просмотра квот есть одно замечание. Они могут не отображаться сразу после создания, пока пользователь не создал ни одного файла.

Также можно воспользоваться командой repquota для просмотра квот, которые в данный момент присутствуют в системе.

# repquota -a
*** Report for user quotas on device /dev/sdb1
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       
user1     -+       0     768    1024              3     2     3  6days

У команды repquota также есть дополнительные опции командной строки.

Licensed under GPL v2

Repo link: https://github.com/mnorin/mnorin.github.io