Skip to content

troubleshooting

andyceo edited this page May 27, 2022 · 3 revisions

На этой странице рассматриваются различные проблемы, которые могут возникнуть с дисками и/или файловыми системами, и методы их починки. Диагностика и починка файловой системы Ext4 рассматривается на странице, посвященной Ext4

Починка на уровне самого диска (S.M.A.R.T.)

На современных винчестерах бед блоки ремапятся на аппаратном уровне автоматически, делается это в несколько шагов. С начала сектора на подозрении попадают в очередь Reallocated_Event_Count, в смарте винта можно посмотреть сколько таких секторов на текущий момент:

196 Reallocated_Event_Count 0x0032 200 200 000 Old_age Always - 0

если после нескольких проходов диагноз подтверждается, то контроллер винчестера их перемещает в очередь Current_Pending_Sector, параметр в смарте отражает количество таких секторов в очереди:

197 Current_Pending_Sector 0x0032 200 200 000 Old_age Always - 0

и только после этого такие сектора ремапятся и попадают в таблицу переназначенных секторов, количество таких секторов мы видим в параметре смарта:

5 Reallocated_Sector_Ct 0x0033 200 200 140 Pre-fail Always - 0

Это в упрощенном варианте. Так что если у Вас во всех трех пунктах значение столбца RAW не нулевые - значит ваш винчестер активно отбрасывает коньки.

Можно заставить винчестер заремапить тот или иной сектор вручную, с помощью утилиты hdparm. Эта утилита читает диск напрямую, в обход всех файловых систем и слоя блочного доступа в Linux. Нужно знать номер сектора, который вы хотите заремапить. См. раздел Диагностика, чтобы узнать номер сектора/секторов. Допустим, у нас есть номер плохого сектора и он равен 1261069669.

Убедимся, что этот сектор действительно не может быть прочитан:

sudo hdparm --read-sector 1261069669 /dev/sda

Вывод:

/dev/sda: Input/Output error

Будьте внимательны, такой вывод может быть дан и в том случае, если вы указали номер сектора за пределами всего диска вообще. Также попробуйте почитать соседние сектора, 1261069668 и 1261069670.

Теперь запишем в сектор нули. Это заставит диск перераспределить плохой сектор в другое место (sector reallocate). Имейте в виду, что прошлые данные в этом секторе будут потеряны навсегда!

sudo hdparm --write-sector 1261069669 /dev/sda

Вывод:

/dev/sda:
Use of --write-sector is VERY DANGEROUS.
You are trying to deliberately overwrite a low-level sector on the media
This is a BAD idea, and can easily result in total data loss.
Please supply the --yes-i-know-what-i-am-doing flag if you really want this.

Program aborted.

Нужно предоставить флаг --yes-i-know-what-i-am-doing, чтобы команда была действительно выполнена:

sudo hdparm --write-sector 1261069669 –yes-i-know-what-i-am-doing /dev/sda

Вывод:

/dev/sda: re-writing sector 1261069669: succeeded

Теперь, можно использовать hdparm снова, чтобы проверить доступность перераспределенных секторов:

sudo hdparm --read-sector 1261069669 /dev/sda

Вывод:

/dev/sda:
reading sector 1261069669: succeeded
(... выведется много нулей...)

Проверим через S.M.A.R.T., что значения соответствующих счетчиков изменились:

sudo smartctl -a -d ata /dev/sda | grep -i reallocated

Вывод:

5 Reallocated_Sector_Ct   0x0033   100   100   005    Pre-fail  Always       –       2
196 Reallocated_Event_Count 0x0032   100   100   000    Old_age   Always       –       2

Эту процедуру нужно повторить для всех сбойных секторов.

Этот алгоритм запрограммирован в скрипте hdcure.sh. Используйте его аккуратно и на свой страх и риск!

Диагностика

О проблемах с диском или файловой системой можно узнать несколькими способами. Рассмотрим два из них:

  1. S.M.A.R.T
  2. dmesg
  3. journalctl (для систем с systemd)

S.M.A.R.T.

В первом случае, любой из смарт-тестов, закончившийся ошибкой, или не закончившийся из-за ошибки, говорит о проблеме с диском. Ясно, что из-за проблемы с диском может быть проблема с файловой системой, но она может никак себя не проявлять, если проблемное место пока не используется файловой системой. Запустите полный смарт-тест в фоновом режиме, чтобы проверить диск:

sudo smartctl -t long /dev/sda

Можно периодически подсматривать за прогрессом (-d ata представляет SATA-диск):

sudo smartctl -d ata -a /dev/sda

или

sudo smartctl -c /dev/sda | grep remain -B 1

В случае ошибок, тест не будет завершен, а при просмотре логов смарта командой sudo smartctl -d ata -a /dev/sda можно будет заметить следующие строки:

SMART Self-test log structure revision number 1
Num  Test_Description    Status                  Remaining  LifeTime(hours)  LBA_of_first_error
# 1  Extended offline    Completed: read failure       50%     10623         893916872
# 2  Short offline       Completed: read failure       90%     10621         893916872
# 3  Short offline       Completed: read failure       90%     10621         893916872
# 4  Extended offline    Completed: read failure       50%     10620         893916872

После этого, надо выяснить, какому разделу (partition) принадлежит этот битый лог, какой файловой системе, и запустить команды из пункта Починка.

dmesg

Во втором, по мере использования компьютера, и чтения данных с диска, можно заметить в журнале примерно следующее:

[149070.165738] ata1.00: exception Emask 0x0 SAct 0x0 SErr 0x0 action 0x0
[149070.165749] ata1.00: irq_stat 0x40000001
[149070.165756] ata1.00: failed command: READ DMA EXT
[149070.165768] ata1.00: cmd 25/00:08:58:3e:59/00:00:39:00:00/e0 tag 18 dma 4096 in
[149070.165768]          res 51/40:08:58:3e:59/00:00:39:00:00/e0 Emask 0x9 (media error)
[149070.165774] ata1.00: status: { DRDY ERR }
[149070.165778] ata1.00: error: { UNC }
[149070.510765] ata1.00: configured for UDMA/133
[149070.510799] sd 0:0:0:0: [sda]  
[149070.510804] Result: hostbyte=DID_OK driverbyte=DRIVER_SENSE
[149070.510808] sd 0:0:0:0: [sda]  
[149070.510812] Sense Key : Medium Error [current] [descriptor]
[149070.510819] Descriptor sense data with sense descriptors (in hex):
[149070.510822]         72 03 11 04 00 00 00 0c 00 0a 80 00 00 00 00 00 
[149070.510838]         39 59 3e 58 
[149070.510847] sd 0:0:0:0: [sda]  
[149070.510851] Add. Sense: Unrecovered read error - auto reallocate failed
[149070.510856] sd 0:0:0:0: [sda] CDB: 
[149070.510859] Read(10): 28 00 39 59 3e 58 00 00 08 00
[149070.510874] end_request: I/O error, dev sda, sector 962149976
[149070.510906] ata1: EH complete

Эти записи попадают в журнал, когда невозможно прочитать сектор, в данном случае - сектор 962149976. Также как и в случае со S.M.A.R.T., нужно выяснить, на какой раздел и какую файловую систему приходится данный сектор, и запустить на нем команды из пункта Починка.

Посмотреть все найденные плохие сектора за время текущей сессии можно следующей командой:

dmesg | grep "dev sda, sector"

Получите примерно следующий вывод:

[195026.031492] end_request: I/O error, dev sda, sector 962151624
[195027.962659] end_request: I/O error, dev sda, sector 962151624
[195152.097729] end_request: I/O error, dev sda, sector 962119200
[209373.151869] end_request: I/O error, dev sda, sector 893916872
[209375.274001] end_request: I/O error, dev sda, sector 893916872
[209377.180616] end_request: I/O error, dev sda, sector 893918616
[209379.111782] end_request: I/O error, dev sda, sector 893918616

Можно собрать все подобные сектора в один файл:

dmesg | grep "dev sda, sector" | cut -d " " -f 8 | uniq | sort > badsectors.txt

journalctl

Нижеследующая команда сканирует записи за все доступное в журнале время, выявляет сообщения об ошибках для диска sda, затем выводит номера секторов, сортирует их (это требуется для последующей работы команды uniq), и записывает в файл с указанием количества, сколько раз тот или иной сектор встречался в логах (иными словами, формирует файл, в котором сохранены номера проблемных секторов с указанием количества неудачных попыток чтения того или иного сектора).

Не забудьте поменять sda на нужный диск:

sudo journalctl -p err | grep 'print_req_error.*dev sda, sector' | awk '{print $12}' | sort | uniq -c > sda_badblocks.txt

После выполнения в файле sda_badblocks.txt будут перечислены найденные проблемные сектора, над которыми нужно запустить команды из пункта Починка.

Утилиты и различные кейсы

  • права для папок внутри /home по умолчанию 750

Ссылки

Устройства хранения: диски, блочные устройства, файловые системы

В этом разделе находится информация об устройствах хранения, файловых системах и утилитах для работы с ними.

Clone this wiki locally