<===

ProNotes

2025-09-19 14:27:00
Пометка повреждённых секторов, замеченных в логах `dmesg`, на уровне контроллера диска — это процесс, который позволяет исключить проблемные сектора из использования, чтобы предотвратить дальнейшие ошибки чтения/записи. Ваш случай с `/dev/sdd` (XFS, повреждённые сектора `9564479712`, `9564479720` и потенциально `9761644072`) идеально подходит для демонстрации этого процесса. Я опишу пошаговый алгоритм, начиная с анализа `dmesg`, тестирования секторов и заканчивая использованием `hdparm --write-sector` для переназначения. Также я учту, что восстановление данных не требуется, и диск использует файловую систему XFS.

---

### Шаг 1: Анализ логов `dmesg` для выявления повреждённых секторов
Логи `dmesg` содержат информацию об ошибках диска, таких как `UNC` (некорректируемые ошибки), которые указывают на повреждённые сектора. В вашем случае логи показали:

```
[18682.865921] critical medium error, dev sdd, sector 9564478768 op 0x0:(READ) flags 0x0 phys_seg 32 prio class 2
[19026.015367] critical medium error, dev sdd, sector 9761644072 op 0x0:(READ) flags 0x80700 phys_seg 64 prio class 2
```

- **Повреждённые сектора**: `9564478768` и `9761644072`.
- **Тип ошибки**: `UNC` (Uncorrectable Error) — сектор не читается даже после повторных попыток.
- **Диск**: `/dev/sdd`.

#### Действия:
1. **Просмотр логов `dmesg`**:
   Чтобы убедиться, что вы нашли все проблемные сектора, выполните:
   ```bash
   dmesg | grep -i "error.*sdd"
   ```
   Это покажет все ошибки, связанные с `/dev/sdd`. Ищите строки с `critical medium error` или `Sense Key : Medium Error`, где указаны номера секторов (например, `sector 9564478768`).

2. **Сохранение списка секторов**:
   Запишите номера секторов из логов. В вашем случае это:
   - `9564478768`
   - `9761644072`

   Также учтём сектора, найденные в тесте `badblocks` (с учётом пересчёта из блоков 4096 байт в сектора 512 байт):
   - `9564479712` (блок `1195559964` × 8)
   - `9564479720` (блок `1195559965` × 8)

   Создайте файл с этими секторами для дальнейшей работы:
   ```bash
   echo -e "9564478768\n9564479712\n9564479720\n9761644072" > bad_sectors.txt
   ```

---

### Шаг 2: Проверка диска и подтверждение повреждённых секторов
Прежде чем помечать сектора как неиспользуемые, полезно подтвердить, что они действительно повреждены, и проверить, нет ли других проблемных секторов вблизи. Для этого можно использовать `badblocks` в неразрушительном режиме (`-n`), как вы делали ранее. Поскольку `/dev/sdd` имеет файловую систему XFS с размером блока 4096 байт, а физический размер сектора диска 512 байт, мы будем использовать `-b 4096` для совместимости с XFS или `-b 512` для точной проверки секторов.

#### Проверка первого участка (окрестности сектора `9564478768`):
- Пересчёт в блоки 4096 байт: `9564478768 ÷ 8 = 1195559846`.
- Диапазон ±100 000 блоков (~400 МБ):
  ```bash
  sudo badblocks -n -s -v -f -b 4096 -c 16384 -o badblocks_sdd_1.txt /dev/sdd 1195659846 1195459846
  ```

#### Проверка второго участка (окрестности сектора `9761644072`):
- Пересчёт в блоки 4096 байт: `9761644072 ÷ 8 = 1220205509`.
- Диапазон ±100 000 блоков:
  ```bash
  sudo badblocks -n -s -v -f -b 4096 -c 16384 -o badblocks_sdd_2.txt /dev/sdd 1220305509 1220105509
  ```

**Перед запуском**:
- Убедитесь, что диск размонтирован:
  ```bash
  sudo umount /dev/sdd
  ```
  Проверьте, не занят ли диск:
  ```bash
  sudo lsof /dev/sdd
  sudo fuser -m /dev/sdd
  sudo fuser -k /dev/sdd
  ```

#### Обработка результатов:
- Первый тест уже выявил блоки `1195559964` и `1195559965` (сектора `9564479712`, `9564479720`). Если новые тесты найдут дополнительные плохие блоки, добавьте их в `bad_sectors.txt`:
  ```bash
  cat badblocks_sdd_1.txt badblocks_sdd_2.txt | while read block; do echo $((block * 8)) >> bad_sectors.txt; done
  ```
  Это преобразует блоки 4096 байт в сектора 512 байт.

---

### Шаг 3: Проверка состояния диска через SMART
Перед пометкой секторов проверьте состояние диска, чтобы понять, насколько он повреждён:
```bash
sudo smartctl -a /dev/sdd
```
Ищите:
- `Reallocated_Sector_Ct`: Количество переназначенных секторов (рост указывает на деградацию).
- `Current_Pending_Sector`: Сектора, ожидающие переназначения (например, `9564478768`, `9761644072` могут быть здесь).
- `Uncorrectable_Error_Count`: Некорректируемые ошибки.

Если `Current_Pending_Sector` > 0, это подтверждает, что указанные сектора ждут переназначения, и `hdparm --write-sector` поможет завершить процесс.

---

### Шаг 4: Пометка секторов как неиспользуемых с `hdparm`
Команда `hdparm --write-sector` заставляет контроллер диска записать данные в указанный сектор. Если сектор повреждён, контроллер переназначит его на резервный сектор из пула запасных.

#### Пометка известных секторов:
На основе логов `dmesg` и теста `badblocks` у вас есть сектора:
- `9564478768` (из `dmesg`)
- `9564479712` (из `badblocks`)
- `9564479720` (из `badblocks`)
- `9761644072` (из `dmesg`, требует проверки)

Команды для переназначения:
```bash
sudo hdparm --write-sector 9564478768 /dev/sdd
sudo hdparm --write-sector 9564479712 /dev/sdd
sudo hdparm --write-sector 9564479720 /dev/sdd
```
Для сектора `9761644072` дождитесь результатов теста `badblocks` (шаг 2). Если он подтвердится как повреждённый, выполните:
```bash
sudo hdparm --write-sector 9761644072 /dev/sdd
```

**Предупреждение**:
- Команда `--write-sector` разрушительна: данные в указанных секторах будут потеряны. Поскольку вы указали, что восстановление данных не требуется, это безопасно.
- Убедитесь, что диск размонтирован перед выполнением:
  ```bash
  sudo umount /dev/sdd
  ```

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

---

### Шаг 5: Ремонт файловой системы XFS
После переназначения секторов на уровне контроллера нужно убедиться, что файловая система XFS не пытается использовать повреждённые области:
1. **Запустите `xfs_repair`**:
   ```bash
   sudo xfs_repair /dev/sdd
   ```
   - `xfs_repair` проверит файловую систему и попытается переместить данные из повреждённых блоков (если они использовались) или исключить их.
   - Поскольку восстановление данных не требуется, любые потери файлов или метаданных некритичны.

2. **Проверка после ремонта**:
   ```bash
   sudo xfs_repair -n /dev/sdd
   ```
   Опция `-n` покажет, остались ли проблемы.

3. **Если XFS сильно повреждена**:
   Если `xfs_repair` не может восстановить файловую систему, переформатируйте диск:
   ```bash
   sudo mkfs.xfs -f /dev/sdd
   ```
   Поскольку переназначение секторов уже выполнено на уровне контроллера, новая файловая система не будет использовать повреждённые сектора.

---

### Шаг 6: Мониторинг и завершение
После переназначения и ремонта:
1. **Проверьте логи `dmesg`**:
   ```bash
   dmesg | grep -i "error.*sdd"
   ```
   Убедитесь, что ошибки `UNC` для секторов `9564478768`, `9564479712`, `9564479720`, `9761644072` больше не появляются.

2. **Смонтируйте диск и протестируйте**:
   ```bash
   sudo mount /dev/sdd /mnt
   ```
   Попробуйте записать тестовые данные:
   ```bash
   sudo dd if=/dev/zero of=/mnt/testfile bs=1M count=100
   ```
   Если ошибки в `dmesg` не появляются, переназначение и ремонт прошли успешно.

---

### Ваш пример в контексте
1. **Логи `dmesg`**:
   Вы заметили в `dmesg` ошибки `UNC` для секторов `9564478768` и `9761644072` на `/dev/sdd`. Дополнительно тест `badblocks` выявил сектора `9564479712` и `9564479720`.

2. **Подтверждение проблем**:
   Вы запустили `badblocks` для проверки первого участка:
   ```bash
   sudo badblocks -n -s -v -f -b 4096 -c 16384 -o badblocks_sdd_1.txt /dev/sdd 1195659846 1195459846
   ```
   Результат: блоки `1195559964`, `1195559965` (сектора `9564479712`, `9564479720`).

3. **Проверка второго участка**:
   Выполните:
   ```bash
   sudo badblocks -n -s -v -f -b 4096 -c 16384 -o badblocks_sdd_2.txt /dev/sdd 1220305509 1220105509
   ```

4. **Пометка секторов с `hdparm`**:
   Для известных секторов:
   ```bash
   sudo hdparm --write-sector 9564478768 /dev/sdd
   sudo hdparm --write-sector 9564479712 /dev/sdd
   sudo hdparm --write-sector 9564479720 /dev/sdd
   ```
   Если второй тест (`badblocks`) подтвердит сектор `9761644072`, добавьте:
   ```bash
   sudo hdparm --write-sector 9761644072 /dev/sdd
   ```

5. **Ремонт XFS**:
   ```bash
   sudo xfs_repair /dev/sdd
   ```

---

### Следующие шаги
1. Выполните тест `badblocks` для второго участка (`9761644072`):
   ```bash
   sudo badblocks -n -s -v -f -b 4096 -c 16384 -o badblocks_sdd_2.txt /dev/sdd 1220305509 1220105509
   ```
   Поделитесь содержимым `badblocks_sdd_2.txt`.

2. Выполните `hdparm --write-sector` для всех подтверждённых секторов.

3. Проверьте SMART:
   ```bash
   sudo smartctl -a /dev/sdd
   ```
   Поделитесь `Reallocated_Sector_Ct`, `Current_Pending_Sector`, `Uncorrectable_Error_Count`.

4. Выполните `xfs_repair`:
   ```bash
   sudo umount /dev/sdd
   sudo xfs_repair /dev/sdd
   ```

5. Проверьте `dmesg` на отсутствие новых ошибок:
   ```bash
   dmesg | grep -i "error.*sdd"
   ```

Этот процесс обеспечит, что повреждённые сектора будут исключены на уровне контроллера диска, а XFS будет работать корректно. Учитывая ошибки `UNC`, диск может быть ненадёжным, и замена рекомендуется.
← Previous Next →
Back to list