PDF Печать E-mail

 

Ограничение размера расшаренной папки.

 

Я знаю два способа:

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

 

По умолчанию файлы квот хранятся в корневом каталоге файловой системы в файлах с именами 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 "---------------------------"

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 "---------------------------"

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=$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 "---------------------------"

echo -e "Введите размер раздела(MB):\c "

read size

size=`expr $size \* 1048576`

# переводим размер в байты

sizefs=`expr $size / $bsize`

# получаем количество блоков для изменения файловой системы

ddcount=`expr $size / 1024`

# получаем кол-во блоков для изменения размера файловой системы

echo "---------------------------"


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 байта каждый

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

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

fi