Pull to refresh

Спасение раздела в Debian, когда пошло, что-то не так

Reading time4 min
Views3K
Добрый день, уважаемые!

Я вам раскажу исторую, которая могла привести к полной потери данных на виртуальной машине, но выход из ситуации все же был найден при помощи: parted

Исходные данные:
ОС: Debiab 9 64bit
ФС: ext4 без LVM
Цель: Расширить ФС на виртуальной машине с 14Гб до 60Гб

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


День 1:
Перед админом была поставлена вполне простая задача — нужно расширить размер ФС на VM. Предварительно уже были проведены работы по расширению образа диска для этой VM и поэтому дело оставалось за малым — расширить размер ФС на VM.

Структура ФС на VM:
/boot — 56Mb
/ — все оставшеее место — ext4

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

И так админ в четверг вечером приступает к исполнению задачи. Первым его шагом было загрузка VM с использование iso-образа — SystemRescue. После успешной загрузки VM с помощь iso-образа админ приступает к работе и при помощи fdisk удаляет раздел / (/dev/vda2), что является правильным так как именно его необходимо расширить. После удаления раздела (/dev/vda2) админ создает новый раздел — /dev/vda2 и тут случается первая ошибка — админ создает сначала extened партицию и уже потом создает primary и сохравнив новую разметку выходит из fdisk и пытается смонтировать раздел:

image

Так как разметка диска изменилась и изменились начало и конец раздела /dev/vda5, то появилась ожидаемая ошибка, о том, что не найден или ошибочный superblock. Ошибка вполне серьёзная и если подойти к решению не так, то можно потерять файлы или получить их битыми. Можно конечно откатиться назад, но проблема заключается еще и в том, что админ перед своими работами не сделал скриншот предыдушей разметки диска.

Так как раздел не может быть смонтирован… админ предпринимает попытку исправить ситуацию путем удаления созданных им партиций и создания уже новой primary, но как он не значает окончания партции с данными, то все его попытки приводят к одному результату:
Superblock invalid.

После нескольких попыток восстановить раздел своими силами первый админ просить помощи у второго админа.

Первым делом второй админ оставливает VM и копирует текущий образ диска с именем vm_bad_disk. Далее поднимается VM с такой же версий ОС — Debian 9 64bit и покдлючает вторым диском — vm_bad_disk.

Зайдя в новую VM через ssh — смотрим листинг дисков в VM:
root@recovery:~# fdisk -l
Disk /dev/vda: 4.9 GiB, 5242880000 bytes, 10240000 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
Disklabel type: dos
Disk identifier: 0x09dea38e

Device Boot Start End Sectors Size Id Type
/dev/vda1 * 2048 499711 497664 243M 83 Linux
/dev/vda2 501758 10237951 9736194 4.7G 5 Extended
/dev/vda5 501760 10237951 9736192 4.7G 83 Linux

Disk /dev/vdb: 58.6 GiB, 62914560000 bytes, 122880000 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
Disklabel type: dos
Disk identifier: 0xe8c76303

Device Boot Start End Sectors Size Id Type
/dev/vdb1 * 2048 194559 192512 94M 83 Linux
/dev/vdb2 196606 30717951 30521346 14.6G 5 Extended
/dev/vdb5 198656 30717951 30519296 14.6G 83 Linux


Вот /dev/vdb — это и есть наш vm_bad_disk. Первым дело второй админ удаляет /dev/vdb2 и /dev/vdb5 и пытаемся создать /dev/vdb2 с началось 194560 и примерным концом, но так же получает:
Superblock invalid.

Для работы с разделом /dev/vdb — ставится parted утилита для более удобной работы с разделом.
Повторяем действие с удаление /dev/vdb2 уже в parted и делаем help.

Внимание админа привлекает команда rescue, которая возволяет задав начало и конец партиции найти на ней ФС. Ничего сложного в синтаксисе команды нет:
Просто наберите в parted:
> rescue
Система спросит:
Start — тут было указано 194560
Теперь админу необходимо расчитать End (конец партиции). Так как изначально админу известно, что размер всего диска был 14Гб и что 1 сектор это 512 байт… то делаются следующие расчеты:
14 ГБ это примерно 15032385536 байт, расчитываем количество секторов:
15032385536 / 512 = 29360128
Вот это значение и необходимо указать в parted:
End 29360128

Нажимайте смело Enter и ждите результата… В данном случае ждать пришлось не долго и parted выдало — что ФС найдено и стоит ли сделать изменения — отвечаем ДА

Parted произведет необходимые измения и админ выходит из parted.

Админ возращается в командную строку системы и делает:
mount /dev/vdb2 /mnt

Раздел монтируется без каких либо проблем и показывает — что его размер около 14Гб, что правильно, так расширение ФС еще не производилось. Админ бегло провяряет файлы и все говорит о том, что артефактов и битых файлов на первый взгляд нету.

Так как раздел выглядит живым админ делает: umount /dev/vdb2 и запускает:
e2fsck /dev/vdb2 после окончания проверки — запускает команда для расширения раздела:
resize2fs /dev/vdb2

Операция проходит без каких-либо проблем и админ монтирует еще раз раздел, чтобы убедиться, что все ОК:
mount /dev/vdb2 /mnt

Раздел монтируется без ошибок и при помощи команды df -р видит уже расширенный раздел.

Админ еще раз проверяет файлы и директории на данной партции и принимает решение, что с ФС и файлами все ОК.

Админ выполняет команду: shutdown -p now и удаляет привязанный диск с VM, с которой производились действия.

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

VM загружается без каких-либо проблем и все данные на месте.

Мораль:
1) Сделайте SnapShot перед своими действиями
2) Сделайте скриншот нужных настроек (в данном случае разметки разделов)
3) Перед работами сделайте бэкап важных файлов
Tags:
Hubs:
-1
Comments5

Articles

Change theme settings