부팅 가능한 FreeDOS 이미지를 생성하는 단계는 다음과 같습니다.

부팅 가능한 FreeDOS 이미지를 생성하는 단계는 다음과 같습니다.

spinrite라는 DOS 기반 HDD 유틸리티가 있습니다. freedos 운영 체제를 사용하여 부팅 가능한 플래시 드라이브를 만들고 생성 후 실행 유틸리티를 드라이브에 복사하고 싶습니다.

gparted를 사용하여 드라이브를 분할하고 Fat32로 포맷하고 부팅 플래그를 설정해 보았습니다. 완료되면 OS를 설치하고 실행 파일을 추가하는 방법을 볼 수 없습니다. Freedos의 이미지 파일이 있는데 이 파일로 플래시 드라이브를 만들려고 하면 부팅되지 않습니다. 어떤 도움이라도 대단히 감사하겠습니다.

답변1

공식 FreeDOS 이미지(이 글을 쓰는 시점에서)는 "라이브 CD"로 사용하기 위한 것이 아닌 설치 미디어로 사용하기 위한 것으로 보입니다. 따라서 목적에 적합한 부트 가능한 미디어를 만들려면 공식 FreeDOS 설치 프로그램 이미지 중 하나를 수정하면 됩니다. 그러나 특히 플로피 이미지를 사용하는 경우에는 선택하는 미디어의 크기에 따라 제한될 수 있습니다.

이 답변에서는 Linux에서 처음부터 최소 FreeDOS 부팅 디스크 이미지(필요한 크기)를 생성한 다음 MBR, VBR, 부팅에 필요한 최소 FreeDOS 파일 세트 및 단일 프로그램(spinrite)을 작성하는 데 중점을 둘 것입니다. ) 또는 BIOS 업데이트 도구 등과 같은 DOS 유틸리티

그런 다음 PXE 부팅을 사용하여 이 FreeDOS 이미지를 부팅하거나 다음 명령을 사용하여 USB 드라이브에 쓸 수 있습니다.ddFreeDOS 부팅 드라이브를 만듭니다. 물론 여기에 사용된 단계를 확장하여 FreeDOS 정식 버전과 함께 제공되는 전체 소프트웨어 제품군을 추가하는 것을 포함하여 원하는 FreeDOS 미디어를 만들 수 있습니다.

Windows 시스템에서는 다음과 같은 도구를 사용할 수 있습니다.루퍼스이것을하기 위해. 하지만 Linux에서는 다음을 사용할 수 있습니다.ms-sys(Rufus가 내부적으로 사용하는 소스 코드)

부팅 가능한 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를 컴파일하려면 Debian/Ubuntu에 설치할 수 있는 패키지를 사용해야 합니다 msgfmt.gettext

    $ sudo apt install gettext
    
  • 컴파일 및 설치:

    $ make
    $ sudo make install
    

2단계: 빈 디스크 이미지를 만들고 msdos 파티션을 만듭니다.

  • 디스크 이미지용 빈 파일을 만듭니다.

    $ truncate -s 50M disk.img
    

    참고: 50MiB 크기의 디스크 이미지가 여기에 생성되지만 필요한 크기로 설정할 수 있습니다.

  • 디스크 이미지를 분할합니다.

    $ 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):다음을 입력하십시오 .ec

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-sysMBR(마스터 부트 레코드) 및 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-sysRufus와 달리 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/공식 FreeDOS 소스에서 바이너리를 얻는 Rufus에 대한 세부 정보입니다.

  • 파티션에 파일 복사:

    $ 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.COMKERNEL.SYS. 나머지 파일은 선택 사항입니다.
    • 이제 제거하기 전에 추가 파일을 디스크 이미지에 복사할 수도 있습니다(예: spinrite.exe).
    • 이러한 명령은 선택 사항이지만 규칙에 따라 fatattr숨김 및 시스템 속성을 파일에 추가합니다. Debian/Ubuntu 시스템에서는 다음 명령을 사용하여 프로그램을 설치할 수 있습니다.COMMAND.COMKERNEL.SYSfatattrsudo apt-get install fatattr

7단계: 완료되었습니다!

  • 디스크 이미지를 마운트 해제합니다.

    $ sudo umount mnt/
    

답변2

FreeDOS 이미지를 사용자 정의하는 방법은 다음과 같습니다.

  1. Freedos 사이트에서 다운로드한 부팅 가능한 플로피 이미지로 시작합니다. 불행하게도 BIOS 업데이트 프로그램과 같은 일회성 유틸리티를 실행할 필요가 없는 기능으로 가득 차 있습니다.

  2. 다음 명령을 사용하여 복사본을 설치하십시오.

    mkdir -p ./floppy
    cp -a ./freedos-1440kb.img freedos-empty.img
    mount -o loop,rw freedos-empty.img ./floppy
    
  3. cd ./floppy그리고 불필요한 내용은 모두 제거하세요. 궁극적으로 1.44MB 이미지에는 약 1.2MB 또는 1.3MB의 여유 공간이 있어야 합니다.

  4. cd .. ; umount ./floppy

  5. 이렇게 하면 원하는 수의 사용자 지정 이미지를 만드는 데 사용할 수 있는 거의 비어 있는 부팅 가능한 이미지가 제공됩니다. 그런 다음 복사본을 만들어 필요한 내용을 복사합니다. 예를 들어

    cp -a ./freedos-empty.img ./freedos-spinrite.img
    mount -o loop,rw freedos-spinrite.img ./floppy
    cp spinrite.exe ./floppy
    umount ./floppy
    

그런 다음 이 이미지를 플로피 드라이브, 플래시 드라이브 등에 복사할 수 있습니다(예: USB 스틱의 장치 노드가 있는 위치 cat freedos-spinrite.img > /dev/sdX). sdX비어 있고 사용 가능한 플래시 드라이브가 필요할 때 결코 찾을 수 없기 때문에 이 작업을 거의 수행하지 않습니다. 또한 grub 또는 tftp 메뉴를 사용하는 것보다 더 많은 작업이 필요하고 시간도 오래 걸립니다. 또한 USB 스틱 부팅은 로컬 하드 드라이브나 TFTP 서버에 저장된 디스크 이미지보다 느립니다.

내 경우에는 그것을 내 /boot/images/디렉터리에 복사하고 실행했습니다 update-grub. 그런 다음 scp필요할 수 있는 다른 컴퓨터에 복사하고 update-grubssh를 통해 실행했습니다.

또한 이를 내 폴더에 복사 하고 해당 디렉토리의 모든 파일에 대한 메뉴 항목을 생성하기 /var/lib/tfptboot/freedos/위해 작성한 스크립트를 실행했습니다 .*.img

이를 통해 부팅 시 grub 메뉴에서 freedos 이미지를 부팅할 수 있고, 부팅 시 "네트워크 카드에서 부팅" 옵션이 있는 모든 시스템(즉, 이러한 거의 모든 시스템)에서 ipxe 및 tftp를 통해 네트워크를 통해 freedos 이미지를 부팅할 수 있습니다. ipxegrub에서 부팅한다는 사실도 포함한다면 ).

마더보드의 BIOS를 업데이트하고, LSI SAS 카드를 IT 모드로 다시 플래시하고, 일부 Seagate 드라이브에 펌웨어 업데이트를 적용하는 등의 부팅 가능한 이미지를 만드는 데 이를 사용했습니다.

그런데 이것이 바로 제가 "초대형" /boot파티션(1GB 또는 2GB 이상)을 생성하는 것을 좋아하는 이유입니다. 그래서 "합리적인" 크기의 모든 이미지를 부팅할 수 있습니다. 또한 이렇게 하면 /boot의 공간이 부족하지 않고 항상 오래된 커널 이미지를 지워야 합니다. 부팅 이나 미러링 등에 gparted유용합니다 .clonezilla


추가 사항: grub 설정

처음에 이를 설정하는 것은 tftp꽤 많은 작업이므로 여기에서는 프로세스에 대해 자세히 설명하지 않겠습니다(이 사이트의 다른 답변에서 이미 설명했다고 확신하며 내 tftp 스크립트는 내깃허브계정 - 아직 memdisk/freedos 스크립트를 업로드하지 않았지만 수행해야 할 작업은 거의 없습니다 grub.

  1. 설치합니다 syslinux(또는 적어도 memdisk바이너리 사본을 얻습니다).
  2. cp memdisk /boot
  3. mkdir -p /boot/이미지
  4. 부팅 가능한 *.img이미지 *.iso파일을 /boot/images.
  5. 스크립트 42_memdisk(아래 참조) 를 복사하여 /etc/grub.d/실행 가능하게 만듭니다.chmod +x /etc/grub.d/42_memdisk
  6. update-grub루트로 실행

참고: 위의 내용은 Debian 및 Ubuntu 및 Mint와 같은 가장 관련/파생 배포판에 적용됩니다. 다른 배포판은 설정이 약간 다르기 grub때문에 그에 따라 프로세스를 조정해야 합니다.

memdisk플로피 디스크 이미지, CD-ROM/DVD 이미지, 하드 디스크 이미지 등 모든 부팅 가능한 디스크 이미지에서 부팅할 수 있습니다.

42_메모리 디스크(이것은 grub에 대한 메뉴 항목을 생성하는 스크립트입니다):

#!/bin/sh
set -e

IMAGES=/boot/images
. /usr/lib/grub/grub-mkconfig_lib
if test -e /boot/memdisk ; then
  echo "Found memdisk: $MEMDISKPATH" >&2
  MEMDISKPATH="$( make_system_path_relative_to_its_root "/boot/memdisk" )"

  find "$IMAGES" -name '*.img' -o -name '*.iso' | sort | 
  while read image ; do
      IMAGEPATH="$( make_system_path_relative_to_its_root "$image" )"
      echo "Found image: $IMAGEPATH" >&2
      cat << EOF
menuentry "Bootable image: $(basename $IMAGEPATH | sed -E -e 's/\.(img|iso)$//i')" {
EOF
      prepare_grub_to_access_device ${GRUB_DEVICE_BOOT} | sed -e 's/^/\t/'
      cat << EOF
        linux16 $MEMDISKPATH bigraw
        initrd16 $IMAGEPATH
}
EOF
  done
fi

IIRC, 이것은 몇 년 전에 이와 같은 작업을 수행하는 방법을 검색하면서 찾은 스크립트를 수정한 것입니다(어디인지 기억이 나지 않습니다).

출력 예:

# update-grub
Generating grub configuration file ...
Found linux image: /boot/vmlinuz-4.14.0-2-amd64
Found initrd image: /boot/initrd.img-4.14.0-2-amd64
Found linux image: /boot/vmlinuz-4.14.0-1-amd64
Found initrd image: /boot/initrd.img-4.14.0-1-amd64
Found linux image: /boot/vmlinuz-4.12.0-2-amd64
Found initrd image: /boot/initrd.img-4.12.0-2-amd64
Found iPXE image: /boot/ipxe.lkrn
Found memtest86 image: /memtest86.bin
Found memtest86+ image: /memtest86+.bin
Found memdisk:
Found image: /images/LSI.img
Found image: /images/Seagate-PH-CC49.img
Found image: /images/fd-asus-m5a97.img
Found image: /images/freedos-empty.img
done

관련 정보