最後活躍 1 day ago

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

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