我想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?实验中复制30GB需要很长时间,我想排除这一步。
UPD。
为未来的映像分配了 40 GB:
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 内
从 VirtualBox (CentOS 7.8) 内的 LiveCD 启动。然后我根据 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)。
系统开始启动。

你需要一个分区表的地方,虽然 seek 会继续......但让它成为:
然后在17G中添加没有孔的部分
在这里,512会写相当长的时间。我建议将503808移位到512000,然后可以大块写入
并且可以重新创建 MBR
和团队
您可以直接输入,而不是 +29268992。如果有像这样的铭文
Partition #1 contains a ext4 signature.——这很好——那么他们就进入了这个领域。但是这里还没有安装 GRUB。可能无法启动。
如果没有 --partscan 选项,那么您可以使用
接下来,安装靴子并在上面写一个新的鹅耳枥
或者也许你会很幸运没有安装,但有时它不起作用。
修复启动大小(增加了约 40 MB 的可用空间而不是 17G)
这是准备好的启动映像。
稍微清理一下自己
PS。如果第一个分区很大,dflash 512 很长时间,那么
对于问题:
使用 fdisk 更好
boot 通过文件系统的 UUID 查找系统 - 它会找到它。
有不同的消息:磁盘不可引导,没有引导加载程序,可以引导进入抓取但找不到引导,可以找到引导,但找不到根
你可以,但你需要将它挂载为/dev/sdb。我在这里写了如何加快速度。您可能会因重写引导加载程序配置而受苦,但可以这样做:
因此磁盘将显示为 sdb1 并且引导将通过 UUID 找到它