urocibg ревизій цього gist 1 day ago. До ревизії
1 file changed, 2 insertions, 2 deletions
repair-ssd.sh
| @@ -3,8 +3,8 @@ | |||
| 3 | 3 | # ============================================================= | |
| 4 | 4 | # SSD Repair Script (ext4/auto) - Proxmox Edition (Final) | |
| 5 | 5 | # ============================================================= | |
| 6 | - | ## 🔙 Обратно към статията | |
| 7 | - | https://itpraktika.com/proxmox-ssd-read-only-fix/ | |
| 6 | + | # 🔙 Обратно към статията: | |
| 7 | + | # https://itpraktika.com/proxmox-ssd-read-only-fix/ | |
| 8 | 8 | ||
| 9 | 9 | MOUNT_POINT="/mnt/backup" | |
| 10 | 10 | DEVICE="/dev/sda1" | |
urocibg ревизій цього gist 1 day ago. До ревизії
1 file changed, 2 insertions
repair-ssd.sh
| @@ -3,6 +3,8 @@ | |||
| 3 | 3 | # ============================================================= | |
| 4 | 4 | # SSD Repair Script (ext4/auto) - Proxmox Edition (Final) | |
| 5 | 5 | # ============================================================= | |
| 6 | + | ## 🔙 Обратно към статията | |
| 7 | + | https://itpraktika.com/proxmox-ssd-read-only-fix/ | |
| 6 | 8 | ||
| 7 | 9 | MOUNT_POINT="/mnt/backup" | |
| 8 | 10 | DEVICE="/dev/sda1" | |
urocibg ревизій цього gist 1 day ago. До ревизії
1 file changed, 129 insertions
repair-ssd.sh(файл створено)
| @@ -0,0 +1,129 @@ | |||
| 1 | + | #!/bin/bash | |
| 2 | + | ||
| 3 | + | # ============================================================= | |
| 4 | + | # SSD Repair Script (ext4/auto) - Proxmox Edition (Final) | |
| 5 | + | # ============================================================= | |
| 6 | + | ||
| 7 | + | MOUNT_POINT="/mnt/backup" | |
| 8 | + | DEVICE="/dev/sda1" | |
| 9 | + | LOG_FILE="repair.log" | |
| 10 | + | ||
| 11 | + | # Цветове | |
| 12 | + | RED="\e[31m" | |
| 13 | + | GREEN="\e[32m" | |
| 14 | + | YELLOW="\e[33m" | |
| 15 | + | CYAN="\e[36m" | |
| 16 | + | RESET="\e[0m" | |
| 17 | + | ||
| 18 | + | # Проверка за root | |
| 19 | + | if [ "$EUID" -ne 0 ]; then | |
| 20 | + | echo -e "${RED}❌ Стартирай скрипта като root (sudo)!${RESET}" | |
| 21 | + | exit 1 | |
| 22 | + | fi | |
| 23 | + | ||
| 24 | + | # Подобрена лог функция (с разделител за по-добра четимост) | |
| 25 | + | log_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 | + | ||
| 32 | + | clear | |
| 33 | + | echo -e "${CYAN}==========================================${RESET}" | |
| 34 | + | echo -e "${CYAN} SSD REPAIR TOOL - СИСТЕМА ЗА БЕКЪПИ ${RESET}" | |
| 35 | + | echo -e "${CYAN}==========================================${RESET}" | |
| 36 | + | echo -e "Лог файл: ${YELLOW}$LOG_FILE${RESET}" | |
| 37 | + | echo "" | |
| 38 | + | ||
| 39 | + | # Потвърждение | |
| 40 | + | echo -e "${YELLOW}ВНИМАНИЕ: Скриптът ще извърши fsck върху $DEVICE.${RESET}" | |
| 41 | + | read -p "Сигурен ли си? (y/n): " confirm | |
| 42 | + | ||
| 43 | + | if [[ $confirm != [yY] ]]; then | |
| 44 | + | echo -e "${RED}❌ Операцията е отменена.${RESET}" | |
| 45 | + | exit 0 | |
| 46 | + | fi | |
| 47 | + | ||
| 48 | + | # Добавяме празен ред в лога за разделител между отделните пускания | |
| 49 | + | echo "----------------------------------------------------------" >> "$LOG_FILE" | |
| 50 | + | log_message "${CYAN}===> Старт на операция за $DEVICE${RESET}" "STARTING NEW SESSION" | |
| 51 | + | ||
| 52 | + | # 1. Проверка mount point | |
| 53 | + | if [ ! -d "$MOUNT_POINT" ]; then | |
| 54 | + | log_message "${RED}❌ Липсва mount point: $MOUNT_POINT${RESET}" "ERROR: Missing mount point directory" | |
| 55 | + | exit 1 | |
| 56 | + | fi | |
| 57 | + | ||
| 58 | + | # 2. Проверка дали е монтиран и unmount | |
| 59 | + | if 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 | |
| 83 | + | else | |
| 84 | + | log_message "${GREEN}✅ Вече е unmounted${RESET}" "Status: Already unmounted" | |
| 85 | + | fi | |
| 86 | + | ||
| 87 | + | # 3. fsck (Най-важната част) | |
| 88 | + | log_message "${CYAN}===> Стартиране на fsck...${RESET}" "Action: Running fsck" | |
| 89 | + | fsck -fvy "$DEVICE" | |
| 90 | + | FSCK_RET=$? | |
| 91 | + | ||
| 92 | + | if [ $FSCK_RET -lt 4 ]; then | |
| 93 | + | log_message "${GREEN}✅ fsck OK (код: $FSCK_RET)${RESET}" "Result: fsck Success" | |
| 94 | + | else | |
| 95 | + | log_message "${RED}❌ fsck проблем (код: $FSCK_RET)${RESET}" "Result: fsck Critical Failure" | |
| 96 | + | exit 1 | |
| 97 | + | fi | |
| 98 | + | ||
| 99 | + | # 4. mount обратно | |
| 100 | + | log_message "${CYAN}===> Монтиране...${RESET}" "Action: Remounting" | |
| 101 | + | mount "$DEVICE" "$MOUNT_POINT" | |
| 102 | + | ||
| 103 | + | if [ $? -ne 0 ]; then | |
| 104 | + | log_message "${RED}❌ mount грешка${RESET}" "Result: Mount Failed" | |
| 105 | + | exit 1 | |
| 106 | + | else | |
| 107 | + | log_message "${GREEN}✅ mount OK${RESET}" "Result: Mount Success" | |
| 108 | + | fi | |
| 109 | + | ||
| 110 | + | # 5. Тест за запис | |
| 111 | + | TEST_FILE="$MOUNT_POINT/repair_test_$(date +%s).tmp" | |
| 112 | + | if touch "$TEST_FILE" 2>/dev/null; then | |
| 113 | + | rm "$TEST_FILE" | |
| 114 | + | log_message "${GREEN}✅ WRITE TEST OK${RESET}" "Write Test: PASSED" | |
| 115 | + | else | |
| 116 | + | log_message "${RED}❌ WRITE TEST FAIL (Read-Only?)${RESET}" "Write Test: FAILED" | |
| 117 | + | fi | |
| 118 | + | ||
| 119 | + | # 6. SMART и Kernel logs (само на екрана, за да не пълним лог файла с излишно инфо) | |
| 120 | + | echo -e "\n${CYAN}===> Последни kernel съобщения:${RESET}" | |
| 121 | + | dmesg | tail -n 15 | |
| 122 | + | ||
| 123 | + | PARENT_DISK=$(lsblk -no PKNAME "$DEVICE") | |
| 124 | + | if [ -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" | |
| 127 | + | fi | |
| 128 | + | ||
| 129 | + | log_message "${GREEN}===> ВСИЧКО ЗАВЪРШИ УСПЕШНО${RESET}" "SESSION FINISHED SUCCESSFULLY" | |