Я хочу включить ограничения по размеру, что означает, что я хочу изменить размер нескольких папок для пользователей, таких как папки «Рабочий стол», «Загрузки» или «Музыка». Если пользователь превысил память, то она не должна перезаписываться и получать предупреждающее сообщение.
Как изменить размер папок через Ansible? Это для многих хостов и непосредственно в системе с правами root. Я хочу сделать это в Ubuntu 14.04 Desktop edition.
решение1
На основании принятого ответа наКак установить ограничение на размер каталога в Linux?кСергей Никуловиоригинальный учебникЯ составил скрипт, который может по требованию создать каталог с ограниченной квотой.
Скрипт работает на основе создания петлевого устройства с определенным размером и файловой системой, а также монтирования петлевого устройства в указанном пользователем каталоге.
Сценарий
Также доступно наGitHub. Дальнейшая разработка будет осуществляться там.
#!/usr/bin/env bash
# Author: Serg Kolo
# Date: June 1, 2018
# Written for: https://askubuntu.com/q/1043035/295286
# Based on: https://www.linuxquestions.org/questions/linux-server-73/directory-quota-601140/
set -e
print_usage(){
cat <<EOF
Usage: sudo mklimdir.sh -m <Mountpoint Directory> -f <Filesystem> -s <INT>
-m directory
-f filesystem type (one of supported by mke2fs)
-s size in bytes
-h this message
Exit statuses:
0:
1: Invalid option
2: Missing argument
3: No args
4: root privillege required
EOF
} > /dev/stderr
parse_args(){
#set -x
option_handler(){
case ${opt} in
m) mountpoint=$( realpath -e "${OPTARG}" );;
s) size=${OPTARG} ;;
h) print_usage; exit 0 ;;
f) mkfs_cmd=mkfs."${OPTARG}" ;;
\?) echo ">>>Invalid option: -$OPTARG" > /dev/stderr; exit 1;;
\:) echo ">>>Missing argument to -${OPTARG}" > /dev/stderr; exit 2;;
esac
}
local OPTIND opt
getopts "m:s:f:h" opt || { echo "No args passed">/dev/stderr;print_usage;exit 3;}
option_handler
while getopts "m:s:f:h" opt; do
option_handler
done
shift $((OPTIND-1))
}
main(){
if [ $EUID -ne 0 ]; then
echo ">>> Please run the script with sudo/as root" > /dev/stderr
exit 4
fi
local mountpoint=""
local size=0
local mkfs_cmd
parse_args "$@"
quota_fs=/"${mountpoint//\//_}"_"$(date +%s)".quota
dd if=/dev/zero of="$quota_fs" count=1 bs="$size"
"$mkfs_cmd" "$quota_fs"
mount -o loop,rw,usrquota,grpquota "$quota_fs" "$mountpoint"
chown $SUDO_USER:$SUDO_USER "$mountpoint"
}
main "$@"
Применение
Необходимо указать 3 флага:
-m
для точки монтирования, то есть каталога, который вы хотите ограничить-s
размер, которым вы хотите ограничиться в байтах-f
Файловая система. Если вы не уверены, какой она должна быть, просто используйте ext4 или ext3
Вот пример того, как я использовал этот скрипт для создания ./quoted_dir
ограниченного 1 МБ (то есть 1024 2 вДвоичный префикс)
sudo ./mklimdir.sh -m ./quoted_dir/ -s $((1024*1024)) -f ext4
Я протестировал скрипт с while true; do cat /etc/passwd >> ./quoted_dir/passwd; sleep 1; done
типом цикла, который добавлял содержимое /etc/passwd
в файл внутри ограниченного кавычками каталога. cat
В конечном итоге произошла ошибка:
cat: write error: No space left on device
и запись файла остановилась на 909 КБ, что немного меньше 1 МБ и не позволило бы превысить ограничения в пределах каталога.
Дальнейшее развитие
Для постоянного эффекта циклическое устройство, созданное скриптомследует добавить к/etc/fstab
. Это может быть добавлено позже на GitHub. Скрипт работает с одним каталогом, однако этот скрипт может быть использован в другом скрипте для создания нескольких ограниченных каталогов, поэтому он достаточно гибок.