Простое квотирование директорий в Linux
Необходимость квотирования отдельно взятых директорий в Linux, на мой взгляд, очевидна — зачастую бывает потребность в ограничении объёма пронстранства для хранения чего-либо, которая не основывается на методе определения порогов квоты для пользователей или групп, а на общем объёме самой директории. К счастью, у нас уже имеются под руками все необходимые средства для реализации этой нетривиальной, но подчас очень востребованной задачи предложенным ниже способом.
Предположим, имеется некая группа пользователей, которая использует ресурсы офисного сервера в том числе и для хранения общих файлов для совместной, коллективной работы. Проблема состоит в том, что зачастую, ресурсы общего доступа для хранения рабочих файлов могут использоваться не по назначению, например, для информации частного или даже развлекательного характера, например, видео или аудио файлы, которые как правило имеют большой объём. Если не предпринимать никаких мер, то в скором времени пространство диска на котором хранится информация самого общего ресурса будет исчерпано, что может вызвать ряд определённых неудобств или даже стать причиной отказа функционирования некоторых служб.
Одно из решений этой проблемы заключается в создании образа файловой системы для хранения нужной нам информации и последующего его подключения в точку монтирования. Преимущество данного метода в отличии от LVM или ряда других методов состоит в быстром решении и простоте использования. Давайте убедимся в этом сами:
Для начала, нам нужно создать каталог для точки монтирования нашего образа ФС.
dd if=/dev/zero of=/mnt/quota.img bs=1024 count=100000
mount -o loop /mnt/quota.img /mnt/quotadir
Всё! Более ничего не требуется! Мы осуществили всё, что требовалось.
И, наконец, если имеется необходимость в постоянном монтировании созданного нами образа, это необходимо сделать в файле /etc/fstab
/mnt/quota.img /mnt/quota ext3 loop 1 2
Не смотря на то, что файловая система на которой хранится нужная нам информация заключается а файле-образе, тем не менее, это всё-таки файловая система, над которой мы можем совершать вполне привычные действия, например, такие как:
Увеличение или уменьшение объёма ФС, тем самым изменяя объём самого хранилища
resize2fs -p quota.img 1000M
Linux: как ограничить размер папки /var/log
Иногда папка /var/log увеличивается в размере настолько, что становится причиной нехватки места на диске. Как ограничить рост размера этой папки? Выполнив два шага из этой статьи, вы можете поставить размер папки /var/log под контроль.
Шаг 1. Ограничение размера логов journald
Логи всех сервисов systemd складываются в папку /var/log/journal/ сервисом journald . Чтобы установить предельный размер этой папки, выполните следующие команды:
sudo bash -c 'echo "SystemMaxUse=100M" >> /etc/systemd/journald.conf' sudo systemctl restart systemd-journald
Вместо размера 100M вы можете указать любой другой размер, в единицах измерения K, M, G, T . После вышеуказанных команд вы можете убедиться, что размер папки /var/log стал иметь заданный размер с помощью команды: du -sh /var/log/journal/
Шаг 2. Ограничение количества файлов логов, ротируемых logrotate
Logrotate каждый день совершает ротацию почти всех лог-файлов, находящихся в папке /var/log . Например, если я наберу команду ls /var/log/kern* , то я увижу, что помимо файла /var/log/kern.log у меня хранится ещё 4 файла, которые сохранил logrotate:
/var/log/kern.log /var/log/kern.log.2.gz /var/log/kern.log.4.gz /var/log/kern.log.1 /var/log/kern.log.3.gz
Чтобы ограничить количество лог-файлов, нужно отредактировать файл /etc/logrotate.d/rsyslog . Посмотрев содержимое файла /etc/logrotate.d/rsyslog , мы увидим, что дефолтное значение параметра rotate равно 4 :
/var/log/syslog /var/log/mail.info /var/log/mail.warn /var/log/mail.err /var/log/mail.log /var/log/daemon.log /var/log/kern.log /var/log/auth.log /var/log/user.log /var/log/lpr.log /var/log/cron.log /var/log/debug /var/log/messages rotate 4 weekly missingok notifempty compress delaycompress sharedscripts postrotate /usr/lib/rsyslog/rsyslog-rotate endscript >
Можно изменить 4 на какое-то другое значение, например, на 1 , чтобы хранился только один файл. В папке /etc/logrotate.d/ вы найдёте также множество других конфигурационных файлов, относящихся к другим лог-файлам, там вы тоже можете изменить параметр rotate .
Вы имеете право копировать, тиражировать, использовать в коммерческих и некоммерческих целях любую информацию, опубликованную на данном сайте.
Linux ограничение размера папки linux
1) Использовать пакет Quota. С помощью этого пакета можно задать квоту на дисковое пространство на разделе, для пользователя и для группы пользователей. Минус: задать отдельные квоты на дирректории, расположенные на одном разделе нельзя (или я пока незнаю как). 2) Создать файл необходимого размера, отформатировать его, и смонтировать в расшаренную папку. Тем самым получаем каталог ограниченного размера. Минус: если это каталог для нескольких пользователей пользователей, то один пользователь может занять все пространство, предназначенное для группы. Избавиться от этих минусов можно комбинируя эти два способа. Алгоритм действий такой: 1) Создаем файлы для групп
3) Монтируем файлы в соответствующие папки 4) Включаем квоты для пользователей на созданных файлах-разделах используя Quota Тем самым на одном разделе можно создать несколько каталогов различного фиксированного объема и на каждый каталог задать различные квоты для пользователей. Создадим два каталога, к примеру: для документов и «помойка» для остального хлама. sudo mkdir /home/doc sudo mkdir /home/other Даем права на папки(например 770 — полный доступ владельцу и группе, остальным доступа нет):
sudo chmod 770 /home/doc sudo chmod 770 /home/other Создаем папку, где будут храниться «форматированные файлы-разделы» : sudo mkdir /home/fs В данном примере создаем файл, содержащий 10485760 блоков размером по 1024байт = 10ГБ для документов (при необходимости размер изменяем на нужный меняя count): sudo dd if=/dev/zero of=/home/fs/doc.fs bs=1024 count=10485760 И для остального к примеру 20ГБ:
sudo dd if=/dev/zero of=/home/fs/other.fs bs=1024 count=20971520 Даем права на созданные файлы: sudo chmod 770 /home/fs/doc.fs sudo chmod 770 /home/fs/other.fs Меняем группу, которой принадлежат файлы. Допустим что пользователи, которым нужен доступ в создаваемые дирректории, входят в группу «smbusers», тогда: sudo chgrp smbusers /home/fs/doc.fs sudo chgrp smbusers /home/fs/other.fs
Форматируем файлы в ext3: sudo mkfs.ext3 /home/fs/doc.fs sudo mkfs.ext3 /home/fs/other.fs Монтируем в созданные нами папки: sudo mount -t ext3 -o loop /home/fs/doc.fs /home/doc sudo mount -t ext3 -o loop /home/fs/other.fs /home/other для автоматического монтирования при загрузке в /etc/fstab добавляем:
/home/fs/doc.fs /home/doc auto auto,loop 0 0 /home/fs/other.fs /home/other auto auto,loop 0 0 Теперь нам надо установить квоты для юзверей на дисковое пространство. Ставим пакет quota: sudo apt-get install quota Редактируем файл /etc/fstab, добавляем «usrquota» в раздел, на который устанавливаем ограничение для пользователей: sudo nano /etc/fstab /home/fs/doc.fs /home/doc auto auto,loop,usrquota 0 0
/home/fs/other.fs /home/other auto auto,loop,usrquota 0 0 По умолчанию файлы квот хранятся в корневом каталоге файловой системы в файлах с именами aquota.user и aquota.group соответственно для пользовательских и групповых квот. Этой командой создадим файлы: quotacheck /home/doc quotacheck /home/other Если будет ругаться — пробуем запускать с ключем -m или -f . sudo edquota -u petrov_ia
после этой команды откроется текстовый редактор, в которым указываем ограничения для пользователя petrov_ia и сохраняем. Вы можете ограничивать размещение ресурсов на основе объема дискового пространства (квотирование блоков), количества файлов (квотирование inode) или их комбинации. Каждое из этих ограничений, в свою очередь, делится на две категории: мягкие (soft) и жёсткие (hard) ограничения. Жёсткое ограничение не может быть превышено. мягкие ограничения могут быть превышены в течении некоторого периода времени. Если пользователь превышает своё мягкое ограничение в течение периода времени, превышающего отсрочку, то это мягкое ограничение становится жестким и последующее выделение ресурсов будет запрещено. Например поставим ограничения: по объему – 1000 Мбайт, по количеству – 1000 файлов. Добавляя 10% запаса на жесткие пределы для раздела doc. И в 2 раза больше для other: Disk quotas for user petrov_ia (uid 1005): Filesystem blocks soft hard inodes soft hard /dev/loop0 7 1024000 1126400 4 1000 1100 /dev/loop1 7 2048000 2252800 4 2000 2200 Размер указывается не в КБ, это число блоков. Но при создании файла с помощью команды dd мы указывали размер блока bs=1024, поэтому в данном случае размер 1 блока = 1 КБ.
Параметры blocks и inodes изменять бессмысленно, они ставятся автоматически. Параметр «grace period» позволяет вам установить время, прежде чем значение soft limit будет приведено в жизнь на файловой системе с включенными квотами: sudo edquota -t Grace period before enforcing soft limits for users: Time units may be: days, hours, minutes, or seconds Filesystem Block grace period Inode grace period /dev/loop0 7days 7days
Проверяем установленные квоты: sudo repquota /home/doc sudo repquota /home/other Теперь размеры расшаренных дирректорий у нас жестко ограничены. После этого я задался вопросом: как менять размер? Перекидывать все файлы из папки в другое место, удалять файл, созданный с помощью dd, создавать заново с нужным размером, и перемещать на него сохраненные файлы не есть гуд. Далее рассмотрим сочиненный мною скрипт, при запуске которого только выбираем папку, размер которой надо изменить и указываем новый размер. Изменения размера проводятся без перемещения файлов, имеющихся в этой папке, поэтому не стоит делать размер меньше чем занято места на нем (информация о том сколько занято выводится при запуске скрипта). Скрипт конечно же запускаем из под рута (sudo ./quota.sh). Скрипт создавался для контроллера домена, статья по настройке PDC : http://linux-bash.ru/mseti/48-pdc.html . sudo touch quota.sh sudo chmod +x quota.sh
Открываем для редактирования: sudo nano quota.sh #!/bin/bash echo «—————————» # указываем имена папок echo «o_it: 1» # список выводится при запуске скрипта echo «o_prodag: 2» echo «o_buh: 3»
echo «o_logist: 4» echo «o_administraciya: 5» echo «share : 6» echo -e «Введите № раздела: \c « read fs # Исходя из выбора пользователя скрипт определяет какой раздел нужно менять case $fs in
1) fs=o_it;; 2) fs=o_prodag;; 3) fs=o_buh;; 4) fs=o_logist;; 5) fs=o_administraciya;; 6) fs=share;; esac
echo «Выполняется проверка раздела. « # Получаем информацию о размере папки, и сколько занято. tune2fs -l /home/fs/$fs.fs | grep «Block count» tune2fs -l /home/fs/$fs.fs | grep «Block size» tune2fs -l /home/fs/$fs.fs | grep «Free blocks» bsize=`tune2fs -l /home/fs/$fs.fs | grep «Block size» | cut -d ‘:’ -f2` # размер блока файловой системы
bcount=`tune2fs -l /home/fs/$fs.fs | grep «Block count» | cut -d ‘:’ -f2` # число блоков fcount=`tune2fs -l /home/fs/$fs.fs | grep «Free blocks» | cut -d ‘:’ -f2` # число свободных блоков size=`expr $bcount \* $bsize` x=$size busy=`expr $fcount \* $bsize`
busy=`expr $size — $busy` echo «Занято на диске:» busy=`expr $busy / 1048576` # занято на диске в мегабайтах echo «$busy MB» echo «Общий размер диска:» size=`expr $size / 1048576`
# общий размер диска в мегабайтах echo «$size MB» echo -e «Введите размер раздела(MB):\c « read size size=`expr $size \* 1048576` # переводим размер в байты sizefs=`expr $size / $bsize`
# получаем количество блоков для изменения файловой системы ddcount=`expr $size / 1024` # получаем кол-во блоков для изменения размера файловой системы if [ $x -lt $size ]; # если нужно увеличить размер then echo «Размонтируется раздел. « umount /home/$fs
echo «Увеличение раздела. « dd if=/dev/zero of=/home/fs/$fs.fs bs=1024 count=$ddcount conv=notrunc oflag=append # изменяем размер файла. Файл будет иметь ddcount блоков по 1024 байта каждый echo «Проверка раздела. « e2fsck -f /home/fs/$fs.fs echo «Изменение файловой системы под новый размер. « resize2fs /home/fs/$fs.fs $sizefs
# изменяем размер файловой системы, будет sizefs блоков по bsize байт каждый echo «Монтирование раздела. « mount -t ext3 -o loop /home/fs/$fs.fs /home/$fs else # если нужно уменьшить раздел echo «Размонтируется раздел. « umount /home/$fs echo «Проверка раздела. «
e2fsck -f /home/fs/$fs.fs echo «Изменение файловой системы под новый размер. « resize2fs /home/fs/$fs.fs $sizefs # изменяем размер файловой системы, будет sizefs блоков по bsize байт каждый echo «Уменьшение раздела. « dd if=/dev/zero of=/home/fs/$fs.fs bs=1024 count=$ddcount conv=notrunc oflag=append # изменяем размер файла. Файл будет иметь ddcount блоков по 1024 байта каждый