| #!/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[@]}" |