| 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 94 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
| 105 | 105 |
| 106 BOARD="${FLAGS_board}" | 106 BOARD="${FLAGS_board}" |
| 107 BOARD_ROOT="${FLAGS_build_root}/${BOARD}" | 107 BOARD_ROOT="${FLAGS_build_root}/${BOARD}" |
| 108 | 108 |
| 109 ROOT_FS_IMG="${OUTPUT_DIR}/rootfs.image" | 109 ROOT_FS_IMG="${OUTPUT_DIR}/rootfs.image" |
| 110 ROOT_FS_DIR="${OUTPUT_DIR}/rootfs" | 110 ROOT_FS_DIR="${OUTPUT_DIR}/rootfs" |
| 111 | 111 |
| 112 STATEFUL_FS_IMG="${OUTPUT_DIR}/stateful_partition.image" | 112 STATEFUL_FS_IMG="${OUTPUT_DIR}/stateful_partition.image" |
| 113 STATEFUL_FS_DIR="${OUTPUT_DIR}/stateful_partition" | 113 STATEFUL_FS_DIR="${OUTPUT_DIR}/stateful_partition" |
| 114 | 114 |
| 115 OEM_FS_IMG="${OUTPUT_DIR}/partner_partition.image" |
| 116 OEM_FS_DIR="${OUTPUT_DIR}/partner_partition" |
| 117 |
| 115 ESP_FS_IMG=${OUTPUT_DIR}/esp.image | 118 ESP_FS_IMG=${OUTPUT_DIR}/esp.image |
| 116 ESP_FS_DIR=${OUTPUT_DIR}/esp | 119 ESP_FS_DIR=${OUTPUT_DIR}/esp |
| 117 | 120 |
| 118 LOOP_DEV= | 121 LOOP_DEV= |
| 119 STATEFUL_LOOP_DEV= | 122 STATEFUL_LOOP_DEV= |
| 123 OEM_LOOP_DEV= |
| 120 ESP_LOOP_DEV= | 124 ESP_LOOP_DEV= |
| 121 | 125 |
| 122 # ${DEV_IMAGE_ROOT} specifies the location of where developer packages will | 126 # ${DEV_IMAGE_ROOT} specifies the location of where developer packages will |
| 123 # be installed on the stateful dir. On a Chromium OS system, this will | 127 # be installed on the stateful dir. On a Chromium OS system, this will |
| 124 # translate to /usr/local. | 128 # translate to /usr/local. |
| 125 DEV_IMAGE_ROOT="${STATEFUL_FS_DIR}/dev_image" | 129 DEV_IMAGE_ROOT="${STATEFUL_FS_DIR}/dev_image" |
| 126 | 130 |
| 127 # What cross-build are we targeting? | 131 # What cross-build are we targeting? |
| 128 . "${BOARD_ROOT}/etc/make.conf.board_setup" | 132 . "${BOARD_ROOT}/etc/make.conf.board_setup" |
| 129 LIBC_VERSION=${LIBC_VERSION:-"2.10.1-r1"} | 133 LIBC_VERSION=${LIBC_VERSION:-"2.10.1-r1"} |
| (...skipping 48 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
| 178 cleanup_rootfs_loop() { | 182 cleanup_rootfs_loop() { |
| 179 sudo umount -d "${ROOT_FS_DIR}" | 183 sudo umount -d "${ROOT_FS_DIR}" |
| 180 } | 184 } |
| 181 | 185 |
| 182 cleanup_stateful_fs_loop() { | 186 cleanup_stateful_fs_loop() { |
| 183 sudo umount "${ROOT_FS_DIR}/usr/local" | 187 sudo umount "${ROOT_FS_DIR}/usr/local" |
| 184 sudo umount "${ROOT_FS_DIR}/var" | 188 sudo umount "${ROOT_FS_DIR}/var" |
| 185 sudo umount -d "${STATEFUL_FS_DIR}" | 189 sudo umount -d "${STATEFUL_FS_DIR}" |
| 186 } | 190 } |
| 187 | 191 |
| 192 cleanup_oem_fs_loop() { |
| 193 sudo umount -d "${OEM_FS_DIR}" |
| 194 } |
| 195 |
| 196 |
| 188 cleanup_esp_loop() { | 197 cleanup_esp_loop() { |
| 189 sudo umount -d "${ESP_FS_DIR}" | 198 sudo umount -d "${ESP_FS_DIR}" |
| 190 } | 199 } |
| 191 | 200 |
| 192 cleanup() { | 201 cleanup() { |
| 193 # Disable die on error. | 202 # Disable die on error. |
| 194 set +e | 203 set +e |
| 195 | 204 |
| 196 if [[ -n "${STATEFUL_LOOP_DEV}" ]]; then | 205 if [[ -n "${STATEFUL_LOOP_DEV}" ]]; then |
| 197 cleanup_stateful_fs_loop | 206 cleanup_stateful_fs_loop |
| 198 fi | 207 fi |
| 199 | 208 |
| 209 if [[ -n "${OEM_LOOP_DEV}" ]]; then |
| 210 cleanup_oem_fs_loop |
| 211 fi |
| 212 |
| 200 if [[ -n "${LOOP_DEV}" ]]; then | 213 if [[ -n "${LOOP_DEV}" ]]; then |
| 201 cleanup_rootfs_loop | 214 cleanup_rootfs_loop |
| 202 fi | 215 fi |
| 203 | 216 |
| 204 if [[ -n "${ESP_LOOP_DEV}" ]]; then | 217 if [[ -n "${ESP_LOOP_DEV}" ]]; then |
| 205 cleanup_esp_loop | 218 cleanup_esp_loop |
| 206 fi | 219 fi |
| 207 | 220 |
| 208 # Turn die on error back on. | 221 # Turn die on error back on. |
| 209 set -e | 222 set -e |
| (...skipping 133 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
| 343 sudo tune2fs -L "${DISK_LABEL}" -U "${UUID}" -c 0 -i 0 "${LOOP_DEV}" | 356 sudo tune2fs -L "${DISK_LABEL}" -U "${UUID}" -c 0 -i 0 "${LOOP_DEV}" |
| 344 sudo mount "${LOOP_DEV}" "${ROOT_FS_DIR}" | 357 sudo mount "${LOOP_DEV}" "${ROOT_FS_DIR}" |
| 345 | 358 |
| 346 # Create stateful partition of the same size as the rootfs. | 359 # Create stateful partition of the same size as the rootfs. |
| 347 STATEFUL_LOOP_DEV=$(sudo losetup -f) | 360 STATEFUL_LOOP_DEV=$(sudo losetup -f) |
| 348 if [ -z "${STATEFUL_LOOP_DEV}" ] ; then | 361 if [ -z "${STATEFUL_LOOP_DEV}" ] ; then |
| 349 echo "No free loop device. Free up a loop device or reboot. exiting. " | 362 echo "No free loop device. Free up a loop device or reboot. exiting. " |
| 350 exit 1 | 363 exit 1 |
| 351 fi | 364 fi |
| 352 dd if=/dev/zero of="${STATEFUL_FS_IMG}" bs=1 count=1 seek=$((ROOT_SIZE_BYTES -
1)) | 365 dd if=/dev/zero of="${STATEFUL_FS_IMG}" bs=1 count=1 seek=$((ROOT_SIZE_BYTES -
1)) |
| 366 |
| 367 # Tune and mount the stateful partition. |
| 368 UUID=$(uuidgen) |
| 369 DISK_LABEL="C-STATE" |
| 353 sudo losetup "${STATEFUL_LOOP_DEV}" "${STATEFUL_FS_IMG}" | 370 sudo losetup "${STATEFUL_LOOP_DEV}" "${STATEFUL_FS_IMG}" |
| 354 sudo mkfs.ext3 "${STATEFUL_LOOP_DEV}" | 371 sudo mkfs.ext3 "${STATEFUL_LOOP_DEV}" |
| 355 sudo tune2fs -L "C-STATE" -U "${UUID}" -c 0 -i 0 \ | 372 sudo tune2fs -L "${DISK_LABEL}" -U "${UUID}" -c 0 -i 0 "${STATEFUL_LOOP_DEV}" |
| 356 "${STATEFUL_LOOP_DEV}" | 373 sudo mount "${STATEFUL_LOOP_DEV}" "${STATEFUL_FS_DIR}" |
| 357 | 374 |
| 358 # Mount the stateful partition. | 375 # Create OEM partner partition. |
| 359 sudo mount "${STATEFUL_LOOP_DEV}" "${STATEFUL_FS_DIR}" | 376 OEM_LOOP_DEV=$(sudo losetup -f) |
| 377 if [ -z "${OEM_LOOP_DEV}" ] ; then |
| 378 echo "No free loop device. Free up a loop device or reboot. exiting. " |
| 379 exit 1 |
| 380 fi |
| 381 OEM_SIZE_BYTES=$((1024 * 1024 * 16)) |
| 382 dd if=/dev/zero of="${OEM_FS_IMG}" bs=1 count=1 seek=$((OEM_SIZE_BYTES - 1)) |
| 383 |
| 384 # Tune and mount OEM partner partition. |
| 385 UUID=$(uuidgen) |
| 386 DISK_LABEL="C-OEM" |
| 387 sudo losetup "${OEM_LOOP_DEV}" "${OEM_FS_IMG}" |
| 388 sudo mkfs.ext3 "${OEM_LOOP_DEV}" |
| 389 sudo tune2fs -L "${DISK_LABEL}" -U "${UUID}" -c 0 -i 0 "${OEM_LOOP_DEV}" |
| 390 sudo mount "${OEM_LOOP_DEV}" "${OEM_FS_DIR}" |
| 360 | 391 |
| 361 # Turn root file system into bootable image. | 392 # Turn root file system into bootable image. |
| 362 if [[ "${ARCH}" = "x86" ]]; then | 393 if [[ "${ARCH}" = "x86" ]]; then |
| 363 # Setup extlinux configuration. | 394 # Setup extlinux configuration. |
| 364 # TODO: For some reason the /dev/disk/by-uuid is not being generated by udev | 395 # TODO: For some reason the /dev/disk/by-uuid is not being generated by udev |
| 365 # in the initramfs. When we figure that out, switch to root=UUID=${UUID}. | 396 # in the initramfs. When we figure that out, switch to root=UUID=${UUID}. |
| 366 sudo mkdir -p "${ROOT_FS_DIR}"/boot | 397 sudo mkdir -p "${ROOT_FS_DIR}"/boot |
| 367 # TODO(adlr): use initramfs for booting. | 398 # TODO(adlr): use initramfs for booting. |
| 368 cat <<EOF | sudo dd of="${ROOT_FS_DIR}"/boot/extlinux.conf | 399 cat <<EOF | sudo dd of="${ROOT_FS_DIR}"/boot/extlinux.conf |
| 369 DEFAULT chromeos-usb | 400 DEFAULT chromeos-usb |
| (...skipping 197 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
| 567 --rootfs_partition_size=${FLAGS_rootfs_partition_size} \ | 598 --rootfs_partition_size=${FLAGS_rootfs_partition_size} \ |
| 568 ${RECOVERY} \ | 599 ${RECOVERY} \ |
| 569 "${OUTPUT_DIR}" \ | 600 "${OUTPUT_DIR}" \ |
| 570 "${OUTPUT_IMG}" | 601 "${OUTPUT_IMG}" |
| 571 } | 602 } |
| 572 | 603 |
| 573 # Create the output directory. | 604 # Create the output directory. |
| 574 mkdir -p "${OUTPUT_DIR}" | 605 mkdir -p "${OUTPUT_DIR}" |
| 575 mkdir -p "${ROOT_FS_DIR}" | 606 mkdir -p "${ROOT_FS_DIR}" |
| 576 mkdir -p "${STATEFUL_FS_DIR}" | 607 mkdir -p "${STATEFUL_FS_DIR}" |
| 608 mkdir -p "${OEM_FS_DIR}" |
| 577 mkdir -p "${ESP_FS_DIR}" | 609 mkdir -p "${ESP_FS_DIR}" |
| 578 | 610 |
| 579 create_base_image ${OUTPUT_DIR}/${PRISTINE_IMAGE_NAME} | 611 create_base_image ${OUTPUT_DIR}/${PRISTINE_IMAGE_NAME} |
| 580 | 612 |
| 581 # Create a recovery image based on the chromium os base image. | 613 # Create a recovery image based on the chromium os base image. |
| 582 if [ "${FLAGS_recovery}" -eq "${FLAGS_TRUE}" ] ; then | 614 if [ "${FLAGS_recovery}" -eq "${FLAGS_TRUE}" ] ; then |
| 583 update_recovery_packages ${OUTPUT_DIR}/${PRISTINE_IMAGE_NAME} | 615 update_recovery_packages ${OUTPUT_DIR}/${PRISTINE_IMAGE_NAME} |
| 584 fi | 616 fi |
| 585 trap - EXIT | 617 trap - EXIT |
| 586 | 618 |
| 587 | 619 |
| 588 # Create a developer image based on the chromium os base image. | 620 # Create a developer image based on the chromium os base image. |
| 589 if [ "${FLAGS_withdev}" -eq "${FLAGS_TRUE}" ] ; then | 621 if [ "${FLAGS_withdev}" -eq "${FLAGS_TRUE}" ] ; then |
| 590 echo "Creating developer image from base image ${OUTPUT_IMG}" | 622 echo "Creating developer image from base image ${OUTPUT_IMG}" |
| 591 cp ${OUTPUT_DIR}/${PRISTINE_IMAGE_NAME} ${OUTPUT_DIR}/${DEVELOPER_IMAGE_NAME} | 623 cp ${OUTPUT_DIR}/${PRISTINE_IMAGE_NAME} ${OUTPUT_DIR}/${DEVELOPER_IMAGE_NAME} |
| 592 update_dev_packages ${OUTPUT_DIR}/${DEVELOPER_IMAGE_NAME} | 624 update_dev_packages ${OUTPUT_DIR}/${DEVELOPER_IMAGE_NAME} |
| 593 fi | 625 fi |
| 594 | 626 |
| 595 trap - EXIT | 627 trap - EXIT |
| 596 | 628 |
| 597 # FIXME: only signing things for x86 right now. | 629 # FIXME: only signing things for x86 right now. |
| 598 if [[ "${ARCH}" = "x86" ]]; then | 630 if [[ "${ARCH}" = "x86" ]]; then |
| 599 # Verify the final image. | 631 # Verify the final image. |
| 600 load_kernel_test "${OUTPUT_IMG}" "${OUTPUT_DIR}/key_alg8.vbpubk" | 632 load_kernel_test "${OUTPUT_IMG}" "${OUTPUT_DIR}/key_alg8.vbpubk" |
| 601 fi | 633 fi |
| 602 | 634 |
| 603 # Clean up temporary files. | 635 # Clean up temporary files. |
| 604 rm -f "${ROOT_FS_IMG}" "${STATEFUL_FS_IMG}" "${OUTPUT_DIR}/vmlinuz.image" \ | 636 rm -f "${ROOT_FS_IMG}" "${STATEFUL_FS_IMG}" "${OUTPUT_DIR}/vmlinuz.image" \ |
| 605 "${ESP_FS_IMG}" "${OUTPUT_DIR}/data4_sign8.keyblock" \ | 637 "${ESP_FS_IMG}" "${OUTPUT_DIR}/data4_sign8.keyblock" \ |
| 606 "${OUTPUT_DIR}/key_alg4.vbpubk" "${OUTPUT_DIR}/key_alg8.vbpubk" | 638 "${OUTPUT_DIR}/key_alg4.vbpubk" "${OUTPUT_DIR}/key_alg8.vbpubk" \ |
| 607 rmdir "${ROOT_FS_DIR}" "${STATEFUL_FS_DIR}" "${ESP_FS_DIR}" | 639 "${OEM_FS_IMG}" |
| 640 rmdir "${ROOT_FS_DIR}" "${STATEFUL_FS_DIR}" "${OEM_FS_DIR}" "${ESP_FS_DIR}" |
| 608 | 641 |
| 609 echo "Done. Image created in ${OUTPUT_DIR}" | 642 echo "Done. Image created in ${OUTPUT_DIR}" |
| 610 echo "Chromium OS image created as ${PRISTINE_IMAGE_NAME}" | 643 echo "Chromium OS image created as ${PRISTINE_IMAGE_NAME}" |
| 611 if [ "${FLAGS_recovery}" -eq "${FLAGS_TRUE}" ]; then | 644 if [ "${FLAGS_recovery}" -eq "${FLAGS_TRUE}" ]; then |
| 612 echo "Recovery image created as ${PRISTINE_IMAGE_NAME}" | 645 echo "Recovery image created as ${PRISTINE_IMAGE_NAME}" |
| 613 fi | 646 fi |
| 614 if [ "${FLAGS_withdev}" -eq "${FLAGS_TRUE}" ]; then | 647 if [ "${FLAGS_withdev}" -eq "${FLAGS_TRUE}" ]; then |
| 615 echo "Developer image created as ${DEVELOPER_IMAGE_NAME}" | 648 echo "Developer image created as ${DEVELOPER_IMAGE_NAME}" |
| 616 fi | 649 fi |
| 617 | 650 |
| 618 print_time_elapsed | 651 print_time_elapsed |
| 619 | 652 |
| 620 echo "To copy to USB keyfob, OUTSIDE the chroot, do something like:" | 653 echo "To copy to USB keyfob, OUTSIDE the chroot, do something like:" |
| 621 echo " ./image_to_usb.sh --from=${OUTSIDE_OUTPUT_DIR} --to=/dev/sdX" | 654 echo " ./image_to_usb.sh --from=${OUTSIDE_OUTPUT_DIR} --to=/dev/sdX" |
| 622 echo "To convert to VMWare image, OUTSIDE the chroot, do something like:" | 655 echo "To convert to VMWare image, OUTSIDE the chroot, do something like:" |
| 623 echo " ./image_to_vmware.sh --from=${OUTSIDE_OUTPUT_DIR}" | 656 echo " ./image_to_vmware.sh --from=${OUTSIDE_OUTPUT_DIR}" |
| 624 echo "from the scripts directory where you entered the chroot." | 657 echo "from the scripts directory where you entered the chroot." |
| OLD | NEW |