Ошибка:
| |
не всегда означает, что сам диск физически стал доступен только для чтения.
При проблемах с I/O, storage или журналом ext4 файловая система может сама перейти в режим read-only, чтобы не продолжать запись в аварийном состоянии.
В моём случае это произошло сразу на нескольких серверах после проблем на уровне VMware/storage.
При этом ситуация была интересной:
- SSH продолжал работать;
- PostgreSQL был
active (running); - использующие базу сервисы в основном продолжали отвечать;
- некоторые системные службы уже начинали падать;
- переставали писаться логи;
aptвозвращалRead-only file system.
В этом гайде разберём, как последовательно понять, на каком уровне возник read-only, и безопасно восстановить файловую систему.
Важно: если причиной являются продолжающиеся проблемы со storage, сначала нужно стабилизировать нижележащую инфраструктуру. Запускать
fsckна системе, которая всё ещё получает I/O errors, смысла мало и в целом опасно.Также не запускайте
fsckна смонтированной файловой системе с активной записью.
Как выглядит проблема
Например, приложение пытается создать файл:
| |
и получает:
| |
Или ошибка появляется при работе apt:
| |
Первое, что нужно понять:
Какая именно файловая система стала
read-only?
Проверяем точки монтирования
Для общей картины:
| |
Для конкретного каталога:
| |
Например:
| |
Здесь главное:
| |
Файловая система смонтирована только для чтения.
То же самое можно проверить для /opt:
| |
и для корня:
| |
Получаем например:
| |
Команда для просмотра дисков, файловых систем и точек монтирования:
| |
Для текущей проблемы лучше всего выполнить:
| |
Получаем:
| |
Диск или файловая система?
Нужно понять что ушло в RO. Диск или ФС.
Цепочка выглядит так:
| |
Если файловая система, то будет так:
| |
Проверяем Диск
| |
Где:
| |
означает, что сам диск в норме не помечен как read-only.
Также проблему с диском можно отделить командой:
| |
Если получаем:
| |
Понимаем, что диск в пордяке и ищем причину по которой файловая система решила запретить запись.
Смотрим dmesg
При любых проблемах с оборудованием одно из первых мест куда смотреть, это в лог ядра.
Фильтруем пайпами, чтобы не читать всё подряд:
| |
Или можно использовать journalctl:
| |
При проблемах с журналом ext4 может решить, что дальнейшая запись небезопасна, и перейти в read-only.
Упрощённо на схеме:

Почему ext4 вообще уходит в RO?
ext4 - это журналируемая файловая система. Если во время изменения данных происходят серьёзные ошибки записи/чтения, то журнал больше нельзя писать, поэтому файловая система переходит в RO.
По сути логика следующая:Я не уверен, что могу безопасно писать дальше -> лучше остановить запись чем продолжить повреждать данные
Поэтому сам факт перехода в ro не говорит, что Linux “сломал диск”. Наоборот, Linux пытается ограничить последствия уже произошедшей аварии.
Можно ли просто сделать remount в rw?
Первая очевидная идея:
| |
Иногда это работает. Например, если причина была временной, исчезла и файловая система не имеет серьёзных ошибок. Но при повреждении журнала можно получить, как было у меня:
| |
или новые ошибки в dmesg.
Если ext4 сама ушла в read-only после ошибок чтения/записи, то бесконечно возвращать её в rw такое себе.
Нужно понять, почему она туда ушла.
Проверяем, не продолжаются ли I/O ошибки
Перед восстановлением нужно убедиться, что проблема на уровне ниже отсутсвует.
Проверяем свежие сообщения:
| |
Если продолжают сыпаться ошибки по диску, то сначала нужно разбираться с диском или гипервизором.
Определяем, какие процессы используют файловую систему
У меня каждый диск отдельно монтируется в директорию, например opt:
| |
перед размонтированием нужно понять, какая программа использует этот раздел.
| |
Если там находятся данные какого-то сервиса, его нужно остановить. У меня была PostgreSQL:
| |
Важный момент с PostgreSQL
В моём случае на /opt находился непосредственно PGDATA.
При этом:
| |
показывал:
| |
К базе можно было подключиться и выполнять запросы. На первый взгляд можно решить, что сервис PostgreSQL здоров.
Процесс продолжает:
- читать данные
- использовать page cache
- работать с уже открытыми файлами
- обслуживать операции, которым прямо сейчас не понадобилась новая запись.
Но проблмеы начнутся, когда БД понадобятся:
- WAL
- изменения таблиц
- служебные файлы
- обновление метаданных.
Поэтому база не сможет нормально работать на RO ФС продолжительное время. Состояние systemd показывает состояние процесса, а не всей инфры под ним.
Размонтируем отдельную файловую систему
Остановил базу, убил зависимости. Далее восстанавливаю:
| |
Проверяем:
| |
Если вывода нет, значит файловая система больше не смонтирована.
Проверяем ext4 через fsck
Когда filesystem размонтирована, можно запускать проверку. Например:
| |
Какие ошибки может найти fsck
После аварийной записи можно увидеть, например:
| |
или другие несоответствия.
fsck предложит исправить найденные проблемы.
Не копируйте
/dev/sdb1из этого гайда. На вашем сервере диски будут другими.
Монтируем файловую систему обратно
После успешного завершения fsck:
| |
Проверяю:
| |
Вижу:
| |
Запускаем сервисы обратно
Файловая система восстановлена, запускаем базу обратно:
| |
Проверяем:
| |
Проверяем остальные файловые системы
Два раздела я починил таким образом на нескольких серверах. Пробегаюсь по остальным командой:
| |
И на части серверов вижу, что корень тоже пострадал.
| |
Если в read-only ушёл корень /
С /opt всё относительно понятно:
| |
С / этот подход не работает. Нельзя на обычной загруженной системе просто выполнить размонтирование. Корень используется самой операционной системой. Поэтому rootFS нужно проверять в состоянии, когда она не используется как обычный смонтированный rw root.
Это означает, что сервак нужно перезагружать и выбирать режим:
- recovery mode
- initramfs
После перезагрузки появляется:
| |
Выглядит неприятно, особенно если это ПРОД сервак, но такое поведение как раз защищает систему от загрузки поверх файловой системы с обнаруженными ошибками.
Определяем диск с корневой ФС и восстанавливаем
| |
Получаю:
| |
Запускаю fsck на проблменом разделе
| |
Путь зависит от вашей конфигурации.
Не запускайте
fsck.ext4по целому диску, LVM PV или устройству наугад. Сначала определите слой, на котором действительно находится ext4.
Во время проверки можно увидеть:
| |
И вопросы типа:
| |
После завершения проверки можно:
| |
и подождать перезагрузку.
После перезагрузки
Первым делом проверяем root:
| |
Ожидаем:
| |
Затем остальные mount points:
| |
Проверяем, не продолжаются ли ошибки:
| |
После этого проверяем сервисы и приложения.
Есть соблазн любой ценой избежать перезагрузки сервера. Но в случае с повреждённой rootFS перезагрузка или переход в режим восстановления может быть как раз наиболее правильным вариантом.
Что проверять в VMware
Если Linux VM получила ошибки по I/O, то со стороны Linux важно определить время появления первых ошибок.
Логами ядра:
| |
После этого сопоставляем время с событиями инфраструктуры.
Проверяем:
- события виртуальной машины в vCenter;
- свободное место;
- storage latency;
- ошибки ESXi;
vmkernel.log;- состояние storage paths;
- ошибки storage controller;
- проблемы физических дисков;
Команды в одном месте
Проверить mount points
| |
Посмотреть диски и флаг RO
| |
Проверить Диски
| |
0 означает, что диск может читать/писать.
Поиск ошибок по файловой системе
| |
Найти процессы, использующие точку монтирования
| |
Размонтировать filesystem
| |
Проверить ext4
| |
Смонтировать обратно
| |
Проверить режим монтирования
| |
Что важно не делать
Не запускать проверку, не зная что с файловой системой:
| |
Не выполнять fsck на активно смонтированной и используемой ext4.
Восстановить такую систему обычно несложно.
Гораздо важнее соблюдать правильную последовательность и не пытаться решать проблему раньше, чем станет понятна причина.
И да, иногда read-only означает не то, что Linux сломался.
Иногда, это ОС вовремя поняла, что ломается что-то на уровне ниже, и просто перестала писать данные, пока ситуация не стала ещё хуже.
