| Index: build_image
|
| diff --git a/build_image b/build_image
|
| index f9e53025cf30d78ac86cc505178a92ca08ba4624..7dd87efab8bb97a3b7c1b61d56b5ad02f880c093 100755
|
| --- a/build_image
|
| +++ b/build_image
|
| @@ -84,8 +84,8 @@ fi
|
| # Append build attempt to output directory.
|
| IMAGE_SUBDIR="${CHROMEOS_VERSION_STRING}-a${FLAGS_build_attempt}"
|
| OUTPUT_DIR="${FLAGS_output_root}/${FLAGS_board}/${IMAGE_SUBDIR}"
|
| -ROOT_FS_DIR="${OUTPUT_DIR}/rootfs"
|
| -ROOT_FS_IMG="${OUTPUT_DIR}/rootfs.image"
|
| +
|
| +OUTSIDE_OUTPUT_DIR="../build/images/${FLAGS_board}/${IMAGE_SUBDIR}"
|
|
|
| # If we are creating a developer image, also create a pristine image with a
|
| # different name.
|
| @@ -106,14 +106,43 @@ OUTPUT_IMG=${FLAGS_to:-${OUTPUT_DIR}/${PRISTINE_IMAGE_NAME}}
|
| BOARD="${FLAGS_board}"
|
| BOARD_ROOT="${FLAGS_build_root}/${BOARD}"
|
|
|
| +ROOT_FS_DIR="${OUTPUT_DIR}/rootfs"
|
| +ROOT_FS_IMG="${OUTPUT_DIR}/rootfs.image"
|
| +
|
| +STATEFUL_IMG="${OUTPUT_DIR}/stateful_partition.image"
|
| +STATEFUL_DIR="${OUTPUT_DIR}/stateful_partition"
|
| +
|
| +ESP_IMG=${OUTPUT_DIR}/esp.image
|
| +ESP_DIR=${OUTPUT_DIR}/esp
|
| +
|
| LOOP_DEV=
|
| STATEFUL_LOOP_DEV=
|
| ESP_LOOP_DEV=
|
|
|
| +# ${DEV_IMAGE_ROOT} specifies the location of where developer packages will
|
| +# be installed on the stateful dir. On a Chromium OS system, this will
|
| +# translate to /usr/local.
|
| +DEV_IMAGE_ROOT="${STATEFUL_DIR}/dev_image"
|
| +
|
| # What cross-build are we targeting?
|
| . "${BOARD_ROOT}/etc/make.conf.board_setup"
|
| LIBC_VERSION=${LIBC_VERSION:-"2.10.1-r1"}
|
|
|
| +INSTALL_MASK=""
|
| +if [[ ${FLAGS_installmask} -eq ${FLAGS_TRUE} ]] ; then
|
| + INSTALL_MASK="${DEFAULT_INSTALL_MASK}"
|
| +fi
|
| +
|
| +# Reduce the size of factory install shim.
|
| +# TODO: Build a separated ebuild for the factory install shim to reduce size.
|
| +if [[ ${FLAGS_factory_install} -eq ${FLAGS_TRUE} ]] ; then
|
| + INSTALL_MASK="${INSTALL_MASK} ${FACTORY_INSTALL_MASK}"
|
| +fi
|
| +
|
| +if [[ ${FLAGS_jobs} -ne -1 ]]; then
|
| + EMERGE_JOBS="--jobs=${FLAGS_jobs}"
|
| +fi
|
| +
|
| # Figure out ARCH from the given toolchain.
|
| # TODO: Move to common.sh as a function after scripts are switched over.
|
| TC_ARCH=$(echo "${CHOST}" | awk -F'-' '{ print $1 }')
|
| @@ -199,14 +228,13 @@ delete_prompt() {
|
|
|
| # $1 - Directory where developer rootfs is mounted.
|
| # $2 - Directory where developer stateful_partition is mounted.
|
| -developer_cleanup() {
|
| +mount_gpt_cleanup() {
|
| "${SCRIPTS_DIR}/mount_gpt_image.sh" -u -r "$1" -s "$2"
|
| delete_prompt
|
| }
|
|
|
| # Creates a modified image based on ${OUTPUT_IMG} with additional packages.
|
| -create_mod_image() {
|
| - local image_type=$1
|
| +update_dev_packages() {
|
| local root_fs_dir="${OUTPUT_DIR}/rootfs_dev"
|
| local root_fs_img="${OUTPUT_DIR}/rootfs_dev.image"
|
| local image_to_mount=${DEVELOPER_IMAGE_NAME}
|
| @@ -217,35 +245,24 @@ create_mod_image() {
|
| local stateful_dir="${OUTPUT_DIR}/stateful_partition_dev"
|
| local file_to_touch=".dev_mode"
|
|
|
| - trap "developer_cleanup \"${root_fs_dir}\" \"${stateful_dir}\"" EXIT
|
| + trap "mount_gpt_cleanup \"${root_fs_dir}\" \"${stateful_dir}\"" EXIT
|
|
|
| - if [ "${image_type}" == "dev" ]; then
|
| - # Mount a new copy of the base image.
|
| - echo "Creating developer image from base image ${OUTPUT_IMG}"
|
| - cp "${OUTPUT_IMG}" "${output_img}"
|
| - elif [ "${image_type}" == "recovery" ]; then
|
| - image_to_mount=${PRISTINE_IMAGE_NAME}
|
| - file_to_touch=".recovery_installer"
|
| - fi
|
| + # Mount a new copy of the base image.
|
| + echo "Creating developer image from base image ${OUTPUT_IMG}"
|
| + cp "${OUTPUT_IMG}" "${output_img}"
|
|
|
| ${SCRIPTS_DIR}/mount_gpt_image.sh --from "${OUTPUT_DIR}" \
|
| --image "${image_to_mount}" -r "${root_fs_dir}" -s "${stateful_dir}"
|
|
|
| - if [ "${image_type}" == "dev" ]; then
|
| - # Determine the root dir for developer packages.
|
| - local root_dev_dir="${root_fs_dir}"
|
| - [ ${FLAGS_statefuldev} -eq ${FLAGS_TRUE} ] && \
|
| - root_dev_dir="${root_fs_dir}/usr/local"
|
| -
|
| - # Install developer packages described in chromeos-dev.
|
| - sudo INSTALL_MASK="${INSTALL_MASK}" ${EMERGE_BOARD_CMD} \
|
| - --root="${root_dev_dir}" --root-deps=rdeps \
|
| - --usepkgonly chromeos-dev ${EMERGE_JOBS}
|
| - elif [ "${image_type}" == "recovery" ]; then
|
| - # Install recovery installer.
|
| - sudo ${EMERGE_BOARD_CMD} --root=${root_fs_dir} --usepkgonly \
|
| - --root-deps=rdeps --nodeps chromeos-recovery
|
| - fi
|
| + # Determine the root dir for developer packages.
|
| + local root_dev_dir="${root_fs_dir}"
|
| + [ ${FLAGS_statefuldev} -eq ${FLAGS_TRUE} ] && \
|
| + root_dev_dir="${root_fs_dir}/usr/local"
|
| +
|
| + # Install developer packages described in chromeos-dev.
|
| + sudo INSTALL_MASK="${INSTALL_MASK}" ${EMERGE_BOARD_CMD} \
|
| + --root="${root_dev_dir}" --root-deps=rdeps \
|
| + --usepkgonly chromeos-dev ${EMERGE_JOBS}
|
|
|
| # Re-run ldconfig to fix /etc/ldconfig.so.cache.
|
| sudo /sbin/ldconfig -r "${root_fs_dir}"
|
| @@ -254,99 +271,125 @@ create_mod_image() {
|
| sudo mkdir -p "${root_fs_dir}/root"
|
| sudo touch "${root_fs_dir}/root/${file_to_touch}"
|
|
|
| - if [ "${image_type}" == "dev" ]; then
|
| - # Additional changes to developer image.
|
| -
|
| - # The ldd tool is a useful shell script but lives in glibc; just copy it.
|
| - sudo cp -a "$(which ldd)" "${root_dev_dir}/usr/bin"
|
| -
|
| - # If vim is installed, then a vi symlink would probably help.
|
| - if [[ -x "${root_fs_dir}/usr/local/bin/vim" ]]; then
|
| - sudo ln -sf vim "${root_fs_dir}/usr/local/bin/vi"
|
| - fi
|
| -
|
| - # Check that the image has been correctly created. Only do it if not
|
| - # building a factory install image, as the INSTALL_MASK for it will
|
| - # make test_image fail.
|
| - if [[ ${FLAGS_factory_install} -eq ${FLAGS_FALSE} ]] ; then
|
| - "${SCRIPTS_DIR}/test_image" \
|
| - --root="${root_fs_dir}" \
|
| - --target="${ARCH}"
|
| - fi
|
| - echo "Developer image built and stored at ${output_img}"
|
| + # Additional changes to developer image.
|
| +
|
| + # The ldd tool is a useful shell script but lives in glibc; just copy it.
|
| + sudo cp -a "$(which ldd)" "${root_dev_dir}/usr/bin"
|
| +
|
| + # If vim is installed, then a vi symlink would probably help.
|
| + if [[ -x "${root_fs_dir}/usr/local/bin/vim" ]]; then
|
| + sudo ln -sf vim "${root_fs_dir}/usr/local/bin/vi"
|
| + fi
|
| +
|
| + # Check that the image has been correctly created. Only do it if not
|
| + # building a factory install image, as the INSTALL_MASK for it will
|
| + # make test_image fail.
|
| + if [[ ${FLAGS_factory_install} -eq ${FLAGS_FALSE} ]] ; then
|
| + "${SCRIPTS_DIR}/test_image" \
|
| + --root="${root_fs_dir}" \
|
| + --target="${ARCH}"
|
| fi
|
| + echo "Developer image built and stored at ${output_img}"
|
|
|
| trap - EXIT
|
| ${SCRIPTS_DIR}/mount_gpt_image.sh -u -r "${root_fs_dir}" -s "${stateful_dir}"
|
| sudo rm -rf "${root_fs_dir}" "${stateful_dir}"
|
| }
|
|
|
| -# ${DEV_IMAGE_ROOT} specifies the location of where developer packages will
|
| -# be installed on the stateful dir. On a Chromium OS system, this will
|
| -# translate to /usr/local.
|
| -DEV_IMAGE_ROOT=
|
|
|
| -trap "cleanup && delete_prompt" EXIT
|
| +# Creates a modified image based on ${OUTPUT_IMG} with additional packages.
|
| +update_recovery_packages() {
|
| + local root_fs_dir="${OUTPUT_DIR}/rootfs_dev"
|
| + local root_fs_img="${OUTPUT_DIR}/rootfs_dev.image"
|
| + local image_to_mount=${DEVELOPER_IMAGE_NAME}
|
| + local output_img="${OUTPUT_DIR}/${image_to_mount}"
|
|
|
| -mkdir -p "${ROOT_FS_DIR}"
|
| + # Create stateful partition of the same size as the rootfs.
|
| + local stateful_img="${OUTPUT_DIR}/stateful_partition_dev.image"
|
| + local stateful_dir="${OUTPUT_DIR}/stateful_partition_dev"
|
| + local file_to_touch=".dev_mode"
|
|
|
| -# Create and format the root file system.
|
| + trap "mount_gpt_cleanup \"${root_fs_dir}\" \"${stateful_dir}\"" EXIT
|
|
|
| -# Check for loop device before creating image.
|
| -LOOP_DEV=$(sudo losetup -f)
|
| -if [ -z "${LOOP_DEV}" ] ; then
|
| - echo "No free loop device. Free up a loop device or reboot. exiting. "
|
| - exit 1
|
| -fi
|
| + image_to_mount=${PRISTINE_IMAGE_NAME}
|
| + file_to_touch=".recovery_installer"
|
|
|
| -# Create root file system disk image to fit on a 1GB memory stick.
|
| -# 1 GB in hard-drive-manufacturer-speak is 10^9, not 2^30. 950MB < 10^9 bytes.
|
| -if [[ ${FLAGS_factory_install} -eq ${FLAGS_TRUE} ]] ; then
|
| - ROOT_SIZE_BYTES=$((1024 * 1024 * 300))
|
| -else
|
| - ROOT_SIZE_BYTES=$((1024 * 1024 * ${FLAGS_rootfs_size}))
|
| -fi
|
| + ${SCRIPTS_DIR}/mount_gpt_image.sh --from "${OUTPUT_DIR}" \
|
| + --image "${image_to_mount}" -r "${root_fs_dir}" -s "${stateful_dir}"
|
|
|
| -dd if=/dev/zero of="${ROOT_FS_IMG}" bs=1 count=1 seek=$((ROOT_SIZE_BYTES - 1))
|
| -sudo losetup "${LOOP_DEV}" "${ROOT_FS_IMG}"
|
| -sudo mkfs.ext3 "${LOOP_DEV}"
|
| + # Install recovery installer.
|
| + sudo ${EMERGE_BOARD_CMD} --root=${root_fs_dir} --usepkgonly \
|
| + --root-deps=rdeps --nodeps chromeos-recovery
|
|
|
| -# Tune and mount rootfs.
|
| -UUID=$(uuidgen)
|
| -DISK_LABEL="C-KEYFOB"
|
| -sudo tune2fs -L "${DISK_LABEL}" -U "${UUID}" -c 0 -i 0 "${LOOP_DEV}"
|
| -sudo mount "${LOOP_DEV}" "${ROOT_FS_DIR}"
|
| + # Re-run ldconfig to fix /etc/ldconfig.so.cache.
|
| + sudo /sbin/ldconfig -r "${root_fs_dir}"
|
|
|
| -# Create stateful partition of the same size as the rootfs.
|
| -STATEFUL_IMG="${OUTPUT_DIR}/stateful_partition.image"
|
| -STATEFUL_DIR="${OUTPUT_DIR}/stateful_partition"
|
| -STATEFUL_LOOP_DEV=$(sudo losetup -f)
|
| -if [ -z "${STATEFUL_LOOP_DEV}" ] ; then
|
| - echo "No free loop device. Free up a loop device or reboot. exiting. "
|
| - exit 1
|
| -fi
|
| -dd if=/dev/zero of="${STATEFUL_IMG}" bs=1 count=1 seek=$((ROOT_SIZE_BYTES - 1))
|
| -sudo losetup "${STATEFUL_LOOP_DEV}" "${STATEFUL_IMG}"
|
| -sudo mkfs.ext3 "${STATEFUL_LOOP_DEV}"
|
| -sudo tune2fs -L "C-STATE" -U "${UUID}" -c 0 -i 0 \
|
| - "${STATEFUL_LOOP_DEV}"
|
| -
|
| -# Mount the stateful partition.
|
| -mkdir -p "${STATEFUL_DIR}"
|
| -sudo mount "${STATEFUL_LOOP_DEV}" "${STATEFUL_DIR}"
|
| -
|
| -# Set dev image root now that we have mounted the stateful partition
|
| -# we created.
|
| -DEV_IMAGE_ROOT="${STATEFUL_DIR}/dev_image"
|
| + # Mark the image as a developer image (input to chromeos_startup).
|
| + sudo mkdir -p "${root_fs_dir}/root"
|
| + sudo touch "${root_fs_dir}/root/${file_to_touch}"
|
|
|
| -# Turn root file system into bootable image.
|
| -if [[ "${ARCH}" = "x86" ]]; then
|
| - # Setup extlinux configuration.
|
| - # TODO: For some reason the /dev/disk/by-uuid is not being generated by udev
|
| - # in the initramfs. When we figure that out, switch to root=UUID=${UUID}.
|
| - sudo mkdir -p "${ROOT_FS_DIR}"/boot
|
| - # TODO(adlr): use initramfs for booting.
|
| - cat <<EOF | sudo dd of="${ROOT_FS_DIR}"/boot/extlinux.conf
|
| + trap - EXIT
|
| + ${SCRIPTS_DIR}/mount_gpt_image.sh -u -r "${root_fs_dir}" -s "${stateful_dir}"
|
| + sudo rm -rf "${root_fs_dir}" "${stateful_dir}"
|
| +}
|
| +
|
| +create_base_image() {
|
| +
|
| + trap "cleanup && delete_prompt" EXIT
|
| +
|
| + mkdir -p "${ROOT_FS_DIR}"
|
| +
|
| + # Create and format the root file system.
|
| +
|
| + # Check for loop device before creating image.
|
| + LOOP_DEV=$(sudo losetup -f)
|
| + if [ -z "${LOOP_DEV}" ] ; then
|
| + echo "No free loop device. Free up a loop device or reboot. exiting. "
|
| + exit 1
|
| + fi
|
| +
|
| + # Create root file system disk image to fit on a 1GB memory stick.
|
| + # 1 GB in hard-drive-manufacturer-speak is 10^9, not 2^30. 950MB < 10^9 bytes.
|
| + if [[ ${FLAGS_factory_install} -eq ${FLAGS_TRUE} ]] ; then
|
| + ROOT_SIZE_BYTES=$((1024 * 1024 * 300))
|
| + else
|
| + ROOT_SIZE_BYTES=$((1024 * 1024 * ${FLAGS_rootfs_size}))
|
| + fi
|
| +
|
| + dd if=/dev/zero of="${ROOT_FS_IMG}" bs=1 count=1 seek=$((ROOT_SIZE_BYTES - 1))
|
| + sudo losetup "${LOOP_DEV}" "${ROOT_FS_IMG}"
|
| + sudo mkfs.ext3 "${LOOP_DEV}"
|
| +
|
| + # Tune and mount rootfs.
|
| + UUID=$(uuidgen)
|
| + DISK_LABEL="C-KEYFOB"
|
| + sudo tune2fs -L "${DISK_LABEL}" -U "${UUID}" -c 0 -i 0 "${LOOP_DEV}"
|
| + sudo mount "${LOOP_DEV}" "${ROOT_FS_DIR}"
|
| +
|
| + # Create stateful partition of the same size as the rootfs.
|
| + STATEFUL_LOOP_DEV=$(sudo losetup -f)
|
| + if [ -z "${STATEFUL_LOOP_DEV}" ] ; then
|
| + echo "No free loop device. Free up a loop device or reboot. exiting. "
|
| + exit 1
|
| + fi
|
| + dd if=/dev/zero of="${STATEFUL_IMG}" bs=1 count=1 seek=$((ROOT_SIZE_BYTES - 1))
|
| + sudo losetup "${STATEFUL_LOOP_DEV}" "${STATEFUL_IMG}"
|
| + sudo mkfs.ext3 "${STATEFUL_LOOP_DEV}"
|
| + sudo tune2fs -L "C-STATE" -U "${UUID}" -c 0 -i 0 \
|
| + "${STATEFUL_LOOP_DEV}"
|
| +
|
| + # Mount the stateful partition.
|
| + mkdir -p "${STATEFUL_DIR}"
|
| + sudo mount "${STATEFUL_LOOP_DEV}" "${STATEFUL_DIR}"
|
| +
|
| + # Turn root file system into bootable image.
|
| + if [[ "${ARCH}" = "x86" ]]; then
|
| + # Setup extlinux configuration.
|
| + # TODO: For some reason the /dev/disk/by-uuid is not being generated by udev
|
| + # in the initramfs. When we figure that out, switch to root=UUID=${UUID}.
|
| + sudo mkdir -p "${ROOT_FS_DIR}"/boot
|
| + # TODO(adlr): use initramfs for booting.
|
| + cat <<EOF | sudo dd of="${ROOT_FS_DIR}"/boot/extlinux.conf
|
| DEFAULT chromeos-usb
|
| PROMPT 0
|
| TIMEOUT 0
|
| @@ -362,87 +405,70 @@ label chromeos-hd
|
| append quiet console=tty2 init=/sbin/init boot=local rootwait root=HDROOT ro noresume noswap i915.modeset=1 loglevel=1 cros_legacy
|
| EOF
|
|
|
| - # Make partition bootable and label it.
|
| - sudo extlinux -z --install "${ROOT_FS_DIR}/boot"
|
| -fi
|
| -
|
| -# -- Install packages into the root file system --
|
| -
|
| -# We need to install libc manually from the cross toolchain.
|
| -# TODO: Improve this? We only want libc and not the whole toolchain.
|
| -PKGDIR="/var/lib/portage/pkgs/cross/"
|
| -sudo tar jxvpf \
|
| - "${PKGDIR}/${CHOST}/cross-${CHOST}"/glibc-${LIBC_VERSION}.tbz2 \
|
| - -C "${ROOT_FS_DIR}" --strip-components=3 \
|
| - --exclude=usr/include --exclude=sys-include --exclude=*.a --exclude=*.o
|
| -
|
| -# We need to install libstdc++ manually from the cross toolchain.
|
| -# TODO: Figure out a better way of doing this?
|
| -sudo cp -a "${BOARD_ROOT}"/lib/libgcc_s.so* "${ROOT_FS_DIR}/lib"
|
| -sudo cp -a "${BOARD_ROOT}"/usr/lib/libstdc++.so* "${ROOT_FS_DIR}/usr/lib"
|
| -
|
| -INSTALL_MASK=""
|
| -if [[ ${FLAGS_installmask} -eq ${FLAGS_TRUE} ]] ; then
|
| - INSTALL_MASK="${DEFAULT_INSTALL_MASK}"
|
| -fi
|
| -
|
| -# Reduce the size of factory install shim.
|
| -# TODO: Build a separated ebuild for the factory install shim to reduce size.
|
| -if [[ ${FLAGS_factory_install} -eq ${FLAGS_TRUE} ]] ; then
|
| - INSTALL_MASK="${INSTALL_MASK} ${FACTORY_INSTALL_MASK}"
|
| -fi
|
| -
|
| -if [[ ${FLAGS_jobs} -ne -1 ]]; then
|
| - EMERGE_JOBS="--jobs=${FLAGS_jobs}"
|
| -fi
|
| + # Make partition bootable and label it.
|
| + sudo extlinux -z --install "${ROOT_FS_DIR}/boot"
|
| + fi
|
|
|
| -# Prepare stateful partition with some pre-created directories.
|
| -sudo mkdir -p "${DEV_IMAGE_ROOT}"
|
| -sudo mkdir -p "${STATEFUL_DIR}/var"
|
| -
|
| -# Create symlinks so that /usr/local/usr based directories are symlinked to
|
| -# /usr/local/ directories e.g. /usr/local/usr/bin -> /usr/local/bin, etc.
|
| -setup_symlinks_on_root "${DEV_IMAGE_ROOT}" "${STATEFUL_DIR}/var" \
|
| - "${STATEFUL_DIR}"
|
| -
|
| -# Perform binding rather than symlinking because directories must exist
|
| -# on rootfs so that we can bind at run-time since rootfs is read-only.
|
| -echo "Binding directories from stateful partition onto the rootfs"
|
| -sudo mkdir -p "${ROOT_FS_DIR}/usr/local"
|
| -sudo mount --bind "${DEV_IMAGE_ROOT}" "${ROOT_FS_DIR}/usr/local"
|
| -sudo mkdir -p "${ROOT_FS_DIR}/var"
|
| -sudo mount --bind "${STATEFUL_DIR}/var" "${ROOT_FS_DIR}/var"
|
| -sudo mkdir -p "${ROOT_FS_DIR}/dev"
|
| -
|
| -# We "emerge --root=${ROOT_FS_DIR} --root-deps=rdeps --usepkgonly" all of the
|
| -# runtime packages for chrome os. This builds up a chrome os image from binary
|
| -# packages with runtime dependencies only. We use INSTALL_MASK to trim the
|
| -# image size as much as possible.
|
| -sudo INSTALL_MASK="${INSTALL_MASK}" ${EMERGE_BOARD_CMD} \
|
| - --root="${ROOT_FS_DIR}" --root-deps=rdeps \
|
| - --usepkgonly chromeos ${EMERGE_JOBS}
|
| -
|
| -# Create EFI System Partition to boot stock EFI BIOS (but not ChromeOS EFI
|
| -# BIOS). We only need this for x86, but it's simpler and safer to keep the disk
|
| -# images the same for both x86 and ARM.
|
| -ESP_IMG=${OUTPUT_DIR}/esp.image
|
| -# NOTE: The size argument for mkfs.vfat is in 1024-byte blocks. We'll hard-code
|
| -# it to 16M for now.
|
| -ESP_BLOCKS=16384
|
| -/usr/sbin/mkfs.vfat -C ${OUTPUT_DIR}/esp.image ${ESP_BLOCKS}
|
| -ESP_DIR=${OUTPUT_DIR}/esp
|
| -ESP_LOOP_DEV=$(sudo losetup -f)
|
| -if [ -z "${ESP_LOOP_DEV}" ] ; then
|
| - echo "No free loop device. Free up a loop device or reboot. exiting. "
|
| - exit 1
|
| -fi
|
| -mkdir -p "${ESP_DIR}"
|
| -sudo losetup "${ESP_LOOP_DEV}" "${ESP_IMG}"
|
| -sudo mount "${ESP_LOOP_DEV}" "${ESP_DIR}"
|
| -sudo mkdir -p "${ESP_DIR}/efi/boot"
|
| -sudo grub-mkimage -p /efi/boot -o "${ESP_DIR}/efi/boot/bootx64.efi" \
|
| - part_gpt fat ext2 normal boot sh chain configfile linux
|
| -cat <<'EOF' | sudo dd of="${ESP_DIR}/efi/boot/grub.cfg"
|
| + # -- Install packages into the root file system --
|
| +
|
| + # We need to install libc manually from the cross toolchain.
|
| + # TODO: Improve this? We only want libc and not the whole toolchain.
|
| + PKGDIR="/var/lib/portage/pkgs/cross/"
|
| + sudo tar jxvpf \
|
| + "${PKGDIR}/${CHOST}/cross-${CHOST}"/glibc-${LIBC_VERSION}.tbz2 \
|
| + -C "${ROOT_FS_DIR}" --strip-components=3 \
|
| + --exclude=usr/include --exclude=sys-include --exclude=*.a --exclude=*.o
|
| +
|
| + # We need to install libstdc++ manually from the cross toolchain.
|
| + # TODO: Figure out a better way of doing this?
|
| + sudo cp -a "${BOARD_ROOT}"/lib/libgcc_s.so* "${ROOT_FS_DIR}/lib"
|
| + sudo cp -a "${BOARD_ROOT}"/usr/lib/libstdc++.so* "${ROOT_FS_DIR}/usr/lib"
|
| +
|
| + # Prepare stateful partition with some pre-created directories.
|
| + sudo mkdir -p "${DEV_IMAGE_ROOT}"
|
| + sudo mkdir -p "${STATEFUL_DIR}/var"
|
| +
|
| + # Create symlinks so that /usr/local/usr based directories are symlinked to
|
| + # /usr/local/ directories e.g. /usr/local/usr/bin -> /usr/local/bin, etc.
|
| + setup_symlinks_on_root "${DEV_IMAGE_ROOT}" "${STATEFUL_DIR}/var" \
|
| + "${STATEFUL_DIR}"
|
| +
|
| + # Perform binding rather than symlinking because directories must exist
|
| + # on rootfs so that we can bind at run-time since rootfs is read-only.
|
| + echo "Binding directories from stateful partition onto the rootfs"
|
| + sudo mkdir -p "${ROOT_FS_DIR}/usr/local"
|
| + sudo mount --bind "${DEV_IMAGE_ROOT}" "${ROOT_FS_DIR}/usr/local"
|
| + sudo mkdir -p "${ROOT_FS_DIR}/var"
|
| + sudo mount --bind "${STATEFUL_DIR}/var" "${ROOT_FS_DIR}/var"
|
| + sudo mkdir -p "${ROOT_FS_DIR}/dev"
|
| +
|
| + # We "emerge --root=${ROOT_FS_DIR} --root-deps=rdeps --usepkgonly" all of the
|
| + # runtime packages for chrome os. This builds up a chrome os image from
|
| + # binary packages with runtime dependencies only. We use INSTALL_MASK to
|
| + # trim the image size as much as possible.
|
| + sudo INSTALL_MASK="${INSTALL_MASK}" ${EMERGE_BOARD_CMD} \
|
| + --root="${ROOT_FS_DIR}" --root-deps=rdeps \
|
| + --usepkgonly chromeos ${EMERGE_JOBS}
|
| +
|
| + # Create EFI System Partition to boot stock EFI BIOS (but not ChromeOS EFI
|
| + # BIOS). We only need this for x86, but it's simpler and safer to keep the
|
| + # disk images the same for both x86 and ARM.
|
| + # NOTE: The size argument for mkfs.vfat is in 1024-byte blocks.
|
| + # We'll hard-code it to 16M for now.
|
| + ESP_BLOCKS=16384
|
| + /usr/sbin/mkfs.vfat -C ${OUTPUT_DIR}/esp.image ${ESP_BLOCKS}
|
| + ESP_LOOP_DEV=$(sudo losetup -f)
|
| + if [ -z "${ESP_LOOP_DEV}" ] ; then
|
| + echo "No free loop device. Free up a loop device or reboot. exiting. "
|
| + exit 1
|
| + fi
|
| + mkdir -p "${ESP_DIR}"
|
| + sudo losetup "${ESP_LOOP_DEV}" "${ESP_IMG}"
|
| + sudo mount "${ESP_LOOP_DEV}" "${ESP_DIR}"
|
| + sudo mkdir -p "${ESP_DIR}/efi/boot"
|
| + sudo grub-mkimage -p /efi/boot -o "${ESP_DIR}/efi/boot/bootx64.efi" \
|
| + part_gpt fat ext2 normal boot sh chain configfile linux
|
| + cat <<'EOF' | sudo dd of="${ESP_DIR}/efi/boot/grub.cfg"
|
| set default=0
|
| set timeout=2
|
|
|
| @@ -462,15 +488,15 @@ menuentry "Alternate USB Boot" {
|
|
|
| EOF
|
|
|
| -# FIXME: At the moment, we're working on signed images for x86 only. ARM will
|
| -# support this before shipping, but at the moment they don't.
|
| -if [[ "${ARCH}" = "x86" ]]; then
|
| + # FIXME: At the moment, we're working on signed images for x86 only. ARM will
|
| + # support this before shipping, but at the moment they don't.
|
| + if [[ "${ARCH}" = "x86" ]]; then
|
|
|
| - # Legacy BIOS will use the kernel in the rootfs (via syslinux), as will
|
| - # standard EFI BIOS (via grub, from the EFI System Partition). Chrome OS BIOS
|
| - # will use a separate signed kernel partition, which we'll create now.
|
| - # FIXME: remove serial output, debugging messages.
|
| - cat <<'EOF' > "${OUTPUT_DIR}/config.txt"
|
| + # Legacy BIOS will use the kernel in the rootfs (via syslinux), as will
|
| + # standard EFI BIOS (via grub, from the EFI System Partition). Chrome OS
|
| + # BIOS will use a separate signed kernel partition, which we'll create now.
|
| + # FIXME: remove serial output, debugging messages.
|
| + cat <<'EOF' > "${OUTPUT_DIR}/config.txt"
|
| earlyprintk=serial,ttyS0,115200
|
| console=ttyS0,115200
|
| init=/sbin/init
|
| @@ -486,93 +512,96 @@ loglevel=7
|
| cros_secure
|
| EOF
|
|
|
| - # FIXME: We need to specify the real keys and certs here!
|
| - SIG_DIR="${SRC_ROOT}/platform/vboot_reference/tests/testkeys"
|
| -
|
| - # Wrap the public keys with VbPublicKey headers.
|
| - vbutil_key --pack \
|
| - --in "${SIG_DIR}/key_rsa2048.keyb" \
|
| - --version 1 --algorithm 4 \
|
| - --out "${OUTPUT_DIR}/key_alg4.vbpubk"
|
| -
|
| - vbutil_key --pack \
|
| - --in "${SIG_DIR}/key_rsa4096.keyb" \
|
| - --version 1 --algorithm 8 \
|
| - --out "${OUTPUT_DIR}/key_alg8.vbpubk"
|
| -
|
| - vbutil_keyblock --pack "${OUTPUT_DIR}/data4_sign8.keyblock" \
|
| - --datapubkey "${OUTPUT_DIR}/key_alg4.vbpubk" \
|
| - --signprivate "${SIG_DIR}/key_rsa4096.pem" \
|
| - --algorithm 8 --flags 3
|
| -
|
| - # Verify the keyblock.
|
| - vbutil_keyblock --unpack "${OUTPUT_DIR}/data4_sign8.keyblock" \
|
| - --signpubkey "${OUTPUT_DIR}/key_alg8.vbpubk"
|
| -
|
| - # Sign the kernel:
|
| - vbutil_kernel --pack "${OUTPUT_DIR}/vmlinuz.image" \
|
| - --keyblock "${OUTPUT_DIR}/data4_sign8.keyblock" \
|
| - --signprivate "${SIG_DIR}/key_rsa2048.pem" \
|
| - --version 1 \
|
| - --config "${OUTPUT_DIR}/config.txt" \
|
| - --bootloader /lib64/bootstub/bootstub.efi \
|
| - --vmlinuz "${ROOT_FS_DIR}/boot/vmlinuz"
|
| -
|
| - # And verify it.
|
| - vbutil_kernel --verify "${OUTPUT_DIR}/vmlinuz.image" \
|
| - --signpubkey "${OUTPUT_DIR}/key_alg8.vbpubk"
|
| -
|
| -else
|
| - # FIXME: For now, ARM just uses the unsigned kernel by itself.
|
| - cp -f "${ROOT_FS_DIR}/boot/vmlinuz" "${OUTPUT_DIR}/vmlinuz.image"
|
| -fi
|
| + # FIXME: We need to specify the real keys and certs here!
|
| + SIG_DIR="${SRC_ROOT}/platform/vboot_reference/tests/testkeys"
|
| +
|
| + # Wrap the public keys with VbPublicKey headers.
|
| + vbutil_key --pack \
|
| + --in "${SIG_DIR}/key_rsa2048.keyb" \
|
| + --version 1 --algorithm 4 \
|
| + --out "${OUTPUT_DIR}/key_alg4.vbpubk"
|
| +
|
| + vbutil_key --pack \
|
| + --in "${SIG_DIR}/key_rsa4096.keyb" \
|
| + --version 1 --algorithm 8 \
|
| + --out "${OUTPUT_DIR}/key_alg8.vbpubk"
|
| +
|
| + vbutil_keyblock --pack "${OUTPUT_DIR}/data4_sign8.keyblock" \
|
| + --datapubkey "${OUTPUT_DIR}/key_alg4.vbpubk" \
|
| + --signprivate "${SIG_DIR}/key_rsa4096.pem" \
|
| + --algorithm 8 --flags 3
|
| +
|
| + # Verify the keyblock.
|
| + vbutil_keyblock --unpack "${OUTPUT_DIR}/data4_sign8.keyblock" \
|
| + --signpubkey "${OUTPUT_DIR}/key_alg8.vbpubk"
|
| +
|
| + # Sign the kernel:
|
| + vbutil_kernel --pack "${OUTPUT_DIR}/vmlinuz.image" \
|
| + --keyblock "${OUTPUT_DIR}/data4_sign8.keyblock" \
|
| + --signprivate "${SIG_DIR}/key_rsa2048.pem" \
|
| + --version 1 \
|
| + --config "${OUTPUT_DIR}/config.txt" \
|
| + --bootloader /lib64/bootstub/bootstub.efi \
|
| + --vmlinuz "${ROOT_FS_DIR}/boot/vmlinuz"
|
| +
|
| + # And verify it.
|
| + vbutil_kernel --verify "${OUTPUT_DIR}/vmlinuz.image" \
|
| + --signpubkey "${OUTPUT_DIR}/key_alg8.vbpubk"
|
|
|
| + else
|
| + # FIXME: For now, ARM just uses the unsigned kernel by itself.
|
| + cp -f "${ROOT_FS_DIR}/boot/vmlinuz" "${OUTPUT_DIR}/vmlinuz.image"
|
| + fi
|
|
|
| -# Perform any customizations on the root file system that are needed.
|
| -"${SCRIPTS_DIR}/customize_rootfs" \
|
| - --root="${ROOT_FS_DIR}" \
|
| - --target="${ARCH}" \
|
| - --board="${BOARD}"
|
|
|
| -# Don't test the factory install shim.
|
| -if [[ ${FLAGS_factory_install} -eq ${FLAGS_FALSE} ]] ; then
|
| - # Check that the image has been correctly created.
|
| - "${SCRIPTS_DIR}/test_image" \
|
| + # Perform any customizations on the root file system that are needed.
|
| + "${SCRIPTS_DIR}/customize_rootfs" \
|
| --root="${ROOT_FS_DIR}" \
|
| - --target="${ARCH}"
|
| -fi
|
| + --target="${ARCH}" \
|
| + --board="${BOARD}"
|
| +
|
| + # Don't test the factory install shim.
|
| + if [[ ${FLAGS_factory_install} -eq ${FLAGS_FALSE} ]] ; then
|
| + # Check that the image has been correctly created.
|
| + "${SCRIPTS_DIR}/test_image" \
|
| + --root="${ROOT_FS_DIR}" \
|
| + --target="${ARCH}"
|
| + fi
|
|
|
| -# Clean up symlinks so they work on a running target rooted at "/".
|
| -# Here development packages are rooted at /usr/local. However, do not
|
| -# create /usr/local or /var on host (already exist on target).
|
| -setup_symlinks_on_root "/usr/local" "/var" "${STATEFUL_DIR}"
|
| + # Clean up symlinks so they work on a running target rooted at "/".
|
| + # Here development packages are rooted at /usr/local. However, do not
|
| + # create /usr/local or /var on host (already exist on target).
|
| + setup_symlinks_on_root "/usr/local" "/var" "${STATEFUL_DIR}"
|
|
|
| -# Cleanup loop devices.
|
| -cleanup
|
| + # Cleanup loop devices.
|
| + cleanup
|
|
|
| -trap delete_prompt EXIT
|
| + trap delete_prompt EXIT
|
|
|
| -RECOVERY="--norecovery"
|
| -if [[ ${FLAGS_recovery} -eq ${FLAGS_TRUE} ]]; then
|
| - RECOVERY="--recovery"
|
| -fi
|
| + RECOVERY="--norecovery"
|
| + if [[ ${FLAGS_recovery} -eq ${FLAGS_TRUE} ]]; then
|
| + RECOVERY="--recovery"
|
| + fi
|
|
|
| -# Create the GPT-formatted image.
|
| -${SCRIPTS_DIR}/build_gpt.sh \
|
| - --arch=${ARCH} \
|
| - --board=${FLAGS_board} \
|
| - --arm_extra_bootargs="${FLAGS_arm_extra_bootargs}" \
|
| - --rootfs_partition_size=${FLAGS_rootfs_partition_size} \
|
| - ${RECOVERY} \
|
| - "${OUTPUT_DIR}" \
|
| - "${OUTPUT_IMG}"
|
| + # Create the GPT-formatted image.
|
| + ${SCRIPTS_DIR}/build_gpt.sh \
|
| + --arch=${ARCH} \
|
| + --board=${FLAGS_board} \
|
| + --arm_extra_bootargs="${FLAGS_arm_extra_bootargs}" \
|
| + --rootfs_partition_size=${FLAGS_rootfs_partition_size} \
|
| + ${RECOVERY} \
|
| + "${OUTPUT_DIR}" \
|
| + "${OUTPUT_IMG}"
|
| +}
|
| +
|
| +create_base_image
|
|
|
| # Create a recovery image based on the chromium os base image.
|
| -[ "${FLAGS_recovery}" -eq "${FLAGS_TRUE}" ] && create_mod_image "recovery"
|
| +[ "${FLAGS_recovery}" -eq "${FLAGS_TRUE}" ] && update_recovery_packages
|
| trap - EXIT
|
|
|
| # Create a developer image based on the chromium os base image.
|
| -[ "${FLAGS_withdev}" -eq "${FLAGS_TRUE}" ] && create_mod_image "dev"
|
| +[ "${FLAGS_withdev}" -eq "${FLAGS_TRUE}" ] && update_dev_packages
|
| trap - EXIT
|
|
|
| # FIXME: only signing things for x86 right now.
|
| @@ -587,8 +616,6 @@ rm -f "${ROOT_FS_IMG}" "${STATEFUL_IMG}" "${OUTPUT_DIR}/vmlinuz.image" \
|
| "${OUTPUT_DIR}/key_alg4.vbpubk" "${OUTPUT_DIR}/key_alg8.vbpubk"
|
| rmdir "${ROOT_FS_DIR}" "${STATEFUL_DIR}" "${ESP_DIR}"
|
|
|
| -OUTSIDE_OUTPUT_DIR="../build/images/${FLAGS_board}/${IMAGE_SUBDIR}"
|
| -
|
| echo "Done. Image created in ${OUTPUT_DIR}"
|
| echo "Chromium OS image created as ${PRISTINE_IMAGE_NAME}"
|
| if [ "${FLAGS_recovery}" -eq "${FLAGS_TRUE}" ]; then
|
|
|