Quiero habilitar restricciones de tamaño, lo que significa que quiero cambiar el tamaño de algunas carpetas para usuarios como las carpetas Escritorio, Descargas o Música. Si un usuario excedió la memoria, no debería sobrescribirla y recibirá el mensaje de advertencia.
¿Cómo cambiar el tamaño de las carpetas a través de Ansible? Es para muchos hosts y directamente en el sistema con permiso de root. Quiero hacer esto en la edición de escritorio Ubuntu 14.04.
Respuesta1
Basado en la respuesta aceptada en¿Cómo establecer un límite en el tamaño del directorio en Linux?porSerguéi Nikulovy eltutoriales originales, He creado un script que puede crear un directorio con cuota limitada a pedido.
El script opera bajo la premisa de crear un dispositivo de bucle con un tamaño y sistema de archivos específicos, y montar el dispositivo de bucle en el directorio definido por el usuario.
Guion
También disponible enGitHub. Allí se realizarán más desarrollos.
#!/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 "$@"
Uso
Hay 3 banderas requeridas:
-m
para el punto de montaje, también conocido como el directorio que desea limitar-s
el tamaño al que desea limitar en bytes-f
sistema de archivos. Si no estás seguro de cuál debería ser, quédate con ext4 o ext3.
Aquí hay un ejemplo de cómo utilicé este script para crear ./quoted_dir
un límite de 1 MiB (es decir, 1024 2 enPrefijo binario)
sudo ./mklimdir.sh -m ./quoted_dir/ -s $((1024*1024)) -f ext4
Probé el script con while true; do cat /etc/passwd >> ./quoted_dir/passwd; sleep 1; done
un tipo de bucle, que agregaría el contenido /etc/passwd
al archivo dentro del directorio limitado por comillas. Finalmente se cat
produjo un error con:
cat: write error: No space left on device
y la escritura del archivo se detuvo en 909 KiB, que es un poco menos de 1 MiB y evitaría exceder los límites dentro del directorio.
Mayor desarrollo
Para un efecto permanente, el dispositivo de bucle creado por el guióndebe agregarse a/etc/fstab
. Esto se puede agregar más adelante en GitHub. El script opera en un único directorio; sin embargo, este script se puede usar dentro de otro script para crear múltiples directorios limitados, por lo que es lo suficientemente flexible.