Untuk membuat gambar dengan banyak partisi, solusi yang tidak memerlukan alat canggih atau akses root adalah membuat sistem file terlebih dahulu, lalu menggabungkannya.
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
Kemudian jalankan parted
atau fdisk
untuk membuat partisi.
Pendekatan ini memiliki kelemahan yaitu gambar yang dihasilkan tidak jarang.
Untuk memperluas jawaban yang diberikan oleh @gilles, inilah salah satu cara untuk membuat gambar disk yang berisi sistem file yang diformat dengan terlebih dahulu membuat sistem file (tipe ESP dalam contoh ini) di dalam file dan kemudian menggabungkannya menjadi gambar disk yang valid; tidak diperlukan perangkat root, mount, atau loop:
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
Pendekatan di atas memiliki keuntungan sampingan karena jarang digunakan pada sistem file yang mendukung file jarang; file "262MB" yang dihasilkan menempati kurang dari 200kB pada disk:
du -h --apparent diskimg; du -h diskimg
262M diskimg
196K diskimg
Untuk sistem file FAT, utilitas Mtools mendukung pengoperasian offset ke dalam file (ext2/4/etc mungkin juga berfungsi?). Ini membuatnya lebih mudah, Anda cukup membuat gambar yang dipartisi dan mengerjakannya secara langsung:
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"
Berikut diagram file gambar yang dihasilkan:
Anda ingin memformat partisi dalam file gambar disk, bukan seluruh file gambar. Dalam hal ini, Anda perlu menggunakan losetup
untuk memberi tahu linux agar menggunakan file gambar sebagai perangkat loopback.
CATATAN:losetup
membutuhkan hak akses root, jadi harus dijalankan sebagai root atau dengan sudo. /dev/loop*
perangkat yang digunakan/dibuatnya juga memerlukan root privs untuk mengakses dan menggunakan.
mis. (sebagai root)
# 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)
dan, terakhir, lepaskan gambar dari perangkat loopback:
# losetup -d /dev/loop0
Lihat man losetup
untuk detail lebih lanjut.