Thank you for reading this post, don't forget to subscribe!
Появилась задача: ограничить используемые ресурсы по пользователям. Соответственно, нужно было ограничить используемую память, процессорное время, размер файлов и прочее.
1) Предварительная настройка.
Для успешной работы нам будет нужна строка
session required pam_limits.so
в файле /etc/pam.d/login
2) Установка параметров.
После этого можно редактировать файл с ограничением. Для этого открываем редактируем файл /etc/security/limits.conf. Пример ниже:
@limit_users hard data 128144
@limit_users hard rss 128144
@limit_users hard memlock 128144
@limit_users hard as 128144
@limit_users hard nice 10
@limit_users hard maxlogins 2
@limit_users hard nproc 20
В данном примере для группы limit_users введены жёсткие ограничения. Можно указывать как группу так и отдельных пользователей. Формат таков:
группа/юзер лимит(жёсткий/мягкий) параметр значение.
soft limit
— значение может изменяться во время выполнения процесса;hard limit
— максимальное значение, которое не может быть превышено установкой значенияsoft limit
.
Описание параметров:
- core - размер core файлов (KB)
- data - максимальный размер данных (KB)
- fsize - максимальный размер файла (KB)
- memlock - максимальное заблокированное адресное пространство (KB)
- nofile - максимальное количество открытых файлов
- rss - максимальный размер памяти для резидент-программ (KB)
- stack - максимальный размер стэка (KB)
- cpu - максимальное процессорное время (MIN)
- nproc - максимальное количество процессов
- as - ограничение адресного пространства (KB)
- maxlogins - максимальное число одновременных регистраций в системе
- maxsyslogins - максимальное количество учётных записей
- priority - приоритет запущенных процессов
- locks - максимальное количество блокируемых файлов пользователем
- sigpending - максимальное количество сигналов, которые можно передать процессу
- msgqueue - максимальный размер памяти для очереди POSIX сообщений (bytes)
- nice - максимальный приоритет, который можно выставить: [-20, 19]
- rtprio - максимальный приоритет времени выполнения
- chroot - изменить директорию root'a (Debian-specific)
Вместо групп/юзера можно использовать групповой символ * (для всех) и групповой символ % для wildcast’a групп.
3) Проверка.
Синтаксис команды следующий:
1 2 |
ulimit [options [limit]] |
Опции могут быть следующими:
-a
— вывод текущих значений;-f
— лимит размера файлов которые, могут быть созданы командной оболочкой;-n
— лимит количества открытых файловых дескрипторов;-H
и-S
— Hard и Soft лимиты соответственно.
Параметры вступают в силу сразу после перелогина пользователя. Что бы посмотреть какие действуют ограничения, используем команду ulimit:
$ ulimit -aH
core file size (blocks, -c) 128144
data seg size (kbytes, -d) 128144
scheduling priority (-e) 10
file size (blocks, -f) 128144
pending signals (-i) 16000
max locked memory (kbytes, -l) 128144
max memory size (kbytes, -m) 128144
open files (-n) 50
pipe size (512 bytes, -p) 8
POSIX message queues (bytes, -q) 819200
real-time priority (-r) 0
stack size (kbytes, -s) 128144
cpu time (seconds, -t) 180
max user processes (-u) 20
virtual memory (kbytes, -v) 128144
file locks (-x) unlimited
Причём команду нужно запускать непосредственно под залогинившимся пользователем. Если зайти под другим пользователем и переключится на него через su, то будут показаны ограничения не текущего пользователя, а непосредственно того, под кем зашли на сервер.
Что бы применять ограничения на лету, нужно выполнить команду ulimit с указанием параметра и желаемого лимита. Пример:
$ulimit -d 256000
4) Дополнение.
Есть ещё одно средство для введения ограничений — cgroups. Разница между limits состоит в том, что limit ограничивает на каждый процесс отдельно, а cgroups — для контроля группы процессов(control groups).
5) Аналоги.
Для ограничения CPU можно использовать cpulimit
6) Проверка
Добавим ограничение для определённого пользователя mid
[root@centos64 ~]# grep mid /etc/security/limits.conf
@mid soft fsize 20
ограничения введены на максимальный размер файла - 20 кб
[mid@centos64 ~]$ ulimit -a
core file size (blocks, -c) 0
data seg size (kbytes, -d) 100
scheduling priority (-e) 0
file size (blocks, -f) 20
pending signals (-i) 8256
max locked memory (kbytes, -l) 64
max memory size (kbytes, -m) unlimited
open files (-n) 1024
pipe size (512 bytes, -p) 8
POSIX message queues (bytes, -q) 819200
real-time priority (-r) 0
stack size (kbytes, -s) 10240
cpu time (seconds, -t) unlimited
max user processes (-u) 1024
virtual memory (kbytes, -v) unlimited
file locks (-x) unlimited
[mid@centos64 ~]$ du -csh *
20K 1
20K 2
40K total
попытаемся увеличить размер файла, добавим содержимое 1 в 2:
[mid@centos64 ~]$ cat 1 >> 2
File size limit exceeded
_______________________________________________________
Quota
Квота — это ограничение на объем дискового пространства, который может использовать пользователь или группа пользователей
Управление квотами дискового пространства осуществляется под пользователем root. Существуют два вида квот: мягкие (soft quota) и жесткие (hard quota).
Мягкая квота определяет максимальный объем дискового пространства, разрешенный квотой. При превышении квоты пользователь получает сообщение о том, что квота превышена.
Жесткая квота определяет абсолютный максимальный объем дискового пространства, который пользователь не может превышать. Пользователю не разрешено будет занять больше дискового пространства, чем определено жесткой квотой.
Установка пакета
Перед началом работы с квотами нужно установить пакет quota
|
yum install quota
|
Настройка файловых систем на работу с квотами
Для файловой системы, для которой мы хотим включить управление квотами, нужно указать опции монтирования usrquota и grpquota для поддержки пользовательских и групповых квот соответственно. Эти параметры нужно указать в файле /etc/fstab, например, так:
1
|
/dev/sdb1 /mnt/storage ext3 defaults,usrquota,grpquota 0 0
|
После указания опций надо перемонтировать файловую систему:
1
|
mount /mnt/sdb1 -o remount
|
После этого в корне файловой системы нужно создать файлы aquota.user и aquota.group. Это файлы базы данных квот. Создать их можно следующей командой:
1
|
quotacheck -cuvgm /dev/sdb1
|
Опции:
-c, —create-files | Создать базу данных |
-u, —user | Проверить квоты для пользователей |
-g, —group | Проверить квоты для групп |
-v, —verbose | Выводить подробную информацию |
-a, —all | Проверить все не-NFS файловые системы |
После этого можно включить квоты
1
|
quotaon /dev/sdb1
|
У этой команды тоже есть опции командной строки, вот некоторые из них:
-a, —all | Включить квоты для всех файловых систем |
-f, —off | Выключить квоты |
-u, —user | Работать с пользовательскими квотами |
-g, —group | Работать с групповыми квотами |
-p, —print-state | Вывести информацию о квотах |
-v, —verbose | Выводить подробную информацию о работе |
После включения квот можно приступать к их настройке.
Управление квотами
Настройка лимитов квот (непосредственное управление квотами) производится при помощи команды edquota. Формат команды:
1
|
edquota [опции] [пользователь|группа]
|
Несколько опций команды edquota:
-u, —user | Редактировать пользовательские квоты |
-g, —group | Редактировать групповые квоты |
-r, —remote | Редактировать квоты на удаленной системе |
-f, —file-system=<файловая-система> | Редактировать квоты только на указанной файловой системе |
-t, —edit-period | Редактировать временные лимиты для мягких квот, которые указываются в единицах времени — минутах, секундах, и так далее |
После редактирования квот может потребоваться перезапустить сервис quota
1
|
service quota restart
|
Добавим пользователя следующие ограничения: пусть он не может использовать больше 1 мегабайта и может создать только 3 файла на файловой системе, смонтированной в /mnt/storage.
Выполним команду
1
|
edquota -u user1
|
В редакторе вы увидите следующее:
1
2
3
|
Disk quotas for user user1 (uid 1004):
Filesystem blocks soft hard inodes soft hard
/dev/sdb1000000
|
Выставим следующие значения для квот по пространству: soft — 768, hard — 1024, по inodes: soft — 2, hard — 3.
1
2
3
|
Disk quotas for user user1 (uid 1004):
Filesystem blocks soft hard inodes soft hard
/dev/sdb107681024023
|
И выйдем с сохранением. Теперь посмотрим, сохранились ли квоты. Залогинимся под пользователем user1 и перейдем в директорию /mnt/storage. Попробуем создать файл большого размера:
1
2
3
4
5
|
$ 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
|
Как видите, квота пользователя исчерпана. Посмотрим, что у нас есть на дисковой системе:
1
2
3
4
5
6
|
$ ls -l
total 1056
-rw------- 1 root root7168 Apr 23 16:03 aquota.group
-rw------- 1 root root7168 Apr 23 15:59 aquota.user
-rw-r--r-- 1 user1 user1 1044480 Apr 23 16:03 file.dat
drwx------ 2 root root16384 Apr 23 15:33 lost+found
|
Как видите, размер файла 1 мегабайт. Теперь надо проверить, работает ли ограничение на количество файлов. Удалим file.dat и попробуем создать четыре файла.
1
2
3
4
5
|
$ 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 мы не смогли создать, потому что сработало ограничение на количество файлов. Смотрим, какие файлы у нас есть:
1
2
3
4
5
6
7
8
|
$ ls -l
total 32
-rw------- 1 root root7168 Apr 23 16:07 aquota.group
-rw------- 1 root root7168 Apr 23 16:06 aquota.user
-rw-r--r-- 1 user1 user10 Apr 23 16:07 file1
-rw-r--r-- 1 user1 user10 Apr 23 16:07 file2
-rw-r--r-- 1 user1 user10 Apr 23 16:07 file3
drwx------ 2 root root16384 Apr 23 15:33 lost+found
|
Как видите, управление квотами работает.
Просмотреть установленные квоты можно при помощи команды quota. Вот несколько опций:
-u, —user | Вывод информации для пользователя |
-g, —group | Вывод информации для группы |
-v, —verbose | Вывод подробной информации |
-s, —human-readable | Вывод информации в удобном для чтения человеком виде |
-l, —local-only | Выводить информацию только по локальным файловым системам, то есть не выводить информацию о сетевых файловых системах |
посмотрим информацию для пользователя user1:
1
2
3
4
|
# quota -u user1
Disk quotas for user user1 (uid 1004):
Filesystem blocks quota limit grace files quota limit grace
/dev/sdb1076810243*236days
|
По поводу просмотра квот есть одно замечание. Они могут не отображаться сразу после создания, пока пользователь не создал ни одного файла.
Также можно воспользоваться командой repquota для просмотра квот, которые в данный момент присутствуют в системе.
1
2
3
4
5
6
7
8
|
# 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--2000200
user1-+076810243236days
|
У команды repquota также есть дополнительные опции командной строки.
Редактирование периода отсрочки
edquota -t
Во время "grace period" система будет лишь предупреждать тех пользователей у которых установлен "soft limit", но не ограничивать их. Могут быть использованы секунды, минуты, часы, дни, недели и месяцы (seconds, minutes, hours, days, weeks, months).
Значение 0 отключает данную опцию.
В случаях, когда файловая система не была размонтирована корректно, необходимо выполнить команду quotacheck, ее можно запускать регулярно, даже если сбоя не было. Периодический запуск команды позволяет поддерживать точность квот.
1
|
#quotacheck -avumf |
для отдельного раздела
1
|
#quotacheck -vumf /home |
Более точную статистику по квотам можно получить, когда анализируемая файловая система не сильно загружена. Поэтому стоит назначать запуск задания cron во время, когда файловая система (системы) используется меньше всего.
1
2
|
#nano /etc/crontab 00 2 * * * root /sbin/quotacheck -avumf |
Отчет по квотам на файловой системе.
repquota -sa
_______________________________
Примеры:
ставим:
yum install quota
[root@centos64 ~]# df -h
Filesystem Size Used Avail Use% Mounted on
/dev/mapper/vg_centos64-lv_root
6.5G 1.8G 4.4G 29% /
tmpfs 939M 0 939M 0% /dev/shm
/dev/sda1 477M 28M 425M 7% /boot
редактируем
[root@centos64 ~]# nano /etc/fstab
добавляем usrquota,grquota
[root@centos64 ~]# grep /dev/mapper/vg_centos64-lv_root /etc/fstab
/dev/mapper/vg_centos64-lv_root / ext4 defaults,usrquota,grquota 1 1
отмонтирование файловой системы и проверка квоты на нашей системе.
[root@centos64 ~]# mount /dev/mapper/vg_centos64-lv_root -o remount
[root@centos64 ~]# quotacheck -cuvgm /dev/mapper/vg_centos64-lv_root
quotacheck: Your kernel probably supports journaled quota but you are not using it. Consider switching to journaled quota to avoid running quotacheck after an unclean shutdown.
quotacheck: Scanning /dev/mapper/vg_centos64-lv_root [/] done
quotacheck: Cannot stat old user quota file //aquota.user: No such file or directory. Usage will not be substracted.
quotacheck: Cannot stat old group quota file //aquota.group: No such file or directory. Usage will not be substracted.
quotacheck: Cannot stat old user quota file //aquota.user: No such file or directory. Usage will not be substracted.
quotacheck: Cannot stat old group quota file //aquota.group: No such file or directory. Usage will not be substracted.
quotacheck: Checked 4993 directories and 42294 files
quotacheck: Old file not found.
quotacheck: Old file not found.
[root@centos64 ~]# quotaon /dev/mapper/vg_centos64-lv_root
Отчет по квоте для всех пользователей и группы:
[root@centos64 ~]# repquota -as
*** Report for user quotas on device /dev/mapper/vg_centos64-lv_root
Block grace time: 7days; Inode grace time: 7days
Block limits File limits
User used soft hard grace used soft hard grace
----------------------------------------------------------------------
root -- 1677M 0 0 40644 0 0
ftp -- 4 0 0 1 0 0
vcsa -- 8 0 0 1 0 0
postfix -- 60 0 0 38 0 0
apache -- 12 0 0 3 0 0
nginx -- 20 0 0 7 0 0
mysql -- 29972 0 0 101 0 0
pma -- 53316 0 0 2831 0 0
#507 -- 27968 0 0 32 0 0
#1000 -- 88 0 0 17 0 0
создадим пользователя и установим для него квоту 40Мб
[root@centos64 ~]# adduser mid
[root@centos64 ~]# setquota -u mid 0 40000 0 0 /
1.block soft limit = 0
2.block hard limit = 40000byte
3.inodes soft limit = 0
4.inodes hard limit = 0
или вручную поправим файл:
[root@centos64 ~]# edquota mid
Disk quotas for user mid (uid 501):
Filesystem blocks soft hard inodes soft hard
/dev/mapper/vg_centos64-lv_root 16 0 40000 5 0 0
blocks: Количество блоков - занятое место пользователем в блоках длиной 1kB.
inodes: Количество инодов - файлов/каталогов пользователя.
soft: Максимальное количество blocks/inodes, которое пользователь может иметь. Если используется период отсрочки "grace period", то вместо жесткого ограничения, пользователь, превысивший данный лимит, получит лишь сообщение об этом, по прошествии "grace period" пользователь не сможет писать на диск пока использованное пространство не будет меньше данного лимита.
Значение 0 отключает данную опцию.
hard: Максимальное количество blocks/inodes, которое пользователь может иметь. Это жесткое ограничение, пользователь не может его превысить.
Значение 0 отключает данную опцию.