| #!/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 | |