blob: 4e1f232d1803ab37b0d4edc43544b874caf8eed3 [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.
### run bootserver in zedboot disk paver mode
## usage: fx boot [--netboot] [--no-data]
## [--artifacts <dir>]
## [--sign-tool <path_to_sign_tool>]
## [--bootloader <path_to_prebuilt_bootloader>]
## [<type>] -- [bootserver arguments]
## <type> see "--help" for list (default: x64 for x64 / arm64 for arm64)
## --netboot Boot from ramdisk containing FVM
## --no-data Use FVM images without a /data partition (preserve existing
## data)
## --artifacts a directory to load files to send to the target where the
## root of the directory base zircon.bin and its bootdata file
## and an images sub-directory has all the images to pave
## --sign-tool Optional executable to sign kernel images.
## --bootloader Flash the bootloader in addition to other partitions. Only
## works with a limited number of device types.
##
## If <type> is omitted, a guess is made based on $FUCHSIA_ARCH. For x64, all
## x64 images will be supplied (resulting in an FVM pave). For arm64 the default
## <type> is netboot.
set -e
source "$(cd "$(dirname "${BASH_SOURCE[0]}")" && pwd)"/lib/image_build_vars.sh
declare -a disks=()
fuchsia_dir="${FUCHSIA_BUILD_DIR}"
zircon_dir="${ZIRCON_BUILD_DIR}"
zircon_tools="${ZIRCON_TOOLS_DIR}"
add_fvm=true
usage() {
fx-command-help
fx-machine-types
echo
echo "Additional bootserver arguments:"
exec "${ZIRCON_TOOLS_DIR}/bootserver" --help
}
netboot=false
add_data=true
ip_targ=()
bootserver_extra=()
sign_tool=""
machine_type=
while [[ $# -gt 0 ]]; do
case "$1" in
-h|--help)
usage
;;
-a)
shift
ip_targ=("-a" "$1")
;;
--netboot)
netboot=true
machine_type="netboot"
;;
--no-data)
echo >&2 "##"
echo >&2 "## Note: if the target has no pre-existing data partition, then"
echo >&2 "## none will be created. The resultant system will behave in a"
echo >&2 "## kind of 'incognito' fashion, as /data will be backed by ram."
echo >&2 "##"
add_data=false
;;
--sign-tool)
shift
sign_tool="$1"
;;
--artifacts)
shift
fuchsia_dir="${1}"
zircon_dir="${1}"
zircon_tools="${zircon_dir}/tools"
# Source the image paths from the artifacts directory, so we can find them.
source "${fuchsia_dir}"/zedboot_image_paths.sh
source "${fuchsia_dir}"/image_paths.sh
;;
--bootloader)
shift
disks=("${disks[@]}" --bootloader "${1}")
;;
--)
shift
while [[ $# -gt 0 ]]; do
bootserver_extra=("${bootserver_extra[@]}" "$1")
shift
done
break
;;
-*)
echo >&2 "error: unknown flag: " "$1"
echo >&2
echo >&2 "You may be intending to pass this to bootserver."
echo >&2 "Bootserver flags must be passed at the end of all other flags, e.g."
echo >&2 " fx boot -- -1"
echo >&2
echo >&2 "See \`fx boot --help\` for more information."
exit 1
;;
*)
if [[ -n "$machine_type" ]]; then
echo >&2 "error: machine type already set (to $machine_type), argument \"$1\" not understood"
echo >&2
usage
exit 1
fi
machine_type="$1"
;;
esac
shift
done
ramdisk="${fuchsia_dir}/${IMAGE_BOOT_RAM}"
case "${machine_type}" in
help)
usage
;;
zedboot)
ramdisk="${fuchsia_dir}/${IMAGE_ZEDBOOT_ZBI}"
disks=()
add_fvm=false
;;
ram|netboot)
ramdisk="${fuchsia_dir}/${IMAGE_NETBOOT_RAM}"
disks=()
add_fvm=false
;;
cros|pixel|vboot|efi|acer|nuc)
disks=("${disks[@]}" --efi "${fuchsia_dir}/${IMAGE_ESP_RAW}")
disks=("${disks[@]}" --kernc "${fuchsia_dir}/${IMAGE_ZIRCON_VBOOT}")
;;
arm|arm64)
disks=("${disks[@]}" --zircona "${fuchsia_dir}/${IMAGE_ZIRCONA_ZBI}"
--zirconr "${fuchsia_dir}/${IMAGE_ZIRCONR_ZBI}")
;;
gauss)
if [[ ! -z "${sign_tool}" ]]; then
GAUSS_SIGN_TOOL="${sign_tool}"
elif [[ -z "${GAUSS_SIGN_TOOL}" ]]; then
echo "Sign tool is required." >&2
usage
fi
"${GAUSS_SIGN_TOOL}" -z "${fuchsia_dir}/${IMAGE_ZIRCONA_ZBI}" \
-o "${fuchsia_dir}/${IMAGE_ZIRCONA_ZBI}.gauss.signed"
"${GAUSS_SIGN_TOOL}" -z "${fuchsia_dir}/${IMAGE_ZIRCONR_ZBI}" \
-o "${fuchsia_dir}/${IMAGE_ZIRCONR_ZBI}.gauss.signed"
disks=("${disks[@]}" --zircona "${fuchsia_dir}/${IMAGE_ZIRCONA_ZBI}.gauss.signed" \
--zirconr "${fuchsia_dir}/${IMAGE_ZIRCONR_ZBI}.gauss.signed")
add_fvm=false
;;
astro)
if [[ ! -z "${sign_tool}" ]]; then
ASTRO_SIGN_TOOL="${sign_tool}"
elif [[ -z "${ASTRO_SIGN_TOOL}" ]]; then
echo "Sign tool is required." >&2
usage
fi
"${ASTRO_SIGN_TOOL}" -z "${fuchsia_dir}/${IMAGE_ZIRCONA_ZBI}" \
-o "${fuchsia_dir}/${IMAGE_ZIRCONA_ZBI}.astro.signed"
"${ASTRO_SIGN_TOOL}" -z "${fuchsia_dir}/${IMAGE_ZIRCONR_ZBI}" \
-o "${fuchsia_dir}/${IMAGE_ZIRCONR_ZBI}.astro.signed"
disks=("${disks[@]}" --zircona "${fuchsia_dir}/${IMAGE_ZIRCONA_ZBI}.astro.signed"\
--zirconr "${fuchsia_dir}/${IMAGE_ZIRCONR_ZBI}.astro.signed")
add_fvm=false
;;
""|*)
if [[ -n "$machine_type" ]]; then
echo >&2 "Unknown machine type: \"$machine_type\", using ${FUCHSIA_ARCH}"
fi
if [[ "$FUCHSIA_ARCH" == "x64" ]]; then
machine_type="x64"
disks=("${disks[@]}" --efi "${fuchsia_dir}/${IMAGE_ESP_RAW}" \
--kernc "${fuchsia_dir}/${IMAGE_ZIRCON_VBOOT}")
else
machine_type="arm64"
disks=("${disks[@]}" --zircona "${fuchsia_dir}/${IMAGE_ZIRCONA_ZBI}"
--zirconr "${fuchsia_dir}/${IMAGE_ZIRCONR_ZBI}")
fi
esac
if $add_fvm; then
disks=("${disks[@]}" --fvm "${fuchsia_dir}/${IMAGE_FVM_SPARSE}")
if $add_data; then
disks=("${disks[@]}" --fvm "${fuchsia_dir}/${IMAGE_DATA_FVM_RAW}")
fi
fi
exec "${zircon_tools}/bootserver" \
"${ip_targ[@]}" \
"${disks[@]}" \
"${zircon_dir}/zircon.bin" \
"${ramdisk}" \
"${bootserver_extra[@]}"