마운트하지 않고 파일 이미지 파티션에서 mkfs를 실행하는 방법은 무엇입니까?

마운트하지 않고 파일 이미지 파티션에서 mkfs를 실행하는 방법은 무엇입니까?

빈 파일을 만드는 중입니다.

dd if=/dev/zero of=${SDCARD} bs=1 count=0 seek=$(expr 1024 \* ${SDCARD_SIZE})

...그런 다음 드라이브 이미지로 변환합니다...

parted -s ${SDCARD} mklabel msdos

...그리고 거기에 파티션을 만듭니다

parted -s ${SDCARD} unit KiB mkpart primary fat32 ${IMAGE_ROOTFS_ALIGNMENT} $(expr ${IMAGE_ROOTFS_ALIGNMENT} \+ ${BOOT_SPACE_ALIGNED})
parted -s ${SDCARD} unit KiB mkpart primary $(expr  ${IMAGE_ROOTFS_ALIGNMENT} \+ ${BOOT_SPACE_ALIGNED}) $(expr ${IMAGE_ROOTFS_ALIGNMENT} \+ ${BOOT_SPACE_ALIGNED} \+ $ROOTFS_SIZE)

어떻게 사용하나요 mkfs.ext?mkfs.vfat 아니요이 이미지를 설치하시겠습니까?

답변1

고급 도구나 루트 액세스가 필요하지 않은 여러 파티션이 있는 이미지를 생성하는 솔루션은 먼저 파일 시스템을 생성한 다음 연결하는 것입니다.

truncate -s $IMAGE_ROOTFS_ALIGNMENT disk
truncate -s $BOOT_SPACE_ALIGNED part1
mkfs.fat part1
cat part1 >>disk
truncate -s $ROOTFS_SIZE part2
mkfs.ext4 part2
cat part2 >>disk

그런 다음 파티션을 실행 parted하거나 생성하십시오.fdisk

이 접근 방식의 단점은 결과 이미지가 희박하지 않다는 것입니다.

답변2

@gilles가 제공한 답변을 확장하기 위해 포맷된 파일 시스템을 포함하는 디스크 이미지를 생성하고 먼저 파일(이 경우 ESP 유형)에 파일 시스템을 생성한 다음 이를 유효한 디스크 이미지로 조합하는 방법이 있습니다. ;장치를 루팅하거나 설치하거나 순환할 필요가 없습니다.

diskimg=diskimg    # filename of resulting disk image
size=$((260*(1<<20))) # desired size in bytes, 260MB in this case
alignment=1048576  # align to next MB (https://www.thomas-krenn.com/en/wiki/Partition_Alignment)
size=$(( (size + alignment - 1)/alignment * alignment ))  # ceil(size, 1MB)

# mkfs.fat requires size as an (undefined) block-count; seem to be units of 1k
mkfs.fat -C -F32 -n "volname" "${diskimg}".fat $((size >> 10))

# insert the filesystem to a new file at offset 1MB
dd if="${diskimg}".fat of="${diskimg}" conv=sparse obs=512 seek=$((alignment/512))
# extend the file by 1MB
truncate -s "+${alignment}" "${diskimg}"

# apply partitioning
parted --align optimal "${diskimg}" mklabel gpt mkpart ESP "${offset}B" '100%' set 1 boot on

희소 파일을 지원하는 파일 시스템에서 사용할 경우 위의 방법은 희소하다는 부작용이 있습니다. 결과 "262MB" 파일은 디스크에서 200kB 미만의 공간을 차지합니다.

du -h --apparent diskimg; du -h diskimg
262M    diskimg
196K    diskimg

FAT 파일 시스템의 경우도구유틸리티는 파일의 오프셋 작업을 지원합니다(ext2/4/etc.도 이 작업을 수행할 수 있습니까?). 이렇게 하면 더 쉬워집니다. 파티션 이미지를 생성하고 직접 작업할 수 있습니다.

diskimg=diskimg
size=$((260*(1<<20))) # desired size in bytes, 260MB in this case
# align to next MB (https://www.thomas-krenn.com/en/wiki/Partition_Alignment)
alignment=1048576

size=$(( (size + alignment - 1)/alignment * alignment ))

# image size is gpt + filesystem size + gpt backup
truncate -s $((size + 2*alignment)) "${diskimg}"

parted --machine --script --align optimal "${diskimg}" mklabel gpt mkpart ESP "${alignment}B" '100%' set 1 boot on

mformat -i "${diskimg}"@@"${alignment}" -t $((size>>20)) -h 64 -s 32 -v "volname"

다음은 결과 이미지 파일의 다이어그램입니다.

파티션 이미지 파일

답변3

전체 이미지 파일이 아닌 디스크 이미지 파일로 파티션을 포맷하려고 합니다. 이 경우 losetup이미지 파일을 루프백 장치로 사용하도록 Linux에 지시해야 합니다.

참고: losetup루트 권한이 필요하므로 루트로 실행하거나 sudo를 사용하여 실행해야 합니다. 사용/생성하는 장치 /dev/loop*에도 액세스하고 사용하려면 루트 권한이 필요합니다.

예를 들어(루트로)

# losetup /dev/loop0 ./sdcard.img

# fdisk -l /dev/loop0
Disk /dev/loop0: 1 MiB, 1048576 bytes, 2048 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: 0x54c246ab

Device       Boot Start   End Sectors   Size Id Type
/dev/loop0p1          1  1023    1023 511.5K  c W95 FAT32 (LBA)
/dev/loop0p2       1024  2047    1024   512K 83 Linux

# file -s /dev/loop0p1
/dev/loop0p1: data

# mkfs.vfat /dev/loop0p1 
mkfs.fat 3.0.28 (2015-05-16)
Loop device does not match a floppy size, using default hd params

# file -s /dev/loop0p1
/dev/loop0p1: DOS/MBR boot sector, code offset 0x3c+2, OEM-ID "mkfs.fat", sectors/cluster 4, root entries 512, sectors 1023 (volumes <=32 MB) , Media descriptor 0xf8, sectors/FAT 1, sectors/track 32, heads 64, serial number 0xfa9e3726, unlabeled, FAT (12 bit)

마지막으로 루프백 장치에서 이미지를 분리합니다.

# losetup -d /dev/loop0

man losetup자세한 내용은 참조하십시오 .

답변4

@user310346의 답변은 Box86에서 사용할 FAT16 파일 시스템을 생성하는 데 적용하기가 특히 까다롭고 취약한 것으로 판명되었으므로 잠시 동안 조사한 결과 세 가지 유용한 사항을 생각해 냈습니다.

첫 번째, user310346의 답변에 있는 상용구의 대부분은 임의의 항목을 지정할 수 있도록 허용하는 것입니다.분할크기를 바이트 단위로 계산한 다음 적절한 반올림을 통해 드라이브 크기를 계산합니다. 지정하고 싶다면이미지/드라이버크기(나는필요Box86의 CHS 사전 설정을 일치시키려고 하기 때문에 Pared는 자동으로 나머지를 내보낼 수 있습니다.

두번째, 이것이별 매뉴얼2002년부터 목록 mkfsmkpartfs명령은 이론적으로 이를 수행할 수 있어야 하므로 변경 로그를 확인하여 어떻게 변경되었는지 확인하는 것이 좋습니다. 어쩌면 좀 더 모호한 것으로 변할 수도 있지만 여전히 루트 액세스가 필요하지 않습니다.

제삼, 고마워하는박스 매뉴얼, mtools를 사용하려는 경우 작동하는 파일 시스템을 얻는 것이 더 쉽다는 것을 알았습니다.모두일하다.

#!/bin/sh
cd "$(dirname "$(readlink -f "$0")")" || exit

SRC_DIR="combined_disk"
IMG_NAME="combined_disk.img"

# Size for the hard drive image
# (Here's one that's in 86Box's CHS presets)
CYLINDERS=1036
HEADS=16
SECTORS=63

# Work around partition=1 not being possible on the command-line AFAIK
mtools_tmp="$(mktemp -d --tmpdir make_disk.XXXXXXXXXX)"
mtools_conf="${mtools_tmp}/mtoolsrc"
echo "drive c: file=\"${IMG_NAME}\" partition=1" >"$mtools_conf"
export MTOOLSRC="${mtools_conf}"
cleanup() {
    rm -rf "${mtools_tmp}"
}
trap cleanup EXIT

rm -f "${IMG_NAME}.img"
truncate -s "$((CYLINDERS * HEADS * SECTORS * 512))" "$IMG_NAME"

mpartition -I -t "$CYLINDERS" -h "$HEADS" -s "$SECTORS" c: 2>&1
mpartition -c -T 6 -t "$CYLINDERS" -h "$HEADS" -s "$SECTORS" c:
mformat c:
mcopy -s "$SRC_DIR"/* c:

관련 정보