Восстановление пропавших разделов в Linux
На гипервизоре Proxmox при запуске виртуальной машины, обнаружилось, что нет ни одного раздела. Из-за чего это произошло не совсем понятно, но в итоге имеем виртуальную машину Ubuntu, которая не загружается, из-за отсутствия разделов. Отсутствие разделов выяснилось только после загрузки с LiveCD и команды fdisk -l .
Давайте восстанавливать пропавшие разделы. Операционная система особой роли не играет. Способы восстановления подойдут для любой ОС на базе Linux с загрузчиком Grub.
Порядок восстановления пропавших разделов в Linux на обычном компьютере/сервере точно такое же как и на виртуальной машине.
В современных дистрибутивах Linux используется только 2 способа загрузки:
Эти два способа используются только со структурой разделов 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: 2048 Last sector (239616-167770000, default = 167770000) or size: +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: 4096 Last sector (239616-167770000, default = 167770000) or size: 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: 2048 Last sector (239616-167770000, default = 167770000) or size: +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: 104448 Last sector (239616-167770000, default = 167770000) or size: 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. Если нужны данные, то они должны уже быть доступны на нем. Если нужно восстановить загрузку ОС, то устанавливаем заново загрузчик.
No free sectors available — Cannot add new partition
I am trying to add additional 40 GB to the 60 GB disk and make it 100GB. Disk is added from backend and in fdisk it shows 100GB. However, when trying to create new partition I get error «No free sectors available». While trying to create partition with fdisk /dev/sda as below:
]# fdisk /dev/sda The device presents a logical sector size that is smaller than the physical sector size. Aligning to a physical sector (or optimal I/O) size boundary is recommended, or performance may be impacted. WARNING: DOS-compatible mode is deprecated. It's strongly recommended to switch off the mode (command 'c') and change display units to sectors (command 'u'). Command (m for help): p Disk /dev/sda: 107.4 GB, 107374182400 bytes 255 heads, 63 sectors/track, 13054 cylinders Units = cylinders of 16065 * 512 = 8225280 bytes Sector size (logical/physical): 512 bytes / 4096 bytes I/O size (minimum/optimal): 4096 bytes / 4096 bytes Disk identifier: 0x0006d1e9 Device Boot Start End Blocks Id System /dev/sda1 * 1 64 512000 83 Linux Partition 1 does not end on cylinder boundary. /dev/sda2 64 6528 51915776 8e Linux LVM /dev/sda3 6528 7832 10481740 8e Linux LVM /dev/sda4 7833 9137 10482412+ 5 Extended /dev/sda5 7833 9137 10482381 8e Linux LVM Partition 5 does not start on physical sector boundary. Command (m for help): n No free sectors available Command (m for help): q
~]# fdisk -l Disk /dev/sda: 107.4 GB, 107374182400 bytes 255 heads, 63 sectors/track, 13054 cylinders Units = cylinders of 16065 * 512 = 8225280 bytes Sector size (logical/physical): 512 bytes / 4096 bytes I/O size (minimum/optimal): 4096 bytes / 4096 bytes Disk identifier: 0x0006d1e9 Device Boot Start End Blocks Id System /dev/sda1 * 1 64 512000 83 Linux Partition 1 does not end on cylinder boundary. /dev/sda2 64 6528 51915776 8e Linux LVM /dev/sda3 6528 7832 10481740 8e Linux LVM /dev/sda4 7833 9137 10482412+ 5 Extended /dev/sda5 7833 9137 10482381 8e Linux LVM Partition 5 does not start on physical sector boundary. Disk /dev/mapper/vg_nkpdpbn01-lv_root: 69.2 GB, 69247959040 bytes 255 heads, 63 sectors/track, 8418 cylinders Units = cylinders of 16065 * 512 = 8225280 bytes Sector size (logical/physical): 512 bytes / 4096 bytes I/O size (minimum/optimal): 4096 bytes / 4096 bytes Disk identifier: 0x00000000 Disk /dev/mapper/vg_nkpdpbn01-lv_swap: 5368 MB, 5368709120 bytes 255 heads, 63 sectors/track, 652 cylinders Units = cylinders of 16065 * 512 = 8225280 bytes Sector size (logical/physical): 512 bytes / 4096 bytes I/O size (minimum/optimal): 4096 bytes / 4096 bytes Disk identifier: 0x00000000
~]# lsblk NAME MAJ:MIN RM SIZE RO TYPE MOUNTPOINT sda 8:0 0 100G 0 disk ââsda1 8:1 0 500M 0 part /boot ââsda2 8:2 0 49.5G 0 part â ââvg_nkpdpbn01-lv_root (dm-0) 253:0 0 64.5G 0 lvm / â ââvg_nkpdpbn01-lv_swap (dm-1) 253:1 0 5G 0 lvm [SWAP] ââsda3 8:3 0 10G 0 part â ââvg_nkpdpbn01-lv_root (dm-0) 253:0 0 64.5G 0 lvm / ââsda4 8:4 0 1K 0 part ââsda5 8:5 0 10G 0 part ââvg_nkpdpbn01-lv_root (dm-0) 253:0 0 64.5G 0 lvm / sr0 11:0 1 1024M 0 rom ~]# pvs File descriptor 63 (pipe:[355848]) leaked on pvs invocation. Parent PID 20225: -bash PV VG Fmt Attr PSize PFree /dev/sda2 vg_nkpdpbn01 lvm2 a-- 49.51g 0 /dev/sda3 vg_nkpdpbn01 lvm2 a-- 9.99g 0 /dev/sda5 vg_nkpdpbn01 lvm2 a-- 9.99g 0 ~]# lvs File descriptor 63 (pipe:[356102]) leaked on lvs invocation. Parent PID 20225: -bash LV VG Attr LSize Pool Origin Data% Meta% Move Log Cpy%Sync Convert lv_root vg_nkpdpbn01 -wi-ao---- 64.49g lv_swap vg_nkpdpbn01 -wi-ao---- 5.00g ~]# vgs File descriptor 63 (pipe:[356125]) leaked on vgs invocation. Parent PID 20225: -bash VG #PV #LV #SN Attr VSize VFree vg_nkpdpbn01 3 2 0 wz--n- 69.49g 0 ~]# df -h Filesystem Size Used Avail Use% Mounted on /dev/mapper/vg_nkpdpbn01-lv_root 64G 44G 17G 73% / tmpfs 3.9G 4.0K 3.9G 1% /dev/shm /dev/sda1 477M 115M 337M 26% /boot
Can’t install Ubuntu 12.04 — No available partitions
I am unable to install Ubuntu 12.04 because it cannot recognize the partition. More technically: «Partition table entries are not in disk order» When I try to install and reach the partitioning step, I get nothing — I mean, no partitions in the installation windows. I can’t push continue because I didn’t select anything. It says sdb as a disk, but with no partitions on it. How can I get the install to acknowledge the partition? Here’s my fdisk -lu output:
Disk identifier: 0xbbc58b91 Device Boot Start End Blocks Id System /dev/sdb1 * 2048 1607679 802816 7 HPFS/NTFS/exFAT /dev/sdb2 1607680 432273407 215332864 7 HPFS/NTFS/exFAT /dev/sdb3 946051072 976771071 15360000 27 Hidden NTFS WinRE /dev/sdb4 432273408 946051071 256888832 83 Linux Partition table entries are not in disk order Disk /dev/sdc: 31.0 GB, 30992891904 bytes 255 heads, 63 sectors/track, 3768 cylinders, total 60532992 sectors Units = sectors of 1 * 512 = 512 bytes Sector size (logical/physical): 512 bytes / 512 bytes I/O size (minimum/optimal): 512 bytes / 512 bytes Disk identifier: 0x0217934c Device Boot Start End Blocks Id System /dev/sdc1 * 63 60532991 30266464+ c W95 FAT32 (LBA)
What happens when you try to install Ubuntu 12.04? What kind of error message do you receive when you reach the partitioning step?
Nothing. I mean, no partitions in the installation windows. I can’t push continue because i didn’t select anything. It says sdb as a disk but with no partitions on it. Thanks!