<===

ProNotes

2025-09-19 14:40:51
### Методика автоматического теста и пометки плохих секторов с помощью smartctl

Поскольку данные на диске `/dev/sdd` не важны и диск будет форматирован в произвольную файловую систему после низкоуровневого маркирования, мы можем использовать **разрушительные тесты**, которые ускорят выявление и переназначение плохих секторов. `smartctl` (из пакета `smartmontools`) позволяет запускать самотестирование диска, которое автоматически сканирует поверхность и добавляет повреждённые сектора в список ожидающих переназначения (`Current_Pending_Sector`). Для автоматической пометки (переназначения) секторов контроллер диска должен записать в них данные — это можно сделать с помощью команды записи на весь диск (например, `dd`), что вызовет автоматическое переназначение всех выявленных секторов.

**Предупреждения и предпосылки**:
- **Установка `smartmontools`**: Если не установлено, выполните:
  - Для Ubuntu/Debian: `sudo apt update && sudo apt install smartmontools`
  - Для Fedora: `sudo dnf install smartmontools`
  - Для Arch: `sudo pacman -S smartmontools`
- **Размонтирование диска**: Перед тестами убедитесь, что `/dev/sdd` не смонтирован и не используется:
  ```bash
  sudo umount /dev/sdd
  sudo lsof /dev/sdd
  sudo fuser -m /dev/sdd
  sudo fuser -k /dev/sdd  # Завершить процессы, если нужно
  ```
- **Риск**: Тесты SMART (даже длинный) — это в основном чтение, но запись для переназначения уничтожит все данные. Поскольку данные не нужны, это безопасно. Не используйте на SSD, если не хотите ускоренного износа (для SSD лучше полагаться на TRIM после форматирования).
- **Время**: Длинный тест может занять часы или дни (для 16 ТБ — до 20–40 часов).
- **Ограничения**: Не все диски поддерживают полное автоматическое переназначение через SMART. Если пул запасных секторов исчерпан (проверьте `Reallocated_Sector_Ct` в SMART), новые переназначения невозможны — в этом случае замените диск.
- **Автоматизация**: Процесс можно автоматизировать в скрипте Bash, но для простоты опишу пошагово с примерами.

#### Шаг 1: Проверка поддержки SMART и базового состояния диска
Убедитесь, что диск поддерживает SMART и проверьте текущее состояние:
```bash
sudo smartctl -i /dev/sdd  # Проверка поддержки SMART
sudo smartctl -a /dev/sdd  # Полный отчёт SMART
```
- Ищите атрибуты:
  - `Reallocated_Sector_Ct`: Текущее количество переназначенных секторов.
  - `Current_Pending_Sector`: Сектора, ожидающие переназначения (цель — выявить и обнулить это значение).
  - `Uncorrectable_Error_Count`: Некорректируемые ошибки.
- Если `SMART support is: Enabled`, продолжайте. Если нет, включите: `sudo smartctl -s on /dev/sdd`.

В вашем примере: Если в отчёте уже видны `Current_Pending_Sector` > 0 (например, из-за секторов `9564478768`, `9761644072`, `9564479712`, `9564479720`), тест поможет подтвердить и расширить список.

#### Шаг 2: Запуск автоматического теста SMART
Запустите **длинный тест** (`long`), который автоматически сканирует весь диск на чтение, выявляя повреждённые сектора и добавляя их в `Current_Pending_Sector`. Это неразрушительный тест (только чтение), но эффективный для выявления проблем.
```bash
sudo smartctl -t long /dev/sdd  # Запуск длинного теста
```
- Тест запустится в фоновом режиме. Проверьте прогресс:
  ```bash
  sudo smartctl -a /dev/sdd | grep "Self-test execution status"
  ```
- По завершении проверьте результаты:
  ```bash
  sudo smartctl -l selftest /dev/sdd  # Лог тестов
  sudo smartctl -a /dev/sdd  # Обновлённый отчёт SMART
  ```
- Если тест найдёт новые плохие сектора, они появятся в `Current_Pending_Sector`. В вашем случае это может подтвердить сектора из `dmesg` (`9564478768`, `9761644072`) и `badblocks` (`9564479712`, `9564479720`), а также выявить дополнительные.

**Автоматизация**: Чтобы подождать завершения теста в скрипте:
```bash
#!/bin/bash
DEVICE="/dev/sdd"
sudo smartctl -t long $DEVICE
while sudo smartctl -a $DEVICE | grep "Self-test routine in progress"; do
    sleep 60  # Проверять каждую минуту
done
sudo smartctl -l selftest $DEVICE
sudo smartctl -a $DEVICE
```

#### Шаг 3: Автоматическая пометка (переназначение) выявленных секторов
После теста сектора в `Current_Pending_Sector` ожидают переназначения. Чтобы автоматически пометить их (заставить контроллер переназначить), нужно записать данные в эти сектора. Поскольку данные не нужны, можно автоматически записать нули на **весь диск** с помощью `dd` — это разрушительный процесс, который вызовет переназначение всех pending секторов.
```bash
sudo dd if=/dev/zero of=/dev/sdd bs=4M status=progress
```
- `bs=4M`: Размер блока для ускорения (можно увеличить до 16M для больших дисков).
- Это перезапишет весь диск (16 ТБ займёт часы), заставляя контроллер переназначить все выявленные плохие сектора (включая ваши `9564478768`, `9761644072`, `9564479712`, `9564479720`).
- **Предупреждение**: Это полностью уничтожит все данные и файловую систему XFS. Убедитесь, что диск не смонтирован и не используется.

Альтернатива для целевого переназначения (если хотите избежать полной перезаписи, но это менее автоматический):
- Если SMART показывает конкретные сектора в логе ошибок (`smartctl -l error /dev/sdd`), используйте `hdparm` для каждого:
  ```bash
  sudo hdparm --write-sector 9564478768 /dev/sdd
  sudo hdparm --write-sector 9761644072 /dev/sdd
  sudo hdparm --write-sector 9564479712 /dev/sdd
  sudo hdparm --write-sector 9564479720 /dev/sdd
  ```
- Но для автоматического — `dd` лучше, так как охватывает все pending сектора без ручного перечисления.

Проверьте после записи:
```bash
sudo smartctl -a /dev/sdd
```
- `Current_Pending_Sector` должен стать 0, а `Reallocated_Sector_Ct` увеличиться на количество переназначенных секторов.

#### Шаг 4: Форматирование диска в произвольную ФС
После переназначения секторов на низком уровне форматируйте диск в желаемую файловую систему. Плохие сектора уже исключены контроллером, так что новая ФС не будет их использовать.
- Пример для XFS (как было):
  ```bash
  sudo mkfs.xfs -f /dev/sdd
  ```
- Для ext4:
  ```bash
  sudo mkfs.ext4 /dev/sdd
  ```
- Для NTFS (если нужно для Windows-совместимости, установите `ntfs-3g`):
  ```bash
  sudo mkfs.ntfs -Q /dev/sdd
  ```
- Для Btrfs:
  ```bash
  sudo mkfs.btrfs -f /dev/sdd
  ```

После форматирования смонтируйте и протестируйте:
```bash
sudo mount /dev/sdd /mnt
sudo dd if=/dev/zero of=/mnt/testfile bs=1G count=1
sudo rm /mnt/testfile
sudo umount /mnt
```
Проверьте `dmesg` на отсутствие новых ошибок:
```bash
dmesg | grep -i "error.*sdd"
```

#### Шаг 5: Полная автоматизация в скрипте Bash
Для полностью автоматического процесса (запуск теста, ожидание, перезапись, форматирование в XFS):
```bash
#!/bin/bash
DEVICE="/dev/sdd"
FS_TYPE="xfs"  # Измените на ext4, ntfs и т.д.

# Размонтировать и проверить
sudo umount $DEVICE
sudo fuser -k $DEVICE

# Запуск длинного теста SMART
sudo smartctl -t long $DEVICE
while sudo smartctl -a $DEVICE | grep "Self-test routine in progress"; do
    sleep 60
done
sudo smartctl -l selftest $DEVICE
sudo smartctl -a $DEVICE > smart_report.txt  # Сохранить отчёт

# Автоматическая перезапись для переназначения (разрушительный)
sudo dd if=/dev/zero of=$DEVICE bs=4M status=progress

# Проверка SMART после переназначения
sudo smartctl -a $DEVICE > smart_report_after.txt

# Форматирование в выбранную ФС
case $FS_TYPE in
  xfs) sudo mkfs.xfs -f $DEVICE ;;
  ext4) sudo mkfs.ext4 $DEVICE ;;
  ntfs) sudo mkfs.ntfs -Q $DEVICE ;;
  *) echo "Неизвестная ФС" ;;
esac

echo "Процесс завершён. Проверьте smart_report.txt и dmesg."
```
- Сохраните как `disk_repair.sh`, сделайте исполняемым: `chmod +x disk_repair.sh`, запустите: `sudo ./disk_repair.sh`.
- **Предупреждение**: Это полностью уничтожит диск. Убедитесь в правильном `$DEVICE` (не укажите системный диск по ошибке!).

Эта методика использует `smartctl` для автоматического теста и выявления, а `dd` для автоматической пометки через перезапись. После переназначения форматирование обеспечит, что новая ФС не использует плохие сектора. Если после теста `Current_Pending_Sector` = 0, перезапись может быть опциональной. Поделитесь результатами `smartctl -a /dev/sdd` после теста, если нужны уточнения!
← Previous Next →
Back to list