| OLD | NEW |
| 1 #!/bin/bash | 1 #!/bin/bash |
| 2 | 2 |
| 3 # Copyright (c) 2009 The Chromium OS Authors. All rights reserved. | 3 # Copyright (c) 2009 The Chromium OS Authors. All rights reserved. |
| 4 # Use of this source code is governed by a BSD-style license that can be | 4 # Use of this source code is governed by a BSD-style license that can be |
| 5 # found in the LICENSE file. | 5 # found in the LICENSE file. |
| 6 | 6 |
| 7 # Script to build a bootable keyfob-based chromeos system image from within | 7 # Script to build a bootable keyfob-based chromeos system image from within |
| 8 # a chromiumos setup. This assumes that all needed packages have been built into | 8 # a chromiumos setup. This assumes that all needed packages have been built into |
| 9 # the given target's root with binary packages turned on. This script will | 9 # the given target's root with binary packages turned on. This script will |
| 10 # build the Chrome OS image using only pre-built binary packages. | 10 # build the Chrome OS image using only pre-built binary packages. |
| (...skipping 90 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
| 101 DEFINE_integer verity_error_behavior 3 \ | 101 DEFINE_integer verity_error_behavior 3 \ |
| 102 "Kernel verified boot error behavior (0: I/O errors, 1: panic, 2: nothing, \ | 102 "Kernel verified boot error behavior (0: I/O errors, 1: panic, 2: nothing, \ |
| 103 3: cros) Default: 3" | 103 3: cros) Default: 3" |
| 104 DEFINE_integer verity_depth 1 \ | 104 DEFINE_integer verity_depth 1 \ |
| 105 "Kernel verified boot hash tree depth. Default: 1" | 105 "Kernel verified boot hash tree depth. Default: 1" |
| 106 DEFINE_integer verity_max_ios -1 \ | 106 DEFINE_integer verity_max_ios -1 \ |
| 107 "Number of outstanding I/O operations dm-verity caps at. Default: -1" | 107 "Number of outstanding I/O operations dm-verity caps at. Default: -1" |
| 108 DEFINE_string verity_algorithm "sha1" \ | 108 DEFINE_string verity_algorithm "sha1" \ |
| 109 "Cryptographic hash algorithm used for kernel vboot. Default : sha1" | 109 "Cryptographic hash algorithm used for kernel vboot. Default : sha1" |
| 110 | 110 |
| 111 DEFINE_string oem_customization "" \ | |
| 112 "Path to directory containing OEM partner partition contents" | |
| 113 | |
| 114 # Parse command line. | 111 # Parse command line. |
| 115 FLAGS "$@" || exit 1 | 112 FLAGS "$@" || exit 1 |
| 116 eval set -- "${FLAGS_ARGV}" | 113 eval set -- "${FLAGS_ARGV}" |
| 117 | 114 |
| 118 # Only now can we die on error. shflags functions leak non-zero error codes, | 115 # Only now can we die on error. shflags functions leak non-zero error codes, |
| 119 # so will die prematurely if 'set -e' is specified before now. | 116 # so will die prematurely if 'set -e' is specified before now. |
| 120 set -e | 117 set -e |
| 121 | 118 |
| 122 if [ -z "${FLAGS_board}" ] ; then | 119 if [ -z "${FLAGS_board}" ] ; then |
| 123 error "--board is required." | 120 error "--board is required." |
| (...skipping 118 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
| 242 BOARD="${FLAGS_board}" | 239 BOARD="${FLAGS_board}" |
| 243 BOARD_ROOT="${FLAGS_build_root}/${BOARD}" | 240 BOARD_ROOT="${FLAGS_build_root}/${BOARD}" |
| 244 | 241 |
| 245 ROOT_FS_IMG="${OUTPUT_DIR}/rootfs.image" | 242 ROOT_FS_IMG="${OUTPUT_DIR}/rootfs.image" |
| 246 ROOT_FS_DIR="${OUTPUT_DIR}/rootfs" | 243 ROOT_FS_DIR="${OUTPUT_DIR}/rootfs" |
| 247 ROOT_FS_HASH="${OUTPUT_DIR}/rootfs.hash" | 244 ROOT_FS_HASH="${OUTPUT_DIR}/rootfs.hash" |
| 248 | 245 |
| 249 STATEFUL_FS_IMG="${OUTPUT_DIR}/stateful_partition.image" | 246 STATEFUL_FS_IMG="${OUTPUT_DIR}/stateful_partition.image" |
| 250 STATEFUL_FS_DIR="${OUTPUT_DIR}/stateful_partition" | 247 STATEFUL_FS_DIR="${OUTPUT_DIR}/stateful_partition" |
| 251 | 248 |
| 252 OEM_FS_IMG="${OUTPUT_DIR}/partner_partition.image" | |
| 253 OEM_FS_DIR="${OUTPUT_DIR}/partner_partition" | |
| 254 | |
| 255 ESP_FS_IMG=${OUTPUT_DIR}/esp.image | 249 ESP_FS_IMG=${OUTPUT_DIR}/esp.image |
| 256 ESP_FS_DIR=${OUTPUT_DIR}/esp | 250 ESP_FS_DIR=${OUTPUT_DIR}/esp |
| 257 | 251 |
| 258 DEVKEYSDIR="/usr/share/vboot/devkeys" | 252 DEVKEYSDIR="/usr/share/vboot/devkeys" |
| 259 | 253 |
| 260 LOOP_DEV= | 254 LOOP_DEV= |
| 261 STATEFUL_LOOP_DEV= | 255 STATEFUL_LOOP_DEV= |
| 262 OEM_LOOP_DEV= | |
| 263 ESP_LOOP_DEV= | 256 ESP_LOOP_DEV= |
| 264 | 257 |
| 265 # ${DEV_IMAGE_ROOT} specifies the location of where developer packages will | 258 # ${DEV_IMAGE_ROOT} specifies the location of where developer packages will |
| 266 # be installed on the stateful dir. On a Chromium OS system, this will | 259 # be installed on the stateful dir. On a Chromium OS system, this will |
| 267 # translate to /usr/local. | 260 # translate to /usr/local. |
| 268 DEV_IMAGE_ROOT="${STATEFUL_FS_DIR}/dev_image" | 261 DEV_IMAGE_ROOT="${STATEFUL_FS_DIR}/dev_image" |
| 269 | 262 |
| 270 # What cross-build are we targeting? | 263 # What cross-build are we targeting? |
| 271 . "${BOARD_ROOT}/etc/make.conf.board_setup" | 264 . "${BOARD_ROOT}/etc/make.conf.board_setup" |
| 272 LIBC_VERSION=${LIBC_VERSION:-"2.10.1-r1"} | 265 LIBC_VERSION=${LIBC_VERSION:-"2.10.1-r1"} |
| (...skipping 49 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
| 322 cleanup_rootfs_loop() { | 315 cleanup_rootfs_loop() { |
| 323 sudo umount -d "${ROOT_FS_DIR}" | 316 sudo umount -d "${ROOT_FS_DIR}" |
| 324 } | 317 } |
| 325 | 318 |
| 326 cleanup_stateful_fs_loop() { | 319 cleanup_stateful_fs_loop() { |
| 327 sudo umount "${ROOT_FS_DIR}/usr/local" | 320 sudo umount "${ROOT_FS_DIR}/usr/local" |
| 328 sudo umount "${ROOT_FS_DIR}/var" | 321 sudo umount "${ROOT_FS_DIR}/var" |
| 329 sudo umount -d "${STATEFUL_FS_DIR}" | 322 sudo umount -d "${STATEFUL_FS_DIR}" |
| 330 } | 323 } |
| 331 | 324 |
| 332 cleanup_oem_fs_loop() { | |
| 333 sudo umount -d "${OEM_FS_DIR}" | |
| 334 } | |
| 335 | |
| 336 | |
| 337 cleanup_esp_loop() { | 325 cleanup_esp_loop() { |
| 338 sudo umount -d "${ESP_FS_DIR}" | 326 sudo umount -d "${ESP_FS_DIR}" |
| 339 } | 327 } |
| 340 | 328 |
| 341 cleanup() { | 329 cleanup() { |
| 342 # Disable die on error. | 330 # Disable die on error. |
| 343 set +e | 331 set +e |
| 344 | 332 |
| 345 if [[ -n "${STATEFUL_LOOP_DEV}" ]]; then | 333 if [[ -n "${STATEFUL_LOOP_DEV}" ]]; then |
| 346 cleanup_stateful_fs_loop | 334 cleanup_stateful_fs_loop |
| 347 STATEFUL_LOOP_DEV= | 335 STATEFUL_LOOP_DEV= |
| 348 fi | 336 fi |
| 349 | 337 |
| 350 if [[ -n "${OEM_LOOP_DEV}" ]]; then | |
| 351 cleanup_oem_fs_loop | |
| 352 fi | |
| 353 | |
| 354 if [[ -n "${LOOP_DEV}" ]]; then | 338 if [[ -n "${LOOP_DEV}" ]]; then |
| 355 cleanup_rootfs_loop | 339 cleanup_rootfs_loop |
| 356 LOOP_DEV= | 340 LOOP_DEV= |
| 357 fi | 341 fi |
| 358 | 342 |
| 359 if [[ -n "${ESP_LOOP_DEV}" ]]; then | 343 if [[ -n "${ESP_LOOP_DEV}" ]]; then |
| 360 cleanup_esp_loop | 344 cleanup_esp_loop |
| 361 ESP_LOOP_DEV= | 345 ESP_LOOP_DEV= |
| 362 fi | 346 fi |
| 363 | 347 |
| (...skipping 242 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
| 606 seek=$((STATEFUL_SIZE_BYTES - 1)) | 590 seek=$((STATEFUL_SIZE_BYTES - 1)) |
| 607 | 591 |
| 608 # Tune and mount the stateful partition. | 592 # Tune and mount the stateful partition. |
| 609 UUID=$(uuidgen) | 593 UUID=$(uuidgen) |
| 610 DISK_LABEL="C-STATE" | 594 DISK_LABEL="C-STATE" |
| 611 sudo losetup "${STATEFUL_LOOP_DEV}" "${STATEFUL_FS_IMG}" | 595 sudo losetup "${STATEFUL_LOOP_DEV}" "${STATEFUL_FS_IMG}" |
| 612 sudo mkfs.ext3 "${STATEFUL_LOOP_DEV}" | 596 sudo mkfs.ext3 "${STATEFUL_LOOP_DEV}" |
| 613 sudo tune2fs -L "${DISK_LABEL}" -U "${UUID}" -c 0 -i 0 "${STATEFUL_LOOP_DEV}" | 597 sudo tune2fs -L "${DISK_LABEL}" -U "${UUID}" -c 0 -i 0 "${STATEFUL_LOOP_DEV}" |
| 614 sudo mount "${STATEFUL_LOOP_DEV}" "${STATEFUL_FS_DIR}" | 598 sudo mount "${STATEFUL_LOOP_DEV}" "${STATEFUL_FS_DIR}" |
| 615 | 599 |
| 616 # Create OEM partner partition. | |
| 617 OEM_LOOP_DEV=$(sudo losetup -f) | |
| 618 if [ -z "${OEM_LOOP_DEV}" ] ; then | |
| 619 echo "No free loop device. Free up a loop device or reboot. exiting. " | |
| 620 exit 1 | |
| 621 fi | |
| 622 OEM_SIZE_BYTES=$((1024 * 1024 * 16)) | |
| 623 dd if=/dev/zero of="${OEM_FS_IMG}" bs=1 count=1 seek=$((OEM_SIZE_BYTES - 1)) | |
| 624 | |
| 625 # Tune and mount OEM partner partition. | |
| 626 UUID=$(uuidgen) | |
| 627 DISK_LABEL="C-OEM" | |
| 628 sudo losetup "${OEM_LOOP_DEV}" "${OEM_FS_IMG}" | |
| 629 sudo mkfs.ext3 "${OEM_LOOP_DEV}" | |
| 630 sudo tune2fs -L "${DISK_LABEL}" -U "${UUID}" -c 0 -i 0 "${OEM_LOOP_DEV}" | |
| 631 sudo mount "${OEM_LOOP_DEV}" "${OEM_FS_DIR}" | |
| 632 | |
| 633 # Populate OEM partner partition. | |
| 634 if [ ! -z "${FLAGS_oem_customization}" ]; then | |
| 635 if [ ! -d ${FLAGS_oem_customization} ]; then | |
| 636 echo "Specified OEM content directory does not exist. exiting." | |
| 637 exit 1 | |
| 638 fi | |
| 639 for ITEM in `ls -A ${FLAGS_oem_customization}` | |
| 640 do sudo cp -a "${FLAGS_oem_customization}/$ITEM" "${OEM_FS_DIR}" | |
| 641 done | |
| 642 sudo find "${OEM_FS_DIR}" -type d -exec chmod 755 "{}" \; | |
| 643 sudo find "${OEM_FS_DIR}" -type f -exec chmod 644 "{}" \; | |
| 644 sudo chown -R root:root "${OEM_FS_DIR}" | |
| 645 else | |
| 646 echo "Empty OEM partition: OEM customizations will not be applied." | |
| 647 fi | |
| 648 | |
| 649 # -- Install packages into the root file system -- | 600 # -- Install packages into the root file system -- |
| 650 | 601 |
| 651 # We need to install libc manually from the cross toolchain. | 602 # We need to install libc manually from the cross toolchain. |
| 652 # TODO: Improve this? We only want libc and not the whole toolchain. | 603 # TODO: Improve this? We only want libc and not the whole toolchain. |
| 653 PKGDIR="/var/lib/portage/pkgs/cross/" | 604 PKGDIR="/var/lib/portage/pkgs/cross/" |
| 654 sudo tar jxvpf \ | 605 sudo tar jxvpf \ |
| 655 "${PKGDIR}/${CHOST}/cross-${CHOST}"/glibc-${LIBC_VERSION}.tbz2 \ | 606 "${PKGDIR}/${CHOST}/cross-${CHOST}"/glibc-${LIBC_VERSION}.tbz2 \ |
| 656 -C "${ROOT_FS_DIR}" --strip-components=3 \ | 607 -C "${ROOT_FS_DIR}" --strip-components=3 \ |
| 657 --exclude=usr/include --exclude=sys-include --exclude=*.a --exclude=*.o | 608 --exclude=usr/include --exclude=sys-include --exclude=*.a --exclude=*.o |
| 658 | 609 |
| (...skipping 101 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
| 760 local largs="-o ${OUTPUT_DIR}" | 711 local largs="-o ${OUTPUT_DIR}" |
| 761 test ! -d "${OUTPUT_DIR}" && mkdir -p "${OUTPUT_DIR}" | 712 test ! -d "${OUTPUT_DIR}" && mkdir -p "${OUTPUT_DIR}" |
| 762 info "Running ${lgenerateauzip} ${largs} for generating AU updater zip file" | 713 info "Running ${lgenerateauzip} ${largs} for generating AU updater zip file" |
| 763 $lgenerateauzip $largs | 714 $lgenerateauzip $largs |
| 764 } | 715 } |
| 765 | 716 |
| 766 # Create the output directory. | 717 # Create the output directory. |
| 767 mkdir -p "${OUTPUT_DIR}" | 718 mkdir -p "${OUTPUT_DIR}" |
| 768 mkdir -p "${ROOT_FS_DIR}" | 719 mkdir -p "${ROOT_FS_DIR}" |
| 769 mkdir -p "${STATEFUL_FS_DIR}" | 720 mkdir -p "${STATEFUL_FS_DIR}" |
| 770 mkdir -p "${OEM_FS_DIR}" | |
| 771 mkdir -p "${ESP_FS_DIR}" | 721 mkdir -p "${ESP_FS_DIR}" |
| 772 | 722 |
| 773 # Preserve old images by copying them forward for --preserve. | 723 # Preserve old images by copying them forward for --preserve. |
| 774 if [[ $FLAGS_preserve -eq ${FLAGS_TRUE} ]] ; then | 724 if [[ $FLAGS_preserve -eq ${FLAGS_TRUE} ]] ; then |
| 775 if [[ -f ${PREVIOUS_DIR}/${PRISTINE_IMAGE_NAME} ]] ; then | 725 if [[ -f ${PREVIOUS_DIR}/${PRISTINE_IMAGE_NAME} ]] ; then |
| 776 # Copy forward pristine image, and associated files | 726 # Copy forward pristine image, and associated files |
| 777 cp ${PREVIOUS_DIR}/*.sh ${PREVIOUS_DIR}/config.txt ${OUTPUT_DIR} | 727 cp ${PREVIOUS_DIR}/*.sh ${PREVIOUS_DIR}/config.txt ${OUTPUT_DIR} |
| 778 cp ${PREVIOUS_DIR}/${PRISTINE_IMAGE_NAME} ${OUTPUT_DIR} | 728 cp ${PREVIOUS_DIR}/${PRISTINE_IMAGE_NAME} ${OUTPUT_DIR} |
| 779 | 729 |
| 780 # Copy forward the developer image, if we already copied forward the base. | 730 # Copy forward the developer image, if we already copied forward the base. |
| (...skipping 57 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
| 838 fi | 788 fi |
| 839 | 789 |
| 840 update_dev_packages ${DEVELOPER_IMAGE_NAME} | 790 update_dev_packages ${DEVELOPER_IMAGE_NAME} |
| 841 ${SCRIPTS_DIR}/bin/cros_make_image_bootable "${OUTPUT_DIR}" \ | 791 ${SCRIPTS_DIR}/bin/cros_make_image_bootable "${OUTPUT_DIR}" \ |
| 842 "${DEVELOPER_IMAGE_NAME}" \ | 792 "${DEVELOPER_IMAGE_NAME}" \ |
| 843 ${crosbug12352_flag} | 793 ${crosbug12352_flag} |
| 844 fi | 794 fi |
| 845 | 795 |
| 846 # Clean up temporary files. | 796 # Clean up temporary files. |
| 847 rm -f "${ROOT_FS_IMG}" "${STATEFUL_FS_IMG}" "${OUTPUT_DIR}/vmlinuz.image" \ | 797 rm -f "${ROOT_FS_IMG}" "${STATEFUL_FS_IMG}" "${OUTPUT_DIR}/vmlinuz.image" \ |
| 848 "${ESP_FS_IMG}" "${OEM_FS_IMG}" "${OUTPUT_DIR}/vmlinuz_hd.vblock" | 798 "${ESP_FS_IMG}" "${OUTPUT_DIR}/vmlinuz_hd.vblock" |
| 849 rmdir "${ROOT_FS_DIR}" "${STATEFUL_FS_DIR}" "${OEM_FS_DIR}" "${ESP_FS_DIR}" | 799 rmdir "${ROOT_FS_DIR}" "${STATEFUL_FS_DIR}" "${ESP_FS_DIR}" |
| 850 | 800 |
| 851 # Generating AU generator zip file to run outside chroot | 801 # Generating AU generator zip file to run outside chroot |
| 852 generate_au_zip || echo "Failed generating AU zip file - ignoring Error..." | 802 generate_au_zip || echo "Failed generating AU zip file - ignoring Error..." |
| 853 # Create a 'latest' link | 803 # Create a 'latest' link |
| 854 rm -f ${FLAGS_output_root}/${FLAGS_board}/latest | 804 rm -f ${FLAGS_output_root}/${FLAGS_board}/latest |
| 855 ln -s $(basename ${OUTPUT_DIR}) ${FLAGS_output_root}/${FLAGS_board}/latest | 805 ln -s $(basename ${OUTPUT_DIR}) ${FLAGS_output_root}/${FLAGS_board}/latest |
| 856 | 806 |
| 857 echo "Done. Image created in ${OUTPUT_DIR}" | 807 echo "Done. Image created in ${OUTPUT_DIR}" |
| 858 echo "Chromium OS image created as ${PRISTINE_IMAGE_NAME}" | 808 echo "Chromium OS image created as ${PRISTINE_IMAGE_NAME}" |
| 859 if [ "${FLAGS_withdev}" -eq "${FLAGS_TRUE}" ]; then | 809 if [ "${FLAGS_withdev}" -eq "${FLAGS_TRUE}" ]; then |
| 860 echo "Developer image created as ${DEVELOPER_IMAGE_NAME}" | 810 echo "Developer image created as ${DEVELOPER_IMAGE_NAME}" |
| 861 fi | 811 fi |
| 862 | 812 |
| 863 print_time_elapsed | 813 print_time_elapsed |
| 864 | 814 |
| 865 echo "To copy to USB keyfob, do something like:" | 815 echo "To copy to USB keyfob, do something like:" |
| 866 echo " ./image_to_usb.sh --from=${OUTSIDE_OUTPUT_DIR} --to=/dev/sdX" | 816 echo " ./image_to_usb.sh --from=${OUTSIDE_OUTPUT_DIR} --to=/dev/sdX" |
| 867 echo "To convert to VMWare image, INSIDE the chroot, do something like:" | 817 echo "To convert to VMWare image, INSIDE the chroot, do something like:" |
| 868 echo " ./image_to_vm.sh --from=${OUTSIDE_OUTPUT_DIR} --board=${BOARD}" | 818 echo " ./image_to_vm.sh --from=${OUTSIDE_OUTPUT_DIR} --board=${BOARD}" |
| 869 echo "from the scripts directory where you entered the chroot." | 819 echo "from the scripts directory where you entered the chroot." |
| OLD | NEW |