如何创建与目录(及其文件)大小完全相同的文件来保存 FAT32 文件系统?

如何创建与目录(及其文件)大小完全相同的文件来保存 FAT32 文件系统?

我正在尝试创建一个文件,其大小至少要足以容纳 FAT32 文件系统,而该文件又会镜像目录(ESP 结构)的内容。这是创建 UEFI 可引导 ISO 映像所必需的。

我已成功创建该文件(ISO映像启动),但我必须以固定大小创建它,而不是其内容的实际大小。

以下是我为实现这一目标所做的事情:

BOOT_IMG_DATA=$(mktemp -d)
BOOT_IMG=$ISO_DIR/boot/efi.img

mkdir -p $(dirname $BOOT_IMG)

truncate -s 4M $BOOT_IMG
mkfs.vfat $BOOT_IMG
mount $BOOT_IMG $BOOT_IMG_DATA
mkdir -p $BOOT_IMG_DATA/efi/boot

grub-mkimage \
    -C xz \
    -O x86_64-efi \
    -p /boot/grub \
    -o $BOOT_IMG_DATA/efi/boot/bootx64.efi \
    boot linux search normal configfile \
    part_gpt btrfs fat iso9660 loopback \
    test keystatus gfxmenu regexp probe \
    efi_gop efi_uga all_video gfxterm font \
    echo read ls cat png jpeg halt reboot

umount $BOOT_IMG_DATA

该代码是生成 UEFI 可引导 ISO 映像的脚本的一部分。完整脚本如下:https://github.com/Nitrux/mkiso/blob/master/mkiso#L79-L100

我需要一种方法来创建一个文件,该文件将包含 ESP 结构,其大小与保存 ESP 数据(目录和文件)和 FAT32 元数据的精确大小相同。我该如何实现这一点?

答案1

适合这个任务的正确工具是du

mkfs.vfat -C $BOOT_IMG \
    $(( ($(stat -c %s $BOOT_IMG_DATA) / 1024 + 511) / 1024 ))

该命令将创建文件$BOOT_IMG,该文件具有足够的大小来保存内容$BOOT_IMG_DATA

相关内容