blob: 46ccaef6b0649cd72f24f7eb37ad82023aac0382 [file] [log] [blame]
#!/bin/bash
# Copyright 2017 The Fuchsia Authors. All rights reserved.
# Use of this source code is governed by a BSD-style license that can be
# found in the LICENSE file.
### make a zedboot USB key
## usage: fx mkzedboot [options] <usb device>
## -f force writing to a non-usb target
set -e
source "$(cd "$(dirname "${BASH_SOURCE[0]}")" && pwd)"/lib/image_build_vars.sh
force=false
if [[ "$1" == "-f" ]]; then
shift
force=true
fi
is_usb() {
if ! ${force}; then
fx-command-run list-usb-disks | grep "$1"
fi
}
USB_DEVICE="$1"
if [[ -z "${USB_DEVICE}" ]]; then
echo >&2 "device argument required"
echo "USB disks:"
fx-command-run list-usb-disks
exit 1
fi
if ! is_usb "${USB_DEVICE}"; then
echo >&2 "${USB_DEVICE} does not look like a USB device, use -f to force, or pick from below"
echo "USB disks:"
fx-command-run list-usb-disks
exit 1
fi
echo >&2 "Changing ownership of ${USB_DEVICE} to ${USER}"
sudo chown "${USER}" "${USB_DEVICE}"
# Linux doesn't automount things aggressively, so no work to do.
unmountcmd=""
# MacOS is really persistent about remounting disks after the raw block device
# is closed, so, keep doing this. In the future we will replace CGPT with our
# own tool that can do everything in one shot, like make-fuchsia-vol does. The
# hack here keeps an open reference to the disk device, which prevents
# re-initialization of the gpt driver.
if [[ "$(uname)" == "Darwin" ]]; then
echo
echo "### NOTE:"
echo "### NOTE: Click 'ignore' on any MacOS disk dialog boxes"
echo "### NOTE:"
echo
unmountcmd="diskutil quiet unmountDisk ${USB_DEVICE}"
fi
# Destroy any existing GPT/MBR on the device and re-create
echo "Create new GPT partition table... "
$unmountcmd
"${FUCHSIA_BUILD_DIR}/tools/cgpt" create "${USB_DEVICE}"
$unmountcmd
"${FUCHSIA_BUILD_DIR}/tools/cgpt" boot -p "${USB_DEVICE}"
$unmountcmd
echo "done"
echo "Create new partitions... "
# ESP needs to be a FAT compatible size
esp_size=$(((63*1024*1024)/512))
vboot_size=$(((64*1024*1024)/512))
esp_offset=2048
vboot_offset=$(($esp_size + $esp_offset))
$unmountcmd
"${FUCHSIA_BUILD_DIR}/tools/cgpt" add -s "${esp_size}" -t efi -b "${esp_offset}" -l esp "${USB_DEVICE}"
$unmountcmd
"${FUCHSIA_BUILD_DIR}/tools/cgpt" add -s "${vboot_size}" -t kernel -b "${vboot_offset}" -l zedboot "${USB_DEVICE}"
$unmountcmd
"${FUCHSIA_BUILD_DIR}/tools/cgpt" add -i 2 -T 1 -S 1 -P 2 "${USB_DEVICE}"
echo "done"
echo "Building zedboot partitions..."
fx-command-run build "images/zedboot-${ZIRCON_PROJECT}.vboot" "images/zedboot-${ZIRCON_PROJECT}.esp.blk"
echo "done"
echo "Writing zedboot for EFI"
$unmountcmd
dd if="${FUCHSIA_BUILD_DIR}/images/zedboot-${ZIRCON_PROJECT}.esp.blk" of="${USB_DEVICE}" seek=${esp_offset}
echo "Writing zedboot for Cros"
$unmountcmd
dd if="${FUCHSIA_BUILD_DIR}/images/zedboot-${ZIRCON_PROJECT}.vboot" of="${USB_DEVICE}" seek=${vboot_offset}
echo "done"
case "$(uname)" in
Linux)
eject "${USB_DEVICE}"
;;
Darwin)
diskutil eject "${USB_DEVICE}"
;;
esac