projects:linux:manual_backup_scripts:clean
Это старая версия документа!
Легкая очистка системы от мусора
Входит в набор rPi Seal
- clean_and_zero.sh
#!/bin/bash export LANG=en_US.UTF-8 export LC_ALL=en_US.UTF-8 # ==DIS/AUTOEXEC== # === SD Safe Cleaner === # 03_clean_and_zero.sh Меню очистки и подготовки SD перед созданием образа # может использоваться как самостоятельный скрипт # set -e LOG_DIR="$HOME/logs" LOG_FILE="$LOG_DIR/safe-cleaner.log" mkdir -p "$LOG_DIR" DATE=$(date '+%Y-%m-%d %H:%M:%S') echo -e "\n[$DATE] === Запуск clean_and_zero ===\n" | tee -a "$LOG_FILE" confirm() { echo -ne "\n$1 [y/N]: " read -r reply [[ "$reply" == "y" || "$reply" == "Y" ]] } get_disk_usage_bytes() { df -B1 / | awk 'NR==2 {print $4}' } human_readable() { numfmt --to=iec-i --suffix=B "$1" } initial_space=$(get_disk_usage_bytes) report_freed_space() { local current_space=$(get_disk_usage_bytes) local diff=$((current_space - initial_space)) echo "📦 Освобождено: $(human_readable "$diff") (до: $(human_readable "$initial_space") → после: $(human_readable "$current_space"))" | tee -a "$LOG_FILE" initial_space=$current_space } run_cleaning() { echo "🧹 Запуск очистки системы..." | tee -a "$LOG_FILE" if confirm "Очистить кэш APT?"; then sudo apt clean && echo "✓ Кэш APT очищен" | tee -a "$LOG_FILE" report_freed_space fi if confirm "Удалить неиспользуемые пакеты (autoremove)?"; then sudo apt autoremove --purge -y | tee -a "$LOG_FILE" report_freed_space fi if confirm "Очистить systemd-журналы старше 7 дней?"; then sudo journalctl --vacuum-time=7d | tee -a "$LOG_FILE" report_freed_space fi if confirm "Очистить /tmp?"; then sudo rm -rf /tmp/* && echo "✓ /tmp очищен" | tee -a "$LOG_FILE" report_freed_space fi if confirm "Удалить архивы логов (*.gz, *.1)?"; then sudo find /var/log -type f \( -name '*.gz' -o -name '*.1' \) -delete && echo "✓ Архивные логи удалены" | tee -a "$LOG_FILE" report_freed_space fi echo -e "\nПроверка содержимого /var/backups:" | tee -a "$LOG_FILE" sudo ls -lh /var/backups | tee -a "$LOG_FILE" if confirm "Удалить безопасные файлы из /var/backups (apt.*, dpkg.status.*, *.gz)?"; then sudo find /var/backups -type f \( -name 'apt.*' -o -name 'dpkg.status.*' -o -name '*.gz' \) -delete echo "✓ Удалено содержимое /var/backups" | tee -a "$LOG_FILE" report_freed_space fi } run_zero_fill() { echo "⚠️ Заполнение свободного места нулями на live-системе. Это может занять время." | tee -a "$LOG_FILE" sudo dd if=/dev/zero of=/zerofill bs=1M status=progress || true sudo rm -f /zerofill echo "✅ Обнуление завершено." | tee -a "$LOG_FILE" report_freed_space } run_zero_fill_img() { echo "📦 Заполнение нулями образа .img/.img.gz (USB/SSD/NAS)" | tee -a "$LOG_FILE" command -v gunzip >/dev/null || { echo "❌ Требуется gunzip"; return; } DEV_PATHS=( $(lsblk -nrpo MOUNTPOINT | grep -E '^/mnt' | sort -u) ) [[ -d /mnt/backup_nas ]] && DEV_PATHS+=("/mnt/backup_nas") if [[ ${#DEV_PATHS[@]} -eq 0 ]]; then echo "❌ Не найдено доступных точек монтирования." | tee -a "$LOG_FILE" return fi echo "💾 Выберите источник .img/.img.gz:" | tee -a "$LOG_FILE" i=1 for path in "${DEV_PATHS[@]}"; do echo "$i - $path" ((i++)) done echo "0 - Отмена" read -rp "👉 Ваш выбор: " path_choice [[ "$path_choice" == "0" || -z "$path_choice" ]] && echo "❎ Отменено." && return TARGET_DIR="${DEV_PATHS[$((path_choice-1))]}" mapfile -t IMG_LIST < <(find "$TARGET_DIR" -maxdepth 1 -type f \( -name "*.img" -o -name "*.img.gz" \)) if [[ ${#IMG_LIST[@]} -eq 0 ]]; then echo "❌ Не найдено .img или .img.gz файлов в $TARGET_DIR" | tee -a "$LOG_FILE" return fi echo "🗂️ Найденные образы:" | tee -a "$LOG_FILE" i=1 for img in "${IMG_LIST[@]}"; do echo "$i - $img" ((i++)) done echo "0 - Отмена" read -rp "👉 Выберите образ: " img_choice [[ "$img_choice" == "0" || -z "$img_choice" ]] && echo "❎ Отменено." && return SELECTED_IMG="${IMG_LIST[$((img_choice-1))]}" TEMP_UNPACKED="" if [[ "$SELECTED_IMG" == *.gz ]]; then echo "[*] Распаковка временного образа..." | tee -a "$LOG_FILE" TEMP_UNPACKED="${SELECTED_IMG%.gz}" gunzip -kf "$SELECTED_IMG" || { echo "❌ Ошибка при распаковке" | tee -a "$LOG_FILE"; return; } [[ ! -f "$TEMP_UNPACKED" ]] && echo "❌ Файл не распаковался" | tee -a "$LOG_FILE" && return IMGFILE="$TEMP_UNPACKED" else IMGFILE="$SELECTED_IMG" fi LOOP_DEV=$(sudo losetup --show -Pf "$IMGFILE") [[ -b "$LOOP_DEV" ]] || { echo "❌ Не удалось создать loop-устройство" | tee -a "$LOG_FILE"; [[ -n "$TEMP_UNPACKED" ]] && rm -f "$TEMP_UNPACKED"; return; } sudo mkdir -p /mnt/rpi_zero PART=$(ls "${LOOP_DEV}"p* 2>/dev/null | tail -n1) [[ -z "$PART" ]] && echo "❌ Не найден раздел в $LOOP_DEV" | tee -a "$LOG_FILE" && sudo losetup -d "$LOOP_DEV" && return sudo mount "$PART" /mnt/rpi_zero || { echo "❌ Ошибка монтирования" | tee -a "$LOG_FILE" sudo losetup -d "$LOOP_DEV" [[ -n "$TEMP_UNPACKED" ]] && rm -f "$TEMP_UNPACKED" return } echo "⚠️ Начинается обнуление..." | tee -a "$LOG_FILE" sudo dd if=/dev/zero of=/mnt/rpi_zero/zerofill bs=1M status=progress || true sudo rm -f /mnt/rpi_zero/zerofill echo "✅ Обнуление завершено в образе" | tee -a "$LOG_FILE" sudo umount /mnt/rpi_zero sudo losetup -d "$LOOP_DEV" [[ -n "$TEMP_UNPACKED" ]] && rm -f "$TEMP_UNPACKED" } # === Меню === while true; do echo "" echo "🧼 Меню очистки SD перед созданием образа:" echo " 1 - Очистить систему (APT, логи, временные файлы...)" echo " 2 - Заполнить свободное место нулями (на live-системе)" echo " 3 - Заполнить нулями образ .img или .img.gz (USB/SSD/NAS)" echo " 0 - ↩ Вернуться в главное меню" echo " 00 - ❌ Выход" echo "" read -rp "👉 Ваш выбор: " main_choice case "$main_choice" in 1) run_cleaning ;; 2) run_zero_fill ;; 3) run_zero_fill_img ;; 0) break ;; 00) echo "🚪 Выход."; exit 0 ;; *) echo "❗ Неверный ввод" ;; esac done echo "✅ Завершено. Лог: $LOG_FILE" exit 0
projects/linux/manual_backup_scripts/clean.1744061314.txt.gz · Последнее изменение: 2025/04/08 00:28 —