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 66 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
77 . "${TOP_SCRIPTS_DIR}/.emerge" | 77 . "${TOP_SCRIPTS_DIR}/.emerge" |
78 fi | 78 fi |
79 | 79 |
80 # Determine build version. | 80 # Determine build version. |
81 . "${SCRIPTS_DIR}/chromeos_version.sh" | 81 . "${SCRIPTS_DIR}/chromeos_version.sh" |
82 | 82 |
83 # Use canonical path since some tools (e.g. mount) do not like symlinks. | 83 # Use canonical path since some tools (e.g. mount) do not like symlinks. |
84 # Append build attempt to output directory. | 84 # Append build attempt to output directory. |
85 IMAGE_SUBDIR="${CHROMEOS_VERSION_STRING}-a${FLAGS_build_attempt}" | 85 IMAGE_SUBDIR="${CHROMEOS_VERSION_STRING}-a${FLAGS_build_attempt}" |
86 OUTPUT_DIR="${FLAGS_output_root}/${FLAGS_board}/${IMAGE_SUBDIR}" | 86 OUTPUT_DIR="${FLAGS_output_root}/${FLAGS_board}/${IMAGE_SUBDIR}" |
87 ROOT_FS_DIR="${OUTPUT_DIR}/rootfs" | 87 |
88 ROOT_FS_IMG="${OUTPUT_DIR}/rootfs.image" | 88 OUTSIDE_OUTPUT_DIR="../build/images/${FLAGS_board}/${IMAGE_SUBDIR}" |
89 | 89 |
90 # If we are creating a developer image, also create a pristine image with a | 90 # If we are creating a developer image, also create a pristine image with a |
91 # different name. | 91 # different name. |
92 DEVELOPER_IMAGE_NAME= | 92 DEVELOPER_IMAGE_NAME= |
93 PRISTINE_IMAGE_NAME=chromiumos_image.bin | 93 PRISTINE_IMAGE_NAME=chromiumos_image.bin |
94 if [ "${FLAGS_withdev}" -eq "${FLAGS_TRUE}" ]; then | 94 if [ "${FLAGS_withdev}" -eq "${FLAGS_TRUE}" ]; then |
95 PRISTINE_IMAGE_NAME=chromiumos_base_image.bin | 95 PRISTINE_IMAGE_NAME=chromiumos_base_image.bin |
96 DEVELOPER_IMAGE_NAME=chromiumos_image.bin | 96 DEVELOPER_IMAGE_NAME=chromiumos_image.bin |
97 fi | 97 fi |
98 | 98 |
99 # If we are creating a recovery image, rename pristine image. | 99 # If we are creating a recovery image, rename pristine image. |
100 if [ "${FLAGS_recovery}" -eq "${FLAGS_TRUE}" ]; then | 100 if [ "${FLAGS_recovery}" -eq "${FLAGS_TRUE}" ]; then |
101 PRISTINE_IMAGE_NAME=recovery_image.bin | 101 PRISTINE_IMAGE_NAME=recovery_image.bin |
102 fi | 102 fi |
103 | 103 |
104 OUTPUT_IMG=${FLAGS_to:-${OUTPUT_DIR}/${PRISTINE_IMAGE_NAME}} | 104 OUTPUT_IMG=${FLAGS_to:-${OUTPUT_DIR}/${PRISTINE_IMAGE_NAME}} |
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_DIR="${OUTPUT_DIR}/rootfs" |
| 110 ROOT_FS_IMG="${OUTPUT_DIR}/rootfs.image" |
| 111 |
| 112 STATEFUL_IMG="${OUTPUT_DIR}/stateful_partition.image" |
| 113 STATEFUL_DIR="${OUTPUT_DIR}/stateful_partition" |
| 114 |
| 115 ESP_IMG=${OUTPUT_DIR}/esp.image |
| 116 ESP_DIR=${OUTPUT_DIR}/esp |
| 117 |
109 LOOP_DEV= | 118 LOOP_DEV= |
110 STATEFUL_LOOP_DEV= | 119 STATEFUL_LOOP_DEV= |
111 ESP_LOOP_DEV= | 120 ESP_LOOP_DEV= |
112 | 121 |
| 122 # ${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 |
| 124 # translate to /usr/local. |
| 125 DEV_IMAGE_ROOT="${STATEFUL_DIR}/dev_image" |
| 126 |
113 # What cross-build are we targeting? | 127 # What cross-build are we targeting? |
114 . "${BOARD_ROOT}/etc/make.conf.board_setup" | 128 . "${BOARD_ROOT}/etc/make.conf.board_setup" |
115 LIBC_VERSION=${LIBC_VERSION:-"2.10.1-r1"} | 129 LIBC_VERSION=${LIBC_VERSION:-"2.10.1-r1"} |
116 | 130 |
| 131 INSTALL_MASK="" |
| 132 if [[ ${FLAGS_installmask} -eq ${FLAGS_TRUE} ]] ; then |
| 133 INSTALL_MASK="${DEFAULT_INSTALL_MASK}" |
| 134 fi |
| 135 |
| 136 # Reduce the size of factory install shim. |
| 137 # TODO: Build a separated ebuild for the factory install shim to reduce size. |
| 138 if [[ ${FLAGS_factory_install} -eq ${FLAGS_TRUE} ]] ; then |
| 139 INSTALL_MASK="${INSTALL_MASK} ${FACTORY_INSTALL_MASK}" |
| 140 fi |
| 141 |
| 142 if [[ ${FLAGS_jobs} -ne -1 ]]; then |
| 143 EMERGE_JOBS="--jobs=${FLAGS_jobs}" |
| 144 fi |
| 145 |
117 # Figure out ARCH from the given toolchain. | 146 # Figure out ARCH from the given toolchain. |
118 # TODO: Move to common.sh as a function after scripts are switched over. | 147 # TODO: Move to common.sh as a function after scripts are switched over. |
119 TC_ARCH=$(echo "${CHOST}" | awk -F'-' '{ print $1 }') | 148 TC_ARCH=$(echo "${CHOST}" | awk -F'-' '{ print $1 }') |
120 case "${TC_ARCH}" in | 149 case "${TC_ARCH}" in |
121 arm*) | 150 arm*) |
122 ARCH="arm" | 151 ARCH="arm" |
123 ;; | 152 ;; |
124 *86) | 153 *86) |
125 ARCH="x86" | 154 ARCH="x86" |
126 ;; | 155 ;; |
(...skipping 65 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
192 sudo rm -rf "${OUTPUT_DIR}" | 221 sudo rm -rf "${OUTPUT_DIR}" |
193 echo "Deleted ${OUTPUT_DIR}" | 222 echo "Deleted ${OUTPUT_DIR}" |
194 else | 223 else |
195 echo "Not deleting ${OUTPUT_DIR}. Note dev server updates will not work" \ | 224 echo "Not deleting ${OUTPUT_DIR}. Note dev server updates will not work" \ |
196 "until you successfully build another image or delete this directory" | 225 "until you successfully build another image or delete this directory" |
197 fi | 226 fi |
198 } | 227 } |
199 | 228 |
200 # $1 - Directory where developer rootfs is mounted. | 229 # $1 - Directory where developer rootfs is mounted. |
201 # $2 - Directory where developer stateful_partition is mounted. | 230 # $2 - Directory where developer stateful_partition is mounted. |
202 developer_cleanup() { | 231 mount_gpt_cleanup() { |
203 "${SCRIPTS_DIR}/mount_gpt_image.sh" -u -r "$1" -s "$2" | 232 "${SCRIPTS_DIR}/mount_gpt_image.sh" -u -r "$1" -s "$2" |
204 delete_prompt | 233 delete_prompt |
205 } | 234 } |
206 | 235 |
207 # Creates a modified image based on ${OUTPUT_IMG} with additional packages. | 236 # Creates a modified image based on ${OUTPUT_IMG} with additional packages. |
208 create_mod_image() { | 237 update_dev_packages() { |
209 local image_type=$1 | |
210 local root_fs_dir="${OUTPUT_DIR}/rootfs_dev" | 238 local root_fs_dir="${OUTPUT_DIR}/rootfs_dev" |
211 local root_fs_img="${OUTPUT_DIR}/rootfs_dev.image" | 239 local root_fs_img="${OUTPUT_DIR}/rootfs_dev.image" |
212 local image_to_mount=${DEVELOPER_IMAGE_NAME} | 240 local image_to_mount=${DEVELOPER_IMAGE_NAME} |
213 local output_img="${OUTPUT_DIR}/${image_to_mount}" | 241 local output_img="${OUTPUT_DIR}/${image_to_mount}" |
214 | 242 |
215 # Create stateful partition of the same size as the rootfs. | 243 # Create stateful partition of the same size as the rootfs. |
216 local stateful_img="${OUTPUT_DIR}/stateful_partition_dev.image" | 244 local stateful_img="${OUTPUT_DIR}/stateful_partition_dev.image" |
217 local stateful_dir="${OUTPUT_DIR}/stateful_partition_dev" | 245 local stateful_dir="${OUTPUT_DIR}/stateful_partition_dev" |
218 local file_to_touch=".dev_mode" | 246 local file_to_touch=".dev_mode" |
219 | 247 |
220 trap "developer_cleanup \"${root_fs_dir}\" \"${stateful_dir}\"" EXIT | 248 trap "mount_gpt_cleanup \"${root_fs_dir}\" \"${stateful_dir}\"" EXIT |
221 | 249 |
222 if [ "${image_type}" == "dev" ]; then | 250 # Mount a new copy of the base image. |
223 # Mount a new copy of the base image. | 251 echo "Creating developer image from base image ${OUTPUT_IMG}" |
224 echo "Creating developer image from base image ${OUTPUT_IMG}" | 252 cp "${OUTPUT_IMG}" "${output_img}" |
225 cp "${OUTPUT_IMG}" "${output_img}" | |
226 elif [ "${image_type}" == "recovery" ]; then | |
227 image_to_mount=${PRISTINE_IMAGE_NAME} | |
228 file_to_touch=".recovery_installer" | |
229 fi | |
230 | 253 |
231 ${SCRIPTS_DIR}/mount_gpt_image.sh --from "${OUTPUT_DIR}" \ | 254 ${SCRIPTS_DIR}/mount_gpt_image.sh --from "${OUTPUT_DIR}" \ |
232 --image "${image_to_mount}" -r "${root_fs_dir}" -s "${stateful_dir}" | 255 --image "${image_to_mount}" -r "${root_fs_dir}" -s "${stateful_dir}" |
233 | 256 |
234 if [ "${image_type}" == "dev" ]; then | 257 # Determine the root dir for developer packages. |
235 # Determine the root dir for developer packages. | 258 local root_dev_dir="${root_fs_dir}" |
236 local root_dev_dir="${root_fs_dir}" | 259 [ ${FLAGS_statefuldev} -eq ${FLAGS_TRUE} ] && \ |
237 [ ${FLAGS_statefuldev} -eq ${FLAGS_TRUE} ] && \ | 260 root_dev_dir="${root_fs_dir}/usr/local" |
238 root_dev_dir="${root_fs_dir}/usr/local" | |
239 | 261 |
240 # Install developer packages described in chromeos-dev. | 262 # Install developer packages described in chromeos-dev. |
241 sudo INSTALL_MASK="${INSTALL_MASK}" ${EMERGE_BOARD_CMD} \ | 263 sudo INSTALL_MASK="${INSTALL_MASK}" ${EMERGE_BOARD_CMD} \ |
242 --root="${root_dev_dir}" --root-deps=rdeps \ | 264 --root="${root_dev_dir}" --root-deps=rdeps \ |
243 --usepkgonly chromeos-dev ${EMERGE_JOBS} | 265 --usepkgonly chromeos-dev ${EMERGE_JOBS} |
244 elif [ "${image_type}" == "recovery" ]; then | |
245 # Install recovery installer. | |
246 sudo ${EMERGE_BOARD_CMD} --root=${root_fs_dir} --usepkgonly \ | |
247 --root-deps=rdeps --nodeps chromeos-recovery | |
248 fi | |
249 | 266 |
250 # Re-run ldconfig to fix /etc/ldconfig.so.cache. | 267 # Re-run ldconfig to fix /etc/ldconfig.so.cache. |
251 sudo /sbin/ldconfig -r "${root_fs_dir}" | 268 sudo /sbin/ldconfig -r "${root_fs_dir}" |
252 | 269 |
253 # Mark the image as a developer image (input to chromeos_startup). | 270 # Mark the image as a developer image (input to chromeos_startup). |
254 sudo mkdir -p "${root_fs_dir}/root" | 271 sudo mkdir -p "${root_fs_dir}/root" |
255 sudo touch "${root_fs_dir}/root/${file_to_touch}" | 272 sudo touch "${root_fs_dir}/root/${file_to_touch}" |
256 | 273 |
257 if [ "${image_type}" == "dev" ]; then | 274 # Additional changes to developer image. |
258 # Additional changes to developer image. | |
259 | 275 |
260 # The ldd tool is a useful shell script but lives in glibc; just copy it. | 276 # The ldd tool is a useful shell script but lives in glibc; just copy it. |
261 sudo cp -a "$(which ldd)" "${root_dev_dir}/usr/bin" | 277 sudo cp -a "$(which ldd)" "${root_dev_dir}/usr/bin" |
262 | 278 |
263 # If vim is installed, then a vi symlink would probably help. | 279 # If vim is installed, then a vi symlink would probably help. |
264 if [[ -x "${root_fs_dir}/usr/local/bin/vim" ]]; then | 280 if [[ -x "${root_fs_dir}/usr/local/bin/vim" ]]; then |
265 sudo ln -sf vim "${root_fs_dir}/usr/local/bin/vi" | 281 sudo ln -sf vim "${root_fs_dir}/usr/local/bin/vi" |
266 fi | 282 fi |
267 | 283 |
268 # Check that the image has been correctly created. Only do it if not | 284 # Check that the image has been correctly created. Only do it if not |
269 # building a factory install image, as the INSTALL_MASK for it will | 285 # building a factory install image, as the INSTALL_MASK for it will |
270 # make test_image fail. | 286 # make test_image fail. |
271 if [[ ${FLAGS_factory_install} -eq ${FLAGS_FALSE} ]] ; then | 287 if [[ ${FLAGS_factory_install} -eq ${FLAGS_FALSE} ]] ; then |
272 "${SCRIPTS_DIR}/test_image" \ | 288 "${SCRIPTS_DIR}/test_image" \ |
273 --root="${root_fs_dir}" \ | 289 --root="${root_fs_dir}" \ |
274 --target="${ARCH}" | 290 --target="${ARCH}" |
275 fi | |
276 echo "Developer image built and stored at ${output_img}" | |
277 fi | 291 fi |
| 292 echo "Developer image built and stored at ${output_img}" |
278 | 293 |
279 trap - EXIT | 294 trap - EXIT |
280 ${SCRIPTS_DIR}/mount_gpt_image.sh -u -r "${root_fs_dir}" -s "${stateful_dir}" | 295 ${SCRIPTS_DIR}/mount_gpt_image.sh -u -r "${root_fs_dir}" -s "${stateful_dir}" |
281 sudo rm -rf "${root_fs_dir}" "${stateful_dir}" | 296 sudo rm -rf "${root_fs_dir}" "${stateful_dir}" |
282 } | 297 } |
283 | 298 |
284 # ${DEV_IMAGE_ROOT} specifies the location of where developer packages will | |
285 # be installed on the stateful dir. On a Chromium OS system, this will | |
286 # translate to /usr/local. | |
287 DEV_IMAGE_ROOT= | |
288 | 299 |
289 trap "cleanup && delete_prompt" EXIT | 300 # Creates a modified image based on ${OUTPUT_IMG} with additional packages. |
| 301 update_recovery_packages() { |
| 302 local root_fs_dir="${OUTPUT_DIR}/rootfs_dev" |
| 303 local root_fs_img="${OUTPUT_DIR}/rootfs_dev.image" |
| 304 local image_to_mount=${DEVELOPER_IMAGE_NAME} |
| 305 local output_img="${OUTPUT_DIR}/${image_to_mount}" |
290 | 306 |
291 mkdir -p "${ROOT_FS_DIR}" | 307 # Create stateful partition of the same size as the rootfs. |
| 308 local stateful_img="${OUTPUT_DIR}/stateful_partition_dev.image" |
| 309 local stateful_dir="${OUTPUT_DIR}/stateful_partition_dev" |
| 310 local file_to_touch=".dev_mode" |
292 | 311 |
293 # Create and format the root file system. | 312 trap "mount_gpt_cleanup \"${root_fs_dir}\" \"${stateful_dir}\"" EXIT |
294 | 313 |
295 # Check for loop device before creating image. | 314 image_to_mount=${PRISTINE_IMAGE_NAME} |
296 LOOP_DEV=$(sudo losetup -f) | 315 file_to_touch=".recovery_installer" |
297 if [ -z "${LOOP_DEV}" ] ; then | |
298 echo "No free loop device. Free up a loop device or reboot. exiting. " | |
299 exit 1 | |
300 fi | |
301 | 316 |
302 # Create root file system disk image to fit on a 1GB memory stick. | 317 ${SCRIPTS_DIR}/mount_gpt_image.sh --from "${OUTPUT_DIR}" \ |
303 # 1 GB in hard-drive-manufacturer-speak is 10^9, not 2^30. 950MB < 10^9 bytes. | 318 --image "${image_to_mount}" -r "${root_fs_dir}" -s "${stateful_dir}" |
304 if [[ ${FLAGS_factory_install} -eq ${FLAGS_TRUE} ]] ; then | |
305 ROOT_SIZE_BYTES=$((1024 * 1024 * 300)) | |
306 else | |
307 ROOT_SIZE_BYTES=$((1024 * 1024 * ${FLAGS_rootfs_size})) | |
308 fi | |
309 | 319 |
310 dd if=/dev/zero of="${ROOT_FS_IMG}" bs=1 count=1 seek=$((ROOT_SIZE_BYTES - 1)) | 320 # Install recovery installer. |
311 sudo losetup "${LOOP_DEV}" "${ROOT_FS_IMG}" | 321 sudo ${EMERGE_BOARD_CMD} --root=${root_fs_dir} --usepkgonly \ |
312 sudo mkfs.ext3 "${LOOP_DEV}" | 322 --root-deps=rdeps --nodeps chromeos-recovery |
313 | 323 |
314 # Tune and mount rootfs. | 324 # Re-run ldconfig to fix /etc/ldconfig.so.cache. |
315 UUID=$(uuidgen) | 325 sudo /sbin/ldconfig -r "${root_fs_dir}" |
316 DISK_LABEL="C-KEYFOB" | |
317 sudo tune2fs -L "${DISK_LABEL}" -U "${UUID}" -c 0 -i 0 "${LOOP_DEV}" | |
318 sudo mount "${LOOP_DEV}" "${ROOT_FS_DIR}" | |
319 | 326 |
320 # Create stateful partition of the same size as the rootfs. | 327 # Mark the image as a developer image (input to chromeos_startup). |
321 STATEFUL_IMG="${OUTPUT_DIR}/stateful_partition.image" | 328 sudo mkdir -p "${root_fs_dir}/root" |
322 STATEFUL_DIR="${OUTPUT_DIR}/stateful_partition" | 329 sudo touch "${root_fs_dir}/root/${file_to_touch}" |
323 STATEFUL_LOOP_DEV=$(sudo losetup -f) | |
324 if [ -z "${STATEFUL_LOOP_DEV}" ] ; then | |
325 echo "No free loop device. Free up a loop device or reboot. exiting. " | |
326 exit 1 | |
327 fi | |
328 dd if=/dev/zero of="${STATEFUL_IMG}" bs=1 count=1 seek=$((ROOT_SIZE_BYTES - 1)) | |
329 sudo losetup "${STATEFUL_LOOP_DEV}" "${STATEFUL_IMG}" | |
330 sudo mkfs.ext3 "${STATEFUL_LOOP_DEV}" | |
331 sudo tune2fs -L "C-STATE" -U "${UUID}" -c 0 -i 0 \ | |
332 "${STATEFUL_LOOP_DEV}" | |
333 | 330 |
334 # Mount the stateful partition. | 331 trap - EXIT |
335 mkdir -p "${STATEFUL_DIR}" | 332 ${SCRIPTS_DIR}/mount_gpt_image.sh -u -r "${root_fs_dir}" -s "${stateful_dir}" |
336 sudo mount "${STATEFUL_LOOP_DEV}" "${STATEFUL_DIR}" | 333 sudo rm -rf "${root_fs_dir}" "${stateful_dir}" |
| 334 } |
337 | 335 |
338 # Set dev image root now that we have mounted the stateful partition | 336 create_base_image() { |
339 # we created. | |
340 DEV_IMAGE_ROOT="${STATEFUL_DIR}/dev_image" | |
341 | 337 |
342 # Turn root file system into bootable image. | 338 trap "cleanup && delete_prompt" EXIT |
343 if [[ "${ARCH}" = "x86" ]]; then | 339 |
344 # Setup extlinux configuration. | 340 mkdir -p "${ROOT_FS_DIR}" |
345 # TODO: For some reason the /dev/disk/by-uuid is not being generated by udev | 341 |
346 # in the initramfs. When we figure that out, switch to root=UUID=${UUID}. | 342 # Create and format the root file system. |
347 sudo mkdir -p "${ROOT_FS_DIR}"/boot | 343 |
348 # TODO(adlr): use initramfs for booting. | 344 # Check for loop device before creating image. |
349 cat <<EOF | sudo dd of="${ROOT_FS_DIR}"/boot/extlinux.conf | 345 LOOP_DEV=$(sudo losetup -f) |
| 346 if [ -z "${LOOP_DEV}" ] ; then |
| 347 echo "No free loop device. Free up a loop device or reboot. exiting. " |
| 348 exit 1 |
| 349 fi |
| 350 |
| 351 # Create root file system disk image to fit on a 1GB memory stick. |
| 352 # 1 GB in hard-drive-manufacturer-speak is 10^9, not 2^30. 950MB < 10^9 bytes
. |
| 353 if [[ ${FLAGS_factory_install} -eq ${FLAGS_TRUE} ]] ; then |
| 354 ROOT_SIZE_BYTES=$((1024 * 1024 * 300)) |
| 355 else |
| 356 ROOT_SIZE_BYTES=$((1024 * 1024 * ${FLAGS_rootfs_size})) |
| 357 fi |
| 358 |
| 359 dd if=/dev/zero of="${ROOT_FS_IMG}" bs=1 count=1 seek=$((ROOT_SIZE_BYTES - 1)) |
| 360 sudo losetup "${LOOP_DEV}" "${ROOT_FS_IMG}" |
| 361 sudo mkfs.ext3 "${LOOP_DEV}" |
| 362 |
| 363 # Tune and mount rootfs. |
| 364 UUID=$(uuidgen) |
| 365 DISK_LABEL="C-KEYFOB" |
| 366 sudo tune2fs -L "${DISK_LABEL}" -U "${UUID}" -c 0 -i 0 "${LOOP_DEV}" |
| 367 sudo mount "${LOOP_DEV}" "${ROOT_FS_DIR}" |
| 368 |
| 369 # Create stateful partition of the same size as the rootfs. |
| 370 STATEFUL_LOOP_DEV=$(sudo losetup -f) |
| 371 if [ -z "${STATEFUL_LOOP_DEV}" ] ; then |
| 372 echo "No free loop device. Free up a loop device or reboot. exiting. " |
| 373 exit 1 |
| 374 fi |
| 375 dd if=/dev/zero of="${STATEFUL_IMG}" bs=1 count=1 seek=$((ROOT_SIZE_BYTES - 1)
) |
| 376 sudo losetup "${STATEFUL_LOOP_DEV}" "${STATEFUL_IMG}" |
| 377 sudo mkfs.ext3 "${STATEFUL_LOOP_DEV}" |
| 378 sudo tune2fs -L "C-STATE" -U "${UUID}" -c 0 -i 0 \ |
| 379 "${STATEFUL_LOOP_DEV}" |
| 380 |
| 381 # Mount the stateful partition. |
| 382 mkdir -p "${STATEFUL_DIR}" |
| 383 sudo mount "${STATEFUL_LOOP_DEV}" "${STATEFUL_DIR}" |
| 384 |
| 385 # Turn root file system into bootable image. |
| 386 if [[ "${ARCH}" = "x86" ]]; then |
| 387 # Setup extlinux configuration. |
| 388 # TODO: For some reason the /dev/disk/by-uuid is not being generated by udev |
| 389 # in the initramfs. When we figure that out, switch to root=UUID=${UUID}. |
| 390 sudo mkdir -p "${ROOT_FS_DIR}"/boot |
| 391 # TODO(adlr): use initramfs for booting. |
| 392 cat <<EOF | sudo dd of="${ROOT_FS_DIR}"/boot/extlinux.conf |
350 DEFAULT chromeos-usb | 393 DEFAULT chromeos-usb |
351 PROMPT 0 | 394 PROMPT 0 |
352 TIMEOUT 0 | 395 TIMEOUT 0 |
353 | 396 |
354 label chromeos-usb | 397 label chromeos-usb |
355 menu label chromeos-usb | 398 menu label chromeos-usb |
356 kernel vmlinuz | 399 kernel vmlinuz |
357 append quiet console=tty2 init=/sbin/init boot=local rootwait root=/dev/sdb3 r
o noresume noswap i915.modeset=1 loglevel=1 cros_legacy | 400 append quiet console=tty2 init=/sbin/init boot=local rootwait root=/dev/sdb3 r
o noresume noswap i915.modeset=1 loglevel=1 cros_legacy |
358 | 401 |
359 label chromeos-hd | 402 label chromeos-hd |
360 menu label chromeos-hd | 403 menu label chromeos-hd |
361 kernel vmlinuz | 404 kernel vmlinuz |
362 append quiet console=tty2 init=/sbin/init boot=local rootwait root=HDROOT ro n
oresume noswap i915.modeset=1 loglevel=1 cros_legacy | 405 append quiet console=tty2 init=/sbin/init boot=local rootwait root=HDROOT ro n
oresume noswap i915.modeset=1 loglevel=1 cros_legacy |
363 EOF | 406 EOF |
364 | 407 |
365 # Make partition bootable and label it. | 408 # Make partition bootable and label it. |
366 sudo extlinux -z --install "${ROOT_FS_DIR}/boot" | 409 sudo extlinux -z --install "${ROOT_FS_DIR}/boot" |
367 fi | 410 fi |
368 | 411 |
369 # -- Install packages into the root file system -- | 412 # -- Install packages into the root file system -- |
370 | 413 |
371 # We need to install libc manually from the cross toolchain. | 414 # We need to install libc manually from the cross toolchain. |
372 # TODO: Improve this? We only want libc and not the whole toolchain. | 415 # TODO: Improve this? We only want libc and not the whole toolchain. |
373 PKGDIR="/var/lib/portage/pkgs/cross/" | 416 PKGDIR="/var/lib/portage/pkgs/cross/" |
374 sudo tar jxvpf \ | 417 sudo tar jxvpf \ |
375 "${PKGDIR}/${CHOST}/cross-${CHOST}"/glibc-${LIBC_VERSION}.tbz2 \ | 418 "${PKGDIR}/${CHOST}/cross-${CHOST}"/glibc-${LIBC_VERSION}.tbz2 \ |
376 -C "${ROOT_FS_DIR}" --strip-components=3 \ | 419 -C "${ROOT_FS_DIR}" --strip-components=3 \ |
377 --exclude=usr/include --exclude=sys-include --exclude=*.a --exclude=*.o | 420 --exclude=usr/include --exclude=sys-include --exclude=*.a --exclude=*.o |
378 | 421 |
379 # We need to install libstdc++ manually from the cross toolchain. | 422 # We need to install libstdc++ manually from the cross toolchain. |
380 # TODO: Figure out a better way of doing this? | 423 # TODO: Figure out a better way of doing this? |
381 sudo cp -a "${BOARD_ROOT}"/lib/libgcc_s.so* "${ROOT_FS_DIR}/lib" | 424 sudo cp -a "${BOARD_ROOT}"/lib/libgcc_s.so* "${ROOT_FS_DIR}/lib" |
382 sudo cp -a "${BOARD_ROOT}"/usr/lib/libstdc++.so* "${ROOT_FS_DIR}/usr/lib" | 425 sudo cp -a "${BOARD_ROOT}"/usr/lib/libstdc++.so* "${ROOT_FS_DIR}/usr/lib" |
383 | 426 |
384 INSTALL_MASK="" | 427 # Prepare stateful partition with some pre-created directories. |
385 if [[ ${FLAGS_installmask} -eq ${FLAGS_TRUE} ]] ; then | 428 sudo mkdir -p "${DEV_IMAGE_ROOT}" |
386 INSTALL_MASK="${DEFAULT_INSTALL_MASK}" | 429 sudo mkdir -p "${STATEFUL_DIR}/var" |
387 fi | |
388 | 430 |
389 # Reduce the size of factory install shim. | 431 # Create symlinks so that /usr/local/usr based directories are symlinked to |
390 # TODO: Build a separated ebuild for the factory install shim to reduce size. | 432 # /usr/local/ directories e.g. /usr/local/usr/bin -> /usr/local/bin, etc. |
391 if [[ ${FLAGS_factory_install} -eq ${FLAGS_TRUE} ]] ; then | 433 setup_symlinks_on_root "${DEV_IMAGE_ROOT}" "${STATEFUL_DIR}/var" \ |
392 INSTALL_MASK="${INSTALL_MASK} ${FACTORY_INSTALL_MASK}" | 434 "${STATEFUL_DIR}" |
393 fi | |
394 | 435 |
395 if [[ ${FLAGS_jobs} -ne -1 ]]; then | 436 # Perform binding rather than symlinking because directories must exist |
396 EMERGE_JOBS="--jobs=${FLAGS_jobs}" | 437 # on rootfs so that we can bind at run-time since rootfs is read-only. |
397 fi | 438 echo "Binding directories from stateful partition onto the rootfs" |
| 439 sudo mkdir -p "${ROOT_FS_DIR}/usr/local" |
| 440 sudo mount --bind "${DEV_IMAGE_ROOT}" "${ROOT_FS_DIR}/usr/local" |
| 441 sudo mkdir -p "${ROOT_FS_DIR}/var" |
| 442 sudo mount --bind "${STATEFUL_DIR}/var" "${ROOT_FS_DIR}/var" |
| 443 sudo mkdir -p "${ROOT_FS_DIR}/dev" |
398 | 444 |
399 # Prepare stateful partition with some pre-created directories. | 445 # We "emerge --root=${ROOT_FS_DIR} --root-deps=rdeps --usepkgonly" all of the |
400 sudo mkdir -p "${DEV_IMAGE_ROOT}" | 446 # runtime packages for chrome os. This builds up a chrome os image from |
401 sudo mkdir -p "${STATEFUL_DIR}/var" | 447 # binary packages with runtime dependencies only. We use INSTALL_MASK to |
| 448 # trim the image size as much as possible. |
| 449 sudo INSTALL_MASK="${INSTALL_MASK}" ${EMERGE_BOARD_CMD} \ |
| 450 --root="${ROOT_FS_DIR}" --root-deps=rdeps \ |
| 451 --usepkgonly chromeos ${EMERGE_JOBS} |
402 | 452 |
403 # Create symlinks so that /usr/local/usr based directories are symlinked to | 453 # Create EFI System Partition to boot stock EFI BIOS (but not ChromeOS EFI |
404 # /usr/local/ directories e.g. /usr/local/usr/bin -> /usr/local/bin, etc. | 454 # BIOS). We only need this for x86, but it's simpler and safer to keep the |
405 setup_symlinks_on_root "${DEV_IMAGE_ROOT}" "${STATEFUL_DIR}/var" \ | 455 # disk images the same for both x86 and ARM. |
406 "${STATEFUL_DIR}" | 456 # NOTE: The size argument for mkfs.vfat is in 1024-byte blocks. |
407 | 457 # We'll hard-code it to 16M for now. |
408 # Perform binding rather than symlinking because directories must exist | 458 ESP_BLOCKS=16384 |
409 # on rootfs so that we can bind at run-time since rootfs is read-only. | 459 /usr/sbin/mkfs.vfat -C ${OUTPUT_DIR}/esp.image ${ESP_BLOCKS} |
410 echo "Binding directories from stateful partition onto the rootfs" | 460 ESP_LOOP_DEV=$(sudo losetup -f) |
411 sudo mkdir -p "${ROOT_FS_DIR}/usr/local" | 461 if [ -z "${ESP_LOOP_DEV}" ] ; then |
412 sudo mount --bind "${DEV_IMAGE_ROOT}" "${ROOT_FS_DIR}/usr/local" | 462 echo "No free loop device. Free up a loop device or reboot. exiting. " |
413 sudo mkdir -p "${ROOT_FS_DIR}/var" | 463 exit 1 |
414 sudo mount --bind "${STATEFUL_DIR}/var" "${ROOT_FS_DIR}/var" | 464 fi |
415 sudo mkdir -p "${ROOT_FS_DIR}/dev" | 465 mkdir -p "${ESP_DIR}" |
416 | 466 sudo losetup "${ESP_LOOP_DEV}" "${ESP_IMG}" |
417 # We "emerge --root=${ROOT_FS_DIR} --root-deps=rdeps --usepkgonly" all of the | 467 sudo mount "${ESP_LOOP_DEV}" "${ESP_DIR}" |
418 # runtime packages for chrome os. This builds up a chrome os image from binary | 468 sudo mkdir -p "${ESP_DIR}/efi/boot" |
419 # packages with runtime dependencies only. We use INSTALL_MASK to trim the | 469 sudo grub-mkimage -p /efi/boot -o "${ESP_DIR}/efi/boot/bootx64.efi" \ |
420 # image size as much as possible. | 470 part_gpt fat ext2 normal boot sh chain configfile linux |
421 sudo INSTALL_MASK="${INSTALL_MASK}" ${EMERGE_BOARD_CMD} \ | 471 cat <<'EOF' | sudo dd of="${ESP_DIR}/efi/boot/grub.cfg" |
422 --root="${ROOT_FS_DIR}" --root-deps=rdeps \ | |
423 --usepkgonly chromeos ${EMERGE_JOBS} | |
424 | |
425 # Create EFI System Partition to boot stock EFI BIOS (but not ChromeOS EFI | |
426 # BIOS). We only need this for x86, but it's simpler and safer to keep the disk | |
427 # images the same for both x86 and ARM. | |
428 ESP_IMG=${OUTPUT_DIR}/esp.image | |
429 # NOTE: The size argument for mkfs.vfat is in 1024-byte blocks. We'll hard-code | |
430 # it to 16M for now. | |
431 ESP_BLOCKS=16384 | |
432 /usr/sbin/mkfs.vfat -C ${OUTPUT_DIR}/esp.image ${ESP_BLOCKS} | |
433 ESP_DIR=${OUTPUT_DIR}/esp | |
434 ESP_LOOP_DEV=$(sudo losetup -f) | |
435 if [ -z "${ESP_LOOP_DEV}" ] ; then | |
436 echo "No free loop device. Free up a loop device or reboot. exiting. " | |
437 exit 1 | |
438 fi | |
439 mkdir -p "${ESP_DIR}" | |
440 sudo losetup "${ESP_LOOP_DEV}" "${ESP_IMG}" | |
441 sudo mount "${ESP_LOOP_DEV}" "${ESP_DIR}" | |
442 sudo mkdir -p "${ESP_DIR}/efi/boot" | |
443 sudo grub-mkimage -p /efi/boot -o "${ESP_DIR}/efi/boot/bootx64.efi" \ | |
444 part_gpt fat ext2 normal boot sh chain configfile linux | |
445 cat <<'EOF' | sudo dd of="${ESP_DIR}/efi/boot/grub.cfg" | |
446 set default=0 | 472 set default=0 |
447 set timeout=2 | 473 set timeout=2 |
448 | 474 |
449 # NOTE: These magic grub variables are a Chrome OS hack. They are not portable. | 475 # NOTE: These magic grub variables are a Chrome OS hack. They are not portable. |
450 | 476 |
451 menuentry "local image A" { | 477 menuentry "local image A" { |
452 linux $grubpartA/boot/vmlinuz quiet console=tty2 init=/sbin/init boot=local ro
otwait root=/dev/$linuxpartA ro noresume noswap i915.modeset=1 loglevel=1 cros_e
fi | 478 linux $grubpartA/boot/vmlinuz quiet console=tty2 init=/sbin/init boot=local ro
otwait root=/dev/$linuxpartA ro noresume noswap i915.modeset=1 loglevel=1 cros_e
fi |
453 } | 479 } |
454 | 480 |
455 menuentry "local image B" { | 481 menuentry "local image B" { |
456 linux $grubpartB/boot/vmlinuz quiet console=tty2 init=/sbin/init boot=local ro
otwait root=/dev/$linuxpartB ro noresume noswap i915.modeset=1 loglevel=1 cros_e
fi | 482 linux $grubpartB/boot/vmlinuz quiet console=tty2 init=/sbin/init boot=local ro
otwait root=/dev/$linuxpartB ro noresume noswap i915.modeset=1 loglevel=1 cros_e
fi |
457 } | 483 } |
458 | 484 |
459 menuentry "Alternate USB Boot" { | 485 menuentry "Alternate USB Boot" { |
460 linux (hd0,3)/boot/vmlinuz quiet console=tty2 init=/sbin/init boot=local rootw
ait root=/dev/sdb3 ro noresume noswap i915.modeset=1 loglevel=1 cros_efi | 486 linux (hd0,3)/boot/vmlinuz quiet console=tty2 init=/sbin/init boot=local rootw
ait root=/dev/sdb3 ro noresume noswap i915.modeset=1 loglevel=1 cros_efi |
461 } | 487 } |
462 | 488 |
463 EOF | 489 EOF |
464 | 490 |
465 # FIXME: At the moment, we're working on signed images for x86 only. ARM will | 491 # FIXME: At the moment, we're working on signed images for x86 only. ARM will |
466 # support this before shipping, but at the moment they don't. | 492 # support this before shipping, but at the moment they don't. |
467 if [[ "${ARCH}" = "x86" ]]; then | 493 if [[ "${ARCH}" = "x86" ]]; then |
468 | 494 |
469 # Legacy BIOS will use the kernel in the rootfs (via syslinux), as will | 495 # Legacy BIOS will use the kernel in the rootfs (via syslinux), as will |
470 # standard EFI BIOS (via grub, from the EFI System Partition). Chrome OS BIOS | 496 # standard EFI BIOS (via grub, from the EFI System Partition). Chrome OS |
471 # will use a separate signed kernel partition, which we'll create now. | 497 # BIOS will use a separate signed kernel partition, which we'll create now. |
472 # FIXME: remove serial output, debugging messages. | 498 # FIXME: remove serial output, debugging messages. |
473 cat <<'EOF' > "${OUTPUT_DIR}/config.txt" | 499 cat <<'EOF' > "${OUTPUT_DIR}/config.txt" |
474 earlyprintk=serial,ttyS0,115200 | 500 earlyprintk=serial,ttyS0,115200 |
475 console=ttyS0,115200 | 501 console=ttyS0,115200 |
476 init=/sbin/init | 502 init=/sbin/init |
477 add_efi_memmap | 503 add_efi_memmap |
478 boot=local | 504 boot=local |
479 rootwait | 505 rootwait |
480 root=/dev/sd%D%P | 506 root=/dev/sd%D%P |
481 ro | 507 ro |
482 noresume | 508 noresume |
483 noswap | 509 noswap |
484 i915.modeset=1 | 510 i915.modeset=1 |
485 loglevel=7 | 511 loglevel=7 |
486 cros_secure | 512 cros_secure |
487 EOF | 513 EOF |
488 | 514 |
489 # FIXME: We need to specify the real keys and certs here! | 515 # FIXME: We need to specify the real keys and certs here! |
490 SIG_DIR="${SRC_ROOT}/platform/vboot_reference/tests/testkeys" | 516 SIG_DIR="${SRC_ROOT}/platform/vboot_reference/tests/testkeys" |
491 | 517 |
492 # Wrap the public keys with VbPublicKey headers. | 518 # Wrap the public keys with VbPublicKey headers. |
493 vbutil_key --pack \ | 519 vbutil_key --pack \ |
494 --in "${SIG_DIR}/key_rsa2048.keyb" \ | 520 --in "${SIG_DIR}/key_rsa2048.keyb" \ |
495 --version 1 --algorithm 4 \ | 521 --version 1 --algorithm 4 \ |
496 --out "${OUTPUT_DIR}/key_alg4.vbpubk" | 522 --out "${OUTPUT_DIR}/key_alg4.vbpubk" |
497 | 523 |
498 vbutil_key --pack \ | 524 vbutil_key --pack \ |
499 --in "${SIG_DIR}/key_rsa4096.keyb" \ | 525 --in "${SIG_DIR}/key_rsa4096.keyb" \ |
500 --version 1 --algorithm 8 \ | 526 --version 1 --algorithm 8 \ |
501 --out "${OUTPUT_DIR}/key_alg8.vbpubk" | 527 --out "${OUTPUT_DIR}/key_alg8.vbpubk" |
502 | 528 |
503 vbutil_keyblock --pack "${OUTPUT_DIR}/data4_sign8.keyblock" \ | 529 vbutil_keyblock --pack "${OUTPUT_DIR}/data4_sign8.keyblock" \ |
504 --datapubkey "${OUTPUT_DIR}/key_alg4.vbpubk" \ | 530 --datapubkey "${OUTPUT_DIR}/key_alg4.vbpubk" \ |
505 --signprivate "${SIG_DIR}/key_rsa4096.pem" \ | 531 --signprivate "${SIG_DIR}/key_rsa4096.pem" \ |
506 --algorithm 8 --flags 3 | 532 --algorithm 8 --flags 3 |
507 | 533 |
508 # Verify the keyblock. | 534 # Verify the keyblock. |
509 vbutil_keyblock --unpack "${OUTPUT_DIR}/data4_sign8.keyblock" \ | 535 vbutil_keyblock --unpack "${OUTPUT_DIR}/data4_sign8.keyblock" \ |
510 --signpubkey "${OUTPUT_DIR}/key_alg8.vbpubk" | 536 --signpubkey "${OUTPUT_DIR}/key_alg8.vbpubk" |
511 | 537 |
512 # Sign the kernel: | 538 # Sign the kernel: |
513 vbutil_kernel --pack "${OUTPUT_DIR}/vmlinuz.image" \ | 539 vbutil_kernel --pack "${OUTPUT_DIR}/vmlinuz.image" \ |
514 --keyblock "${OUTPUT_DIR}/data4_sign8.keyblock" \ | 540 --keyblock "${OUTPUT_DIR}/data4_sign8.keyblock" \ |
515 --signprivate "${SIG_DIR}/key_rsa2048.pem" \ | 541 --signprivate "${SIG_DIR}/key_rsa2048.pem" \ |
516 --version 1 \ | 542 --version 1 \ |
517 --config "${OUTPUT_DIR}/config.txt" \ | 543 --config "${OUTPUT_DIR}/config.txt" \ |
518 --bootloader /lib64/bootstub/bootstub.efi \ | 544 --bootloader /lib64/bootstub/bootstub.efi \ |
519 --vmlinuz "${ROOT_FS_DIR}/boot/vmlinuz" | 545 --vmlinuz "${ROOT_FS_DIR}/boot/vmlinuz" |
520 | 546 |
521 # And verify it. | 547 # And verify it. |
522 vbutil_kernel --verify "${OUTPUT_DIR}/vmlinuz.image" \ | 548 vbutil_kernel --verify "${OUTPUT_DIR}/vmlinuz.image" \ |
523 --signpubkey "${OUTPUT_DIR}/key_alg8.vbpubk" | 549 --signpubkey "${OUTPUT_DIR}/key_alg8.vbpubk" |
524 | 550 |
525 else | 551 else |
526 # FIXME: For now, ARM just uses the unsigned kernel by itself. | 552 # FIXME: For now, ARM just uses the unsigned kernel by itself. |
527 cp -f "${ROOT_FS_DIR}/boot/vmlinuz" "${OUTPUT_DIR}/vmlinuz.image" | 553 cp -f "${ROOT_FS_DIR}/boot/vmlinuz" "${OUTPUT_DIR}/vmlinuz.image" |
528 fi | 554 fi |
529 | 555 |
530 | 556 |
531 # Perform any customizations on the root file system that are needed. | 557 # Perform any customizations on the root file system that are needed. |
532 "${SCRIPTS_DIR}/customize_rootfs" \ | 558 "${SCRIPTS_DIR}/customize_rootfs" \ |
533 --root="${ROOT_FS_DIR}" \ | 559 --root="${ROOT_FS_DIR}" \ |
534 --target="${ARCH}" \ | 560 --target="${ARCH}" \ |
535 --board="${BOARD}" | 561 --board="${BOARD}" |
536 | 562 |
537 # Don't test the factory install shim. | 563 # Don't test the factory install shim. |
538 if [[ ${FLAGS_factory_install} -eq ${FLAGS_FALSE} ]] ; then | 564 if [[ ${FLAGS_factory_install} -eq ${FLAGS_FALSE} ]] ; then |
539 # Check that the image has been correctly created. | 565 # Check that the image has been correctly created. |
540 "${SCRIPTS_DIR}/test_image" \ | 566 "${SCRIPTS_DIR}/test_image" \ |
541 --root="${ROOT_FS_DIR}" \ | 567 --root="${ROOT_FS_DIR}" \ |
542 --target="${ARCH}" | 568 --target="${ARCH}" |
543 fi | 569 fi |
544 | 570 |
545 # Clean up symlinks so they work on a running target rooted at "/". | 571 # Clean up symlinks so they work on a running target rooted at "/". |
546 # Here development packages are rooted at /usr/local. However, do not | 572 # Here development packages are rooted at /usr/local. However, do not |
547 # create /usr/local or /var on host (already exist on target). | 573 # create /usr/local or /var on host (already exist on target). |
548 setup_symlinks_on_root "/usr/local" "/var" "${STATEFUL_DIR}" | 574 setup_symlinks_on_root "/usr/local" "/var" "${STATEFUL_DIR}" |
549 | 575 |
550 # Cleanup loop devices. | 576 # Cleanup loop devices. |
551 cleanup | 577 cleanup |
552 | 578 |
553 trap delete_prompt EXIT | 579 trap delete_prompt EXIT |
554 | 580 |
555 RECOVERY="--norecovery" | 581 RECOVERY="--norecovery" |
556 if [[ ${FLAGS_recovery} -eq ${FLAGS_TRUE} ]]; then | 582 if [[ ${FLAGS_recovery} -eq ${FLAGS_TRUE} ]]; then |
557 RECOVERY="--recovery" | 583 RECOVERY="--recovery" |
558 fi | 584 fi |
559 | 585 |
560 # Create the GPT-formatted image. | 586 # Create the GPT-formatted image. |
561 ${SCRIPTS_DIR}/build_gpt.sh \ | 587 ${SCRIPTS_DIR}/build_gpt.sh \ |
562 --arch=${ARCH} \ | 588 --arch=${ARCH} \ |
563 --board=${FLAGS_board} \ | 589 --board=${FLAGS_board} \ |
564 --arm_extra_bootargs="${FLAGS_arm_extra_bootargs}" \ | 590 --arm_extra_bootargs="${FLAGS_arm_extra_bootargs}" \ |
565 --rootfs_partition_size=${FLAGS_rootfs_partition_size} \ | 591 --rootfs_partition_size=${FLAGS_rootfs_partition_size} \ |
566 ${RECOVERY} \ | 592 ${RECOVERY} \ |
567 "${OUTPUT_DIR}" \ | 593 "${OUTPUT_DIR}" \ |
568 "${OUTPUT_IMG}" | 594 "${OUTPUT_IMG}" |
| 595 } |
| 596 |
| 597 create_base_image |
569 | 598 |
570 # Create a recovery image based on the chromium os base image. | 599 # Create a recovery image based on the chromium os base image. |
571 [ "${FLAGS_recovery}" -eq "${FLAGS_TRUE}" ] && create_mod_image "recovery" | 600 [ "${FLAGS_recovery}" -eq "${FLAGS_TRUE}" ] && update_recovery_packages |
572 trap - EXIT | 601 trap - EXIT |
573 | 602 |
574 # Create a developer image based on the chromium os base image. | 603 # Create a developer image based on the chromium os base image. |
575 [ "${FLAGS_withdev}" -eq "${FLAGS_TRUE}" ] && create_mod_image "dev" | 604 [ "${FLAGS_withdev}" -eq "${FLAGS_TRUE}" ] && update_dev_packages |
576 trap - EXIT | 605 trap - EXIT |
577 | 606 |
578 # FIXME: only signing things for x86 right now. | 607 # FIXME: only signing things for x86 right now. |
579 if [[ "${ARCH}" = "x86" ]]; then | 608 if [[ "${ARCH}" = "x86" ]]; then |
580 # Verify the final image. | 609 # Verify the final image. |
581 load_kernel_test "${OUTPUT_IMG}" "${OUTPUT_DIR}/key_alg8.vbpubk" | 610 load_kernel_test "${OUTPUT_IMG}" "${OUTPUT_DIR}/key_alg8.vbpubk" |
582 fi | 611 fi |
583 | 612 |
584 # Clean up temporary files. | 613 # Clean up temporary files. |
585 rm -f "${ROOT_FS_IMG}" "${STATEFUL_IMG}" "${OUTPUT_DIR}/vmlinuz.image" \ | 614 rm -f "${ROOT_FS_IMG}" "${STATEFUL_IMG}" "${OUTPUT_DIR}/vmlinuz.image" \ |
586 "${ESP_IMG}" "${OUTPUT_DIR}/data4_sign8.keyblock" \ | 615 "${ESP_IMG}" "${OUTPUT_DIR}/data4_sign8.keyblock" \ |
587 "${OUTPUT_DIR}/key_alg4.vbpubk" "${OUTPUT_DIR}/key_alg8.vbpubk" | 616 "${OUTPUT_DIR}/key_alg4.vbpubk" "${OUTPUT_DIR}/key_alg8.vbpubk" |
588 rmdir "${ROOT_FS_DIR}" "${STATEFUL_DIR}" "${ESP_DIR}" | 617 rmdir "${ROOT_FS_DIR}" "${STATEFUL_DIR}" "${ESP_DIR}" |
589 | 618 |
590 OUTSIDE_OUTPUT_DIR="../build/images/${FLAGS_board}/${IMAGE_SUBDIR}" | |
591 | |
592 echo "Done. Image created in ${OUTPUT_DIR}" | 619 echo "Done. Image created in ${OUTPUT_DIR}" |
593 echo "Chromium OS image created as ${PRISTINE_IMAGE_NAME}" | 620 echo "Chromium OS image created as ${PRISTINE_IMAGE_NAME}" |
594 if [ "${FLAGS_recovery}" -eq "${FLAGS_TRUE}" ]; then | 621 if [ "${FLAGS_recovery}" -eq "${FLAGS_TRUE}" ]; then |
595 echo "Recovery image created as ${PRISTINE_IMAGE_NAME}" | 622 echo "Recovery image created as ${PRISTINE_IMAGE_NAME}" |
596 fi | 623 fi |
597 if [ "${FLAGS_withdev}" -eq "${FLAGS_TRUE}" ]; then | 624 if [ "${FLAGS_withdev}" -eq "${FLAGS_TRUE}" ]; then |
598 echo "Developer image created as ${DEVELOPER_IMAGE_NAME}" | 625 echo "Developer image created as ${DEVELOPER_IMAGE_NAME}" |
599 fi | 626 fi |
600 | 627 |
601 print_time_elapsed | 628 print_time_elapsed |
602 | 629 |
603 echo "To copy to USB keyfob, OUTSIDE the chroot, do something like:" | 630 echo "To copy to USB keyfob, OUTSIDE the chroot, do something like:" |
604 echo " ./image_to_usb.sh --from=${OUTSIDE_OUTPUT_DIR} --to=/dev/sdX" | 631 echo " ./image_to_usb.sh --from=${OUTSIDE_OUTPUT_DIR} --to=/dev/sdX" |
605 echo "To convert to VMWare image, OUTSIDE the chroot, do something like:" | 632 echo "To convert to VMWare image, OUTSIDE the chroot, do something like:" |
606 echo " ./image_to_vmware.sh --from=${OUTSIDE_OUTPUT_DIR}" | 633 echo " ./image_to_vmware.sh --from=${OUTSIDE_OUTPUT_DIR}" |
607 echo "from the scripts directory where you entered the chroot." | 634 echo "from the scripts directory where you entered the chroot." |
OLD | NEW |