GNU/Linux >> Linux の 問題 >  >> Linux

マウントせずにファイル イメージ パーティションで mkfs を実行する方法は?

複数のパーティションを持つイメージを作成する場合、高度なツールやルート アクセスを必要としないソリューションは、最初にファイル システムを作成し、次にそれらを連結することです。

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 パーティションを作成します。

このアプローチには、結果の画像がまばらにならないという欠点があります。


@gilles によって提供された回答を拡張するために、最初にファイル内にファイルシステム (この例では ESP タイプ) を作成し、それを有効なディスク イメージにアセンブルすることによって、フォーマットされたファイルシステムを含むディスク イメージを作成する 1 つの方法を次に示します。ルート、マウント、またはループ デバイスは不要:

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 ファイルシステムの場合、Mtools ユーティリティはファイルへのオフセットの操作をサポートします (おそらく 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"

結果の画像ファイルの図は次のとおりです:


イメージ ファイル全体ではなく、ディスク イメージ ファイルのパーティションをフォーマットする場合。その場合、 losetup を使用する必要があります イメージ ファイルをループバック デバイスとして使用するよう Linux に指示します。

注:losetup root 権限が必要なため、root または 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 を参照 詳細はこちら


Linux
  1. Linuxで特定のサイズのファイルを作成するには?

  2. コミット時にファイルサイズを制限するには?

  3. Linuxでファイルの物理サイズを取得するには?

  1. UbuntuLinuxでスワップサイズを増やす方法

  2. Apacheでファイルのアップロードサイズの制限を設定するにはどうすればよいですか?

  3. Pythonで(MB)ファイルのtar.gzのサイズを取得する方法

  1. ファイル全体を読み取らずに、大きなファイルの末尾から X バイトを削除する方法は?

  2. 起動時にシェルスクリプトを実行する方法

  3. シェルで .sh 拡張子のないファイルを実行する方法