Восстановление таблицы разделов жесткого диска Linux

Обновлено: 30.06.2024

Мы много раз сталкивались с такой ситуацией, когда «таблица разделов жесткого диска была случайно стерта» или «данные раздела отсутствуют или повреждены» и, следовательно, не могут смонтировать соответствующие блочные устройства. Да, «как восстановить или восстановить поврежденную или удаленную таблицу разделов жесткого диска» или «как воссоздать таблицу разделов жесткого диска без потери данных» — вот некоторые из ключевых слов, которые мы нажимаем в Интернете, чтобы найти решение. Есть несколько сторонних инструментов (многие из открытых источников), которые могут выполнить эту работу, однако я хотел показать, как это можно сделать с помощью собственных инструментов/команд в операционной системе Linux. Иногда мы не можем использовать эти сторонние инструменты, поэтому нам приходится использовать собственный способ восстановления данных таблицы разделов. Итак, давайте посмотрим, как мы можем добиться этого. ПРИМЕЧАНИЕ. Если жесткий диск сильно поврежден (физически) или если он переформатирован (создание файловой системы), или если сами метаданные повреждены или серьезно повреждены, то в таких случаях шансов на восстановление данных очень мало. пользователям, возможно, придется полагаться на некоторые сложные сторонние инструменты, которые могут восстановить некоторые или часть данных. Ситуация, которую я собираюсь описать здесь, состоит в том, что таблица разделов жесткого диска стерта, однако повторное форматирование еще не было выполнено.

Прежде чем мы приступим к процессу/демонстрации восстановления данных на жестком диске, давайте разберемся с некоторыми фактами о жестких дисках и о том, как данные хранятся.

Жесткий диск или дисковод, будь то SATA (Serial ATA), SCSI (Small Computer System Interface), SAS (Serial Attached SCSI) и т. п., обычно напоминают тонкие дисковые пластины, установленные на вращающемся шпинделе диска с головками чтения/записи. прилагается, который представляет высокоуровневый архитектурный вид жесткого диска, за исключением SSD (твердотельный накопитель), архитектура которого отличается. Каждая из таких дисковых пластин круглой формы делится на более мелкие дорожки (кольца) и снова делится на сектора. Сектор – это наименьший сегмент единицы данных.

Вот небольшая внутренняя схема жесткого диска в разрезе, показывающая, как дисковые пластины уложены одна над другой. Каждая дисковая пластина будет разделена на дорожки, сектора, к которым будут обращаться головки чтения/записи для каждой пластины.

Таким образом, данные хранятся на жестких дисках в блоках, и доступ к ним осуществляется головками чтения/записи по номеру цилиндра, номеру головки чтения/записи и, наконец, номеру сектора (CHS). Это самый простой метод хранения или извлечения данных с дисков. Это также называется методологией адресации дисков. У этого метода есть некоторые ограничения, и, следовательно, используется режим LBA (логическая адресация блоков), а также расширенный метод GPT (таблица разделов GUID), который также доступен для больших жестких дисков. Я не буду все это объяснять, так как это не входит в рамки темы.

Новый жесткий диск без форматирования непригоден для использования. Это означает, что операционная система не может понять структуру жесткого диска для записи/чтения данных. Таким образом, в идеале один большой жесткий диск делится на разделы в зависимости от требований. Эти разделы можно сделать подходящими для хранения данных, создав структуру файловой системы, которую операционная система (ядро) может понять и может легко записывать/считывать данные. В Windows мы бы назвали это процессом форматирования. Это стандарт, которому следуют в различных операционных системах, кроме Unix. ПРИМЕЧАНИЕ. Весь жесткий диск можно использовать без создания разделов, если он используется в качестве базового блочного устройства в случае логического тома. Но рекомендуется создать раздел с полным размером жесткого диска, а затем использовать его в качестве базового блочного устройства для логического тома, что позволит избежать использования любого инструмента/программы, которые могут ошибочно спроецировать жесткий диск как неиспользуемый.

Существует таблица разделов, которая в идеале находится в первых 512 байтах диска и содержит сведения о разделах, также называемые метаданными. Эта таблица разделов имеет размер 64 байта и может содержать данные 16 X 4 (16 байт X 4 раздела). Каждый раздел содержит такие сведения, как запуск CHS, общая емкость раздела в байтах, данные LBA и т. д.

В идеале жесткий диск может содержать максимум 4 основных раздела. Чтобы преодолеть это ограничение, используется концепция расширенного раздела, который будет последним основным разделом, который может содержать дополнительные логические разделы, максимум 16. Это в случае системы на основе BIOS (базовая система ввода-вывода), которая может понимать макет MBR (основная загрузочная запись). В случае систем на основе UEFI (Unified Extensible Firmware Interface), где используется GPT (таблица разделов GUID), таких ограничений на разделы нет. Кроме того, MBR может обращаться только к диску размером менее 2,2 ТБ.

Простое удаление таблицы разделов никогда не уничтожит данные на жестком диске.Да, когда таблица разделов повреждена или повреждена, есть вероятность, что мы все еще сможем восстановить детали раздела. Однако дальнейшее форматирование или повреждение диска недопустимо. Существует множество доступных сторонних инструментов, которые все еще могут восстанавливать данные с сильно поврежденного диска, однако здесь мы сосредоточимся только на восстановлении таблицы разделов с помощью собственных команд/инструментов Linux.

Чтобы продемонстрировать процесс восстановления таблицы разделов, я бы рассмотрел диск «/dev/sdb», который является вторым жестким диском с двумя разделами. Разделы «/dev/sdb1» монтируются как блочное устройство для точки монтирования «/data1», а второй раздел «/dev/sdb2» используется как блочное устройство для LVM, т.е. «/dev/datavg /datalv», для которого точкой монтирования является «/data2», как показано на снимке ниже:

--> Сектор традиционно имеет размер 512 байт, но новые диски имеют размер 4096 байт (4 КБ). Это наименьший объем данных, который может быть записан или прочитан с диска большинством программ. Размер сектора не может быть изменен операционной системой, и это решается производителями дисков. Диск с размером сектора 4096 байт считается имеющим расширенный формат. Это можно просмотреть с помощью дисковых инструментов, таких как fdisk, parted и т. д., как показано ниже:

--> Когда раздел форматируется путем запуска создания файловой системы, он вычисляет определенные параметры, такие как «Размер блока», «Количество блоков» и т. д. «Размер блока», который обычно имеет размер 4096 байт (за исключением для /boot в RHEL6, который остается на 1024 байта) по умолчанию, если не изменено.




--> Стек ввода-вывода Linux был улучшен для использования предоставляемой поставщиком информации об ограничениях ввода-вывода, которая позволяет родным инструментам Linux (parted, lvm, mkfs .* и т. д.) для оптимизации размещения данных и доступа к ним. Существует «физический_блок_размер», который определяет наименьшую единицу, с которой работает устройство хранения, и «логический_блок_размер», который используется извне для адресации местоположения устройства соответственно. Существует также «minimum_io_size», который определяет предпочтительную минимальную единицу устройства для произвольного ввода-вывода, и «optimal_io_size», которая является предпочтительной единицей устройства для потокового ввода-вывода. Доступ к этим данным можно получить из файловой системы «/sys», как показано ниже для устройства «sdb», или с помощью дисковых утилит, таких как «fdisk» или «parted»:


--> Любой жесткий диск объемом более 2,2 ТБ не может быть распознан инструментами на основе MBR, такими как «fdisk», поэтому нам нужно использовать инструмент «parted», который поддерживает GPT, и которая также является схемой расположения разделов по умолчанию, используемой в системах на основе UEFI. При использовании схемы GPT таблица разделов сохраняется как в первом, так и в последнем секторах диска, поэтому восстановить данные раздела не так уж сложно.


Воспроизведите проблему: давайте уничтожим таблицу разделов устройства «sdb»

Я бы использовал команду «dd», чтобы обнулить первые 512 байт на блочное устройство «sdb», чтобы стереть таблицу разделов. Однако это не повлияет на фактические данные, хранящиеся в отдельных разделах устройства.




Восстановим таблицу разделов


Прочитав файл «/etc/fstab», мы поняли, что на «/dev/sdb» было создано два раздела. Это «/dev/sdb1», для которого точка монтирования была «/data1», и «/dev/datavg/datalv» lvm, для которой точка монтирования была «/data2».

Если системе требуется перезагрузка, прокомментируйте соответствующие строки в «/etc/fstab», иначе система может не загрузиться и выдает «Ошибка Ctrl+D» и переходит в аварийный режим. Если смонтированные детали случайно недоступны в файле «/etc/fstab», нам нужно будет обнаружить эти разделы и восстановить их.


Шаг 2. Определите «Размер блока» и «Количество блоков».

Итак, давайте создадим первый раздел любого размера в «/dev/sdb», а затем попробуем определить «Размер блока» и «Количество блоков» с помощью команды «dumpe2fs» (необходимо использовать команду xfs_info для файловых систем XFS). Этот раздел должен быть любого размера и должен быть больше исходного размера первого раздела до того, как он был стерт.

В данном случае я знал, что размер раздела составляет 600 МБ, однако в реальном времени мы не знали и не помнили фактический размер раздела. Итак, давайте сначала создадим раздел размером 1 ГБ и проверим.



Теперь попробуем прочитать «Размер блока» и «Количество блоков» из «/dev/sdb1» с помощью команды «dumpe2fs». Мы попытаемся воссоздать раздел большего размера и проверить количество блоков и размер блока, и он не должен измениться, если он изменится, нам нужно будет создать раздел большего размера и проверить снова. Итак, начнем:



На этом этапе, если бы вы могли просто смонтировать это устройство и проверить, мы бы увидели, что файлы, которые мы создали, существуют, однако, этот раздел имеет неправильный размер, поэтому нам нужно определить правильный размер.

Шаг 3. Рассчитайте правильный размер раздела и создайте его заново.

Из «Шага 2» мы узнали, что «Количество блоков» и «Размер блока» следующие:

Количество блоков: 154617
Размер блока : 4096

Итак, давайте умножим оба и посмотрим, что получится в байтах: «633311232». Поскольку это значение указано в байтах, нам нужно преобразовать его в килобайты (КБ), мегабайты (МБ), гигабайты (ГБ), терабайты (ТБ) и т. д., если требуется.


Следовательно, округлив 603,97, мы получим 604 МБ.

Итак, давайте удалим созданный раздел «/dev/sdb1» и создадим заново с размером 604 МБ. Это может быть не тот размер. ПРИМЕЧАНИЕ. Не запускайте mkfs.ext4 во вновь созданном разделе.



Да, файлы найдены.

Точно так же создадим второй раздел '/dev/sdb2' и проверим, сможем ли мы смонтируйте его, чтобы получить данные. Итак, сначала я создал второй раздел с полностью пропущенным пространством в «sdb» и попытался узнать «Количество блоков» и «Размер блока», но получил ошибку, как показано:




Итак, давайте проверим, использовался ли «/dev/sdb2» в качестве физического тома для группы томов. Это можно найти в папке «/etc/lvm/backup», так как система создаст файл с именем группы томов со всеми подробностями после недавней операции lvm.




Да, это подтверждает, что это устройство «/dev/sdb2» использовалось в качестве физического тома для создания группы томов «datavg». Итак, давайте узнаем больше деталей, используя файл «/etc/lvm/backup/datavg».



Мы знаем, что можем запустить команду «vgcfgrestore», чтобы вернуть метаданные группы томов «datavg», поэтому давайте посмотрим, работает ли это сейчас:




Не удалось восстановить "datavg", и ошибка указывает на то, что физический том не найден. Итак, давайте проверим размер этого PV в файле резервной копии lvm, а также реальный размер:

Из приведенного выше вывода мне кажется, что устройство имеет размер «1 ГБ», поэтому давайте заново создадим раздел «/dev/sdb2» размером 1 ГБ и проверим, можно ли восстановить vg.

Нет, мы по-прежнему не можем восстановить "datavg". Это связано с тем, что границы устройства «/dev/sdb2» не точны. Это связано с тем, что первый раздел «/dev/sdb1» создается большего размера. Таким образом, размер устройства, который мы получили после расчета с использованием «Число блоков» и «Размер блока» для «sdb1», звучит некорректно. Таким образом, размер, который мы решили «604 МБ», неверен, и он должен быть размером «600 МБ». Как правило, мы знаем, что всякий раз, когда создается новый раздел, он будет округлен, поэтому в этом случае мы можем сказать, что он должен иметь размер «600M».

Давайте теперь реструктурируем расположение разделов. Нам нужно создать первый раздел «/dev/sdb1» размером 600 МБ, а второй — «/dev/sdb2» размером 1 ГБ.



Шаг 4. Смонтируйте устройства и проверьте, существуют ли данные. Если задействована группа томов, необходимо восстановить ее с помощью команды «vgcfgrestore».

Из предыдущих шагов мы обнаружили, что необходимо создать два раздела «/dev/sdb1» и «/dev/sdb2» с размерами, описанными ранее.


Поскольку мы знаем, что устройство «/dev/sdb2» использовалось в качестве физического тома для группы томов «datavg», давайте запустим «vgcfgrestore» и проверим сейчас.


Да, мы успешны! Это восстановило vg ‘datavg’. Теперь давайте попробуем смонтировать его и проверить, сможем ли мы вернуть данные. Поскольку «datavg» еще не активен, нам нужно запустить другую команду, чтобы активироваться, как показано ниже:


ПРИМЕЧАНИЕ. Как мы заметили, этот подход требует некоторых проб и ошибок для определения фактического размера разделов. Кроме того, мы знали, что на устройстве «/dev/sdb» было создано только 2 раздела, и если разделов будет больше, нам нужно будет продолжить, как мы делали раньше.


Создайте раздел размером не меньше первого раздела. Вы можете сделать его больше исходного раздела на любую величину. Если вы недооцените, будет много плача и скрежета зубов.

Команда (m для справки): n Действие команды e расширенный p основной раздел (1-4) p Номер раздела (1-4): 1 Первый цилиндр (1-23361, по умолчанию 1): используется значение по умолчанию 1 Последний цилиндр или +size или +sizeM или +sizeK (1-22800, по умолчанию 22800): 13032 Команда (m для справки): w

Запустите dumpe2fs на первом разделе и получите количество блоков.

% dumpe2fs /dev/sda1 | grep "Количество блоков:" Количество блоков: 41270953

Если вы не уверены в этом значении, повторите шаг 1 с большим размером раздела. Если количество блоков изменится, значит, вы недооценили размер исходного раздела. Повторяйте шаг 1, пока не получите стабильное количество блоков.

Команда (m для справки): d Номер раздела (1-4): 1

Создайте новый раздел точно такого же размера, который вы получили из подсчета блоков. Поскольку вы не можете ввести размер блока в fdisk, вам нужно выяснить, сколько цилиндров запрашивать. Вот формула:

(количество необходимых цилиндров) = (количество блоков) / (размер блока) (размер блока) = (размер блока) / 1024 (размер блока) = (количество головок) * (количество секторов/цилиндр) * (количество байт/сектор)

Рассмотрите следующий пример, в котором жесткий диск разделен на четыре основных раздела с 1, 2, 4 и 8 цилиндрами.

диск /dev/sda: 16 головок, 63 сектора, 23361 цилиндр. Единицы = цилиндры 1008 * 512 байт. Идентификатор блоков начала загрузки устройства Система /dev/sda1 1 2 976+ 83 Linux /dev/sda2 3 5 1512 83 Linux /dev/sda3 6 10 2520 83 Linux /dev/sda4 11 19 4536 83 Linux

fdisk предоставляет необходимую мне информацию о конфигурации в заголовке вывода. Размер блока составляет 516096 (16 головок * 63 сектора/цилиндр * 512 байт/сектор). Размер блока 504 ( 516096/1024 ). Таким образом, количество необходимых цилиндров для второго раздела равно 3 (1512 блоков / 504). Таблица разделов показывает, что это действительно так: первый цилиндр равен 3, второй — 4, а последний — 5, всего три цилиндра. Количество необходимых цилиндров для третьего раздела рассчитывается аналогично: 2520 блоков / 504 = 5, что соответствует блокам 6,7,8,9,10. Обратите внимание, что этот расчет не работает для первого раздела, потому что счетчик блоков неверен (976 вместо 1008). Знак плюс указывает, что не все блоки включены в значение fdisk. Когда вы попытаетесь вычислить (976/504), вы получите 1,937. Зная, что количество цилиндров должно быть целым числом, можно просто округлить в большую сторону.

Запустите на нем e2fsck, чтобы убедиться, что вы можете прочитать новый раздел.

Повторите шаги 1–5 для остальных разделов.

Благодарность Майку Вевеа, системному администратору jedi, за предоставление базовой стратегии.

При перезагрузке виртуального сервера Linux (Ubuntu) мы получили пугающую ошибку «Операционная система не найдена».

Error

Я убедился, что виртуальный жесткий диск не поврежден и доступен из хранилища данных.

Первым делом нужно было изучить структуру виртуального диска. Я загрузил образ Gparted Live ISO и сохранил его в своем локальном хранилище данных.

Измените настройки виртуальной машины, чтобы она запускалась с загруженного ISO-файла:

Изменить настройки

Откройте окно консоли и перезапустите сервер.

Следуйте инструкциям, чтобы загрузить ОС Gparted Live.

После загрузки вы увидите таблицу разделов в графическом виде. Вот как выглядел наш. Как видите, это выглядит как нераспределенное пространство и нераспознанная метка диска.

Ширина таблицы разделов

Это говорит о том, что таблица разделов повреждена или больше не записывается на диск.

В GParted встроен отличный инструмент TestDisk.

TestDisk может делать следующее (согласно их веб-сайту).

  • Исправить таблицу разделов, восстановить удаленный раздел
  • Восстановить загрузочный сектор FAT32 из резервной копии
  • Перестроить загрузочный сектор FAT12/FAT16/FAT32
  • Исправить таблицы FAT
  • Перестроить загрузочный сектор NTFS
  • Восстановить загрузочный сектор NTFS из резервной копии
  • Исправить MFT с помощью зеркала MFT
  • Найдите ext2/ext3/ext4 Backup SuperBlock
  • Восстановление файлов из файловых систем FAT, exFAT, NTFS и ext2
  • Скопируйте файлы из удаленных разделов FAT, exFAT, NTFS и ext2/ext3/ext4.

Откройте командное окно с рабочего стола GParted Live OS.

Введите TestDisk и нажмите «Создать»:

Создать

Далее выберите диск, на котором нужно выполнить поиск. Если вы не видите свой диск. нажмите SUDO внизу, чтобы выполнить поиск от имени пользователя root.

Нажмите "Продолжить":

Proceed

TestDisk выполнит поиск типа раздела по умолчанию. Обычно вы можете просто выбрать вариант по умолчанию:

Выберите вариант по умолчанию

Далее выберите «Анализ», чтобы позволить TestDisk изучить диск и найти потерянные разделы:

Анализ

Вы увидите список найденной текущей структуры разделов. Нажмите «Быстрый поиск», чтобы продолжить.

Теперь вы увидите список отсутствующих разделов. Вы можете выбрать раздел и выбрать P, чтобы изучить содержимое.
Нажмите Enter, чтобы продолжить.

Если вы удовлетворены тем, что все разделы найдены, вы можете нажать Записать, чтобы записать таблицу разделов на диск.

Если в списке нет дополнительных разделов, нажмите "Углубленный поиск", чтобы найти больше.

После записи раздела вы можете посмотреть на раздел в GParted, чтобы увидеть результаты:

Результаты

Выключите виртуальную машину.

Отредактируйте виртуальную машину, чтобы удалить ISO-образ с компакт-диска.

Теперь вы можете попытаться запустить ОС, но мы по-прежнему получаем сообщение об ошибке при загрузке.

1234F: эта ошибка характерна для Ubuntu и предполагает, что наша MBR (основная загрузочная запись) повреждена.

*** Чтобы исправить это, было использовано следующее, но опять же, это было характерно для Ubuntu — ваши результаты могут отличаться!

У Ubuntu есть загрузочный диск для восстановления, доступный здесь.

Загрузите ISO-образ и сохраните его в своем хранилище данных.

Измените настройки виртуальной машины для загрузки с нового образа ISO.

Изменить настройки

Откройте окно консоли и перезапустите виртуальную машину.

Следуйте инструкциям, чтобы загрузиться с Boot-Repair-Disk.

Boot-Repair- Диск

Если диск определяет необходимость ремонта, вы увидите следующее:

Boot Repair

Нажмите "Рекомендуемый ремонт".

После восстановления вы должны увидеть сообщение об успешном восстановлении MBR.

Загрузка успешно восстановлена

Отредактируйте виртуальную машину, чтобы отключить ISO и загрузить свою операционную систему.

Жесткий диск

В разделе Как предотвратить случайное удаление файлов и восстановиться после них в Linux мы рассмотрели локальные и удаленные резервные копии, как уменьшить драматизм восстановления файлов с помощью интеллектуального управления командами удаления файлов, а также общие рекомендации по реагированию на чрезвычайные ситуации при восстановлении файлов. К сожалению, случаются несчастные случаи, и оборудование выходит из строя. Один из инструментов, к которому можно обратиться, когда пришло время восстановить потерянные файлы или файловые системы, — TestDisk.

Примечание. Если у вас нет обязательного плана резервного копирования, внедрите его прямо сейчас. В первый раз вам не придется прибегать к TestDisk, потому что у вас есть резервная копия, планирование и подготовка окупаются как временем, так и спокойствием.

TestDisk пытается восстановить потерянные данные раздела и любые потерянные файлы в пределах восстановленного раздела. Этот инструмент может восстановить ваши данные сам по себе, или вы можете использовать его в сочетании со Scalpel — инструментом извлечения файлов — сначала используя TestDisk для получения образа диска, а затем сканируя образ на наличие типов файлов с помощью Scalpel. Вы можете узнать больше об использовании скальпеля в следующей статье.

TestDisk менее сфокусирован и более гибок, чем Scalpel, поэтому то, как вы используете этот инструмент, зависит от ситуации. TestDisk — это интерактивное приложение, поэтому начните с указания ему устройства или образа жертвы. Например:

TestDisk пытается определить правильную карту разделов, но если вы знаете лучше, вы можете переопределить его предположение, указав определенное местоположение. Как только вы выберете схему разделов, TestDisk предлагает свое главное меню. Здесь вы можете анализировать файлы, восстанавливать их или изменять геометрию и параметры диска. Типичный рабочий процесс заключается в анализе и последующем восстановлении.

Запуск TestDisk на образце лабораторного флэш-накопителя возвращает следующий анализ:

В этом случае потерянный раздел был назван wreck , и TestDisk успешно обнаружил его границы. Если единственные потерянные данные, которые вы восстанавливаете, — это потеря карты разделов, то на этом этапе вы можете использовать эти данные для воссоздания этой карты с помощью GNU Parted.

Успешный анализ открывает доступ к нескольким новым параметрам в меню "Дополнительно". Вооружившись границами раздела, вы можете сбросить данные этого раздела в файл образа:

Затем вы можете использовать скальпель на изображении для восстановления отдельных файлов.

В качестве альтернативы вы можете знать тип раздела и файловой системы (Тип), и в этом случае вы можете указать, как TestDisk обрабатывает данные. Это может помочь TestDisk найти резервный суперблок, что позволит вам использовать mkfs для восстановления данных следующим образом:

Или вы можете использовать TestDisk для обнаружения файлов с помощью пункта меню "Список":

Использование TestDisk — это, безусловно, путешествие. Если вы ранее сделали резервную копию диска, который пытаетесь спасти, этот инструмент, как правило, безопасен для экспериментов в случае возникновения проблем. Однако если вы только экспериментируете, безопаснее всего делать это на отдельной тестовой машине.

И, пожалуйста, поэкспериментируйте. Опыт, который вы получите от практики, бесценен.

Читайте также: