Файловая система доступна только для чтения: различия между версиями
(https://lists.altlinux.org/pipermail/sisyphus 08.05.2018 19:47 Игорь Андросов <blacester@gmail.com>) |
(Раздел →Примечания) |
||
(не показаны 4 промежуточные версии этого же участника) | |||
Строка 1: | Строка 1: | ||
Внезапно в ответ на любую команду получаем: | Внезапно в ответ на любую команду получаем: | ||
Файловая система доступна только для чтения: | Файловая система доступна только для чтения: | ||
Такое сообщение означает, что файловая система /var или корневая автоматически перемонтирована в RO после сбоя, проверьте это в выводе команды <code>mount</code>. | |||
<br>(Драйвер ext4 при появлении сбойного блока переводит файловую систему в read-only.) | |||
== Важно == | |||
# Все команды выполняйте с правами суперпользователя. | |||
# В инструкции указано дисковое устройство <code>/dev/sda</code>, если ваше отличается - пишите своё. | |||
# Требуемое ПО: программа <code>smartctl</code> из пакета smartmontools и программа <code>hdparm</code> из одноимённого пакета. | |||
# Рекомендуемое ПО: программа <code>awk</code> из одноимённого пакета. | |||
# Если пакеты smartmontools и hdparm отсутствуют в системе, загрузите с флешки LiveCD. | |||
== Диагностика == | == Диагностика == | ||
Проверяем состояние жёсткого диска | Проверяем состояние жёсткого диска.<br> | ||
В командной строке (в окне терминала) запускаем с правами суперпользователя: | В командной строке (в окне терминала) запускаем с правами суперпользователя: | ||
smartctl -A /dev/sda | awk 'BEGIN{ rc="GOOD"};/^( 5|19[6-8])/{if($10>0){print "Disk Error: "$2" = "$10; rc="BAD"}} END{print rc; if(rc=="BAD"){exit 1}}' | smartctl -A /dev/sda | awk 'BEGIN{ rc="GOOD"};/^( 5|19[6-8])/{if($10>0){print "Disk Error: "$2" = "$10; rc="BAD"}} END{print rc; if(rc=="BAD"){exit 1}}' | ||
Видим результат: | |||
Disk Error: Current_Pending_Sector = 1 | Disk Error: Current_Pending_Sector = 1 | ||
BAD | BAD | ||
Сообщение «Current_Pending_Sector = 1» означает, что на диске появился сбойный блок. | Сообщение «Current_Pending_Sector = 1» означает, что на диске появился сбойный блок (может юыть любое положительное число - это количество секторов или блоков с фатальной ошибкой чтения). | ||
Увеличение счётчика «Current_Pending_Sector» может быть результатом сбоя в электропитании, а может свидетельствовать о повреждении поверхности диска у HDD или деградации микросхемы в SSD. | |||
Если результат команды — <code>GOOD</code>, значит причина в другом — например, на втором HDD (<code>/dev/sdb</code>), в сбое массива RAID или где-то ещё. | |||
/dev/ | |||
Если awk не установлен, можно обойтись одним smartmontools: | ==== Примечание ==== | ||
Если awk не установлен, можно обойтись одним smartmontools: выполните <code>smartctl -A /dev/sda</code> и смотрите его вывод — важны параметры c ID №№ 5, 196, 197, 198, колонка «RAW_VALUE». | |||
== Исправление == | == Исправление == | ||
: Будьте внимательны! В инструкции есть деструктивные действия! | : Будьте внимательны! В инструкции есть деструктивные действия! | ||
=== Поиск сбойного блока === | === Поиск сбойного блока === | ||
Строка 29: | Строка 35: | ||
smartctl -t short /dev/sda | smartctl -t short /dev/sda | ||
Посмотрите сообщение о прогнозируемом времени выполнения | Посмотрите сообщение о прогнозируемом времени выполнения:<br> | ||
<code>Please wait … minutes for test to complete.<br> Test will complete after …</code><br> | |||
Подождите это время и выполните команду | |||
smartctl -l selftest /dev/sda | smartctl -l selftest /dev/sda | ||
Команда выдаст таблицу. В верхней строчке в столбце «Status» написано «Completed: read failure», в столбце «LBA_of_first_error» написано число — это адрес сбойного блока (сектора), запомните его. | Команда выдаст таблицу. В верхней строчке в столбце «Status» написано «Completed: read failure», в столбце «LBA_of_first_error» написано число — это адрес сбойного блока (сектора), запомните его. | ||
Пример:<pre># smartctl -l selftest /dev/sda | |||
smartctl 6.6 2017-11-05 r4594 [x86_64-linux-4.4.63-std-def-alt0.M80P.2] (ALT 6.6-alt1) | |||
Copyright (C) 2002-17, Bruce Allen, Christian Franke, www.smartmontools.org | |||
=== START OF READ SMART DATA SECTION === | |||
SMART Self-test log structure revision number 1 | |||
Num Test_Description Status Remaining LifeTime(hours) LBA_of_first_error | |||
# 1 Short offline Completed: read failure 90% 16715 1600021400 | |||
</pre> | |||
Выполните команду | Выполните команду | ||
Строка 50: | Строка 67: | ||
Должен выдать пачку нулей и не должно быть задержки и ошибки | Должен выдать пачку нулей и не должно быть задержки и ошибки | ||
После этого | После этого снова проверяем состояние диска | ||
smartctl -A /dev/sda | awk 'BEGIN{ rc="GOOD"};/^( 5|19[6-8])/{if($10>0){print "Disk Error: "$2" = "$10; rc="BAD"}} END{print rc; if(rc=="BAD"){exit 1}} ' | smartctl -A /dev/sda | awk 'BEGIN{ rc="GOOD"};/^( 5|19[6-8])/{if($10>0){print "Disk Error: "$2" = "$10; rc="BAD"}} END{print rc; if(rc=="BAD"){exit 1}} ' | ||
Если результат «GOOD» — все хорошо | |||
Если же будет «BAD» — нужно смотреть: | |||
* если ненулевой «Current_Pending_Sector» — вычислять адреса и переписывать проблемные секторы, у современных HDD один блок содержит восемь секторов и скорее всего придётся проделывать процедуру восемь раз; | |||
* если ненулевой «Reallocated_Sector_Ct», то лучше менять диск. | |||
==== Поиск повреждённого файла ==== | |||
Используйте программу [https://ru.wikipedia.org/wiki/Dmde DMDE] — в режиме просмотра физического диска найдите восстановленный сектор и программа покажет, к какому файлу он относится. Затем замените файл из резервной копии. (В случае, если нет резервной копии и это программа или библиотека, найдите пакет, которому принадлежит файл и установите пакет заново.) | |||
После всех манипуляций имеет смысл проверить файловую систему командой <code>fsck</code> на отмонтированной ФС. | |||
== Примечания == | |||
; Важные параметры SMART | |||
В таблице <code>smartctl -A /dev/sda</code> смотрим колонку RAW_VALUE у параметров с ID №№ 5, 196, 197 и 198: | |||
<pre>ID# ATTRIBUTE_NAME FLAG VALUE WORST THRESH TYPE UPDATED WHEN_FAILED RAW_VALUE | |||
… | |||
5 Reallocated_Sector_Ct 0x0033 200 200 140 Pre-fail Always - 0 | |||
… | |||
196 Reallocated_Event_Count 0x0032 200 200 000 Old_age Always - 0 | |||
197 Current_Pending_Sector 0x0032 200 200 000 Old_age Always - 0 | |||
198 Offline_Uncorrectable 0x0030 200 200 000 Old_age Offline - 0 | |||
…</pre> | |||
Ненулевые Reallocated_Sector_Ct и Reallocated_Event_Count свидетельствуют о физических сбоях, такой диск лучше заменить. | |||
Current_Pending_Sector - число секторов (блоков) с ошибкой чтения. Такой сектор будет возвращён в "хорошие" после успешной записи в него, а в случае неудачной записи за время таймаута он будет переназначен на резервный и контроллер увеличит счётчик Reallocated_Sector_Ct. | |||
Offline_Uncorrectable — блоки, ошибки на которых контроллер диска не смог исправить. | |||
; Время задержки | |||
Таймауты SCT ERC контроллера диска задают время задержек, при которых блок будет помечен сбойным: | |||
* <code>Current_Pending_Sector</code> помечается блок, который не прочитан за время SCT ERC Read Timeout; | |||
* переназначается на резервный блок, который не записан за время SCT ERC Write Timeout (и увеличивается счётчик SMART <code>Reallocated_Sector_Ct</code>). | |||
Посмотреть и установить эти таймауты можно командой {{cmd|smartctl -l scterc}} — изменение таймаутов доступно не на всех HDD: на десктопных изменение таймаутов заблокировано в прошивке. | |||
По умолчанию (на заводе) установлено время 70 секунд. | |||
== Приложение == | |||
Скрипт для проверки состояния всех дисков. Требует smartctl и awk | |||
<pre> | |||
#!/bin/sh | |||
if [ $EUID -ne 0 ] ; then echo "Run by superuser!" ; exit; fi | |||
for D in $(smartctl --scan | awk '{print $1}') | |||
do | |||
smartctl -i $D >/dev/null && ( | |||
smartctl -A $D | D=$D awk 'BEGIN{ rc="GOOD"};/^( 5|19[6-8])/{if($10>0){ if(rc=="GOOD"){print "\n" ENVIRON["D"] " is BAD"} print "Disk Error: "$2" = "$10; rc="BAD"}} END{print "SMART of " ENVIRON["D"] " " rc; if(rc=="BAD"){exit 1}} ' | |||
) | |||
done | |||
</pre> | |||
[[Категория:FAQ]] | [[Категория:FAQ]] | ||
[[Категория:Проблемы]] | [[Категория:Проблемы]] | ||
[[Категория:Ошибки]] | [[Категория:Ошибки]] |
Текущая версия от 11:39, 13 мая 2018
Внезапно в ответ на любую команду получаем:
Файловая система доступна только для чтения:
Такое сообщение означает, что файловая система /var или корневая автоматически перемонтирована в RO после сбоя, проверьте это в выводе команды mount
.
(Драйвер ext4 при появлении сбойного блока переводит файловую систему в read-only.)
Важно
- Все команды выполняйте с правами суперпользователя.
- В инструкции указано дисковое устройство
/dev/sda
, если ваше отличается - пишите своё. - Требуемое ПО: программа
smartctl
из пакета smartmontools и программаhdparm
из одноимённого пакета. - Рекомендуемое ПО: программа
awk
из одноимённого пакета. - Если пакеты smartmontools и hdparm отсутствуют в системе, загрузите с флешки LiveCD.
Диагностика
Проверяем состояние жёсткого диска.
В командной строке (в окне терминала) запускаем с правами суперпользователя:
smartctl -A /dev/sda | awk 'BEGIN{ rc="GOOD"};/^( 5|19[6-8])/{if($10>0){print "Disk Error: "$2" = "$10; rc="BAD"}} END{print rc; if(rc=="BAD"){exit 1}}'
Видим результат:
Disk Error: Current_Pending_Sector = 1 BAD
Сообщение «Current_Pending_Sector = 1» означает, что на диске появился сбойный блок (может юыть любое положительное число - это количество секторов или блоков с фатальной ошибкой чтения). Увеличение счётчика «Current_Pending_Sector» может быть результатом сбоя в электропитании, а может свидетельствовать о повреждении поверхности диска у HDD или деградации микросхемы в SSD.
Если результат команды — GOOD
, значит причина в другом — например, на втором HDD (/dev/sdb
), в сбое массива RAID или где-то ещё.
Примечание
Если awk не установлен, можно обойтись одним smartmontools: выполните smartctl -A /dev/sda
и смотрите его вывод — важны параметры c ID №№ 5, 196, 197, 198, колонка «RAW_VALUE».
Исправление
- Будьте внимательны! В инструкции есть деструктивные действия!
Поиск сбойного блока
Выполните команду
smartctl -t short /dev/sda
Посмотрите сообщение о прогнозируемом времени выполнения:
Please wait … minutes for test to complete.
Test will complete after …
Подождите это время и выполните команду
smartctl -l selftest /dev/sda
Команда выдаст таблицу. В верхней строчке в столбце «Status» написано «Completed: read failure», в столбце «LBA_of_first_error» написано число — это адрес сбойного блока (сектора), запомните его.
Пример:
# smartctl -l selftest /dev/sda smartctl 6.6 2017-11-05 r4594 [x86_64-linux-4.4.63-std-def-alt0.M80P.2] (ALT 6.6-alt1) Copyright (C) 2002-17, Bruce Allen, Christian Franke, www.smartmontools.org === START OF READ SMART DATA SECTION === SMART Self-test log structure revision number 1 Num Test_Description Status Remaining LifeTime(hours) LBA_of_first_error # 1 Short offline Completed: read failure 90% 16715 1600021400
Выполните команду
hdparm --read-sector адрес_сектора_из_LBA_of_first_error /dev/sda
После некоторой задержки (стандартно 70 секунд) команда выдаст ошибку и сообщение.
Если нет ошибки, скорее всего неправильно указан сектор и его нужно искать по другому или с сектора уже снята метка «Pending» и он либо уже нормальный (отметка Pending снята), либо забракован и переназначен на резервный (Reallocated). В этом случае дальнейшее НЕ выполнять, нужно тестировать (smartctl -t long) и смотреть (smartctl -l errors, smartctl -A)
Отбраковка сбойного блока
Внимание! Следующая команда перезаписывает нулями весь сектор, но он и так не читается, главное не ошибиться с сектором и с диском
hdparm --write-sector адрес_сектора_из_LBA_of_first_error --yes-i-know-what-i-am-doing /dev/sda
После этого опять
hdparm --read-sector адрес_сектора_из_LBA_of_first_error /dev/sda
Должен выдать пачку нулей и не должно быть задержки и ошибки
После этого снова проверяем состояние диска
smartctl -A /dev/sda | awk 'BEGIN{ rc="GOOD"};/^( 5|19[6-8])/{if($10>0){print "Disk Error: "$2" = "$10; rc="BAD"}} END{print rc; if(rc=="BAD"){exit 1}} '
Если результат «GOOD» — все хорошо
Если же будет «BAD» — нужно смотреть:
- если ненулевой «Current_Pending_Sector» — вычислять адреса и переписывать проблемные секторы, у современных HDD один блок содержит восемь секторов и скорее всего придётся проделывать процедуру восемь раз;
- если ненулевой «Reallocated_Sector_Ct», то лучше менять диск.
Поиск повреждённого файла
Используйте программу DMDE — в режиме просмотра физического диска найдите восстановленный сектор и программа покажет, к какому файлу он относится. Затем замените файл из резервной копии. (В случае, если нет резервной копии и это программа или библиотека, найдите пакет, которому принадлежит файл и установите пакет заново.)
После всех манипуляций имеет смысл проверить файловую систему командой fsck
на отмонтированной ФС.
Примечания
- Важные параметры SMART
В таблице smartctl -A /dev/sda
смотрим колонку RAW_VALUE у параметров с ID №№ 5, 196, 197 и 198:
ID# ATTRIBUTE_NAME FLAG VALUE WORST THRESH TYPE UPDATED WHEN_FAILED RAW_VALUE … 5 Reallocated_Sector_Ct 0x0033 200 200 140 Pre-fail Always - 0 … 196 Reallocated_Event_Count 0x0032 200 200 000 Old_age Always - 0 197 Current_Pending_Sector 0x0032 200 200 000 Old_age Always - 0 198 Offline_Uncorrectable 0x0030 200 200 000 Old_age Offline - 0 …
Ненулевые Reallocated_Sector_Ct и Reallocated_Event_Count свидетельствуют о физических сбоях, такой диск лучше заменить.
Current_Pending_Sector - число секторов (блоков) с ошибкой чтения. Такой сектор будет возвращён в "хорошие" после успешной записи в него, а в случае неудачной записи за время таймаута он будет переназначен на резервный и контроллер увеличит счётчик Reallocated_Sector_Ct.
Offline_Uncorrectable — блоки, ошибки на которых контроллер диска не смог исправить.
- Время задержки
Таймауты SCT ERC контроллера диска задают время задержек, при которых блок будет помечен сбойным:
Current_Pending_Sector
помечается блок, который не прочитан за время SCT ERC Read Timeout;- переназначается на резервный блок, который не записан за время SCT ERC Write Timeout (и увеличивается счётчик SMART
Reallocated_Sector_Ct
).
Посмотреть и установить эти таймауты можно командой smartctl -l scterc — изменение таймаутов доступно не на всех HDD: на десктопных изменение таймаутов заблокировано в прошивке. По умолчанию (на заводе) установлено время 70 секунд.
Приложение
Скрипт для проверки состояния всех дисков. Требует smartctl и awk
#!/bin/sh if [ $EUID -ne 0 ] ; then echo "Run by superuser!" ; exit; fi for D in $(smartctl --scan | awk '{print $1}') do smartctl -i $D >/dev/null && ( smartctl -A $D | D=$D awk 'BEGIN{ rc="GOOD"};/^( 5|19[6-8])/{if($10>0){ if(rc=="GOOD"){print "\n" ENVIRON["D"] " is BAD"} print "Disk Error: "$2" = "$10; rc="BAD"}} END{print "SMART of " ENVIRON["D"] " " rc; if(rc=="BAD"){exit 1}} ' ) done