x86/boot: Fix make hdimage with older versions of mtools
Some versions of mtools (fixed somewhere between 4.0.31 and 4.0.35) generate bad output for mformat when used with the partition= option. Use the offset= option instead. An mtools.conf entry is *also* needed with partition= to support mpartition; combining them in one entry does not work either. Don't specify the -t option to mpartition; it is unnecessary and seems to confuse mpartition under some circumstances. Also do a few minor optimizations: Use a larger cluster size; there is no reason for the typical 4K clusters when we are dealing mainly with comparatively huge files. Start the partition at 32K. There is no reason to align it more than that, since the internal FAT filesystem structures will at best be cluster-aligned, and 32K is the maximum FAT cluster size. [ bp: Remove "we". ] Signed-off-by: H. Peter Anvin (Intel) <hpa@zytor.com> Signed-off-by: Borislav Petkov <bp@suse.de> Link: https://lkml.kernel.org/r/20210911003906.2700218-1-hpa@zytor.com
This commit is contained in:
parent
5816b3e657
commit
067595d728
|
@ -120,12 +120,13 @@ efiarch() {
|
||||||
}
|
}
|
||||||
|
|
||||||
# Get the combined sizes in bytes of the files given, counting sparse
|
# Get the combined sizes in bytes of the files given, counting sparse
|
||||||
# files as full length, and padding each file to a 4K block size
|
# files as full length, and padding each file to cluster size
|
||||||
|
cluster=16384
|
||||||
filesizes() {
|
filesizes() {
|
||||||
local t=0
|
local t=0
|
||||||
local s
|
local s
|
||||||
for s in $(ls -lnL "$@" 2>/dev/null | awk '/^-/{ print $5; }'); do
|
for s in $(ls -lnL "$@" 2>/dev/null | awk '/^-/{ print $5; }'); do
|
||||||
t=$((t + ((s+4095)/4096)*4096))
|
t=$((t + ((s+cluster-1)/cluster)*cluster))
|
||||||
done
|
done
|
||||||
echo $t
|
echo $t
|
||||||
}
|
}
|
||||||
|
@ -230,14 +231,14 @@ genhdimage() {
|
||||||
ptype='-T 0xef' # EFI system partition, no GPT
|
ptype='-T 0xef' # EFI system partition, no GPT
|
||||||
fi
|
fi
|
||||||
sizes=$(filesizes "$FBZIMAGE" "${FDINITRDS[@]}" "$efishell")
|
sizes=$(filesizes "$FBZIMAGE" "${FDINITRDS[@]}" "$efishell")
|
||||||
# Allow 1% + 1 MiB for filesystem and partition table overhead,
|
# Allow 1% + 2 MiB for filesystem and partition table overhead,
|
||||||
# syslinux, and config files
|
# syslinux, and config files; this is probably excessive...
|
||||||
megs=$(((sizes + sizes/100 + 2*1024*1024 - 1)/(1024*1024)))
|
megs=$(((sizes + sizes/100 + 2*1024*1024 - 1)/(1024*1024)))
|
||||||
$dd if=/dev/zero of="$FIMAGE" bs=$((1024*1024)) count=$megs 2>/dev/null
|
$dd if=/dev/zero of="$FIMAGE" bs=$((1024*1024)) count=$megs 2>/dev/null
|
||||||
mpartition -I -c -s 32 -h 64 -t $megs $ptype -b 512 -a h:
|
mpartition -I -c -s 32 -h 64 $ptype -b 64 -a p:
|
||||||
$dd if="$mbr" of="$FIMAGE" bs=440 count=1 conv=notrunc 2>/dev/null
|
$dd if="$mbr" of="$FIMAGE" bs=440 count=1 conv=notrunc 2>/dev/null
|
||||||
mformat -v 'LINUX_BOOT' -s 32 -h 64 -t $megs h:
|
mformat -v 'LINUX_BOOT' -s 32 -h 64 -c $((cluster/512)) -t $megs h:
|
||||||
syslinux --offset $((512*512)) "$FIMAGE"
|
syslinux --offset $((64*512)) "$FIMAGE"
|
||||||
do_mcopy h:
|
do_mcopy h:
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|
|
@ -14,7 +14,8 @@ drive v:
|
||||||
drive w:
|
drive w:
|
||||||
file="@OBJ@/fdimage" cylinders=80 heads=2 sectors=36 filter
|
file="@OBJ@/fdimage" cylinders=80 heads=2 sectors=36 filter
|
||||||
|
|
||||||
# Hard disk
|
# Hard disk (h: for the filesystem, p: for format - old mtools bug?)
|
||||||
drive h:
|
drive h:
|
||||||
|
file="@OBJ@/hdimage" offset=32768 mformat_only
|
||||||
|
drive p:
|
||||||
file="@OBJ@/hdimage" partition=1 mformat_only
|
file="@OBJ@/hdimage" partition=1 mformat_only
|
||||||
|
|
||||||
|
|
Loading…
Reference in New Issue