tee
и bash
:
cat foo | tee >(manager) >(manager) >(manager) >(manager) >(manager) >/dev/null
Если количество менеджеров должно быть настраиваемым или если вы хотите, чтобы вывод от разных менеджеров не смешивался:
export -f manager
cat foo | parallel --pipe --tee manager ::: {1..10}
Вы хотите отформатировать раздел в файле образа диска, а не весь файл образа. В этом случае вам нужно использовать losetup
, чтобы указать Linux на использование файла образа в качестве устройства обратной связи.
ПРИМЕЧАНИЕ: losetup
требует привилегий суперпользователя, поэтому его необходимо запускать от имени суперпользователя или с помощью sudo. Устройства / dev / loop *
, которые он использует / создает, также требуют доступа и использования root-прав.
например (как 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)
и, наконец, отсоединить изображение от устройства обратной связи:
# losetup -d /dev/loop0
Подробнее см. man losetup
.
Чтобы создать образ с несколькими разделами, решение, не требующее каких-либо изящных инструментов или корневого доступа, состоит в том, чтобы сначала создать файловые системы, а затем объединить их.
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 в этом примере )в файле, а затем собрав ее для действующий образ диска; не требуются корневые, монтируемые или петлевые устройства:
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
Описанный выше подход имеет дополнительное -преимущество в том, что он является разреженным при использовании в файловой системе, поддерживающей разреженные файлы; полученный файл «262 МБ» занимает на диске менее 200 КБ:
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"
Вот схема получившегося файла изображения: