Skip to content

Commit a3b534d

Browse files
tsoomepyhalov
authored andcommitted
create uefi/bios dual bootable images
1 parent 0a9202b commit a3b534d

File tree

2 files changed

+74
-25
lines changed

2 files changed

+74
-25
lines changed

usr/src/cmd/distro_const/utils/create_iso

+26-3
Original file line numberDiff line numberDiff line change
@@ -105,10 +105,33 @@ rm -f "$DIST_ISO"
105105
PLATFORM=$(uname -m)
106106

107107
if [[ "${PLATFORM}" == "i86pc" ]] ; then
108-
$MKISOFS -o "$DIST_ISO" -b boot/cdboot -c .catalog \
109-
-no-emul-boot -boot-load-size 4 -boot-info-table -N -l -R -U \
108+
# create efi bootblock
109+
/usr/bin/dd if=/dev/zero count=4400 bs=1024 \
110+
of="${PKG_IMG_PATH}/boot/efiboot.img" 2> /dev/null
111+
LOFIDEV="`lofiadm -a ${PKG_IMG_PATH}/boot/efiboot.img`"
112+
RLOFIDEV="/dev/rlofi/${LOFIDEV##/*/}"
113+
/usr/sbin/mkfs -F pcfs -o nofdisk,size=8800 ${RLOFIDEV} < /dev/null
114+
MDIR="`/bin/mktemp -d`"
115+
/usr/sbin/mount -F pcfs ${LOFIDEV} ${MDIR}
116+
mkdir -p ${MDIR}/efi/boot
117+
if [ -f ${PKG_IMG_PATH}/boot/loader32.efi ] ; then
118+
cp ${PKG_IMG_PATH}/boot/loader32.efi ${MDIR}/efi/boot/bootia32.efi
119+
cp ${PKG_IMG_PATH}/boot/loader64.efi ${MDIR}/efi/boot/bootx64.efi
120+
else
121+
cp ${PKG_IMG_PATH}/boot/loader.efi ${MDIR}/efi/boot/bootx64.efi
122+
fi
123+
/usr/sbin/umount ${MDIR}
124+
rmdir ${MDIR}
125+
lofiadm -d ${LOFIDEV}
126+
127+
# the option order is important!
128+
$MKISOFS -o "$DIST_ISO" -c .catalog -N -l -R -U \
110129
-allow-multidot -no-iso-translate -cache-inodes -d -D -volset \
111-
"$VOLSETID" -V "$DISTRO_NAME" "$PKG_IMG_PATH"
130+
"$VOLSETID" -V "$DISTRO_NAME" \
131+
-eltorito-boot boot/cdboot -no-emul-boot -boot-info-table \
132+
-eltorito-alt-boot \
133+
-eltorito-boot boot/efiboot.img -no-emul-boot \
134+
"$PKG_IMG_PATH"
112135
else
113136
#
114137
# First create the hsfs bootblock

usr/src/cmd/install-tools/usbgen

+48-22
Original file line numberDiff line numberDiff line change
@@ -303,13 +303,15 @@ mount -F hsfs "${isodev}" "${iso_path}" || \
303303
# Compute the size for the new USB image.
304304
# Use ISO file size + 20% to account for smaller block size on UFS
305305
# and the log. Round to nearest kbyte plus 512
306-
# plus 4MB for MBR+SMI label
306+
# plus 4MB for label
307+
# plus 34MB for system partition
308+
# plus 1MB for boot partition
307309
#
308310
get_filesize "usb_size" "${iso_file}"
309311
if (( usb_size == -1 )) ; then
310312
error_handler "Failed to get size of file ${iso_file}"
311313
fi
312-
(( usb_size=((int( (usb_size * 1.2) / 1024.) * 1024.) + 512) + 4194304 ))
314+
(( usb_size=((int( (usb_size * 1.2) / 1024.) * 1024.) + 512) + 41943040 ))
313315

314316
#
315317
# Create and mount an empty new USB image.
@@ -324,40 +326,64 @@ devs="$(lofiadm -la "${usb_file}")" || \
324326
# Set rdevs by replacing dsk with rdsk in devs
325327
#
326328
rdevs="${devs/dsk/rdsk}"
327-
# for mount
329+
# for system partition
328330
s0devs="${devs/p0/s0}"
329-
# for newfs and installboot
330-
rs0devs="${rdevs/p0/s0}"
331-
# for prtvtoc | fmthard
331+
s2devs="${devs/p0/s2}"
332+
# for newfs and installboot and prtvtoc | fmthard
332333
rs2devs="${rdevs/p0/s2}"
334+
rs0devs="${rdevs/p0/s0}"
335+
pdev="${devs/p0/}"
333336

334337
#
335-
# create Solaris2 partition
338+
# create GPT partitioning with system, boot and root
336339
#
337-
fdisk -B "${rdevs}"
340+
zpool create -B -o bootsize=34M usbgen-$$ $pdev
341+
zpool destroy usbgen-$$
342+
338343
prtvtoc "${rs2devs}" | nawk '
339344
/^[^\*]/ { r = $1; for(n = 1; n <= NF; n++) vtoc[r,n] = $n }
340345
END {
341-
vtoc[0,1] = 0;
342-
vtoc[0,2] = 2;
343-
vtoc[0,3] = 00;
344-
vtoc[0,4] = vtoc[8,6] + 1;
345-
vtoc[0,5] = vtoc[2,6] - vtoc[8,6];
346-
vtoc[0,6] = vtoc[2,6];
346+
vtoc[1,1] = 1;
347+
vtoc[1,2] = 1;
348+
vtoc[1,3] = 00;
349+
vtoc[1,5] = 1024 * 1024 / 512;
350+
vtoc[1,6] = vtoc[1,4] + vtoc[1,5] - 1;
351+
352+
vtoc[2,1] = 2;
353+
vtoc[2,2] = 2;
354+
vtoc[2,3] = 00;
355+
vtoc[2,4] = vtoc[1,6] + 1;
356+
vtoc[2,6] = vtoc[8,4] - 1;
357+
vtoc[2,5] = vtoc[2,6] - vtoc[2,4];
358+
359+
printf("\t%d\t%d\t%02d\t%d\t%d\t%d\n",
360+
vtoc[0,1], vtoc[0,2], vtoc[0,3], vtoc[0,4], vtoc[0,5], vtoc[0,6]);
347361
printf("\t%d\t%d\t%02d\t%d\t%d\t%d\n",
348-
vtoc[0,1], vtoc[0,2], vtoc[0,3], vtoc[0,4], vtoc[0,5], vtoc[0,6]);
362+
vtoc[1,1], vtoc[1,2], vtoc[1,3], vtoc[1,4], vtoc[1,5], vtoc[1,6]);
349363
printf("\t%d\t%d\t%02d\t%d\t%d\t%d\n",
350-
vtoc[2,1], vtoc[2,2], vtoc[2,3], vtoc[2,4], vtoc[2,5], vtoc[2,6]);
364+
vtoc[2,1], vtoc[2,2], vtoc[2,3], vtoc[2,4], vtoc[2,5], vtoc[2,6]);
351365
printf("\t%d\t%d\t%02d\t%d\t%d\t%d\n",
352-
vtoc[8,1], vtoc[8,2], vtoc[8,3], vtoc[8,4], vtoc[8,5], vtoc[8,6]);
366+
vtoc[8,1], vtoc[8,2], vtoc[8,3], vtoc[8,4], vtoc[8,5], vtoc[8,6]);
353367
}' | fmthard -s- "${rs2devs}"
354368

369+
mkfs -F pcfs -o b=system ${rs0devs} < /dev/null
370+
371+
mount -F pcfs ${s0devs} ${usb_path}
372+
mkdir -p ${usb_path}/efi/boot
373+
if [ -f ${iso_path}/boot/bootia32.efi ] ; then
374+
cp ${iso_path}/boot/bootia32.efi ${usb_path}/efi/boot/BOOTIA32.EFI
375+
cp ${iso_path}/boot/bootx64.efi ${usb_path}/efi/boot/BOOTX64.EFI
376+
else
377+
cp ${iso_path}/boot/boot1.efi ${usb_path}/efi/boot/BOOTX64.EFI
378+
fi
379+
umount ${usb_path}
380+
355381
# newfs doesn't ask questions if stdin isn't a tty.
356-
newfs "${rs0devs}" </dev/null || \
357-
error_handler "Failed to construct the UFS file system ${rs0devs}"
382+
newfs "${rs2devs}" </dev/null || \
383+
error_handler "Failed to construct the UFS file system ${rs2devs}"
358384

359-
mount -o nologging "${s0devs}" "${usb_path}" || \
360-
error_handler "Failed to mount construct the UFS file system ${rs0devs}"
385+
mount -o nologging "${s2devs}" "${usb_path}" || \
386+
error_handler "Failed to mount construct the UFS file system ${rs2devs}"
361387

362388
#
363389
# Copy the contents of the ISO file to the new USB image.
@@ -369,7 +395,7 @@ print "Copying ISO contents to USB image..."
369395
# install bootblocks
370396
#
371397
installboot -mf "${usb_path}/boot/pmbr" "${usb_path}/boot/gptzfsboot" \
372-
"${rs0devs}"
398+
"${rs2devs}"
373399

374400
# If we get an error hereforth in menu.lst modifications, proceed with a warning
375401
trap "" ERR INT

0 commit comments

Comments
 (0)