web-dev-qa-db-ja.com

PXEブート可能な10MB以上のDOSイメージの作成

システム、ハードドライブ、またはBIOSに必要なすべてのファームウェアアップデートを含む、「大規模な」DOSフロッピーディスクイメージ(たとえば10MB以上)を作成したいと思います。

すべてがPXEで起動されたイメージ上にあるため、DOSイメージがネットワーク対応である必要はありませんが、ネットワークは素晴らしいでしょう。 Zipディスクはフロッピーディスクコントローラーに接続されており、100MBを超えていたため、これは可能であるはずです。

私はずっと前にこれをやろうとしましたが、起動に失敗するだけであまりにも多くの時間を費やしました。ですから、そのような悪夢のような獣を作成して編集する方法について誰かが信頼できる指示を持っているなら、私に知らせてください。 PXEに使用してUSBスティックにコピーできる画像があれば尚可です。

残念なメーカーは、LAN経由で簡単に起動してネットワークを構築できるすべてのファームウェアアップデートを含む単一の起動可能なLinuxISOを提供していません。 HPサーバーはこれを行い、それは素晴らしいです。

4
rjt

目的に合わせてFreeDOSブート可能イメージ(必要なサイズ)を作成してから、ソフトウェアまたはBIOS更新ツールなどのDOSユーティリティを追加できます。

あなたの質問から、あなたはLinuxにアクセスでき、ターミナル/コマンドラインの使用に精通しているようです。したがって、この回答では、Linuxでのブート可能イメージの作成に焦点を当てます。 Windowsマシンでは、 Rufus のようなツールを使用してこれを行うことができます。

次に、PXEブートを使用してこのFreeDOSイメージをブートするか、 dd を使用してUSBドライブに書き込み、FreeDOSブートドライブを作成できます。もちろん、ここで使用する手順を拡張して、FreeDOSフルエディションに付属するソフトウェアの完全なスイートを追加するなど、必要なFreeDOSメディアを作成できます。

Linuxで起動可能なFreeDOSイメージを作成する手順は次のとおりです。


警告/免責事項!!!以下で使用される一部のコマンドは、誤って使用すると、ディスクドライブからデータを消去する可能性があります。続行する前に、各プログラムのマニュアルページを読んで、コマンドの使用法を理解してください。貴重なデータがないセカンダリ/仮想マシンでこれらのコマンドを試してみることをお勧めします。


ステップ1:Prerequites(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をコンパイルするには、以下を使用してDebian/Ubuntuにインストールできるmsgfmtパッケージからgettextが必要です。

    _$ 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 xsector_sizeバイト= 2048 x 512バイト=1048576バイト。実際には、ステップ2で開始セクターを明示的に指定しましたが、パーティションが既に作成されている場合に役立つ可能性があるため、このステップを含めました。これらの番号:2048および1048576は、次のコマンドで使用されます。

ステップ4:FATファイルシステムでパーティションをフォーマットする

  • フリーループデバイスを検索します。

    _$ losetup -f
    /dev/loop0
    _
  • パーティションのループデバイスを作成します(ディスクイメージのoffset =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_は、ステップ3で決定されたセクター単位のパーティション1オフセットです。パラメータ_-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 7MBRをディスクイメージに書き込みます。

    _$ 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リポジトリからダウンロードされますが、公式のFreeDOSWebサイトから抽出されます。 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
    _

    ノート:

    • ディスクイメージを起動可能にするために本当に必要なファイルは、_COMMAND.COM_と_KERNEL.SYS_だけです。残りのファイルはオプションです
    • マウントを解除する前に、他のファイルをディスクイメージにコピーすることもできるようになりました(例:BIOSファームウェアの更新)。
    • fatattrコマンドはオプションですが、通常どおり、ファイル_COMMAND.COM_および_KERNEL.SYS_に非表示のシステム属性を追加します。 Debian/Ubuntuシステムでは、_Sudo apt-get install fatattr_を使用してfatattrプログラムをインストールできます。

ステップ7:完了です!

  • ディスクイメージをアンマウントします。

    _$ Sudo umount mnt/
    _
1
moo

私はこのプロセスを数回経験しました。非常に簡単ですが、使用した正確な手順を忘れ続けているので、私自身や他の人の参考のためにここに文書化します。ちなみに、私はPXEサーバーとしてSlackware Linux 14.2+を使用しており、BIOSアップデートのためにいくつかの異なるDellOptiplexモデルを起動しています。他の回答で述べたように、大規模なファイルシステム用に起動可能な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)

MEMDISKが他のサイズに対して選択するジオメトリを決定できる小さなPerlスクリプトがMEMDISKディレクトリに含まれています。一般に、MEMDISKは、80シリンダー以上の、使用されているほとんどの物理的な拡張フォーマットを正しく検出します。

 LABEL floppy_image
  LINUX memdisk
  INITRD floppy.img

画像が4MiBより大きく、フロッピー画像の場合は、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

ただし、そのコマンドが完了するまでに1分かかる場合があります。より大きなブロックサイズを使用すると、同じことを1秒未満で達成できます。

dd if=/dev/zero of=FAT12_16MB.img bs=8192 count=2043

'空のフロッピーディスク'ができたので、FAT12としてフォーマットする必要があります(このコマンドで使用可能なパラメーターに関心がある場合は、man mkfs.fatを実行してmanページを表示します)。

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 Boot Disk from 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

これで、FreeDOSオペレーティングシステムを含む16MBのフロッピーイメージ(FAT12_16MB.img)ができました。ただし、これを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ブート可能な16MBFAT12フロッピーイメージができました。この時点で、イメージを再マウントして、必要な追加ファイルをコピーできます。

このイメージの起動に使用している正確なPXE構成は次のとおりです。

label bios
menu label FreeDOS
kernel memdisk
append initrd=FAT12_16MB.img

この回答を作成する際に私が相談したいくつかの その他の役立つステップバイステップのリソース があります。

5
vallismortis

これは簡単に行うことはできませんが、不可能ではありません。

すべてのファームウェアアップグレードを含む起動可能なFreeDOSISOを作成できます。次に、PXELINUXとmemdiskを使用してそのISOをPXE起動します。

LABEL BIOS UPG
 MENU LABEL Bios Upg
 KERNEL memdisk
 APPEND iso initrd=FreDosBiosUpg.iso
3
Pat

memdiskカーネルは、より大きなイメージをロードできません。

大きな画像をロードするには、vmlinuzカーネルを試す必要があります。オンラインのLinuxミラーで見つけることができます。centosの1つを使用して、いくつかの大きな画像をロードしました。

0
Ahmed