Файловая система доступна только для чтения: различия между версиями

Материал из ALT Linux Wiki
(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.


== Диагностика ==
== Диагностика ==
Такое сообщение означает, что файловая система /var или корневая автоматически перемонтирована в RO после сбоя.


Проверяем состояние жёсткого диска (требуются пакеты smartmontools и awk).<br>
Проверяем состояние жёсткого диска.<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» означает, что на диске появился сбойный блок. Это может быть результат сбоя в электропитании, а может быть и повреждение поверхности диска (в случае SSD - выход из строя микросхемы).
Сообщение «Current_Pending_Sector = 1» означает, что на диске появился сбойный блок (может юыть любое положительное число - это количество секторов или блоков с фатальной ошибкой чтения).
Увеличение счётчика «Current_Pending_Sector» может быть результатом сбоя в электропитании, а может свидетельствовать о повреждении поверхности диска у HDD или деградации микросхемы в SSD.


==== Примечания =====
Если результат команды — <code>GOOD</code>, значит причина в другом — например, на втором HDD (<code>/dev/sdb</code>), в сбое массива RAID или где-то ещё.
/dev/sda замените на ваш диск.


Если awk не установлен, можно обойтись одним smartmontools: <code>smartctl -A /dev/sda</code> и смотреть его вывод вручную - важны параметры №№ 5, 196, 197, 198.
==== Примечание ====
 
Если awk не установлен, можно обойтись одним smartmontools: выполните <code>smartctl -A /dev/sda</code> и смотрите его вывод важны параметры c ID №№ 5, 196, 197, 198, колонка «RAW_VALUE».
Если и пакет smartmontools отсутствует в системе, загрузите с флешки LiveCD


== Исправление ==
== Исправление ==
Все команды выполняйте с правами суперпользователя.
В инструкции указано дисковое устройство /dev/sda, если ваше отличается - пишите своё.
: Будьте внимательны! В инструкции есть деструктивные действия!
: Будьте внимательны! В инструкции есть деструктивные действия!
=== Поиск сбойного блока ===
=== Поиск сбойного блока ===
Строка 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.


И если будет GOOD - то все хорошо
Offline_Uncorrectable — блоки, ошибки на которых контроллер диска не смог исправить.


Если же будет BAD - нужно смотреть, если еще есть Current_Pending_Sector, вычислять адреса и переписывать, если есть Reallocated_Sector_Ct, то лучше менять диск.
; Время задержки
Таймауты 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 секунд.


После всех манипуляций имеет смысл проверить файловую систему (fsck) на отмонтированной ФС.
== Приложение ==
Скрипт для проверки состояния всех дисков. Требует 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.)

Важно

  1. Все команды выполняйте с правами суперпользователя.
  2. В инструкции указано дисковое устройство /dev/sda, если ваше отличается - пишите своё.
  3. Требуемое ПО: программа smartctl из пакета smartmontools и программа hdparm из одноимённого пакета.
  4. Рекомендуемое ПО: программа awk из одноимённого пакета.
  5. Если пакеты 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