最終更新 1 day ago

SSD Repair Script (ext4/auto) - Proxmox Edition (Final)

修正履歴 4ec1e61e83fe2c36213fcadfb8bdcf7322483d20

repair-ssd.sh Raw
1#!/bin/bash
2
3# =============================================================
4# SSD Repair Script (ext4/auto) - Proxmox Edition (Final)
5# =============================================================
6
7MOUNT_POINT="/mnt/backup"
8DEVICE="/dev/sda1"
9LOG_FILE="repair.log"
10
11# Цветове
12RED="\e[31m"
13GREEN="\e[32m"
14YELLOW="\e[33m"
15CYAN="\e[36m"
16RESET="\e[0m"
17
18# Проверка за root
19if [ "$EUID" -ne 0 ]; then
20 echo -e "${RED}❌ Стартирай скрипта като root (sudo)!${RESET}"
21 exit 1
22fi
23
24# Подобрена лог функция (с разделител за по-добра четимост)
25log_message() {
26 echo -e "$1"
27 # Записваме в лога без цветови кодове (за чист текст)
28 local clean_msg=$(echo -e "$2" | sed 's/\x1b\[[0-9;]*m//g')
29 echo "$(date '+%Y-%m-%d %H:%M:%S') - $clean_msg" >> "$LOG_FILE"
30}
31
32clear
33echo -e "${CYAN}==========================================${RESET}"
34echo -e "${CYAN} SSD REPAIR TOOL - СИСТЕМА ЗА БЕКЪПИ ${RESET}"
35echo -e "${CYAN}==========================================${RESET}"
36echo -e "Лог файл: ${YELLOW}$LOG_FILE${RESET}"
37echo ""
38
39# Потвърждение
40echo -e "${YELLOW}ВНИМАНИЕ: Скриптът ще извърши fsck върху $DEVICE.${RESET}"
41read -p "Сигурен ли си? (y/n): " confirm
42
43if [[ $confirm != [yY] ]]; then
44 echo -e "${RED}❌ Операцията е отменена.${RESET}"
45 exit 0
46fi
47
48# Добавяме празен ред в лога за разделител между отделните пускания
49echo "----------------------------------------------------------" >> "$LOG_FILE"
50log_message "${CYAN}===> Старт на операция за $DEVICE${RESET}" "STARTING NEW SESSION"
51
52# 1. Проверка mount point
53if [ ! -d "$MOUNT_POINT" ]; then
54 log_message "${RED}❌ Липсва mount point: $MOUNT_POINT${RESET}" "ERROR: Missing mount point directory"
55 exit 1
56fi
57
58# 2. Проверка дали е монтиран и unmount
59if mountpoint -q "$MOUNT_POINT"; then
60 log_message "${YELLOW}⚠️ Дискът е монтиран.${RESET}" "Status: Mounted"
61
62 # Показваме кои процеси пречат
63 BUSY_PIDS=$(fuser -m "$MOUNT_POINT" 2>/dev/null)
64 if [ -n "$BUSY_PIDS" ]; then
65 echo -e "${CYAN}Процеси използващи диска (PIDs):${RESET} $BUSY_PIDS"
66 read -p "Да бъдат ли спрени процесите автоматично? (y/n): " kill_confirm
67 if [[ $kill_confirm == [yY] ]]; then
68 log_message "${YELLOW}⚠️ Спиране на процеси...${RESET}" "Action: Killing processes $BUSY_PIDS"
69 fuser -km "$MOUNT_POINT" 2>/dev/null
70 sleep 2
71 fi
72 fi
73
74 echo -e "${CYAN}Опит за unmount...${RESET}"
75 umount -l "$MOUNT_POINT" # Добавено -l за по-сигурен unmount
76
77 if mountpoint -q "$MOUNT_POINT"; then
78 log_message "${RED}❌ Unmount неуспешен!${RESET}" "ERROR: Umount failed"
79 exit 1
80 else
81 log_message "${GREEN}✅ Успешен unmount${RESET}" "Status: Unmount OK"
82 fi
83else
84 log_message "${GREEN}✅ Вече е unmounted${RESET}" "Status: Already unmounted"
85fi
86
87# 3. fsck (Най-важната част)
88log_message "${CYAN}===> Стартиране на fsck...${RESET}" "Action: Running fsck"
89fsck -fvy "$DEVICE"
90FSCK_RET=$?
91
92if [ $FSCK_RET -lt 4 ]; then
93 log_message "${GREEN}✅ fsck OK (код: $FSCK_RET)${RESET}" "Result: fsck Success"
94else
95 log_message "${RED}❌ fsck проблем (код: $FSCK_RET)${RESET}" "Result: fsck Critical Failure"
96 exit 1
97fi
98
99# 4. mount обратно
100log_message "${CYAN}===> Монтиране...${RESET}" "Action: Remounting"
101mount "$DEVICE" "$MOUNT_POINT"
102
103if [ $? -ne 0 ]; then
104 log_message "${RED}❌ mount грешка${RESET}" "Result: Mount Failed"
105 exit 1
106else
107 log_message "${GREEN}✅ mount OK${RESET}" "Result: Mount Success"
108fi
109
110# 5. Тест за запис
111TEST_FILE="$MOUNT_POINT/repair_test_$(date +%s).tmp"
112if touch "$TEST_FILE" 2>/dev/null; then
113 rm "$TEST_FILE"
114 log_message "${GREEN}✅ WRITE TEST OK${RESET}" "Write Test: PASSED"
115else
116 log_message "${RED}❌ WRITE TEST FAIL (Read-Only?)${RESET}" "Write Test: FAILED"
117fi
118
119# 6. SMART и Kernel logs (само на екрана, за да не пълним лог файла с излишно инфо)
120echo -e "\n${CYAN}===> Последни kernel съобщения:${RESET}"
121dmesg | tail -n 15
122
123PARENT_DISK=$(lsblk -no PKNAME "$DEVICE")
124if [ -n "$PARENT_DISK" ] && command -v smartctl >/dev/null 2>&1; then
125 echo -e "\n${CYAN}===> SMART статус (/dev/$PARENT_DISK):${RESET}"
126 smartctl -H "/dev/$PARENT_DISK" | grep -iE "result|status|health"
127fi
128
129log_message "${GREEN}===> ВСИЧКО ЗАВЪРШИ УСПЕШНО${RESET}" "SESSION FINISHED SUCCESSFULLY"