RFC (Request for Comments, Запрос на комментарии) - серия документов, публикуемая сообществом исследователей и разработчиков, руководствующихся практическими интересами, в которой описывается набор протоколов и обобщается опыт функционирования Интернет.
В FreeBSD 9.0 появился новый механизм управления доступом к ресурсам системы — демон racctd. Для управления существует утилита rctl. По умолчанию механизм выключен, для активации необходимо добавить в конфигурационный файл ядра следующие стрроки:
options RACCT
options RCTL
После пересборки и загрузки с новым ядром запускается демон racctd. Управляющая им утилита rctl позволяет просмотреть список правил (все или с фильтрами)., очистить правила, добавить новое правило. Синтаксис правила имеет вид:
subject:subject-id:resource:action=amount/per
subject — субъект правила, может быть:
process,
user,
loginclass,
jail.
subject-id — идентификатор субъекта:
имя пользователя либо его ID в системе,
имя класса,
имя jail.
resource — тип контролируемого ресурса, может быть:
cputime — время CPU в секундах (толку от этого ресурса мягко говоря не много, поскольку доступен только для чтения, например, в контексте «добавить в лог запись, если пользователь занял более 2 секунд процессорного времени),
datasize — используемые данные, в байтах, причем какие именно данные известно одному разработчику,
stacksize — размер стека в байтах, как правило равен 0
coredumpsize — размер файла дампа в байтах, если установка в 1 байт реально запрещает приложениям создавать дампы, то это замечательно, но стоило ли ради этого писать целый racctd,
memoryuse — количество используемой памяти в байтах, это более-менее соответствует истине,
memorylocked — количество блокируемой памяти в байтах, как правило для пользовательских процессов равно 0,
maxproc- количество процессов — единственный полезный ресурс, ограничение реально работает
openfiles — размер таблицы файловых дескрипторов, кстати тоже преимущественно 0, отдаленно напоминает ужасные квоты, но там оно хотя бы работало,
vmemoryuse — количество виртуальной памяти в байтах, сомнительно, что имеет смысл ограничивать,
pseudoterminals количество псевдотерминалов PTYs, что является терминалом в контексте автора непонятно, обычные логины в консолях псевдотерминалами с точки зрения racctd не являются,
swapuse — размер файла подкачки в байтах, тоже сомнительный ресурс, даже несмотря на тот факт, что при исчерпании резервированного файла подкачки FreeBSD становиться неуправляемой,
nthr — количество потоков, как правило совпадает в количеством процессов,
msgqqueued — количество очередей SysV сообщений,
msgqsize — размер сообщения SysV в очереди в байтах,
nmsgq — количество сообщений SysV в очереди ,
nsem — количество SysV семафоров,
nsemop — количество SysV семафоров semaphores, преобразуемых в один semop вызов
nshm — количество SysV общих сегментов памяти
shmsize — размер SysV общего сегмента памяти в байтах,
wallclock в секундах.
action — определячет действие при выполнения условия правила, может быть:
deny - запрет выделения ресурса, неприменимо для ресурсов cpu и wallclock,
log — вывод сообщения в консоль (и в файл лога по умолчанию),
devctl — отправка сообщения для devd,
sig* или sigterm — послать сигнал превысившему ограничение процессу.
Указывать /per можно при описании класса пользователей, например:
loginclass:customrs:memoryuse:deny=200m/user
В случае ограничения конкретного пользователя:
user:joe: maxproc:deny=25
Если нужно только фиксировать превышение, необходимо действие log
user:joe: datasize:log=26m
Тогда при превышении лимита в файле лога появится сообщение вида
Jan 16 12:22:59 test kernel: rctl: rule "user:1001:datasize:log=27262976" matched by pid 1770 (ubench), uid 1001, jail 0
При одновременном наличии правил log и deny первым срабатывает запрет и запись в логе не появляется, хотя при просмотре правил логирование раньше