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 |