GNU/Linux >> Belajar Linux >  >> Linux

Bagaimana menjalankan mkfs pada partisi gambar file tanpa pemasangan?

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.


Linux
  1. Bagaimana cara mengatur batas Ukuran Unggah File di Apache?

  2. Bagaimana cara membuat file dengan ukuran tertentu di Linux?

  3. Bagaimana cara membatasi ukuran file saat komit?

  1. Bagaimana Cara Menjalankan Perintah Tanpa Properti Root?

  2. Bagaimana Cara Memasang File Gambar Tanpa Root?

  3. Cara mengeksekusi file tanpa ekstensi .sh di shell

  1. Cara Meningkatkan Ukuran Swap di Ubuntu Linux

  2. Cara mendapatkan ukuran file tar.gz dalam (MB) dengan python

  3. Bagaimana cara menghapus X byte dari akhir file besar tanpa membaca seluruh file?