`e2fsck -n` + как узнать, нужно ли запускать e2fsck для исправления поврежденных блоков?

465
King David

Мы хотим проверить файловую систему на дисках как /deb/sdc ... /dev/sdgна каждом компьютере Red Hat Linux.

Цель состоит в том, чтобы найти, какие диски требуются e2fsck(как e2fsck -y /dev/sdbи т.д.)

Согласно справочной странице

-n
Откройте файловую систему только для чтения и примите ответ «нет» на все вопросы. Позволяет e2fsckиспользовать не в интерактивном режиме. Эта опция не может быть указана одновременно с опциями -pили -y.

Когда мы запускаем команду (пример)

 e2fsck -n /dev/sdXX 

мы получаем

e2fsck 1.42.9 (28-Dec-2013) Warning! /dev/sdc is mounted. Warning: skipping journal recovery because doing a read-only filesystem check. /dev/sdc: clean, 94/1310720 files, 156685/5242880 blocks 

Так что нам нужно захватить из e2fsck -nвывода, что требует от нас запуска e2fsck(без -n)?

процесс e2fsck

init 1 umount /dev/sdXX e2fsck -y /dev/sdXX # (or e2fsck -C /dev/sdXX for full details)  init 3 
2

2 ответа на вопрос

0
Kamil Maciorowski

Вы используете, e2fsckпоэтому я предполагаю, что мы говорим о ext?файловой системе. Команда

tune2fs -l /dev/sdXX 

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

Filesystem state: clean 

или что-то еще, чем clean. Поскольку grepвозвращает false, если совпадение не найдено, ваша основная попытка может быть такой:

tune2fs -l /dev/sdXX | grep "^Filesystem state:[ ]*clean$" || { commands; to; fix; the; filesystem; } 

Вышеуказанное будет работать, только если файловая система заранее обнаружит свое нечистое состояние. Иногда вы все равно хотите проверить наличие проблем (вот почему желаемое поведение относится к fsckкаждому N-му монтированию или по прошествии такого-то количества дней). Если я вас правильно понял, вы пытаетесь узнать, должны ли вы e2fsck -y /dev/sdXX, анализируя результаты e2fsck -n /dev/sdXX.

Я говорю не анализировать вывод. Проверьте статус выхода. Смотрите, man 8 e2fsckчтобы узнать:

Код возврата, возвращаемый функцией, e2fsckявляется суммой следующих условий:
0- Нет ошибок
1- Исправлены ошибки файловой системы
2- Исправлены ошибки файловой системы, система должна быть перезагружена
4- Ошибки файловой системы оставлены без
8исправлений
16- Операционная ошибка - Ошибка использования или синтаксиса
32- e2fsckотменена по запросу пользователя
128- Ошибка общей библиотеки

Note e2fsck -n /dev/sdXXне сделает ничего полезного (и вернет «без ошибок»), если файловая система кажется чистой; так что это еще один способ обнаружить текущее видимое состояние, как мы сделали с tune2fs. Для проверки в любом случае вам нужен -fвариант. Затем вы хотите знать, если статус выхода включает4 . В bashэтом можно сделать с помощью:

e2fsck -nf /dev/sdXX # this is safe even if the filesystem is mounted status=$? [ $(( $status & 4 )) -eq 4 ] && { commands; to; fix; the; filesystem; } 

Быстрое объяснение:

  • $?является статусом выхода последней команды ( e2fsckв данном случае). Я сохраняю его в отдельной переменной, чтобы можно было выполнить несколько тестов с ним. Это не обязательно в этом простом примере, где есть только один тест, но в целом это хорошая практика. Основная причина: после того, как эти строки $statusвсе еще содержат статус выхода e2fsckи могут быть использованы повторно, в то время как (новый) не $?имеет ничего общего с e2fsck.
  • $(( ... )) делает арифметику оболочки
  • где &побитовое И,
  • тогда [ ... -eq 4 ]на самом деле testкоманда для проверки, если результат 4.
  • Если тест пройден успешно, { ... }блок будет выполнен.

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

  • smartctl -t long /dev/sdX
  • badblocks -n -b 512 /dev/sdX

Прочитайте их справочные страницы, прежде чем использовать их.

Большое спасибо за длинный и отличный ответ, только одна записка, почему бы не сделать -> [[$? -eq 4]] && e2fsck -y / dev / sdXX, это проще King David 6 лет назад 0
второе - безопасно ли запускать e2fsck -nf / dev / sdXX, пока устройство смонтировано? King David 6 лет назад 0
@KingDavid `[$? -eq 4] `пропускает, например,` 12`, что равно `4 + 8`. Вы, вероятно, не получите это значение. Вам решать, какую логику вы будете использовать, проверяете ли вы на `128` или нет и т. Д. Если вы хотите точно найти` 4`, то `[$? -eq 4] `должно быть хорошо. `e2fsck -nf / dev / sdXX` безопасен, потому что` -n` делает его доступным только для чтения, поэтому команда не может ничего сломать. Отдельный вопрос: может ли смонтированное состояние изменить заключение? Это я не знаю. Я предполагаю, что вам нужно проверить работоспособность файловой системы без нарушения нормальной работы. Очевидно, вы должны `umount` перед` e2fsck -y`. Kamil Maciorowski 6 лет назад 0
@KingDavid Я намеренно испортил мою (тестовую) файловую систему с помощью некоторых команд `dd` и получил код выхода` 12` из `e2fsck -nf`. Я думаю, что вы не должны проверять наличие единственного `4`; лучше используйте мой побитовый код. Kamil Maciorowski 6 лет назад 0
0
Stef

Сначала проверьте, является ли это файловой системой журналирования.

«Журналируемая файловая система - это файловая система, которая отслеживает изменения, еще не зафиксированные в основной части файловой системы, записывая намерения таких изменений в структуре данных, известной как« журнал », которая обычно представляет собой циклический журнал. В случае сбоя системы или сбоя питания такие файловые системы могут быть быстрее подключены к сети с меньшей вероятностью повреждения ».

Затем вы можете попробовать Gparted для проверки согласованности и посмотреть, что инструмент может сделать для вас.

Похожие вопросы