Как исправить ошибку «невозможно прочитать суперблок» в Linux (ext4 и Btrfs)
Недавно мой настольный компьютер с Linux не смог подключить внешний жесткий диск (HDD) емкостью 5 ТБ, и файловый менеджер отображает на экране ошибку «невозможно прочитать суперблок». Я собираюсь поделиться с вами тем, что я сделал, чтобы исправить ошибку, поэтому, если вы находитесь в такой же ситуации, эта статья может вам помочь.
Но прежде чем сделать это, я хочу объяснить некоторые базовые знания о жестких дисках и файловых системах в Linux, чтобы вы действительно знали, что делаете. Если вас не волнуют эти детали, вы можете сразу перейти к решению. Жесткий диск (HDD) – это магнитный диск. Твердотельный накопитель (SSD) – это электронный диск.
Структура жесткого диска
Жесткий диск обычно имеет несколько круглых пластин, расположенных вертикально, со шпинделем, который вращает диск в центре. Каждая пластина покрыта намагничивающимся материалом для записи данных. Поверхность каждого диска разделена на десятки тысяч дорожек. Это как беговые дорожки в спорте.
Совет. Жесткие диски — очень сложные устройства, и их можно легко повредить, если уронить на землю.
Каждая дорожка разделена на сектора. Обычно на каждой дорожке имеются сотни секторов, и каждый сектор обычно имеет одинаковую длину. Сектор — это наименьшая единица чтения данных с диска. То есть, даже если вам нужна только часть данных из сектора, головка чтения-записи прочитает весь сектор для извлечения данных. Традиционно в одном секторе хранится 512 байт данных. В 2009 году в отрасли был разработан формат размера сектора 4K, известный как расширенный формат, для повышения надежности диска и увеличения емкости. После января 2011 года большинство новых жестких дисков хранят 4096 байт данных в одном секторе.
Размер физического сектора и размер логического сектора
Хотя новые жесткие диски используют расширенный формат 4K, операционные системы по-прежнему ожидают размера сектора в 512 байт, поэтому прошивка жесткого диска делит физический сектор 4K на несколько логических секторов, обычно по 512 байт. В Linux вы можете проверить размер физического и логического секторов жесткого диска с помощью команды fdisk
.
fdisk -l /dev/sda
На скриншоте видно, что размер физического сектора моего жесткого диска составляет 4096 байт, а размер логического сектора – 512 байт. Размер ввода-вывода — это минимальные фрагменты данных, которые операционная система считывает с диска.
Выравнивание разделов
Использование встроенного ПО для создания логического сектора может снизить производительность, особенно если разделы файловой системы не выровнены с физическими секторами. К выравниванию разделов предъявляются два требования:
- Количество секторов в каждом разделе должно быть кратно 8, поскольку физический сектор содержит 8 логических секторов.
- Начальный сектор каждого раздела должен быть первым логическим сектором физического сектора. Поскольку сектор 0 является первым сектором всего диска, это означает, что начальный сектор каждого раздела должен быть кратен 8, сектору 0, сектору 8, сектору 16 и т. д.
При создании разделов на жестком диске вам следует учитывать следующие две таблицы разделов.
- MBR: основная загрузочная запись.
- GPT: таблица разделов GUID.
Если вы покупаете новый жесткий диск, для разделения жесткого диска рекомендуется использовать новый формат GPT. И MBR, и GPT будут использовать некоторые сектора в начале диска, поэтому вам следует оставить немного пустого пространства (например, 1 МБ) перед первым разделом. Чтобы создать разделы, которые будут выровнены по физическому сектору, используйте сектор в качестве единицы измерения при разбиении диска.
Вы можете быстро проверить, выровнены ли разделы вашего диска по физическим секторам, с помощью утилиты parted
(редактор разделов). parted
— редактор разделов диска, поддерживающий несколько форматов таблиц разделов, включая MBR и GPT.
Сначала скажите parted использовать ваш диск. В качестве примера я использую my/dev/sdb
.
parted /dev/sdb
Затем введите p
, чтобы распечатать таблицу разделов на диске. И выполните следующую команду, чтобы проверить выравнивание разделов.
align-check opt partition-number
Введите q
, чтобы выйти.
Как вы можете видеть на скриншоте ниже, первые два раздела не выровнены должным образом. Третий раздел выровнен.
Выравнивание разделов SSD
Обратите внимание, что структура SSD сильно отличается от структуры HDD. Наименьшая часть модуля SSD называется ячейкой. Последовательные ячейки образуют страницу, многие из которых организованы в блок. Операции чтения и записи выполняются на уровне страницы. Размер страницы SSD варьируется от производителя к производителю и от модели к модели. Не существует простого способа проверить размер страницы с помощью командной строки Linux, поскольку уровень трансляции флэш-памяти заставляет ОС думать, что SSD — это традиционный жесткий диск. ОС не понимает страницы SSD и по-прежнему использует сектора для описания местоположений на SSD.
Обычные размеры страниц: 8 КБ, 16 КБ, 32 КБ. Также очень важно иметь выровненные разделы на SSD. Если разделы не выровнены, всегда будет одна дополнительная страница для чтения или записи. Это не только снизит производительность, но и уменьшит срок службы SSD. Чтобы правильно выровнять разделы на SSD, все, что вам нужно сделать, это оставить одну пустую страницу (например, 32 КБ) в начале SSD и убедиться, что размер каждого раздела на SSD кратен размеру страницы.
Когда вы используете GParted для создания первого раздела на SSD, он автоматически оставляет 1 МБ пустого пространства перед первым разделом, что составляет 32 пустые страницы (32 КиБ * 32=1024 КиБ). Это отлично. На следующем снимке экрана показано создание системного раздела EFI (ESP) для компьютера UEFI. Размер раздела — 512 МБ с файловой системой FAT32.
Блоки в файловой системе
В файловой системе есть концепция блок, которая аналогична сектору на дисках. Многих людей путают эти два понятия. Понять разницу не так уж и сложно. Когда вы создаете раздел на диске, вы можете использовать сектора для определения его размера. Если отформатировать раздел с файловой системой, будут созданы блоки.
Операционная система и файловая система обращаются к данным на диске блоками, а не секторами. Блок обычно кратен сектору. Так почему бы нам просто не получить доступ к данным по секторам? Ну, блок может абстрагировать физические детали диска. Если вы обращаетесь к сектору (узнаете адрес сектора), вам нужно использовать схему CHS (цилиндр-головка-сектор). Это связано с тем, что жесткий диск имеет несколько пластин. Вам необходимо знать, на каком диске и дорожке находится сектор. Если вы адресуете блок, вы просто используете блок 0, блок 1, блок 2 и т. д., не зная физических деталей диск. Каждый блок сопоставляется с сектором (или несколькими секторами) с помощью схемы адресации логических блоков (LBA).
Суперблок
Первый блок диска или раздела называется суперблоком и является основным суперблоком. Суперблок может быть поврежден, например, при внезапном отключении электроэнергии, поэтому в группе блоков имеются резервные копии суперблока.
- первичный суперблок
- резервный суперблок
Не могу прочитать суперблок
Может быть несколько причин, по которым ваша ОС не может прочитать суперблок на жестком диске.
- Жесткий диск упал на землю, и суперблок повредился. Обычно это физическое повреждение соответствующих секторов диска.
- Произошло внезапное отключение электроэнергии. Поскольку суперблок кэшируется в оперативной памяти, в случае отключения электроэнергии в суперблоке могут произойти важные изменения, которые не были записаны на диск.
Если основной суперблок поврежден, вы не сможете смонтировать файловую систему, и операционная система, вероятно, сообщит вам, что она «не может прочитать суперблок», если вы попытаетесь смонтировать файловую систему. Нам нужно восстановить сбойный суперблок из резервных копий. Следующие инструкции показывают, как восстановить суперблок для файловых систем ext4 и Btrfs. Мой HDD — внешний жесткий диск. Если поврежденная файловая система является вашей корневой файловой системой, вам необходимо загрузить компьютер с USB-накопителя Linux Live.
Восстановить суперблок в файловой системе ext4
Узнайте имя устройства поврежденного раздела.
sudo parted -l
Определите расположение резервных суперблоков.
sudo mke2fs -n /dev/xxx
Например, имя устройства моего раздела жесткого диска — /dev/sdb1, поэтому я запускаю
sudo mke2fs -n /dev/sdb1
Он сообщит вам, что раздел содержит файловую систему ext4, нажмите y, чтобы продолжить. Не волнуйтесь, опция -n
сообщает mke2fs не создавать файловую систему.
mke2fs 1.45.5 (07-Jan-2020)
/dev/sdb1 contains a ext4 file system labelled 'Stretch'
last mounted on /media/linux-terminal/b43e4eea-9796-4ac6-9c48-2bcaa46353732 on Thu Jan 28 02:43:43 2021
Proceed anyway? (y,N) y
Creating filesystem with 7864320 4k blocks and 1966080 inodes
Filesystem UUID: fcae3dc8-ee11-412c-97f0-27106601314e
Superblock backups stored on blocks:
32768, 98304, 163840, 229376, 294912, 819200, 884736, 1605632, 2654208,
4096000
Внизу вы можете увидеть расположение резервных суперблоков. Далее восстановите суперблок из первой резервной копии.
sudo e2fsck -b 32768 /dev/xxx
Теперь вы сможете смонтировать раздел ext4.
Восстановить суперблок в файловой системе btrfs
Узнайте имя устройства поврежденного раздела.
sudo parted -l
Установите утилиту Btrfs.
sudo apt install btrfs-progs
Затем выполните следующую команду, чтобы восстановить суперблок.
sudo btrfs rescue super-recover -v /dev/xxx
Если вам сообщают: «Все суперы действительны, восстанавливать не нужно», проверьте системный журнал.
sudo dmesg
Вы можете найти следующее сообщение, которое указывает на то, что дерево журналов повреждено, поэтому невозможно воспроизвести журнал.
BTRFS: error (device sdb1) in btrfs_run_delayed_refs:2227: errno=-5 IO failure
BTRFS: error (device sdb1) in btrfs_replay_log:2287: errno=-5 IO failure (Failed to recover log tree)
Затем вам нужно запустить следующую команду, чтобы очистить дерево журналов файловой системы.
sudo btrfs rescue zero-log /dev/xxx
Теперь вы сможете смонтировать файловую систему Btrfs.
Если в вашей файловой системе Btrfs периодически происходят сбои ввода-вывода, вы можете добавить задание crontab для автоматической очистки дерева журналов файловой системы один раз в день.
sudo crontab -e
Добавьте следующую строку в конец файла crontab.
@daily umount /dev/xxx && btrfs rescue zero-log /dev/xxx && mount -a
Сохраните и закройте файл.
Резервное копирование файлов на вашем диске
Чтобы предотвратить потерю данных, рекомендуется использовать такой инструмент, как Duplicati, для автоматического резервного копирования файлов в облачное хранилище. Duplicati зашифрует ваши файлы, чтобы предотвратить посторонние глаза.
- Как использовать Duplicati для резервного копирования файлов в Debian, Ubuntu, Linux Mint
Внешний жесткий диск становится доступным только для чтения?
Иногда в файловой системе может возникнуть ошибка, поэтому Linux может монтировать внешний жесткий диск только в режиме только для чтения. Чтобы это исправить, вам необходимо отключить внешний жесткий диск, а затем использовать утилиту командной строки e2fsck для исправления ошибок файловой системы.
Например,
sudo e2fsck /dev/sdb1
затем ответьте y
, чтобы оптимизировать или исправить файловую систему, и вы сможете смонтировать внешний жесткий диск в режиме записи.
Кончик
- Некоторые материнские платы по-прежнему могут заряжать USB-устройства даже после завершения работы операционной системы. Если у вас есть внешний жесткий диск, рекомендуется отключать питание USB-устройств при выключении, чтобы внешний жесткий диск мог перестать вращаться. Это хорошо для продолжительности его жизни. Например, у меня есть материнская плата ASUS PRIME z270. Я захожу в раздел дополнительных настроек UEFI и отключаю «зарядку USB-устройств в состоянии питания s5».
Подведение итогов
Я надеюсь, что это руководство помогло вам исправить ошибку «невозможно прочитать суперблок» в Linux. Как всегда, если этот пост оказался для вас полезным, подпишитесь на нашу бесплатную рассылку, чтобы получать больше советов и рекомендаций. Берегите себя 🙂