GNU/Linux >> Linux Esercitazione >  >> Linux

Come eseguire mkfs su partizioni di immagini di file senza montaggio?

Per creare un'immagine con più partizioni, una soluzione che non richiede strumenti fantasiosi o accesso root è creare prima i filesystem, quindi concatenarli.

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

Quindi esegui parted o fdisk per creare le partizioni.

Questo approccio ha lo svantaggio che l'immagine risultante non sarà sparsa.


Per espandere la risposta fornita da @gilles, ecco un modo per creare un'immagine disco contenente un filesystem formattato creando prima un filesystem (di tipo ESP in questo esempio) all'interno di un file e quindi assemblandolo in un'immagine disco valida; non sono richiesti dispositivi root, mount o 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

L'approccio di cui sopra ha il vantaggio collaterale di essere sparse se utilizzato su un filesystem che supporta i file sparse; il file "262MB" risultante occupa meno di 200kB su disco:

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

Per i filesystem FAT le utilità Mtools supportano l'operatività su un offset in un file (probabilmente lo fanno anche ext2/4/etc?). Questo lo rende più semplice, basta creare l'immagine partizionata e lavorarci direttamente:

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"

Ecco un diagramma del file immagine risultante:


Si desidera formattare una partizione in un file immagine disco, piuttosto che l'intero file immagine. In tal caso, devi utilizzare losetup per dire a Linux di usare il file immagine come dispositivo di loopback.

NOTA:losetup richiede i privilegi di root, quindi deve essere eseguito come root o con sudo. Il /dev/loop* i dispositivi che utilizza/crea richiedono anche i privilegi di root per l'accesso e l'utilizzo.

ad esempio (come 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)

e, infine, staccare l'immagine dal dispositivo di loopback:

# losetup -d /dev/loop0

Vedi man losetup per maggiori dettagli.


Linux
  1. Come eseguire un comando senza proprietà di root?

  2. Come impostare il limite della dimensione del caricamento dei file in Apache?

  3. Come ottenere la dimensione di tar.gz nel file (MB) in python

  4. Come rimuovere X byte dalla fine di un file di grandi dimensioni senza leggere l'intero file?

  5. Come limitare la dimensione del file al commit?

Come eseguire il comando Sudo senza password

Come fare la steganografia delle immagini su Linux

Come eseguire comandi Sudo senza password

Come aprire l'immagine ISO senza masterizzare su disco in Linux

Come comprimere il file immagine PNG in Linux

Come eseguire sudo comandi senza password