Если постоянно не контролировать свободное пространство на дисках сервера, то рано или поздно диски переполнятся. В результате перестанут работать сервисы, и даже может получиться так, что вы не сможете подключиться к консоли сервера через SSH.

Конечно, стандартные шаблоны мониторинга Zabbix для операционных систем содержат триггеры, которые сработают при опасном уменьшении свободного пространства на диске. 

Однако на серверах лучше ограничивать использование файловой системы для пользователей с помощью дисковых квот. Это предотвратит переполнение всего диска, если один из пользователей запишет на диск слишком много файлов. Такая ситуация бывает, например, на серверах хостинга интернет-магазинов, импортирующих крупные каталоги товаров.

В этой статье мы расскажем про настройку квот файловой системы Linux, а также про то, как организован мониторинг квот на хостинговых серверах SAAS-сервиса интернет-магазинов.

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

Проще всего настроить использование квот, если на сервере установлена какая-нибудь панель управления, например ISPmanager или Hestia Control Panel. Если же никакая панель не используется, можно настроить квоты вручную.

Настройка через панель управления ISPmanager

Если на вашем сервере установлена панель управления ISPmanager, то для включение дисковых квот достаточно установить флажок Дисковые квоты на странице Конфигурация ПО, доступную в меню Настройки (рис. 1).

Рис. 1. Включение дисковых квот в панели ISPmanager
Рис. 1. Включение дисковых квот в панели ISPmanager

Возможно, вам будет полезна документация разработчика панели по настройке квот.

Настройка через панель управления Hestia Control Panel

В бесплатной панели управления Hestia Control Panel для включения квот нужно использовать плагин File System Disk Quota. Чтобы его включить, щелкните значок шестеренки справа вверху, затем щелкните кнопку Configure и раскройте блок Plugins (рис. 2).

Рис. 2. Блок Plugins в панели Hestia Control Panel
Рис. 2. Блок Plugins в панели Hestia Control Panel

Убедитесь, что в меню File System Disk Quota выбрана строка Yes.

Чтобы задавать различные квоты для разных пользователей, нужно создать необходимое количество пакетов (Package), указав в них нужные значения квот.

Для добавления пакета откройте список пользователей при помощи кнопки USERS, щелкните кнопку Packages, а затем — кнопку Add Package.

При добавлении пакета укажите нужное значение квоты в поле Quota (рис. 3).

Рис. 3. Указание квоты в пакете панели Hestia Control Panel
Рис. 3. Указание квоты в пакете панели Hestia Control Panel

Далее щелкните кнопку 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).

Рис. 4. Ключ quota.key
Рис. 4. Ключ quota.key

Также в этом шаблоне определены два триггера (рис. 5).

Рис. 5. Триггеры в шаблоне программы check_quota.pl
Рис. 5. Триггеры в шаблоне программы check_quota.pl

Первый из этих триггеров срабатывает, когда максимальное использование квоты достигло 90% или более. Этот триггер отмечен как серьезный (High), так как переполнение квоты требует срочного вмешательства системного администратора.

Второй триггер срабатывает, если данные о текущем использовании квот не поступают полтора часа или дольше. Как правило, такое бывает при неправильной настройке задания crontab или при наличии других ошибок в настройке сервера. Здесь важность не так велика (Warning), и системный администратор может действовать в плановом, а не срочном порядке. 

Автор: Александр Фролов.


НЛО прилетело и оставило здесь промокод для читателей нашего блога:

— 15% на все тарифы VDS (кроме тарифа Прогрев) — HABRFIRSTVDS.

Комментарии (3)


  1. vasilisc
    30.08.2022 11:47
    +1

    Если постоянно не контролировать свободное пространство на дисках сервера, то рано или поздно диски переполнятся.

    Следует знать и признать, чтобы такого не случилось в современных Linux дистрибутивах резервируется по умолчанию 5% пространства. Обычные пользователи и службы, работающие от своих системных учётных записей, НЕ могут переполнить дисковое пространство так, чтобы система поломалась.

    Посмотреть текущее количество зарезервированных блоков

    sudo tune2fs -l /dev/sdX | grep "Reserved"

    Root может указать в процентах другое значение

    tune2fs -m2 /dev/sdX


    1. AlexandreFrolov
      30.08.2022 13:04

      Спасибо за комментарий!

      Это хорошо что есть защита от полной поломки системы.

      Тут еще такой момент, что надо контролировать пространство, которое используют магазины на предмет соответствия тарифам. Если выделенное им пространство занято более чем на 90%, срабатывает триггер и надо разбираться, что делать.

      Кроме того, если это пространство переполнится, то интернет-магазин перестанет правильно работать (загрузки, например, перестанут работать и публикации), и такую ситуацию важно вовремя отловить.

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


      1. vasilisc
        30.08.2022 13:10

        Полностью согласен! У нас с коллегами тоже девиз - всё что можно на контроль Zabbix поставить и мониторить его элементами и получать события от триггеров.