blob: d01861c9cd27813927ce407ef3d19e78adf0611c [file] [log] [blame]
#!/bin/bash
# Copyright 2020 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.
# WARNING: This is not supposed to be directly executed by users.
set -o errexit
# fx-mkzedboot USB_DEVICE IMAGE_TYPE IMAGE FORCE_DEVICE
# IMAGE_TYPE Can be "efi" for x64 bootable disks
# or "vboot" for chromebook
# IMAGE Path to image
# FORCE_DEVICE true/false
function fx-mkzedboot {
local usb_device="$1"
local type="$2"
local image="$3"
local force="$4"
# EFI boot constants
readonly esp_size=$(((63*1024*1024)/512))
readonly esp_offset=2048
# vboot constants
readonly reserved_size=2048
readonly reserved_offset=2048
readonly vboot_size=$(((64*1024*1024)/512))
readonly vboot_offset=$(($reserved_offset + $reserved_size))
CGPT="${PREBUILT_CGPT_DIR}/cgpt"
is_usb() {
if ! ${force}; then
fx-command-run list-usb-disks | grep "$1"
fi
}
if ! is_usb "${usb_device}"; then
fx-error >&2 "${usb_device} does not look like a USB device, use -f to force, or pick from below"
fx-info "USB disks:"
fx-command-run list-usb-disks
exit 1
fi
if ! [[ -w "${usb_device}" ]] ; then
fx-info "Changing ownership of ${usb_device} to ${USER}"
sudo chown "${USER}" "${usb_device}"
fi
fx-info "Opening device..."
# We open the device and hold onto an fd for the duration of our modifications.
# This prevents automounting solutions from observing a final close and
# rescanning the partition table until we're all done making changes -
# particularly important on macOS where users would otherwise receive
# EAGAIN/EBUSY and so on.
open_device() {
case "${HOST_OS}" in
mac)
if ! diskutil quiet unmountDisk "${usb_device}"; then
fx-error "Failed to unmount ${usb_device}, cannot continue"
exit 1
fi
;;
esac
exec 3>>"${usb_device}"
}
close_device() {
fx-info "Closing device."
exec 3>&-
}
open_device
# Destroy any existing GPT/MBR on the device and re-create
fx-info "Create new GPT partition table... "
"${CGPT}" create "${usb_device}"
"${CGPT}" boot -p "${usb_device}"
fx-info "done"
fx-info "Create new partitions... "
# ESP needs to be a FAT compatible size
if [[ "${type}" == "efi" ]]; then
"${CGPT}" add -s "${esp_size}" -t efi -b "${esp_offset}" -l esp "${usb_device}"
elif [[ "${type}" == "vboot" ]]; then
"${CGPT}" add -s "${reserved_size}" -t reserved -b "${reserved_offset}" -l reserved "${usb_device}"
"${CGPT}" add -s "${vboot_size}" -t kernel -b "${vboot_offset}" -l zedboot "${usb_device}"
"${CGPT}" add -i 2 -T 1 -S 1 -P 2 "${usb_device}"
else
fx-error "Unknown image type: ${type}. Please check the build target used in \"fx set\"."
exit 1
fi
fx-info "done"
if [[ "${type}" == "efi" ]]; then
fx-info "Writing zedboot for EFI"
dd if="${image}" of="${usb_device}" seek=${esp_offset} conv=notrunc
else
fx-info "Writing zedboot for Cros"
dd if="${image}" of="${usb_device}" seek=${vboot_offset} conv=notrunc
fi
fx-info "done"
close_device
case "${HOST_OS}" in
linux)
eject "${usb_device}"
;;
mac)
diskutil eject "${usb_device}"
;;
esac
}