Соединить два файла-образа разделов в один образ диска и сделать его загрузочным
Хочу создать образ диска в виде файла img из двух файлов-образов разделов (также img). Затем переконвертировать в его в vdi - образ, с которого в VirtualBox загрузить всю систему - этот пункт я знаю как сделать (VBoxManage convertdd disk.img disk.vdi).
Чтобы было понятней, напишу так:
Есть диск с рабочей системой, система работает как гостевая под управлением Proxmox:
df -h
...
/dev/sdb1 225M 140M 73M 66% /boot
/dev/sdb3 28G 21G 5,2G 81% /
Визуально диск выглядит так:
fdisk /dev/sdb: 50.5 GB, 50465865728 bytes, 98566144 sectors
Units = sectors of 1 * 512 = 512 Bytes
...
Disk label type: dos
Disk indentifier: 0x2fda227d
Device Boot Start End Blocks Id System
/dev/sdb1 * 2048 503807 250880 83 Linux
/dev/sdb3 34605056 93143039 29268992 83 Linux
Я загрузился с Live-CD и снял два файла-образа через Create Partition Image - указал стрелками. Один - загрузочный, там grub, на другом - вся остальная система:
boot.img- загрузочныйbase.img- система
Теперь я хочу собрать один img файл, который переконвертировать в VirtualVox формат vdi (это я умею).
Вот тут я нашел алгоритм действий, но были неудачные эксперименты и появились вопросы.
Я вижу решение проблемы так:
- создать пустой файл
imgчерезfallocate -l 40G desc.img - через
fdiskсоздать два раздела, поставить флагbootableдля первого - подрубить диск через
losetup -f --show desc.img, запомнить номер устройства/dev/loopY - сделать
kpartx -a /dev/loopY - сделать
ddboot.imgиbase.imgна соответствующие/dev/loopYp1и/dev/loopYp1
Боюсь что это не будет работать, так как не до конца понимаю процесс. Также:
- не знаю, нужно ли делать создание MBR
dd if=/usr/lib/syslinux/mbr.bin of=/dev/loopY conv=notruncи откуда его взять (на исходной системе этого нет, можно ли взять от другой системы и "доработать")? Или в образеboot.imgуже есть MBR? - в исходном диске система размещалась по другим секторам, сможет ли
/bootнайти систему? - как можно диагностировать в чем, проблема, если я вставляю конечный
vdiв VirtualBox, но он не грузится с сообщением, что нет загрузочного диска. Или просто черный экран? - если создать загрузочный образ только из
boot.img(boot.vdi=>/dev/sdaв гостевой), аbase.imgподключить как второй диск (base.vdi=>/dev/sdbв гостевой), сможет ли система загрузиться в VirtualBox? Очень долго копировать 30 Гб в экспериментах, хочу исключить этот шаг.
UPD.
Отвел 40 Гб под будущий образ:
fallocate -l 40G dest.img
затем:
fdisk dest.img
n
p
1
2048
513807 (тут я немного накинул на всякий случай)
n
p
2
514048 (по-умолчанию)
83886079 (по-умолчанию)
p
Устр-во Загрузочный Start Конец Секторы Size Id Тип
dest.img1 * 2048 513807 511760 249,9M 83 Linux
dest.img2 514048 83886079 83372032 39,8G 83 Linux
w
Затем
losetup -f --show dest.img
# получилось /dev/loop6
kpartx -a /dev/loop6
потом скопировал разделы:
dd if=boot.img of=/dev/mapper/loop6p1 conv=notrunc
dd if=base.img of=/dev/mapper/loop6p2 conv=notrunc
затем попробовал отмонтировать losetup -d /dev/loop6, но losetup -l все равно показывает /dev/loop6.
Потом преобразовал VBoxManage convertdd dest.img dest.vdi, и посмотрел через Live CD - диск есть, вроде все норм, но попытка загрузиться с него выдает что no bootable media....
UPD2.
mkdir ./boot
mount /dev/loop6 ./boot
grub-install --recheck --boot-directory=./boot /dev/loop6
# Установка для платформы i386-pc.
# Установка завершена. Ошибок нет.
resize2fs /dev/mapper/loop6p1
# The filesystem on /dev/mapper/loop6p1 is now 63970 (4k) blocks long.
kpartx -r /dev/loop6
# loop6p1 : 0 511760 /dev/loop6 2048
# loop6p2 : 0 83372032 /dev/loop6 514048
losetup --detach /dev/loop6
После загрузки система проваливается в загрузчик grub:
grub >
Что-то я делаю не так...
UPD3.
Переставлял grub несколько раз, вот основные эксперименты
Первая переустановка grub - со своей машинки Ubuntu 16.04
losetup --partscan /dev/loop8 ./dest.img
затем grub-install и остальные действия.
После превращения в образ VBox и загрузки с него пишет, что не найден загрузочный диск no such device: (guid диска /dev/sda1 - это то что раньше было в boot.img).
Загружаюсь с LiveCD, с таким guid диск существует, это то что раньше было в boot.img и куда ставился grub. Команда
grub rescue > ls
(hd0) # тут выводится только это
Вторая переустановка grub - внутри VBox
Загрузился с LiveCD внутри VirtualBox (CentOS 7.8). Далее сделал по инструкции восстановления grub:
mount /dev/sda2 /mnt
mount /dev/sda1 /mnt/boot
mount --bind /dev /mnt/dev; mount --bind /sys /mnt/sys; mount --bind /proc /mnt/proc
chroot /mnt /bin/bash
Затем grub-install --recheck /dev/sda. Установщик вывел предупреждение, что нет /dev/sda3 (там раньше была система, теперь это /dev/sda2). При перезагрузке выводится экран grub:
(Добро пожаловать в Граб версии 0.97 ... нажмите Tab для списка команд)
grub >
Понажимая cd / + Tab я понял, что там каталог /grub/ и файлы /initramfs-..., vmlinuz-2.6 - то есть /boot, а корневой файловой системы нет.
Затем я проделал все это заново, но отредактировал файл /etc/mtab, где заменил монтирование корня /dev/sda3 на /dev/sda2, grub-install больше не выводил предупреждение.
Система по-прежнему не загружалась. Наконец, я понял в чем дело, и создал конфигурационный файл /boot/grub/grub.conf, поместив в него прежднее содержимое, которое ранее удалил в экспериментах (удалял полностью /grub).
Система стала загружаться.
Ответы (1 шт):
Нужно место под таблицу разделов, хотя дальше будет seek... но пусть будет:
dd if=/dev/zero of=disk.img bs=512 count=2048
Потом добавим разделы без дырки в 17G
dd if=boot.img of=disk.img bs=512 seek=2048
#dd if=base.img of=disk.img bs=512 seek=503808
Тут по 512 писаться будет довольно долго. Рекомендую сдвинуть 503808 сдвинуть на 512000, тогда можно писать большим блоком
dd if=base.img of=disk.img bs=10485760 seek=25
А MBR можно пересоздать поверх
fdisk disk.img
И команды
o
n
p
1
2048
511999
a
n
p
2
512000
+29268992
w
Вместо +29268992 можно просто энтер. Если там были надписи вроде Partition #1 contains a ext4 signature. - это хорошо - значит попали в сектор.
Но тут GRUB не установлен ещё. Может не стартануть.
modprobe loop
losetup --partscan /dev/loop1 ./disk.img
Если нет опции --partscan, то можно через
kpartx -a /dev/loop1
Дальше смонтируем бут и запишем на него новый граб
mkdir ./boot
mount /dev/loop1p1 ./boot
grub-install --recheck --boot-directory=./boot /dev/loop1
Или может повезет и без монтирования, но иногда не срабатывает.
grub-install /dev/loop1
Поправим размер бута (~40 мегабайт добавилось свободного пространства вместо 17Г)
resize2fs /dev/loop1p1
Вот и загрузочный образ готов.
Чуток прибраться за собой
kpartx -r /dev/loop1
losetup --detach /dev/loop1
ПС. Если первый раздел большой, и ддшить его по 512 долго, то
cp boot.img disk.img
fallocate --insert-range -o 0 -l 1048576 ./disk.img
По вопросам:
лучше через fdisk
boot ищет систему по UUID файловой системы - найдет.
там разные сообщения: диск не загрузочный, нет загрузчика, может загрузиться в граб но не найти бут, может найти бут, но не найти рут
можно, но монтировать его надо будет как /dev/sdb. Я тут написал как ддшить его побыстрей выше. Можешь намучаться с переписыванием конфига загрузчика, но сделай ка так:
fallocate --insert-range -o 0 -l 1048576 ./base.img
fdisk ./base.img
o
n
p
1
#энтер
#энтер
w
Так диск будет виден как sdb1 и загрузчк по UUID его найдет
