
Automatyzacja Zarządzania Przestrzenią Dyskową w Środowisku Linux
W dzisiejszym cyfrowym świecie, gdzie dane gromadzone są w coraz większych ilościach, zarządzanie przestrzenią dyskową staje się kluczowym elementem utrzymania efektywności operacyjnej systemów. W tym artykule przedstawię skrypt, który automatyzuje proces zarządzania przestrzenią na zdalnym dysku montowanym przez SSHFS, szczególnie przydatny dla administratorów systemów, którzy regularnie muszą radzić sobie z zapełniającymi się nośnikami danych.
Wymagania wstępne
Przed rozpoczęciem, upewnij się, że na twoim systemie zainstalowane jest SSHFS oraz wszystkie niezbędne pakiety umożliwiające jego prawidłową pracę. SSHFS pozwala na montowanie systemów plików zdalnych przez SSH, co jest kluczowe dla działania naszego skryptu. Aby zainstalować SSHFS oraz niezbędne narzędzia, w tym pakiet umożliwiający przekazywanie hasła (sshpass), użyj poniższego polecenia:
1 2 |
sudo apt-get update sudo apt-get install sshfs fuse sshpass -y |
Skrypt Bash do zarządzania przestrzenią dyskową
Nasz skrypt Bash skupia się na monitorowaniu i utrzymaniu określonego procentu wolnej przestrzeni dyskowej na zdalnym dysku, montowanym za pomocą SSHFS. Oto główne funkcje skryptu:
Definicja Celów:
TARGET_USAGE=70 – procent przestrzeni dyskowej, który chcemy utrzymać jako zajęty. Skrypt będzie działał na rzecz utrzymania przynajmniej 30% wolnego miejsca na dysku.
Punkt Montowania i Ścieżki:
MOUNT_POINT=”/mnt/qnapskorupki” – lokalny katalog, w którym montowany jest zdalny dysk. TARGET_DIRS=”$MOUNT_POINT/up*.soban.pl” – ścieżki katalogów, w których skrypt będzie szukał plików do usunięcia, jeśli zajdzie taka potrzeba.
Funkcja check_qnap: Ta funkcja sprawdza, czy dysk jest zamontowany i czy katalog montowania nie jest pusty. Jeśli są problemy, skrypt próbuje odmontować i ponownie zamontować dysk, używając sshfs z hasłem przekazanym przez sshpass.
Usuwanie Plików: Skrypt monitoruje użycie dysku i, jeśli przekroczone jest TARGET_USAGE, znajduje i usuwa najstarsze pliki w określonych katalogach aż do osiągnięcia docelowego poziomu wolnej przestrzeni.
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 50 51 52 53 54 55 56 57 58 59 60 61 62 63 64 65 66 67 |
#!/bin/bash TARGET_USAGE=70 MOUNT_POINT="/mnt/qnapskorupki" TARGET_DIRS="$MOUNT_POINT/up*.soban.pl" # Function to check and mount SSHFS function check_qnap { local remote_path="/share/MD0_DATA/backup_proxmox/" local user_remote="remote_user" local remote_host="192.168.1.XX" local port=22 local password='XXXXXXXXXXXXXXXXXXXXXXX' # Check if the mounting directory exists and is empty if [ ! -d "$MOUNT_POINT" ] || [ -z "$(ls -A $MOUNT_POINT)" ]; then echo "Problem: The directory $MOUNT_POINT is missing or empty. Attempting to remount..." # Unmount if anything is currently mounted if mountpoint -q $MOUNT_POINT; then echo "Unmounting $MOUNT_POINT..." fusermount -u $MOUNT_POINT sleep 5 fi # Remount echo "Mounting SSHFS: $user_remote@$remote_host:$remote_path to $MOUNT_POINT..." echo $password | sshfs $user_remote@$remote_host:$remote_path $MOUNT_POINT -o password_stdin # Check if the mounting was successful if mountpoint -q $MOUNT_POINT; then echo "QNAP successfully mounted." else echo "Error: Failed to mount $remote_host:$remote_path to $MOUNT_POINT." exit 1 fi fi } # Check and mount the disk check_qnap # Begin deleting files current_usage=$(df --output=pcent "$MOUNT_POINT" | tail -n 1 | tr -d '%') echo "Current usage: $current_usage%" target_free_space=$((100 - $TARGET_USAGE)) # Continue deleting files until the required free space is achieved while [[ $current_usage -gt $TARGET_USAGE ]]; do # Find the oldest file in the target directories oldest_file=$(find $TARGET_DIRS -type f -printf '%T+ %p\n' | sort | head -n 1 | cut -d' ' -f2) if [ -z "$oldest_file" ]; then echo "No files to delete." break fi # Delete the oldest file echo "Deleting file $oldest_file..." rm -f "$oldest_file" # Check usage again current_usage=$(df --output=pcent "$MOUNT_POINT" | tail -n 1 | tr -d '%') echo "New usage after deletion: $current_usage%" done echo "Target disk usage achieved." |
Przykładowe wywołanie skryptu:

skrypt będzie pracować aż do osiągnięcia 70% zgodnie z założeniem:

Pobieranie skryptu i dodawanie do crontaba
Skrypt oczywiście należy dostosować pod swoje wymagania, jednak jeśli chcesz go pobrać i dodać do crontaba to:
1 2 |
wget soban.pl/bash/remove_old_files.sh chmod +x remove_old_files.sh |
Jeśli chcemy zautomatyzować proces usuwania np pod koniec dnia, to warto dodać do crontaba następujący wpis:
1 |
crontab -e |
Skrypt będzie się uruchamiać w tym przypadku o 23:55 każdego dnia:
1 |
45 23 * * * /root/scripts/remove_old_files.sh > /dev/null 2>&1 |
Należy zachować powyżej odpowiednią ścieżkę do skryptu.
Bezpieczeństwo i optymalizacja
Skrypt używa hasła wprost w linii komend, co może stanowić ryzyko bezpieczeństwa. W praktycznym zastosowaniu zaleca się użycie bardziej zaawansowanych metod autentykacji, na przykład kluczy SSH, które są bezpieczniejsze i nie wymagają jawnej obecności hasła w skrypcie. Jednak w przypadku QNAPa posłużyliśmy się hasłem pisząc ten skrypt.
Podsumowanie
Prezentowany skrypt jest przykładem, jak można automatyzować codzienne zadania administracyjne, takie jak zarządzanie przestrzenią dyskową, zwiększając tym samym efektywność i niezawodność operacji. Jego implementacja w realnych środowiskach IT może znacznie usprawnić procesy zarządzania danymi, zwłaszcza w sytuacjach, gdzie szybkie reagowanie na zmiany w użyciu dysku jest krytyczne.