Инструменты пользователя

Инструменты сайта


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 —

Если не указано иное, содержимое этой вики предоставляется на условиях следующей лицензии: CC Attribution 4.0 International
CC Attribution 4.0 International Donate Powered by PHP Valid HTML5 Valid CSS Driven by DokuWiki