Como posso redimensionar / restringir uma pasta para usuários como Desktop / Downloads no Ubuntu

0

Desejo ativar restrições de tamanho, o que significa que quero redimensionar algumas pastas para usuários como as pastas Desktop, Downloads ou Música. Se um usuário exceder a memória, não deverá sobregravar e receber a mensagem de aviso.

Como redimensionar as pastas através do Ansible? É para muitos hosts e diretamente no sistema com permissão de root. Eu quero fazer isso no Ubuntu 14.04 Desktop edition.

    
por Rajendra 02.06.2018 / 22:41

1 resposta

1

Com base na resposta aceita em Como definir o limite do tamanho do diretório no Linux? por Sergei Nikulov e o tutorial original , eu montei um script que pode criar um diretório limitado por quota sob demanda.

O script opera na premissa de criar um dispositivo de loop com tamanho e sistema de arquivos específicos e montar o dispositivo de loop no diretório definido pelo usuário.

Script

Também disponível em GitHub . Desenvolvimento adicional será feito lá.

#!/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

Existem 3 bandeiras obrigatórias:

  • -m para o ponto de montagem, também conhecido como o diretório que você deseja limitar
  • -s o tamanho ao qual você deseja limitar em bytes
  • -f filesystem. Se você não tem certeza do que deveria ser, basta usar ext4 ou ext3

Veja um exemplo de como eu usei esse script para criar ./quoted_dir limitado a 1 MiB (ou seja, 1024 2 em Prefixo binário )

sudo ./mklimdir.sh -m ./quoted_dir/ -s $((1024*1024)) -f ext4

Eu testei o script com while true; do cat /etc/passwd >> ./quoted_dir/passwd; sleep 1; done type de loop, o que acrescentaria o conteúdo de /etc/passwd ao arquivo dentro do diretório limited-quote. O cat acabou por errar com:

cat: write error: No space left on device

e a gravação do arquivo parou em 909KiB, o que é um pouco menor que 1 MiB e evitaria exceder os limites dentro do diretório.

Desenvolvimento adicional

Para efeito permanente, o dispositivo de loop criado pelo script deve ser adicionado a /etc/fstab . Isso pode ser adicionado posteriormente no GitHub. O script opera em um único diretório, no entanto, esse script pode ser usado em outro script para criar vários diretórios limitados, por isso é flexível o suficiente.

    
por Sergiy Kolodyazhnyy 03.06.2018 / 09:40