我在尝试创建可启动的 Linux 分发映像时缺少哪些步骤?

use*_*428 6 linux bootloader partitioning dd disk-image

我正在尝试dd为可与硬盘驱动器和闪存介质一起使用的操作系统创建分发映像(通过 Linux 的命令)。我已成功创建映像,但无法正常启动。我将布局以下步骤:

  1. 这将创建一个包含整个图像的空白文件:

    dd if=/dev/zero of=/tmp/test.img bs=512 count=1250000
    
    Run Code Online (Sandbox Code Playgroud)
  2. 将环回设备文件与映像文件关联:

    losetup /dev/loop0 /tmp/test.img
    
    Run Code Online (Sandbox Code Playgroud)
  3. 在我们可以操作之前,parted我们必须定义一个媒体标签类型:

    parted -s /dev/loop0 mklabel msdos
    
    Run Code Online (Sandbox Code Playgroud)
  4. 使图像文件中的第一个分区为 512MB:

    parted -s -a opt /dev/loop0 mkpart primary ext2 '0%' 512MB
    
    Run Code Online (Sandbox Code Playgroud)
  5. 将第一个分区设置为“可引导”:

    parted -s /dev/loop0 set 1 boot on
    
    Run Code Online (Sandbox Code Playgroud)
  6. 在第一个分区上创建一个 Ext2 文件系统:

    mkfs.ext2 -b 1024 /dev/loop0p1
    
    Run Code Online (Sandbox Code Playgroud)
  7. 安装 grub 引导代码的 stage1,同时保留上面创建的分区表:

    dd if=/boot/grub/stage1 of=/dev/loop0 bs=446 count=1
    
    Run Code Online (Sandbox Code Playgroud)
  8. 在媒体的前 512 字节之后安装 grub 引导代码的 stage2(跳过 stage1 和分区表):

    dd if=/boot/grub/stage2 of=/dev/loop0 bs=512 seek=1
    
    Run Code Online (Sandbox Code Playgroud)
  9. 将镜像文件的第一个分区挂载到一个挂载点:

    mount /dev/loop0p1 /mnt/image
    
    Run Code Online (Sandbox Code Playgroud)
  10. 将所有数据复制到分区中并卸载。

  11. dd 映像文件到任何硬盘驱动器或闪存介质。

使用这些步骤,我可以dd将图像文件到硬盘驱动器或闪存驱动器并引导到grub的传统控制台,我可以启动,但仅通过指定的rootkernelinitrd值。如果我尝试通过rootsetup命令安装 grub legacy ,我不会收到任何错误,但设备会启动为乱码。运行并fdisk -l产生:

Partition 1 has different physical/logical beginnings (non-Linux?):
phys(0,32,33) logical(0,37,14)
Partition 1 has different physical/logical endings:
phys(62,53,55) logical(336,27,19)
Run Code Online (Sandbox Code Playgroud)

我认为创建映像文件的方式存在问题,因为它负责创建(混乱的)分区表。有没有人能够使用这些(修改过的)步骤来制作一个有效的可启动媒体?

saw*_*ust 1

\n
    \n
  1. 使映像文件中的第一个分区为 512MB

    \n\n

    parted -s -a opt /dev/loop0 mkpart primary ext2 \'0%\' 512MB

  2. \n
\n
\n\n

在步骤 #4 中,您使用实用程序修改分区表的第一个条目,该条目位于扇区/块的末尾,也包含 MBR 的引导加载程序。

\n\n
\n
    \n
  1. 安装 grub\xe2\x80\x99s 引导代码的 stage1,同时保留上面创建的分区表:

    \n\n

    dd if=/boot/grub/stage1 of=/dev/loop0 bs=446 count=1

  2. \n
\n
\n\n

在步骤 #7 中,您尝试将引导加载程序安装到第一个扇区/块中,该扇区/块已包含有效的分区表。
\n但是dd是一个块传输实用程序,它从源读取块,并将这些块写入目标。

\n\n

在这种情况下,目标设备是 HDD 或 SSD,大概基于 512(或 4096)字节扇区。对块设备的读或写操作必须针对整个扇区。
\n当尝试仅 446 字节的“短”写入时,磁盘控制器(或操作系统)将强制执行,但附加 66(或 3650)字节的零以将扇区填充到其正确/完整长度。
\n块写入根本不是为了部分修改扇区和保留“未写入部分”。

\n\n

因此,此写入操作将覆盖先前安装的分区表。

\n\n

简单的解决方案是在步骤 #4 之前执行步骤 #7。这将使用一个空分区表写入整个 MBR 扇区,然后仅编辑一项。

\n