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

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


projects:linux:manual_backup_scripts:clean

Различия

Показаны различия между двумя версиями страницы.

Ссылка на это сравнение

Следующая версия
Предыдущая версия
projects:linux:manual_backup_scripts:clean [2025/04/07 10:26] – создано projects:linux:manual_backup_scripts:clean [2025/04/11 17:41] (текущий)
Строка 1: Строка 1:
 ====== Легкая очистка системы от мусора ====== ====== Легкая очистка системы от мусора ======
  
-Входит в набор [[projects:linux:manual_backup_scripts|rPi Seal]]+//**Входит в набор [[projects:linux:manual_backup_scripts|rPi Seal]]**// 
 + 
 +<code bash 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 
 + 
 +</code> 
 +===== ******* ===== 
 +[[https://boosty.to/takraztak/donate|Поддержать через Boosty]]
projects/linux/manual_backup_scripts/clean.1744010786.txt.gz · Последнее изменение: 2025/04/07 10:26 —

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