我想要制作一个“海量” DOS 软盘映像,比如 10MB 或更大,其中包含任何系统、硬盘或 BIOS 所需的所有固件更新。
我不需要 DOS 映像具有网络功能,因为所有内容都将位于 PXE 启动映像上,但网络功能会很好。由于 Zip 磁盘已连接到软盘控制器并且超过 100MB,因此这应该是可能的。
我很久以前就尝试过这样做,花了太多时间,但最终还是无法启动。所以如果有人有关于如何创建和编辑这样一个噩梦般的怪物的可靠说明,请告诉我。可用于 PXE 并复制到 USB 记忆棒的映像将是一个加分项。
遗憾的是,制造商没有提供包含所有固件更新的单个可启动 Linux ISO,这些固件更新可轻松通过 LAN 启动并联网。HP 服务器做到了这一点,这太棒了。
答案1
您可以根据您的目的制作一个 FreeDOS 可启动映像(您需要的任意大小),然后添加任何软件或任何 DOS 实用程序,如 BIOS 更新工具等。
从你的问题来看,你似乎可以访问 Linux,并且可能熟悉使用终端/命令行。因此,对于这个答案,我将重点介绍在 Linux 中创建可启动映像。在 Windows 机器上,你可以使用类似鲁弗斯去做这件事。
然后,您可以使用 PXE 启动来启动这个 FreeDOS 映像,或者使用以下命令将其写入 USB 驱动器:dd
创建 FreeDOS 启动驱动器。当然,您可以扩展此处使用的步骤来创建您想要的任何 FreeDOS 媒体,包括添加 FreeDOS 完整版附带的全套软件。
以下是在 Linux 中创建可启动 FreeDOS 映像的步骤:
警告/免责声明!!!如果使用不当,下面使用的某些命令可能会从您的磁盘驱动器中擦除数据。在继续操作之前,请阅读每个程序的手册页以了解命令用法。您可能希望在没有您宝贵数据的辅助/虚拟机上尝试这些命令。
步骤 1:安装先决条件(ms-sys):
ms-sys
如果你的包管理器没有提供源代码,请从以下位置安装:$ wget https://sourceforge.net/projects/ms-sys/files/ms-sys%20stable/2.6.0/ms-sys-2.6.0.tar.gz $ tar -xzvf ms-sys-2.6.0.tar.gz $ cd ms-sys-2.6.0
编译 ms-sys 需要使用
msgfmt
以下gettext
软件包,该软件包可以在 Debian/Ubuntu 上安装:$ sudo apt install gettext
编译并安装:
$ make $ sudo make install
第 2 步:创建一个空白磁盘映像并创建一个 msdos 分区:
为磁盘映像创建一个空文件:
$ truncate -s 50M disk.img
注意:这里创建了一个 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
注意:
fdisk
上述命令假设您需要 FAT32 文件系统。如果您想使用 FAT16 文件系统,则对于上述问题,请Partition type (type L to list all types):
输入e
c
步骤3:确认第一个分区的起始扇区的位置:
使用 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)
注意:从上面的
fdisk
输出我们可以看到起始扇区偏移量是2048扇区或 2048 x 扇区大小字节 = 2048 x 512 字节 =1048576字节。实际上,我们明确指定了起始扇区第2步但我加入了这一步,因为当分区已经创建时它可能有用。这些数字:2048和1048576用于后面的命令中。
步骤 4:使用 FAT 文件系统格式化分区
搜索免费循环设备:
$ losetup -f /dev/loop0
创建分区的循环设备(位于偏移量=1048576磁盘映像):
$ sudo losetup -o1048576 /dev/loop0 disk.img
创建 FAT 文件系统:
要创建 FAT16 文件系统:
$ sudo mkfs.vfat -F16 -R8 -h2048 /dev/loop0
要创建 FAT32 文件系统:
$ sudo mkfs.vfat -F32 -h2048 /dev/loop0
注意:在
mkfs.vfat
参数-h2048
是必需的。mkfs.vfat
除非您指定此参数,否则不会将分区前的隐藏扇区写入引导记录,并且它是引导映像所必需的。这里再次2048
是分区 1 的扇区偏移量,如步骤3. 该参数-R8
是可选的,但建议使用。
步骤5:使用ms-sys
写入主引导记录(MBR)和卷引导记录(VBR):
首先在分区仍作为循环设备加载时写入 VBR:
要创建 FAT16 文件系统:
$ sudo ms-sys --fat16free /dev/loop0
要创建 FAT32 文件系统:
$ sudo ms-sys --fat32free /dev/loop0
笔记:
- 不要使用此命令:
ms-sys --partition /dev/loop0
即使某些文档中讨论了ms-sys
在某些情况下需要使用此命令。它将覆盖已正确写入的隐藏扇区字段mkfs.vfat
ms-sys
仅写入第一个引导记录。ms-sys
与 Rufus 不同,它不会写入 FAT32 的备份引导记录,但这不应阻止映像引导。
- 不要使用此命令:
接下来从循环设备中卸载/分离磁盘映像文件:
$ sudo losetup -d /dev/loop0
最后将 Windows 7 MBR 写入磁盘映像:
$ ms-sys --mbr7 --force disk.img
注意:写入常规(非设备)文件时
ms-sys
需要参数。--force
步骤 6:将基本 FreeDos 文件和您需要的任何其他程序写入磁盘映像上的分区:
挂载分区:
$ mkdir mnt $ sudo mount -o loop,offset=1048576 disk.img mnt/
下载并提取所需的 FreeDOS 文件:
$ wget https://github.com/pbatard/rufus/archive/v3.6.tar.gz $ tar -xvf v3.6.tar.gz rufus-3.6/res/freedos/
注意:这些文件是从 Rufus github 存储库下载的,但从 FreeDOS 官方网站提取。请
readme.txt
参阅https://github.com/pbatard/rufus/tree/master/res/freedos/有关 Rufus 从官方 FreeDOS 源获取二进制文件的详细信息。复制文件到分区:
$ 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
笔记:
- 使磁盘映像可启动真正需要的文件只有
COMMAND.COM
和KERNEL.SYS
。其余文件是可选的 - 现在,您还可以在卸载磁盘映像之前将任何其他文件复制到磁盘映像中(例如:BIOS 固件更新)。
- 这些命令是可选的,但会按照惯例
fatattr
为文件添加隐藏和系统属性。在 Debian/Ubuntu 系统上,您可以使用以下命令安装程序COMMAND.COM
KERNEL.SYS
fatattr
sudo apt-get install fatattr
- 使磁盘映像可启动真正需要的文件只有
第 7 步:您已完成!
卸载磁盘映像:
$ sudo umount mnt/
答案2
我已经经历过几次这个过程,虽然非常简单,但我总是忘记我使用的具体步骤,所以我在这里记录下来,供我自己和其他人参考。为了记录,我使用 Slackware Linux 14.2+ 作为 PXE 服务器,并引导到几个不同的 Dell Optiplex 型号进行 BIOS 更新。正如其他答案中提到的,您可以为大型文件系统创建可启动的 ISO 映像。但是,既然你特别询问了可启动的软盘映像,下面是我为此使用的步骤。
首先,我要介绍一些有关 MEMDISK 和 FAT12 的背景信息,以便将您的问题放在上下文中。目前有很多相互矛盾和模棱两可的信息,希望这能让您稍微理清一些。
A自 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)
MEMDISK 目录中包含一个小的 perl 脚本,它可以确定 MEMDISK 为其他大小选择的几何形状;一般来说,MEMDISK 将正确检测使用的大多数物理扩展格式,具有 80 个或略高的圆柱体。
LABEL floppy_image
LINUX memdisk
INITRD floppy.img
如果您的映像大于 4 MiB 并且它是软盘映像,则可以强制 MEMDISK 将其视为软盘映像:
LABEL floppy_image
LINUX memdisk
INITRD floppy.img
APPEND floppy
实际上,我对这个参数并没有任何运气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
但是,该命令可能需要一分钟才能完成。使用更大的块大小,我们可以在不到一秒的时间内完成相同的操作:
dd if=/dev/zero of=FAT12_16MB.img bs=8192 count=2043
现在我们有了一张‘空白软盘’,我们需要将其格式化为 FAT12(如果您对该命令的可用参数感兴趣,请运行man mkfs.fat
查看手册页):
mkfs.fat -D 0x00 -F 12 -n FREEDOSBIOS FAT12_16MB.img
现在我们有一个格式化的 FAT12“软盘”映像。我们可以创建一个文件夹并挂载它:
mkdir floppy
mount -t msdos -o loop FAT12_16MB.img floppy
现在我们可以开始将文件复制到它了。我下载了FreeDOS OEM 启动盘从fdos.org并将其复制到我的大图上:
wget http://www.fdos.org/bootdisks/autogen/FDOEM.288.imz
unzip FDOEM.288.imz
为 FreeDOS 映像创建一个新的挂载点并挂载它:
mkdir freedos12
mount -t msdos -o loop FDOEM.288 freedos12
将 FreeDOS 操作系统复制到更大的软盘:
cp -r freedos12/* floppy
然后卸载 FreeDOS 分区并删除挂载点(如果不再需要):
umount freedos12
rmdir freedos12
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...
我们需要在这个映像上创建引导扇区。 重要的:由于我们将直接写入映像文件,因此请确保在下一步之前未安装软盘映像:
umount floppy
将引导扇区从 FreeDOS 映像 ( 复制FDOEM.288
到更大的映像“FAT12_16MB.img”:
dd if=FDOEM.288 of=FAT12_16MB.img bs=1 count=446 seek=62 skip=62 conv=notrunc
现在您有一个带有 FreeDOS 的 PXE 可启动 16MB FAT12 软盘映像。此时,您可以重新安装该映像并复制所需的任何其他文件。
我用来启动该映像的确切 PXE 配置是:
label bios
menu label FreeDOS
kernel memdisk
append initrd=FAT12_16MB.img
答案3
这并不容易做到,但并非不可能;
你可以制作一个包含所有固件升级的可启动 FreeDOS ISO,然后使用 PXELINUX 和 memdisk 以 PXE 方式启动该 ISO
LABEL BIOS UPG
MENU LABEL Bios Upg
KERNEL memdisk
APPEND iso initrd=FreDosBiosUpg.iso
答案4
memdisk 内核无法加载更大的图像,
您需要尝试 vmlinuz kernal 来加载更大的图像,您可以在线在 linux 镜像中找到它。我使用了 centos 中的一个来加载一些更大的图像。