Chromium Code Reviews
chromiumcodereview-hr@appspot.gserviceaccount.com (chromiumcodereview-hr) | Please choose your nickname with Settings | Help | Chromium Project | Gerrit Changes | Sign out
(570)

Unified Diff: build_image

Issue 2823010: Created wrapper methods for create_base_image and image updates. (Closed) Base URL: ssh://git@chromiumos-git/crosutils.git
Patch Set: Created wrapper methods for create_base_image and image updates to prepare for --preserve. Created 10 years, 6 months ago
Use n/p to move between diff chunks; N/P to move between comments. Draft comments are only viewable by you.
Jump to:
View side-by-side diff with in-line comments
Download patch
« no previous file with comments | « no previous file | no next file » | no next file with comments »
Expand Comments ('e') | Collapse Comments ('c') | Show Comments Hide Comments ('s')
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
« no previous file with comments | « no previous file | no next file » | no next file with comments »

Powered by Google App Engine
This is Rietveld 408576698