лимиты. limit. quota

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) Про­вер­ка.

Син­так­сис коман­ды следующий:

Опции могут быть следующими:

  • -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

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

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

 

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

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

Опции:

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

 

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

У этой коман­ды тоже есть опции команд­ной стро­ки, вот неко­то­рые из них:

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

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

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

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

Несколь­ко опций коман­ды edquota:

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

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

Отчет по кво­там на фай­ло­вой системе.

repquota -sa

созда­дим поль­зо­ва­те­ля и уста­но­вим для него кво­ту 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 отклю­ча­ет дан­ную опцию.