Ich möchte Größenbeschränkungen aktivieren, das heißt, ich möchte die Größe einiger Ordner für Benutzer anpassen, z. B. Desktop-, Download- oder Musikordner. Wenn ein Benutzer den Speicher überschreitet, sollte er nicht überschrieben werden und erhält eine Warnmeldung.
Wie ändere ich die Größe der Ordner über Ansible? Das geht für viele Hosts und direkt auf dem System mit Root-Berechtigung. Ich möchte das auf der Ubuntu 14.04 Desktop Edition machen.
Antwort1
Basierend auf der akzeptierten Antwort unterWie kann man in Linux eine Begrenzung der Verzeichnisgröße festlegen?vonSergej Nikulowund dasursprüngliches Tutorialhabe ich ein Skript zusammengestellt, das bei Bedarf ein kontingentbeschränktes Verzeichnis erstellen kann.
Das Skript basiert auf der Annahme, dass ein Loop-Gerät mit bestimmter Größe und einem bestimmten Dateisystem erstellt und das Loop-Gerät im benutzerdefinierten Verzeichnis bereitgestellt wird.
Skript
Auch verfügbar aufGitHub. Dort wird weiterentwickelt.
#!/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 "$@"
Verwendung
Es gibt drei erforderliche Flags:
-m
für den Mountpoint, also das Verzeichnis, das Sie einschränken möchten-s
die Größe in Bytes, auf die Sie beschränken möchten-f
Dateisystem. Wenn Sie nicht sicher sind, was das sein soll, bleiben Sie einfach bei ext4 oder ext3
Hier ist ein Beispiel, wie ich dieses Skript verwendet habe, um ./quoted_dir
auf 1 MiB (das sind 1024 2 inBinäres Präfix)
sudo ./mklimdir.sh -m ./quoted_dir/ -s $((1024*1024)) -f ext4
Ich habe das Skript mit einer Schleife getestet , die den Inhalt an die Datei im durch Anführungszeichen begrenzten Verzeichnis while true; do cat /etc/passwd >> ./quoted_dir/passwd; sleep 1; done
anfügte . Es kam schließlich zu einem Fehler mit:/etc/passwd
cat
cat: write error: No space left on device
und das Schreiben der Datei wurde bei 909 KiB gestoppt, was knapp unter 1 MiB liegt und ein Überschreiten der Grenzen innerhalb des Verzeichnisses verhindern würde.
Weitere Entwicklung
Für einen dauerhaften Effekt kann das durch das Skript erstellte Loop-Gerätsollte hinzugefügt werden/etc/fstab
. Dies kann später auf GitHub hinzugefügt werden. Das Skript arbeitet mit einem einzelnen Verzeichnis, kann jedoch innerhalb eines anderen Skripts zum Erstellen mehrerer begrenzter Verzeichnisse verwendet werden, es ist also flexibel genug.