flatcar-scripts/make_netboot.sh
Vic Yang 90e3b25914 Move ARM factory install shim to initramfs
As USB/SD install shim might be used for ARM devices now, it is
reasonable to move ARM factory install shim to initramfs like on x86.
This converges the code path and build process for ARM and x86.

BUG=chrome-os-partner:15884
TEST=Install with install shim and netboot on Spring.

Change-Id: Ic8d7328502181ca909be3d7542be34f2a904523f
Signed-off-by: Vic Yang <victoryang@chromium.org>
Reviewed-on: https://gerrit.chromium.org/gerrit/40931
Reviewed-by: Hung-Te Lin <hungte@chromium.org>
2013-01-09 10:32:24 -08:00

155 lines
4.6 KiB
Bash
Executable File

#!/bin/bash
# Copyright (c) 2011 The Chromium OS 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_netboot.sh --board=[board]
#
# This script validates that the current latest image is an install shim,
# and generates a netboot image from it. This pulls the u-boot kernel
# image bundle (uimg), the legacy firmware for netbooting, and the install
# shim kernel image, bundled as a uboot gz/uimg, and places them in a
# "netboot" subfolder.
SCRIPT_ROOT=$(dirname $(readlink -f "$0"))
. "${SCRIPT_ROOT}/common.sh" || exit 1
# Script must be run inside the chroot.
restart_in_chroot_if_needed "$@"
DEFINE_string board "${DEFAULT_BOARD}" \
"The board to build an image for."
DEFINE_string image "" "Path to the image to use"
# Parse command line.
FLAGS "$@" || exit 1
eval set -- "${FLAGS_ARGV}"
. "${SCRIPT_ROOT}/build_library/build_common.sh" || exit 1
. "${BUILD_LIBRARY_DIR}/board_options.sh" || exit 1
switch_to_strict_mode
# build_packages artifact output.
SYSROOT="${GCLIENT_ROOT}/chroot/build/${FLAGS_board}"
# build_image artifact output.
IMAGES_DIR="${CHROOT_TRUNK_DIR}/src/build/images"
if [ -n "${FLAGS_image}" ]; then
cd $(dirname "${FLAGS_image}")
INSTALL_SHIM=$(basename "${FLAGS_image}")
else
cd ${IMAGES_DIR}/${FLAGS_board}/latest
# Canonical install shim name.
INSTALL_SHIM="factory_install_shim.bin"
fi
if [ ! -f "${INSTALL_SHIM}" ]; then
echo "Cannot locate ${INSTALL_SHIM}, nothing to netbootify!"
exit 1
fi
# Generate staging dir for netboot files.
sudo rm -rf netboot
mkdir -p netboot
# Get netboot firmware.
# TODO(nsanders): Set default IP here when userspace
# env modification is available.
# TODO(nsanders): ARM generic doesn't build chromeos-u-boot package.
# When ARM generic goes away, delete the test.
if [ -r "${SYSROOT}/firmware/legacy_image.bin" ]; then
echo "Copying netboot firmware legacy_image.bin"
cp "${SYSROOT}/firmware/legacy_image.bin" "netboot"
cp "${GCLIENT_ROOT}/chroot/usr/bin/update_firmware_vars.py" "netboot"
else
echo "Skipping legacy fw: ${SYSROOT}/firmware/legacy_image.bin not present?"
fi
# Prepare to mount rootfs.
umount_loop() {
safe_umount r || true
safe_umount s || true
false
}
echo "Unpack factory install shim partitions"
./unpack_partitions.sh "${INSTALL_SHIM}"
# Genrate clean mountpoints.
sudo rm -rf r s
mkdir -p r s
# Clean ROified filesystem headers, and mount.
trap "umount_loop" EXIT
enable_rw_mount part_3
sudo mount -o loop part_3 r
sudo mount -o loop part_1 s
echo "Mount install shim rootfs (partition 3)"
if [ "${ARCH}" = "arm" ]; then
export MKIMAGE_ARCH="arm"
else
export MKIMAGE_ARCH="x86" # including amd64
fi
# Get netboot kernel.
echo "Building kernel"
# Create temporary emerge root
temp_build_path="$(mktemp -d bk_XXXXXXXX)"
if ! [ -d "${temp_build_path}" ]; then
echo "Failed to create temporary directory."
exit 1
fi
# Emerge network boot kernel
# We don't want to build whole install shim everytime we run this script,
# and thus we only build kernel here. If this script is run against install
# shim with different kernel version, this might not work. But as we don't
# upgrade kernel so often, this is probably fine.
export USE='vfat blkdevram fbconsole'
export EMERGE_BOARD_CMD="emerge-${FLAGS_board}"
emerge_custom_kernel ${temp_build_path}
# Generate kernel uImage
echo "Generating netboot kernel vmlinux.uimg"
if [ "${ARCH}" = "arm" ]; then
cp "${temp_build_path}"/boot/vmlinux.uimg netboot/
else
# U-boot put kernel image at 0x100000. We load it at 0x3000000 because
# 0x3000000 is safe enough not to overlap with image at 0x100000.
mkimage -A "${MKIMAGE_ARCH}" -O linux -T kernel -n "Linux kernel" -C none \
-d "${temp_build_path}"/boot/vmlinuz \
-a 0x03000000 -e 0x03000000 netboot/vmlinux.uimg
fi
# Clean up temporary emerge root
sudo rm -rf "${temp_build_path}"
echo "Add lsb-factory"
# Copy factory config file.
# TODO(nsanders): switch this to u-boot env var config.
LSB_FACTORY_DIR="mnt/stateful_partition/dev_image/etc"
sudo mkdir -p "r/${LSB_FACTORY_DIR}"
sudo cp "s/dev_image/etc/lsb-factory" "r/${LSB_FACTORY_DIR}"
# Clean up mounts.
trap - EXIT
safe_umount r s
sudo rm -rf r s
# Generate an initrd fo u-boot to load.
gzip -9 -c part_3 > ext2_rootfs.gz
echo "Generating netboot rootfs initrd.uimg"
# U-boot's uimg wrapper specifies where we will load the blob into memory.
# tftp boot's default root address is set to 0x12008000 in legacy_image.bin,
# so we want to unpack it there.
mkimage -A "${MKIMAGE_ARCH}" -O linux -T ramdisk -a 0x12008000 \
-n "Factory Install RootFS" -C gzip -d ext2_rootfs.gz \
netboot/initrd.uimg
# Cleanup
rm -rf ext2_rootfs.gz part_*