RError.com

RError.com Logo RError.com Logo

RError.com Navigation

  • 主页

Mobile menu

Close
  • 主页
  • 系统&网络
    • 热门问题
    • 最新问题
    • 标签
  • Ubuntu
    • 热门问题
    • 最新问题
    • 标签
  • 帮助
主页 / 问题 / 1126972
Accepted
Total Pusher
Total Pusher
Asked:2020-05-17 19:04:26 +0000 UTC2020-05-17 19:04:26 +0000 UTC 2020-05-17 19:04:26 +0000 UTC

将两个分区映像文件合并为一个磁盘映像并使其可启动

  • 772

我想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
  • dd boot.img同时做base.img适当的/dev/loopYp1和/dev/loopYp1

恐怕这行不通,因为我不完全理解这个过程。还:

  • 我不知道是否需要创建 MBRdd 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)。

系统开始启动。

linux
  • 1 1 个回答
  • 10 Views

1 个回答

  • Voted
  1. Best Answer
    eri
    2020-05-17T23:18:01Z2020-05-17T23:18:01Z

    你需要一个分区表的地方,虽然 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 MB 的可用空间而不是 17G)

    resize2fs /dev/loop1p1
    

    这是准备好的启动映像。

    稍微清理一下自己

    kpartx -r /dev/loop1
    losetup --detach /dev/loop1
    

    PS。如果第一个分区很大,dflash 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 找到它

    • 2

相关问题

  • 如果 fuser -k number/tcp 没有帮助,如何在 Debian 中释放端口?

  • Ubuntu。startx 不起作用。黑屏

  • --syn 在 iptables 中有什么作用?

  • 为什么需要iso格式?

  • C程序中没有密码的sudo

Sidebar

Stats

  • 问题 10021
  • Answers 30001
  • 最佳答案 8000
  • 用户 6900
  • 常问
  • 回答
  • Marko Smith

    如何从列表中打印最大元素(str 类型)的长度?

    • 2 个回答
  • Marko Smith

    如何在 PyQT5 中清除 QFrame 的内容

    • 1 个回答
  • Marko Smith

    如何将具有特定字符的字符串拆分为两个不同的列表?

    • 2 个回答
  • Marko Smith

    导航栏活动元素

    • 1 个回答
  • Marko Smith

    是否可以将文本放入数组中?[关闭]

    • 1 个回答
  • Marko Smith

    如何一次用多个分隔符拆分字符串?

    • 1 个回答
  • Marko Smith

    如何通过 ClassPath 创建 InputStream?

    • 2 个回答
  • Marko Smith

    在一个查询中连接多个表

    • 1 个回答
  • Marko Smith

    对列表列表中的所有值求和

    • 3 个回答
  • Marko Smith

    如何对齐 string.Format 中的列?

    • 1 个回答
  • Martin Hope
    Alexandr_TT 2020年新年大赛! 2020-12-20 18:20:21 +0000 UTC
  • Martin Hope
    Alexandr_TT 圣诞树动画 2020-12-23 00:38:08 +0000 UTC
  • Martin Hope
    Air 究竟是什么标识了网站访问者? 2020-11-03 15:49:20 +0000 UTC
  • Martin Hope
    Qwertiy 号码显示 9223372036854775807 2020-07-11 18:16:49 +0000 UTC
  • Martin Hope
    user216109 如何为黑客设下陷阱,或充分击退攻击? 2020-05-10 02:22:52 +0000 UTC
  • Martin Hope
    Qwertiy 并变成3个无穷大 2020-11-06 07:15:57 +0000 UTC
  • Martin Hope
    koks_rs 什么是样板代码? 2020-10-27 15:43:19 +0000 UTC
  • Martin Hope
    Sirop4ik 向 git 提交发布的正确方法是什么? 2020-10-05 00:02:00 +0000 UTC
  • Martin Hope
    faoxis 为什么在这么多示例中函数都称为 foo? 2020-08-15 04:42:49 +0000 UTC
  • Martin Hope
    Pavel Mayorov 如何从事件或回调函数中返回值?或者至少等他们完成。 2020-08-11 16:49:28 +0000 UTC

热门标签

javascript python java php c# c++ html android jquery mysql

Explore

  • 主页
  • 问题
    • 热门问题
    • 最新问题
  • 标签
  • 帮助

Footer

RError.com

关于我们

  • 关于我们
  • 联系我们

Legal Stuff

  • Privacy Policy

帮助

© 2023 RError.com All Rights Reserve   沪ICP备12040472号-5