Ограничение размера папки linux

Обновлено: 08.07.2024

Я хочу включить ограничения размера, что означает, что я хочу изменить размер нескольких папок для пользователей, таких как папки "Рабочий стол", "Загрузки" или "Музыка". Если пользователь превысил память, он не должен перезаписывать и получает предупреждение.

Как изменить размер папок через Ansible? Это для многих хостов и непосредственно в системе с правами root. Я хочу сделать это в Ubuntu 14.04 Desktop Edition.

1 ответ

На основании принятого ответа на Как установить ограничение на размер каталога в Linux? Сергея Никулова и оригинального урока, я собрал скрипт, который может создавать каталог с ограничением квот по требованию.

Сценарий работает на основе создания устройства петли с определенным размером и файловой системой и монтирования устройства петли в пользовательском каталоге.

скрипт

Также доступно на GitHub. Дальнейшее развитие будет сделано там.

использование

Там 3 обязательных флага:

  • -m для точки монтирования, то есть директории, которую вы хотите ограничить
  • -s размер, который вы хотите ограничить в байтах
  • -f файловая система. Если вы не уверены, что это должно быть, просто придерживайтесь ext4 или ext3

Вот пример того, как я использовал этот скрипт для создания ./quoted_dir ограничено 1 МБ (то есть 1024 2 в двоичном префиксе)

Я проверил сценарий с while true; do cat /etc/passwd >> ./quoted_dir/passwd; sleep 1; done тип цикла, который будет добавлять содержимое /etc/passwd к файлу внутри директории с ограничением цитаты. cat в конце концов ошибся с:

и запись в файл остановилась на уровне 909 КБ, что немного меньше 1 МБ и не позволило бы превысить пределы в каталоге.

Дальнейшее развитие

Для постоянного эффекта, устройство цикла, созданное сценарием, должно быть добавлено в /etc/fstab , Это может быть добавлено позже на GitHub. Сценарий работает с одним каталогом, однако этот сценарий можно использовать в другом сценарии для создания нескольких ограниченных каталогов, поэтому он достаточно гибок.

1) Использовать пакет Quota. С помощью этого пакета можно задать квоту на дисковое пространство на разделе, для пользователя и для группы пользователей. Минус: задать отдельные квоты на дирректории, расположенные на одном разделе нельзя (или я пока незнаю как).

2) Создать файл необходимого размера, отформатировать его, и смонтировать в расшаренную папку. Тем самым получаем каталог ограниченного размера. Минус: если это каталог для нескольких пользователей пользователей, то один пользователь может занять все пространство, предназначенное для группы.

Избавиться от этих минусов можно комбинируя эти два способа. Алгоритм действий такой:

1) Создаем файлы для групп

2) Форматируем их

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

Этой командой создадим файлы:

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

Теперь размеры расшаренных дирректорий у нас жестко ограничены.

sudo touch quota.sh

sudo chmod +x quota.sh

Открываем для редактирования:

sudo nano quota.sh

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`

then

echo "Размонтируется раздел. "

umount /home/$fs

echo "Увеличение раздела. "

dd if=/dev/zero of=/home/fs/$fs.fs bs=1024 count=$ddcount conv=notrunc oflag=append

echo "Проверка раздела. "

e2fsck -f /home/fs/$fs.fs

echo "Изменение файловой системы под новый размер. "

resize2fs /home/fs/$fs.fs $sizefs

echo "Монтирование раздела. "

mount -t ext3 -o loop /home/fs/$fs.fs /home/$fs

echo "Размонтируется раздел. "

umount /home/$fs

echo "Проверка раздела. "

e2fsck -f /home/fs/$fs.fs

echo "Изменение файловой системы под новый размер. "

resize2fs /home/fs/$fs.fs $sizefs

echo "Уменьшение раздела. "

dd if=/dev/zero of=/home/fs/$fs.fs bs=1024 count=$ddcount conv=notrunc oflag=append

Необходимость квотирования отдельно взятых директорий в Linux, на мой взгляд, очевидна — зачастую бывает потребность в ограничении объёма пронстранства для хранения чего-либо, которая не основывается на методе определения порогов квоты для пользователей или групп, а на общем объёме самой директории. К счастью, у нас уже имеются под руками все необходимые средства для реализации этой нетривиальной, но подчас очень востребованной задачи предложенным ниже способом.

Предположим, имеется некая группа пользователей, которая использует ресурсы офисного сервера в том числе и для хранения общих файлов для совместной, коллективной работы. Проблема состоит в том, что зачастую, ресурсы общего доступа для хранения рабочих файлов могут использоваться не по назначению, например, для информации частного или даже развлекательного характера, например, видео или аудио файлы, которые как правило имеют большой объём. Если не предпринимать никаких мер, то в скором времени пространство диска на котором хранится информация самого общего ресурса будет исчерпано, что может вызвать ряд определённых неудобств или даже стать причиной отказа функционирования некоторых служб.

Одно из решений этой проблемы заключается в создании образа файловой системы для хранения нужной нам информации и последующего его подключения в точку монтирования. Преимущество данного метода в отличии от LVM или ряда других методов состоит в быстром решении и простоте использования. Давайте убедимся в этом сами:

Для начала, нам нужно создать каталог для точки монтирования нашего образа ФС.

Далее, необходимо создать сам образ файловой системы и указать его объём (count)

Следующим щагом произвести «форматирование» файлового образа, создав на нём необходимую нам ФС.

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

Всё! Более ничего не требуется! Мы осуществили всё, что требовалось.

И, наконец, если имеется необходимость в постоянном монтировании созданного нами образа, это необходимо сделать в файле /etc/fstab


Не смотря на то, что файловая система на которой хранится нужная нам информация заключается а файле-образе, тем не менее, это всё-таки файловая система, над которой мы можем совершать вполне привычные действия, например, такие как:

Увеличение или уменьшение объёма ФС, тем самым изменяя объём самого хранилища

Блог про Linux, Bash и другие информационные технологии

Управление квотами дискового пространства осуществляется под пользователем root. Существуют два вида квот: мягкие (soft quota) и жесткие (hard quota).

Жесткая квота определяет абсолютный максимальный объем дискового пространства, который пользователь не может превышать. Пользователю не разрешено будет занять больше дискового пространства, чем определено жесткой квотой.

Установка пакета

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

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

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

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

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

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

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

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

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

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

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

Теперь давайте создадим пользователя и настроим для него квоты

Пользователь создан. Добавим для него следующие ограничения: пусть он не может использовать больше 1 мегабайта и может создать только 3 файла на файловой системе, смонтированной в /mnt/storage.

В редакторе вы увидите следующее:

И выйдем с сохранением. Теперь посмотрим, сохранились ли квоты. Залогинимся под пользователем user1 и перейдем в директорию /mnt/storage. Попробуем создать файл большого размера:

Как видите, квота пользователя исчерпана. Посмотрим, что у нас есть на дисковой системе:

Как видите, размер файла 1 мегабайт. Теперь надо проверить, работает ли ограничение на количество файлов. Удалим file.dat и попробуем создать четыре файла.

Файл file4 мы не смогли создать, потому что сработало ограничение на количество файлов. Смотрим, какие файлы у нас есть:

Как видите, управление квотами работает.

Просмотреть установленные квоты можно при помощи команды quota. Вот несколько опций:

Давайте посмотрим информацию для пользователя user1:

По поводу просмотра квот есть одно замечание. Они могут не отображаться сразу после создания, пока пользователь не создал ни одного файла.

Также можно воспользоваться командой repquota для просмотра квот, которые в данный момент присутствуют в системе.

Читайте также: