Если постоянно не контролировать свободное пространство на дисках сервера, то рано или поздно диски переполнятся. В результате перестанут работать сервисы, и даже может получиться так, что вы не сможете подключиться к консоли сервера через SSH.
Конечно, стандартные шаблоны мониторинга Zabbix для операционных систем содержат триггеры, которые сработают при опасном уменьшении свободного пространства на диске.
Однако на серверах лучше ограничивать использование файловой системы для пользователей с помощью дисковых квот. Это предотвратит переполнение всего диска, если один из пользователей запишет на диск слишком много файлов. Такая ситуация бывает, например, на серверах хостинга интернет-магазинов, импортирующих крупные каталоги товаров.
В этой статье мы расскажем про настройку квот файловой системы Linux, а также про то, как организован мониторинг квот на хостинговых серверах SAAS-сервиса интернет-магазинов.
Настройка квот файловой системы на сервере
Проще всего настроить использование квот, если на сервере установлена какая-нибудь панель управления, например ISPmanager или Hestia Control Panel. Если же никакая панель не используется, можно настроить квоты вручную.
Настройка через панель управления ISPmanager
Если на вашем сервере установлена панель управления ISPmanager, то для включение дисковых квот достаточно установить флажок Дисковые квоты на странице Конфигурация ПО, доступную в меню Настройки (рис. 1).
Возможно, вам будет полезна документация разработчика панели по настройке квот.
Настройка через панель управления Hestia Control Panel
В бесплатной панели управления Hestia Control Panel для включения квот нужно использовать плагин File System Disk Quota. Чтобы его включить, щелкните значок шестеренки справа вверху, затем щелкните кнопку Configure и раскройте блок Plugins (рис. 2).
Убедитесь, что в меню File System Disk Quota выбрана строка Yes.
Чтобы задавать различные квоты для разных пользователей, нужно создать необходимое количество пакетов (Package), указав в них нужные значения квот.
Для добавления пакета откройте список пользователей при помощи кнопки USERS, щелкните кнопку Packages, а затем — кнопку Add Package.
При добавлении пакета укажите нужное значение квоты в поле Quota (рис. 3).
Далее щелкните кнопку Save для сохранения изменений.
Настройка вручную для Debian
Прежде всего, обновите пакеты и установите пакет quota:
# apt update
# apt install quota
Проверьте версию установленного пакета:
# quota --version
Quota utilities version 4.06.
…
Далее отредактируйте файл /etc/fstab при помощи любого текстового редактора, например vim:
# vim /etc/fstab
Найдите в этом файле строку раздела /, для которого нужно добавить квоты:
# <file system> <mount point> <type> <options> <dump> <pass>
/dev/vda3 / ext4 errors=remount-ro 0 1
/dev/vda2 /boot ext2 defaults 0 2
Затем добавьте «,usrquota,grpquota» без пробела, как это показано ниже:
/dev/vda3 / ext4 errors=remount-ro,usrquota,grpquota 0 1
/dev/vda2 /boot ext2 defaults 0 2
Сохраните файл /etc/fstab
и перемонтируйте файловую систему:
# mount -o remount /
Убедитесь, что при монтировании файловой системы добавились нужные нам опции:
~# cat /proc/mounts | grep ' / '
/dev/vda3 / ext4 rw,relatime,quota,usrquota,grpquota,errors=remount-ro 0 0
Далее запустите команду quotacheck
, которая создаст файлы /aquota.user
и /aquota.group
, предназначенные для хранения информации об ограничениях и использовании файловой системы:
# quotacheck -ugm /
Проверьте, что файлы создались:
# ls -lh / | grep aquota
-rw------- 1 root root 6.0K Aug 4 15:12 aquota.group
-rw------- 1 root root 6.0K Aug 4 15:12 aquota.user
Если все хорошо, включите квоты:
# quotaon -v /
/dev/vda3 [/]: group quotas turned on
/dev/vda3 [/]: user quotas turned on
Чтобы установить квоты, например, для пользователя quotausr, введите такую команду:
# setquota -u quotausr 100M 120M 0 0 /
Эта команда установит для пользователя quotausr квоту 100 Мбайт и лимит 120 Мбайт.
Проверьте, что квота и лимит были установлены:
# quota -vs quotausr
Disk quotas for user quotausr (uid 1000):
Filesystem space quota limit grace files quota limit grace
/dev/vda3 16K 100M 120M 4 0 0
Более подробное руководство по настройке квот вы найдете здесь.
Настройка журналируемых квот
При включении квот командой quotaon на консоли может появиться следующее сообщение:
quotaon: Your kernel probably supports ext4 quota feature but you are using external quota files. Please switch your filesystem to use ext4 quota feature as external quota files on ext4 are deprecated.
Оно говорит, что вам нужно настроить так называемые журналируемые квоты. Они хороши тем, что после аварийного завершения работы ОС не нужно запускать проверку квот вручную.
Для настройки журналируемых квот добавьте в файл /etc/fstab
строку (без пробелов) «,usrjquota=aquota.user,grpjquota=aquota.group,jqfmt=vfsv0»:
/dev/vda3 / ext4 errors=remount-ro,usrjquota=aquota.user,grpjquota=aquota.group,jqfmt=vfsv0 0 1
/dev/vda2 /boot ext2 defaults 0 2
Если ранее были созданы файлы /aquota.user
и /aquota.group
, удалите их:
# rm /aquota.user
# rm /aquota.group
Перемонтируйте корневой раздел и запустите проверку квот::
# mount -o remount /
# quotacheck -avugm
При первом запуске вы получите предупреждающие сообщения, которые можно игнорировать:
quotacheck: Your kernel probably supports ext4 quota feature but you are using external quota files. Please switch your filesystem to use ext4 quota feature as external quota files on ext4 are deprecated.
quotacheck: Scanning /dev/vda3 [/] done
quotacheck: Cannot stat old user quota file //aquota.user: No such file or directory. Usage will not be subtracted.
quotacheck: Cannot stat old group quota file //aquota.group: No such file or directory. Usage will not be subtracted.
quotacheck: Cannot stat old user quota file //aquota.user: No such file or directory. Usage will not be subtracted.
quotacheck: Cannot stat old group quota file //aquota.group: No such file or directory. Usage will not be subtracted.
quotacheck: Checked 5029 directories and 42224 files
quotacheck: Old file not found.
quotacheck: Old file not found.
Далее включите квоты:
# quotaon -avug
quotaon: Your kernel probably supports ext4 quota feature but you are using external quota files. Please switch your filesystem to use ext4 quota feature as external quota files on ext4 are deprecated.
Опять игнорируйте предупреждающие сообщения, но убедитесь, что квоты включены:
/dev/vda3 [/]: group quotas turned on
/dev/vda3 [/]: user quotas turned on
Далее, как и при работе с обычными квотами, установите квоты для пользователя и проверьте, что они успешно установились:
# setquota -u quotausr 100M 120M 0 0 /
# quota -vs quotausr
Disk quotas for user quotausr (uid 1000):
Filesystem space quota limit grace files quota limit grace
/dev/vda3 16K 100M 120M 4 0 0
Вы можете также обратиться к следующей инструкции.
Однако не создавайте вручную файлы /aquota.user
и /aquota.group
, как там рекомендуется. Эти файлы будут созданы автоматически командой quotacheck
.
Ручная проверка использования квот
Чтобы проверить использование квот вручную, используйте команду repquota
:
# repquota -s /
*** Report for user quotas on device /dev/vda3
Block grace time: 7days; Inode grace time: 7days
Space limits File limits
User used soft hard grace used soft hard grace
----------------------------------------------------------------------
root -- 1496M 0K 0K 44653 0 0
man -- 1688K 0K 0K 160 0 0
_apt -- 12K 0K 0K 3 0 0
ntp -- 12K 0K 0K 3 0 0
zabbix -- 72K 0K 0K 8 0 0
quotausr -- 16K 100M 120M 4 0 0
Параметр -s указывает программе включить в отчет использованное дисковое пространство, а также количество индексных узлов inode. Второй параметр указывает файловую систему, для которой нужно проверить использование квот.
Обратите внимание, что здесь выводятся значения для так называемой мягкой (soft) и жесткой (hard) квот.
Если будет превышено значение мягкой квоты, пользователь получит предупреждающе сообщение. Что же касается жесткой квоты, то ее значение пользователь превысить не сможет — сработает ограничение.
Команда repquota
с параметрами -v и -g показывают все квоты, в том числе для групп, даже если квоты не используются:
# repquota -v -g /
*** Report for group quotas on device /dev/vda3
Block grace time: 7days; Inode grace time: 7days
Block limits File limits
Group used soft hard grace used soft hard grace
----------------------------------------------------------------------
root -- 1493712 0 0 44605 0 0
adm -- 2600 0 0 26 0 0
tty -- 76 0 0 3 0 0
mail -- 28 0 0 2 0 0
man -- 1688 0 0 160 0 0
shadow -- 168 0 0 7 0 0
utmp -- 1828 0 0 4 0 0
staff -- 8 0 0 2 0 0
systemd-journal -- 32780 0 0 3 0 0
crontab -- 48 0 0 2 0 0
messagebus -- 52 0 0 1 0 0
ssh -- 348 0 0 1 0 0
ntp -- 12 0 0 3 0 0
zabbix -- 72 0 0 8 0 0
quotausr -- 16 0 0 4 0 0
Statistics:
Total blocks: 7
Data blocks: 1
Entries: 15
Used average: 15.000000
Если добавить параметр -p, то команда repquota
будет показывать период времени grace, в течение которого система будет предупреждать пользователя о переполнении квоты, но не ограничивать его:
# repquota -c -v -p -g /
*** Report for group quotas on device /dev/vda3
Block grace time: 7days; Inode grace time: 7days
Block limits File limits
Group used soft hard grace used soft hard grace
----------------------------------------------------------------------
root -- 1493712 0 0 0 44605 0 0 0
adm -- 2608 0 0 0 26 0 0 0
tty -- 76 0 0 0 3 0 0 0
mail -- 28 0 0 0 2 0 0 0
man -- 1688 0 0 0 160 0 0 0
shadow -- 168 0 0 0 7 0 0 0
utmp -- 1832 0 0 0 4 0 0 0
staff -- 8 0 0 0 2 0 0 0
systemd-journal -- 32780 0 0 0 3 0 0 0
crontab -- 48 0 0 0 2 0 0 0
messagebus -- 52 0 0 0 1 0 0 0
ssh -- 348 0 0 0 1 0 0 0
ntp -- 12 0 0 0 3 0 0 0
zabbix -- 72 0 0 0 8 0 0 0
quotausr -- 16 0 0 0 4 0 0 0
Statistics:
Total blocks: 7
Data blocks: 1
Entries: 15
Used average: 15.000000
Параметр -c включит кэширование. Более подробное описание параметров программы repquota можно найти здесь.
Программа для мониторинга квот check_quota.pl с помощью Zabbix
Чтобы автоматически контролировать использование дисковых квот с помощью Zabbix, мы подготовили программу check_quota.pl.
Эта программа не пытается отслеживать квоты для каждого пользователя. Вместо этого она получает общий список квот и определяет максимальное использование квоты в процентах по всей файловой системе.
Предполагается, что если какой-либо пользователь приблизился к переполнению жесткой квоты, то системный администратор получает сообщение об этом от Zabbix. Далее он вручную с помощью панели ISPmanager проверяет "провинившегося" пользователя и увеличивает ему квоту, чтобы сайт продолжил свою работу.
Если оказалось, что какой-либо сайт интернет-магазина стал занимать слишком много места на диске сервера, то нужно решить, повышать ли ему тариф за использование дискового пространства или попросить клиента удалить ненужную информацию. Возможно, придется перенести сайт на другой сервер.
Практика показала, что этот способ вполне себя оправдывает. Автоматическая обработка переполнения квоты едва ли возможна, так как необходимо обсуждение возникшей ситуации с клиентом.
Инициализация программы check_quota.pl
В процессе инициализации программа check_quota.pl
получает параметры командной строки, определяет версию ОС (Linux или FreeBSD), пути для запуска утилит zabbix_sender
и repquota
, а также задает параметры запуска для repquota
:
my $zabbix_server_ip = $ARGV[0];
my $hostname = $ARGV[1];
if($ARGV[2] eq 'debug') { $debug = 1; } else { $debug = 0; }
if($^O eq 'linux')
{
$zabbix_sender = '/usr/bin/zabbix_sender';
$bin_repquota = '/usr/sbin/repquota';
$cmd = "$bin_repquota -c -v -p -g /";
}
elsif($^O eq 'freebsd')
{
$zabbix_sender = '/usr/local/bin/zabbix_sender';
$bin_repquota = '/usr/sbin/repquota';
$cmd = "$bin_repquota -v -g /";
}
else
{
print "\nUnsupported OS: $^O";
}
Получение информации об использовании квот
Для получения информации об использовании квот программа запускает утилиту repquota
:
my @rqout = ();
@rqout = split /\n/, `$cmd`;
Результаты обрабатываются в цикле:
my $max_quota_use=0;
foreach my $line (@rqout)
{
my @dat = split /\s+/, $line;
next if (($#dat < 9) or ($dat[4] !~ /^\d+/));
my ($quotaname, $quota_status, $quota_inuse, $quota_softlimit, $quota_hardlimit,$quota_grace) = ( $dat[0], $dat[1], $dat[2], $dat[3], $dat[4], $dat[5] );
if ($quotaname =~ /#/)
{
$quotaname =~ s/#//g;
$quotaname = "${quotaname}";
}
my $quotaname_perfdata = $quotaname; $quotaname_perfdata =~ s/^uid /uid/g;
my $percent;
if ($quota_hardlimit != 0)
{
$percent = int(($quota_inuse * 100) / $quota_hardlimit);
}
else
{
$percent=0;
}
if($percent != 0)
{
if($max_quota_use < $percent) { $max_quota_use = $percent; }
}
}
Максимальное значение использованной квоты, выраженной в процентах, сохраняется в переменной max_quota_use
.
Отправка результатов на серверы Zabbix
Чтобы отправить результат, а именно максимальное значение использованной квоты на серверы Zabbix, программа запускает в цикле утилиту zabbix_sender
:
my $zabbix_item_key = 'quota.key';
my @zabbix_server_ip_array = split(',', $zabbix_server_ip);
foreach my $server_ip (@zabbix_server_ip_array)
{
my $trap_cmd = $zabbix_sender.' -vv -z '.$server_ip.' -s "'.$hostname.'" -k '.$zabbix_item_key.' -o '.$max_quota_use;
my @trapout = ();
@trapout = split /\n/, `$trap_cmd`;
}
Отправка выполняется на серверы, адреса IP которых были заданы в командной строке при запуске программы.
Задание crontab для запуска программы check_quota.pl
Программу check_quota.pl нужно запускать периодически как задание crontab с правами пользователя root:
*/11 * * * * /usr/bin/perl /home/frolov/zabbix_quota/check_quota.pl [Zabbix_IP_1], [Zabbix_IP_2] [Hostname
Здесь программа запускается каждые 11 минут. Вы, конечно, можете задать другой график запуска программы в зависимости от ваших потребностей.
В качестве параметров программе передается список адресов IP серверов Zabbix, разделенных запятой, а также имя хоста, как оно определено на серверах Zabbix.
Шаблон для Zabbix
Для программы check_quota.pl мы подготовили шаблон, который можно загрузить по этому адресу.
В шаблоне определен один ключ quota.key (рис. 4).
Также в этом шаблоне определены два триггера (рис. 5).
Первый из этих триггеров срабатывает, когда максимальное использование квоты достигло 90% или более. Этот триггер отмечен как серьезный (High), так как переполнение квоты требует срочного вмешательства системного администратора.
Второй триггер срабатывает, если данные о текущем использовании квот не поступают полтора часа или дольше. Как правило, такое бывает при неправильной настройке задания crontab или при наличии других ошибок в настройке сервера. Здесь важность не так велика (Warning), и системный администратор может действовать в плановом, а не срочном порядке.
Автор: Александр Фролов.
НЛО прилетело и оставило здесь промокод для читателей нашего блога:
— 15% на все тарифы VDS (кроме тарифа Прогрев) — HABRFIRSTVDS.
vasilisc
Следует знать и признать, чтобы такого не случилось в современных Linux дистрибутивах резервируется по умолчанию 5% пространства. Обычные пользователи и службы, работающие от своих системных учётных записей, НЕ могут переполнить дисковое пространство так, чтобы система поломалась.
Посмотреть текущее количество зарезервированных блоков
Root может указать в процентах другое значение
AlexandreFrolov
Спасибо за комментарий!
Это хорошо что есть защита от полной поломки системы.
Тут еще такой момент, что надо контролировать пространство, которое используют магазины на предмет соответствия тарифам. Если выделенное им пространство занято более чем на 90%, срабатывает триггер и надо разбираться, что делать.
Кроме того, если это пространство переполнится, то интернет-магазин перестанет правильно работать (загрузки, например, перестанут работать и публикации), и такую ситуацию важно вовремя отловить.
Также без общего контроля квот одни магазины смогут отобрать место у других, полностью заполнив диск своими данными. Когда магазинов сотни, а серверов - десятки, не обойтись без автоматического отслеживания.
vasilisc
Полностью согласен! У нас с коллегами тоже девиз - всё что можно на контроль Zabbix поставить и мониторить его элементами и получать события от триггеров.