Ограничение размера расшаренной папки.
Я знаю два способа:
1) Использовать пакет Quota. С помощью этого пакета можно задать квоту на дисковое пространство на разделе, для пользователя и для группы пользователей. Минус: задать отдельные квоты на дирректории, расположенные на одном разделе нельзя (или я пока незнаю как).
2) Создать файл необходимого размера, отформатировать его, и смонтировать в расшаренную папку. Тем самым получаем каталог ограниченного размера. Минус: если это каталог для нескольких пользователей пользователей, то один пользователь может занять все пространство, предназначенное для группы.
Избавиться от этих минусов можно комбинируя эти два способа. Алгоритм действий такой:
1) Создаем файлы для групп
2) Форматируем их
3) Монтируем файлы в соответствующие папки
4) Включаем квоты для пользователей на созданных файлах-разделах используя Quota
Тем самым на одном разделе можно создать несколько каталогов различного фиксированного объема и на каждый каталог задать различные квоты для пользователей.
Пример.
Создадим два каталога, к примеру: для документов и "помойка" для остального хлама.
sudo mkdir /home/docsudo mkdir /home/other Даем права на папки(например 770 - полный доступ владельцу и группе, остальным доступа нет):
sudo chmod 770 /home/docsudo 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.fssudo chmod 770 /home/fs/other.fs Меняем группу, которой принадлежат файлы. Допустим что пользователи, которым нужен доступ в создаваемые дирректории, входят в группу "smbusers", тогда:
sudo chgrp smbusers /home/fs/doc.fssudo chgrp smbusers /home/fs/other.fs Форматируем файлы в ext3:
sudo mkfs.ext3 /home/fs/doc.fssudo mkfs.ext3 /home/fs/other.fs Монтируем в созданные нами папки:
sudo mount -t ext3 -o loop /home/fs/doc.fs /home/docsudo 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/docquotacheck /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/docsudo repquota /home/other Теперь размеры расшаренных дирректорий у нас жестко ограничены.
После этого я задался вопросом: как менять размер? Перекидывать все файлы из папки в другое место, удалять файл, созданный с помощью dd, создавать заново с нужным размером, и перемещать на него сохраненные файлы не есть гуд. Далее рассмотрим сочиненный мною скрипт, при запуске которого только выбираем папку, размер которой надо изменить и указываем новый размер. Изменения размера проводятся без перемещения файлов, имеющихся в этой папке, поэтому не стоит делать размер меньше чем занято места на нем (информация о том сколько занято выводится при запуске скрипта). Скрипт конечно же запускаем из под рута (sudo ./quota.sh). Скрипт создавался для контроллера домена, статья по настройке PDC :
pdc .
Создаем скрипт:
sudo touch quota.sh Разрешаем запуск:
sudo chmod +x quota.sh Открываем для редактирования:
sudo nano quota.sh #!/bin/bashecho "---------------------------" # указываем имена папокecho "o_it: 1" # список выводится при запуске скриптаecho "o_prodag: 2"echo "o_buh: 3"echo "o_logist: 4"echo "o_administraciya: 5"echo "share : 6"echo "---------------------------"echo -e "Введите № раздела: \c "read fs # Исходя из выбора пользователя скрипт определяет какой раздел нужно менять case $fs in1) fs=o_it;;2) fs=o_prodag;;3) fs=o_buh;;4) fs=o_logist;;5) fs=o_administraciya;;6) fs=share;;esac echo "---------------------------"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"echo "---------------------------"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=$sizebusy=`expr $fcount \* $bsize`busy=`expr $size - $busy`echo "Занято на диске:"busy=`expr $busy / 1048576`# занято на диске в мегабайтахecho "$busy MB"echo "Общий размер диска:"size=`expr $size / 1048576`# общий размер диска в мегабайтахecho "$size MB"echo "---------------------------"echo -e "Введите размер раздела(MB):\c "read sizesize=`expr $size \* 1048576`# переводим размер в байтыsizefs=`expr $size / $bsize`# получаем количество блоков для изменения файловой системыddcount=`expr $size / 1024`# получаем кол-во блоков для изменения размера файловой системыecho "---------------------------" if [ $x -lt $size ]; # если нужно увеличить размерthen echo "Размонтируется раздел..."umount /home/$fsecho "Увеличение раздела..."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.fsecho "Изменение файловой системы под новый размер..."resize2fs /home/fs/$fs.fs $sizefs# изменяем размер файловой системы, будет sizefs блоков по bsize байт каждыйecho "Монтирование раздела..."mount -t ext3 -o loop /home/fs/$fs.fs /home/$fs else # если нужно уменьшить раздел echo "Размонтируется раздел..."umount /home/$fsecho "Проверка раздела..."e2fsck -f /home/fs/$fs.fsecho "Изменение файловой системы под новый размер..."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 байта каждыйecho "Монтирование раздела..."mount -t ext3 -o loop /home/fs/$fs.fs /home/$fsfi
Dec. 11, 2010