制作 PXE 可引导的 10MB 或更大的 DOS 映像

rjt*_*rjt 4 boot pxe ms-dos freedos

我想制作一个“海量”DOS 软盘映像,比如 10MB 或更多,包含我需要的任何系统、硬盘驱动器或 BIOS 的所有固件更新。

我不需要 DOS 映像可以联网,因为一切都在 PXE 启动的映像上,但联网会很好。由于 Zip 磁盘连接到软盘控制器并且超过 100MB,这应该是可能的。

我很久以前就尝试过这样做,但花了太多时间却无法启动。因此,如果有人对如何创建这样一个噩梦般的野兽并对其进行编辑有可靠的说明,请告诉我。可用于 PXE 并复制到 USB 记忆棒的图像将是一个加分项。

太糟糕了,制造商不提供包含所有固件更新的单个可引导 Linux ISO,这些固件更新很容易通过 LAN 引导并具有网络。惠普服务器做到了这一点,非常棒。

val*_*tis 5

我已经经历了几次这个过程,虽然它非常容易,但我一直忘记我使用的确切步骤,所以我在这里记录它以供我自己和其他人参考。作为记录,我使用 Slackware Linux 14.2+ 作为 PXE 服务器,并引导到几个不同的 Dell Optiplex 模型以进行 BIOS 更新。正如其他答案中提到的,您可以为大型文件系统创建可引导的 ISO 映像。但是,由于您专门询问了可启动软盘映像,因此这里是我使用的步骤。

首先,一些关于 MEMDISK 和 FAT12 的背景信息将您的问题放在上下文中。那里有很多相互矛盾和模棱两可的信息,所以希望这能让事情变得更清楚。

2003 年syslinux 线程表明 MEMDISK 支持的最大图像大小为 4GB,具体取决于硬件(即内存有限,但可能还有其他特定于硬件的注意事项)。2002 年的一个早期线程也指出了单独的 PXELINUX 限制(Linux 内核空间限制为 ~1GB,但此信息已超过 15 年)。

MEMDISK 文档 中,有一些特定的软盘几何形状, memdisk 将尝试猜测:

软盘图像

如果磁盘映像小于 4,194,304 字节(4096K,4 MiB),则假定它是软盘映像,并且 MEMDISK 将尝试根据文件大小猜测其几何形状。MEMDISK 可识别所有标准软盘大小以及常见的扩展格式:

  163,840 bytes  (160K) c=40 h=1 s=8    5.25" SSSD
  184,320 bytes  (180K) c=40 h=1 s=9    5.25" SSSD
  327,680 bytes  (320K) c=40 h=2 s=8    5.25" DSDD
  368,640 bytes  (360K) c=40 h=2 s=9    5.25" DSDD
  655,360 bytes  (640K) c=80 h=2 s=8    3.5"  DSDD
  737,280 bytes  (720K) c=80 h=2 s=9    3.5"  DSDD
1,222,800 bytes (1200K) c=80 h=2 s=15   5.25" DSHD
1,474,560 bytes (1440K) c=80 h=2 s=18   3.5"  DSHD
1,638,400 bytes (1600K) c=80 h=2 s=20   3.5"  DSHD (extended)
1,720,320 bytes (1680K) c=80 h=2 s=21   3.5"  DSHD (extended)
1,763,328 bytes (1722K) c=82 h=2 s=21   3.5"  DSHD (extended)
1,784,832 bytes (1743K) c=83 h=2 s=21   3.5"  DSHD (extended)
1,802,240 bytes (1760K) c=80 h=2 s=22   3.5"  DSHD (extended)
1,884,160 bytes (1840K) c=80 h=2 s=23   3.5"  DSHD (extended)
1,966,080 bytes (1920K) c=80 h=2 s=24   3.5"  DSHD (extended)
2,949,120 bytes (2880K) c=80 h=2 s=36   3.5"  DSED
3,194,880 bytes (3120K) c=80 h=2 s=39   3.5"  DSED (extended)
3,276,800 bytes (3200K) c=80 h=2 s=40   3.5"  DSED (extended)
3,604,480 bytes (3520K) c=80 h=2 s=44   3.5"  DSED (extended)
3,932,160 bytes (3840K) c=80 h=2 s=48   3.5"  DSED (extended)
Run Code Online (Sandbox Code Playgroud)

MEMDISK 目录中包含一个小的 perl 脚本,它可以确定 MEMDISK 将为其他尺寸选择的几何图形;通常,MEMDISK 将正确检测使用的大多数物理扩展格式,80 柱面或稍高一些。

 LABEL floppy_image
  LINUX memdisk
  INITRD floppy.img
Run Code Online (Sandbox Code Playgroud)

如果您的映像大于 4 MiB 并且是软盘映像,则可以强制 MEMDISK 将其视为软盘映像:

 LABEL floppy_image
  LINUX memdisk
  INITRD floppy.img
  APPEND floppy
Run Code Online (Sandbox Code Playgroud)

在实践中,我对APPEND floppy参数没有任何运气;MEMDISK: No ramdisk image specified!当我使用它时出现错误。

传统上,软盘映像使用FAT12 格式,其限制为 16MB 和 8k 簇。似乎有对 FAT12 的扩展允许 32MB 甚至 256MB(64k 集群),但我不确定具体细节。

如果我们针对可引导的“软盘”映像的最大 FAT12 大小(16,736,256 字节),我们可以执行以下操作:

dd if=/dev/zero of=FAT12_16MB.img bs=1 count=16736256
Run Code Online (Sandbox Code Playgroud)

但是,该命令可能需要一分钟才能完成。使用更大的块大小,我们可以在不到一秒的时间内完成同样的事情:

dd if=/dev/zero of=FAT12_16MB.img bs=8192 count=2043
Run Code Online (Sandbox Code Playgroud)

现在我们有一张“空白软盘”,我们需要将其格式化为 FAT12(如果您对该命令的可用参数感兴趣,请运行man mkfs.fat以查看手册页):

mkfs.fat -D 0x00 -F 12 -n FREEDOSBIOS FAT12_16MB.img
Run Code Online (Sandbox Code Playgroud)

现在我们有一个格式化的 FAT12“软盘”映像。我们可以创建一个文件夹并挂载它:

mkdir floppy
mount -t msdos -o loop FAT12_16MB.img floppy
Run Code Online (Sandbox Code Playgroud)

现在我们可以开始将文件复制到它。我从fdos.org下载了FreeDOS OEM 启动盘并将其复制到我的大图像中:

wget http://www.fdos.org/bootdisks/autogen/FDOEM.288.imz
unzip FDOEM.288.imz
Run Code Online (Sandbox Code Playgroud)

为 FreeDOS 映像创建一个新的挂载点并挂载它:

mkdir freedos12
mount -t msdos -o loop FDOEM.288 freedos12
Run Code Online (Sandbox Code Playgroud)

将 FreeDOS 操作系统复制到更大的软盘:

cp -r freedos12/* floppy
Run Code Online (Sandbox Code Playgroud)

然后卸载 FreeDOS 分区并删除不再需要的挂载点:

umount freedos12
rmdir freedos12
Run Code Online (Sandbox Code Playgroud)

现在我们有一个FAT12_16MB.img包含 FreeDOS 操作系统的 16MB 软盘映像 ( )。但是,如果您尝试通过 PXE 启动它,您将收到以下错误:

Loading boot sector... booting...
This is not a bootable disk. Please insert a bootable floppy and press any key to try again...
Run Code Online (Sandbox Code Playgroud)

我们需要在这个镜像上创建引导扇区。 重要提示:由于我们将直接写入映像文件,请确保在下一步之前未安装软盘映像:

umount floppy
Run Code Online (Sandbox Code Playgroud)

将 FreeDOS 映像中的引导扇区复制FDOEM.288到更大的映像“FAT12_16MB.img”:

dd if=FDOEM.288 of=FAT12_16MB.img bs=1 count=446 seek=62 skip=62 conv=notrunc
Run Code Online (Sandbox Code Playgroud)

现在您拥有了一个带有 FreeDOS 的 PXE 可引导 16MB FAT12 软盘映像。此时,您可以重新挂载映像并复制您需要的任何其他文件。

我用来启动这个映像的确切 PXE 配置是:

label bios
menu label FreeDOS
kernel memdisk
append initrd=FAT12_16MB.img
Run Code Online (Sandbox Code Playgroud)

我在创建此答案时参考了其他 一些有用的分步资源


moo*_*moo 3

您可以根据您的目的制作 FreeDOS 可启动映像(任何您需要的大小),然后添加任何软件或任何 DOS 实用程序,如 BIOS 更新工具等。

从您的问题来看,您似乎可以访问 Linux,并且可能熟悉使用终端/命令行。因此,对于这个答案,我将重点讨论在 Linux 中创建可启动映像。在 Windows 计算机上,您可以使用Rufus等工具来执行此操作。

然后,您可以使用 PXE 启动来启动此 FreeDOS 映像,或者将其写入 USB 驱动器以dd创建 FreeDOS 启动驱动器。当然,您可以扩展此处使用的步骤来创建您想要的任何 FreeDOS 媒体,包括添加 FreeDOS 完整版附带的全套软件。

以下是在 Linux 中创建可启动 FreeDOS 映像的步骤:


警告/免责声明!!!如果使用不当,下面使用的一些命令可能会擦除磁盘驱动器中的数据。在继续之前,请阅读每个程序的手册页以了解命令用法。您可能想在没有宝贵数据的辅助/虚拟机上尝试这些命令。


第 1 步:安装先决条件 (ms-sys):

步骤2:创建空白磁盘映像并创建msdos分区:

  • 为磁盘映像创建一个空文件:

    $ truncate -s 50M disk.img
    
    Run Code Online (Sandbox Code Playgroud)

    注意:此处创建了 50 MiB 大小的磁盘映像,但您可以将其设置为您需要的任何大小

  • 对磁盘映像进行分区:

    $ fdisk disk.img
    Command (m for help): o
        Created a new DOS disklabel with disk identifier 0x1234abcd.
    
    Command (m for help): n
        Partition type
           p   primary (0 primary, 0 extended, 4 free)
           e   extended (container for logical partitions)
        Select (default p): p
        Partition number (1-4, default 1): <ENTER>
        First sector (2048-102399, default 2048): 2048
        Last sector, +sectors or +size{K,M,G,T,P} (2048-102399, default 102399): <ENTER>
    
    Command (m for help): t
        Selected partition 1
        Partition type (type L to list all types): c
    
    Command (m for help): a
        Selected partition 1
        The bootable flag on partition 1 is enabled now.
    
    Command (m for help): w
    
    Run Code Online (Sandbox Code Playgroud)

    注意:fdisk上面的命令假设您需要 FAT32 文件系统。如果您想使用 FAT16 文件系统,则对于上述问题,Partition type (type L to list all types):请输入e而不是c

第三步:确认第一个分区的起始扇区位置:

  • 使用 fdisk 确定起始扇区:

    $ fdisk -l disk.img
    Disk disk.img: 50 MiB, 52428800 bytes, 102400 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: 0x1234abcd
    
    Device     Boot Start    End Sectors Size Id Type
    disk.img1  *     2048 102399  100352  49M  c W95 FAT32 (LBA)
    
    Run Code Online (Sandbox Code Playgroud)

    注意:从上面的fdisk输出中我们可以看到起始扇区偏移量为2048 个扇区,即 2048 xector_size 字节 = 2048 x 512 字节 = 1048576字节。实际上,我们在步骤 2中明确指定了起始扇区,但我包含了此步骤,因为当分区已创建时它可能很有用。以下命令中使用了这些数字:20481048576 。

步骤 4:使用 FAT 文件系统格式化分区

步骤 5:用于ms-sys写入主引导记录 (MBR) 和卷引导记录 (VBR):

  • 首先在分区仍作为循环设备加载时写入 VBR:

    • 要创建 FAT16 文件系统:

      $ sudo ms-sys --fat16free /dev/loop0
      
      Run Code Online (Sandbox Code Playgroud)
    • 要创建 FAT32 文件系统:

      $ sudo ms-sys --fat32free /dev/loop0
      
      Run Code Online (Sandbox Code Playgroud)

      笔记:

      • 不要使用此命令:ms-sys --partition /dev/loop0即使在某些文档中讨论了ms-sys某些情况下需要的命令。它将覆盖已正确写入的隐藏扇区字段mkfs.vfat
      • ms-sys只写入第一引导记录。ms-sys与 Rufus 不同的是,Rufus 不会写入 FAT32 的备份引导记录,但这不应阻止映像的可引导。
  • 接下来从循环设备中卸载/分离磁盘映像文件:

    $ sudo losetup -d /dev/loop0
    
    Run Code Online (Sandbox Code Playgroud)
  • 最后将 Windows 7 MBR 写入磁盘映像:

    $ ms-sys --mbr7 --force disk.img
    
    Run Code Online (Sandbox Code Playgroud)

    注意:写入常规(非设备)文件时ms-sys需要参数。--force

步骤 6:将基本 FreeDos 文件和您需要的任何其他程序写入磁盘映像上的分区:

  • 挂载分区:

    $ mkdir mnt
    $ sudo mount -o loop,offset=1048576 disk.img mnt/
    
    Run Code Online (Sandbox Code Playgroud)
  • 下载并解压所需的 FreeDOS 文件:

    $ wget https://github.com/pbatard/rufus/archive/v3.6.tar.gz
    $ tar -xvf v3.6.tar.gz rufus-3.6/res/freedos/
    
    Run Code Online (Sandbox Code Playgroud)

    注意:这些文件是从 Rufus github 存储库下载的,但是从 FreeDOS 官方网站提取的。有关 Rufus 从官方 FreeDOS 源获取二进制文件的详细信息,请参阅https://github.com/pbatard/rufus/tree/master/res/freedos/readme.txt上的 。

  • 将文件复制到分区:

    $ sudo mkdir mnt/LOCALE
    $ sudo cp rufus-3.6/res/freedos/!(COMMAND.COM|KERNEL.SYS) mnt/LOCALE/
    $ sudo cp rufus-3.6/res/freedos/{COMMAND.COM,KERNEL.SYS} mnt/
    $ printf '@echo off\r\nset PATH=.;\\;\\LOCALE\r\necho Using US-English keyboard with US-English codepage [437]\r\n' | sudo tee mnt/AUTOEXEC.BAT
    $ sudo fatattr +h +s mnt/COMMAND.COM
    $ sudo fatattr +h +s mnt/KERNEL.SYS
    
    Run Code Online (Sandbox Code Playgroud)

    笔记:

    • 使磁盘映像可引导真正需要的唯一文件是COMMAND.COMKERNEL.SYS。其余文件是可选的
    • 现在,您还可以在卸载之前将任何其他文件复制到磁盘映像(例如:BIOS 固件更新)。
    • 这些命令是可选的,但按照惯例fatattr向文件添加隐藏和系统属性。在 Debian/Ubuntu 系统上,您可以使用以下命令安装该程序COMMAND.COMKERNEL.SYSfatattrsudo apt-get install fatattr

第7步:你就完成了!