Восстановление пропавших разделов в Linux
На гипервизоре Proxmox при запуске виртуальной машины, обнаружилось, что нет ни одного раздела. Из-за чего это произошло не совсем понятно, но в итоге имеем виртуальную машину Ubuntu, которая не загружается, из-за отсутствия разделов. Отсутствие разделов выяснилось только после загрузки с LiveCD и команды fdisk -l
.
Давайте восстанавливать пропавшие разделы. Операционная система особой роли не играет. Способы восстановления подойдут для любой ОС на базе Linux с загрузчиком Grub.
Порядок восстановления пропавших разделов в Linux на обычном компьютере/сервере точно такое же как и на виртуальной машине.
В современных дистрибутивах Linux используется только 2 способа загрузки:
- загрузчик GRUB в GPT через BIOS;
- загрузчик GRUB в GPT через UEFI.
Эти два способа используются только со структурой разделов GPT. MBR сейчас не используется. В первом случае GRUB работает с устройствами через BIOS (немного устаревший вариант). Во втором GRUB работает с устройствами через специальную прослойку EFI, минуя BIOS.
В моем случае был способ №1. Узнал я это только после того как временно восстановил систему из старого бэкапа.
Общие принципы
В обоих случаях нам нужно скачать дистрибутив Ubuntu LiveCD серверной или десктопной версии. С помощью него мы будем восстанавливать пропавшие разделы в Linux. Можно использовать любой другой, но в статье использовался этот.
Если разделы пропали не по вашей вине (вы не удаляли их и не форматировали), на жестком диске, где размещен образ виртуальной машины, нет BAD-блоков или других проблем, то успех решения этой проблемы очень высок.
Можно проверить жесткий диск на наличие физических проблем, запустив любую специальную утилиту. К примеру, можно запустить программу Victoria только на чтение.
Восстанавливаем структуру ФС
Это теоретический раздел и вводить команды в консоль будем в следующих разделах.
При запуске команды fdisk -l
мы не видим ни одного раздела. Если мы создадим разделы на диске точь в точь как это было ранее, то ОС запустится. В моем случае был старый бэкап, который я восстановил и увидел как была размечена файловая система. Примерно так:
fdisk -l
...
Device Start End Sectors Size Type
/dev/sda1 2048 4095 2048 1M BIOS boot
/dev/sda2 4096 830078125 830074030 395.8G Linux filesystem
Здесь мы видим, используется GPT. Первый раздел имеет 1Мб с меткой bios_boot. Загрузчик в таком случае ставится физически на второй раздел в директорию /boot/.
Запоминаем все цифры и воссоздаем разметку дисков вручную. При этом не форматируем разделы. Это важно.
Если точных данных у вас нет и Вы только примерно представляете структуру (сначала sda1 с BIOS boot, а потом sda2 с основным разделом системы), то размечаете первый раздел как на листинге выше. Это сработает, так как этот раздел создается автоматически при установке ОС с одинаковыми параметрами.
Файловая система EXT 3/4 устроена так, что если мы даже создадим один раздел от начала первого и до конца второго, то вы сможете увидеть его содержимое. Восстановить загрузку не получится, а получить доступ к данным — да.
Установка загрузчика GRUB в GPT через BIOS
При этом варианте загрузки необходимо иметь первый раздел /dev/sda1
размером 1Mb с флагом bios_grub. Этот раздел должен быть обязательно первым.
Создаем первый раздел:
sudo gdisk /dev/sda
GPT fdisk (gdisk) version 1.0.1
Partition table scan:
MBR: protective
BSD: not present
APM: not present
GPT: present
Found valid GPT with protective MBR; using GPT.
Command (? for help): n
Partition number (1-128, default 1): 1
First sector (34-167770000, default = 2048) or {+-}size{KMGTP}: 2048
Last sector (239616-167770000, default = 167770000) or {+-}size{KMGTP}: +1Mb
Hex code or GUID (L to show codes, Enter = 8300): EF02
Changed type of partition to 'BIOS boot partition'
Command (? for help): w
Таким способом восстановили первый раздел. Далее второй:
sudo gdisk /dev/sda
GPT fdisk (gdisk) version 1.0.1
Partition table scan:
MBR: protective
BSD: not present
APM: not present
GPT: present
Found valid GPT with protective MBR; using GPT.
Command (? for help): n
Partition number (2-128, default 2): 2
First sector (4096-167770000, default = 4096) or {+-}size{KMGTP}: 4096
Last sector (239616-167770000, default = 167770000) or {+-}size{KMGTP}: 830078125
Hex code or GUID (L to show codes, Enter = 8300): 8300
Command (? for help): w
Если не знаете чему должен быть равен Last sector, то оставляете значение по умолчанию.
Если вы изначально знали точные размеры разделов (как в моем случае), то при следующей загрузке у Вас запустится ОС. Если система не запустилась, то необходимо переустановить загрузчик GRUB.
Для этого устанавливаем дополнительный пакет:
sudo apt install grub2-common
И далее устанавливаем сам загрузчик:
sudo mount /dev/sda2 /mnt
sudo mount --bind /dev /mnt/dev
sudo mount --bind /proc /mnt/proc
sudo chroot /mnt
sudo grub-install /dev/sda
Здесь подключаем все нужные папки и через chroot ставим GRUB.
После перезагрузки система запустится.
Установка загрузчика GRUB в GPT через UEFI
Если для загрузки Linux используется EFI, то восстановление похожее как в предыдущем случае. Есть небольшие исключения: специальный раздел должен быть =100Mb и отформатирован в FAT32 с установленным флагом esp. Раздел можно сделать последним. Порядок не важен. Чаще всего EFI — это первый раздел. Именно в этом случае важно знать первоначальную разметку диска до аварии.
sudo gdisk /dev/sda
GPT fdisk (gdisk) version 1.0.1
Partition table scan:
MBR: protective
BSD: not present
APM: not present
GPT: present
Found valid GPT with protective MBR; using GPT.
Command (? for help): n
Partition number (1-128, default 1): 1
First sector (34-167770000, default = 2048) or {+-}size{KMGTP}: 2048
Last sector (239616-167770000, default = 167770000) or {+-}size{KMGTP}: +100Mb
Hex code or GUID (L to show codes, Enter = 8300): EF00
Changed type of partition to 'ESP partition'
Command (? for help): w
Восстанавливаем второй раздел:
Второй раздел
sudo gdisk /dev/sda
GPT fdisk (gdisk) version 1.0.1
Partition table scan:
MBR: protective
BSD: not present
APM: not present
GPT: present
Found valid GPT with protective MBR; using GPT.
Command (? for help): n
Partition number (2-128, default 2): 2
First sector (104448-167770000, default = 104448) or {+-}size{KMGTP}: 104448
Last sector (239616-167770000, default = 167770000) or {+-}size{KMGTP}: 830078125
Hex code or GUID (L to show codes, Enter = 8300): 8300
Command (? for help): w
Далее устанавливаем загрузчик GRUB в EFI раздел. Для этого устанавливаем нужные пакеты:
sudo apt install grub-efi efibootmgr
И далее устанавливаем сам загрузчик:
sudo mount /dev/sda1 /mnt
sudo mount --bind /dev/sda1 /mnt/boot
sudo mount --bind /dev /mnt/dev
sudo mount --bind /proc /mnt/proc
sudo chroot /mnt
sudo grub-install /dev/sda
По сути эти два способа не сильно отличаются между собой, только размером разделов и флагом. В обоих случаях мы создаём заново раздел загрузки и на остальном свободном месте создаем раздел Ext4. Если нужны данные, то они должны уже быть доступны на нем. Если нужно восстановить загрузку ОС, то устанавливаем заново загрузчик.
Теги: grub