| OLD | NEW |
| 1 #!/bin/bash | 1 #!/bin/bash |
| 2 | 2 |
| 3 # Copyright (c) 2009 The Chromium OS Authors. All rights reserved. | 3 # Copyright (c) 2010 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 convert the output of build_image.sh to a usb image. | 7 # Script to convert the output of build_image.sh to a usb image. |
| 8 | 8 |
| 9 # --- BEGIN COMMON.SH BOILERPLATE --- | 9 # --- BEGIN COMMON.SH BOILERPLATE --- |
| 10 # Load common CrOS utilities. Inside the chroot this file is installed in | 10 # Load common CrOS utilities. Inside the chroot this file is installed in |
| 11 # /usr/lib/crosutils. Outside the chroot we find it relative to the script's | 11 # /usr/lib/crosutils. Outside the chroot we find it relative to the script's |
| 12 # location. | 12 # location. |
| 13 find_common_sh() { | 13 find_common_sh() { |
| (...skipping 19 matching lines...) Expand all Loading... |
| 33 INSTALLER_ROOT=$(dirname "$(readlink -f "$0")") | 33 INSTALLER_ROOT=$(dirname "$(readlink -f "$0")") |
| 34 | 34 |
| 35 . "${INSTALLER_ROOT}/chromeos-common.sh" || \ | 35 . "${INSTALLER_ROOT}/chromeos-common.sh" || \ |
| 36 die "Unable to load chromeos-common.sh" | 36 die "Unable to load chromeos-common.sh" |
| 37 | 37 |
| 38 get_default_board | 38 get_default_board |
| 39 | 39 |
| 40 # Flags | 40 # Flags |
| 41 DEFINE_string board "${DEFAULT_BOARD}" "Board for which the image was built" | 41 DEFINE_string board "${DEFAULT_BOARD}" "Board for which the image was built" |
| 42 DEFINE_string from "" \ | 42 DEFINE_string from "" \ |
| 43 "Directory containing chromiumos_image.bin" | 43 "Directory containing ${CHROMEOS_IMAGE_NAME}" |
| 44 DEFINE_string to "/dev/sdX" "${DEFAULT_TO_HELP}" | 44 DEFINE_string to "/dev/sdX" "${DEFAULT_TO_HELP}" |
| 45 DEFINE_boolean yes ${FLAGS_FALSE} "Answer yes to all prompts" "y" | 45 DEFINE_boolean yes ${FLAGS_FALSE} "Answer yes to all prompts" "y" |
| 46 DEFINE_boolean force_copy ${FLAGS_FALSE} "Always rebuild test image" | 46 DEFINE_boolean force_copy ${FLAGS_FALSE} "Always rebuild test image" |
| 47 DEFINE_boolean force_non_usb ${FLAGS_FALSE} \ | 47 DEFINE_boolean force_non_usb ${FLAGS_FALSE} \ |
| 48 "Write out image even if target (--to) doesn't look like a USB disk" | 48 "Write out image even if target (--to) doesn't look like a USB disk" |
| 49 DEFINE_boolean factory_install ${FLAGS_FALSE} \ | 49 DEFINE_boolean factory_install ${FLAGS_FALSE} \ |
| 50 "Whether to generate a factory install shim." | 50 "Whether to generate a factory install shim." |
| 51 DEFINE_boolean factory ${FLAGS_FALSE} \ | 51 DEFINE_boolean factory ${FLAGS_FALSE} \ |
| 52 "Whether to generate a factory runin image. Implies aututest and test" | 52 "Whether to generate a factory runin image. Implies aututest and test" |
| 53 DEFINE_boolean copy_kernel ${FLAGS_FALSE} \ | 53 DEFINE_boolean copy_kernel ${FLAGS_FALSE} \ |
| 54 "Copy the kernel to the fourth partition." | 54 "Copy the kernel to the fourth partition." |
| 55 DEFINE_boolean test_image "${FLAGS_FALSE}" \ | 55 DEFINE_boolean test_image "${FLAGS_FALSE}" \ |
| 56 "Copies normal image to chromiumos_test_image.bin, modifies it for test." | 56 "Copies normal image to ${CHROMEOS_TEST_IMAGE_NAME}, modifies it for test." |
| 57 DEFINE_string image_name "chromiumos_image.bin" \ | 57 DEFINE_string image_name "${CHROMEOS_IMAGE_NAME}" \ |
| 58 "Base name of the image" i | 58 "Base name of the image" i |
| 59 DEFINE_string build_root "/build" \ | 59 DEFINE_string build_root "/build" \ |
| 60 "The root location for board sysroots." | 60 "The root location for board sysroots." |
| 61 DEFINE_boolean install ${FLAGS_FALSE} "Install to the usb device." | 61 DEFINE_boolean install ${FLAGS_FALSE} "Install to the usb device." |
| 62 DEFINE_string arch "" "Architecture of the image." | 62 DEFINE_string arch "" "Architecture of the image." |
| 63 | 63 |
| 64 # Parse command line | 64 # Parse command line |
| 65 FLAGS "$@" || exit 1 | 65 FLAGS "$@" || exit 1 |
| 66 eval set -- "${FLAGS_ARGV}" | 66 eval set -- "${FLAGS_ARGV}" |
| 67 | 67 |
| (...skipping 28 matching lines...) Expand all Loading... |
| 96 | 96 |
| 97 # No board set during install | 97 # No board set during install |
| 98 if [ -z "${FLAGS_board}" ] && [ ${FLAGS_install} -eq ${FLAGS_TRUE} ]; then | 98 if [ -z "${FLAGS_board}" ] && [ ${FLAGS_install} -eq ${FLAGS_TRUE} ]; then |
| 99 setup_board_warning | 99 setup_board_warning |
| 100 exit 1 | 100 exit 1 |
| 101 fi | 101 fi |
| 102 | 102 |
| 103 # We have a board name but no image set. Use image at default location | 103 # We have a board name but no image set. Use image at default location |
| 104 if [ -z "${FLAGS_from}" ]; then | 104 if [ -z "${FLAGS_from}" ]; then |
| 105 IMAGES_DIR="${DEFAULT_BUILD_ROOT}/images/${FLAGS_board}" | 105 IMAGES_DIR="${DEFAULT_BUILD_ROOT}/images/${FLAGS_board}" |
| 106 |
| 107 # Get latest image directory |
| 106 FLAGS_from="${IMAGES_DIR}/$(ls -t ${IMAGES_DIR} 2>&-| head -1)" | 108 FLAGS_from="${IMAGES_DIR}/$(ls -t ${IMAGES_DIR} 2>&-| head -1)" |
| 107 fi | 109 fi |
| 108 | 110 |
| 109 if [ ! -d "${FLAGS_from}" ] ; then | 111 if [ ! -d "${FLAGS_from}" ] ; then |
| 110 echo "Cannot find image directory ${FLAGS_from}" | 112 echo "Cannot find image directory ${FLAGS_from}" |
| 111 exit 1 | 113 exit 1 |
| 112 fi | 114 fi |
| 113 | 115 |
| 114 if [ "${FLAGS_to}" == "/dev/sdX" ]; then | 116 if [ "${FLAGS_to}" == "/dev/sdX" ]; then |
| 115 echo "You must specify a file or device to write to using --to." | 117 echo "You must specify a file or device to write to using --to." |
| (...skipping 30 matching lines...) Expand all Loading... |
| 146 disk_manufacturer=$(get_disk_info ${FLAGS_to##*/} manufacturer) | 148 disk_manufacturer=$(get_disk_info ${FLAGS_to##*/} manufacturer) |
| 147 disk_product=$(get_disk_info ${FLAGS_to##*/} product) | 149 disk_product=$(get_disk_info ${FLAGS_to##*/} product) |
| 148 elif [ ${FLAGS_force_non_usb} -ne ${FLAGS_TRUE} ]; then | 150 elif [ ${FLAGS_force_non_usb} -ne ${FLAGS_TRUE} ]; then |
| 149 # Safeguard against writing to a real non-USB disk | 151 # Safeguard against writing to a real non-USB disk |
| 150 echo "Error: Device ${FLAGS_to} does not appear to be a USB disk!" | 152 echo "Error: Device ${FLAGS_to} does not appear to be a USB disk!" |
| 151 echo " To override this safeguard, use the --force_non_usb flag" | 153 echo " To override this safeguard, use the --force_non_usb flag" |
| 152 exit 1 | 154 exit 1 |
| 153 fi | 155 fi |
| 154 fi | 156 fi |
| 155 | 157 |
| 156 # Use this image as the source image to copy | |
| 157 SRC_IMAGE="${FLAGS_from}/${FLAGS_image_name}" | |
| 158 | |
| 159 STATEFUL_DIR="${FLAGS_from}/stateful_partition" | 158 STATEFUL_DIR="${FLAGS_from}/stateful_partition" |
| 160 mkdir -p "${STATEFUL_DIR}" | 159 mkdir -p "${STATEFUL_DIR}" |
| 161 | 160 |
| 162 function do_cleanup { | 161 function do_cleanup { |
| 163 echo "Cleaning loopback devices: ${STATEFUL_LOOP_DEV}" | 162 echo "Cleaning loopback devices: ${STATEFUL_LOOP_DEV}" |
| 164 if [ "${STATEFUL_LOOP_DEV}" != "" ]; then | 163 if [ "${STATEFUL_LOOP_DEV}" != "" ]; then |
| 165 sudo umount "${STATEFUL_DIR}" | 164 sudo umount "${STATEFUL_DIR}" |
| 166 sudo losetup -d "${STATEFUL_LOOP_DEV}" | 165 sudo losetup -d "${STATEFUL_LOOP_DEV}" |
| 167 rmdir "${STATEFUL_DIR}" | 166 rmdir "${STATEFUL_DIR}" |
| 168 echo "Cleaned" | 167 echo "Cleaned" |
| 169 fi | 168 fi |
| 170 } | 169 } |
| 171 | 170 |
| 172 | |
| 173 # If we're asked to modify the image for test, then let's make a copy and | |
| 174 # modify that instead. | |
| 175 if [ ${FLAGS_test_image} -eq ${FLAGS_TRUE} ] ; then | 171 if [ ${FLAGS_test_image} -eq ${FLAGS_TRUE} ] ; then |
| 176 if [ ! -f "${FLAGS_from}/chromiumos_test_image.bin" ] || \ | 172 # Make a test image - this returns the test filename in CHROMEOS_RETURN_VAL |
| 177 [ ${FLAGS_force_copy} -eq ${FLAGS_TRUE} ] ; then | 173 prepare_test_image "${FLAGS_from}" "${FLAGS_image_name}" |
| 178 # Copy it. | 174 SRC_IMAGE="${CHROMEOS_RETURN_VAL}" |
| 179 echo "Creating test image from original..." | 175 else |
| 180 cp -f "${SRC_IMAGE}" "${FLAGS_from}/chromiumos_test_image.bin" | 176 # Use the standard image |
| 181 | 177 SRC_IMAGE="${FLAGS_from}/${FLAGS_image_name}" |
| 182 # Check for manufacturing image. | |
| 183 if [ ${FLAGS_factory} -eq ${FLAGS_TRUE} ] ; then | |
| 184 EXTRA_ARGS="--factory" | |
| 185 fi | |
| 186 | |
| 187 # Check for instqall shim. | |
| 188 if [ ${FLAGS_factory_install} -eq ${FLAGS_TRUE} ] ; then | |
| 189 EXTRA_ARGS="--factory_install" | |
| 190 fi | |
| 191 | |
| 192 # Modify it. Pass --yes so that mod_image_for_test.sh won't ask us if we | |
| 193 # really want to modify the image; the user gave their assent already with | |
| 194 # --test-image and the original image is going to be preserved. | |
| 195 "${SCRIPTS_DIR}/mod_image_for_test.sh" --image \ | |
| 196 "${FLAGS_from}/chromiumos_test_image.bin" --board=${FLAGS_board} \ | |
| 197 ${EXTRA_ARGS} --yes | |
| 198 echo "Done with mod_image_for_test." | |
| 199 else | |
| 200 echo "Using cached test image." | |
| 201 fi | |
| 202 SRC_IMAGE="${FLAGS_from}/chromiumos_test_image.bin" | |
| 203 echo "Source test image is: ${SRC_IMAGE}" | |
| 204 fi | 178 fi |
| 205 | 179 |
| 206 | |
| 207 # Let's do it. | 180 # Let's do it. |
| 208 if [ -b "${FLAGS_to}" ]; then | 181 if [ -b "${FLAGS_to}" ]; then |
| 209 # Output to a block device (i.e., a real USB key), so need sudo dd | 182 # Output to a block device (i.e., a real USB key), so need sudo dd |
| 210 if [ ${FLAGS_install} -ne ${FLAGS_TRUE} ]; then | 183 if [ ${FLAGS_install} -ne ${FLAGS_TRUE} ]; then |
| 211 echo "Copying USB image ${SRC_IMAGE} to device ${FLAGS_to}..." | 184 echo "Copying USB image ${SRC_IMAGE} to device ${FLAGS_to}..." |
| 212 else | 185 else |
| 213 echo "Installing USB image ${SRC_IMAGE} to device ${FLAGS_to}..." | 186 echo "Installing USB image ${SRC_IMAGE} to device ${FLAGS_to}..." |
| 214 fi | 187 fi |
| 215 | 188 |
| 216 # Warn if it looks like they supplied a partition as the destination. | 189 # Warn if it looks like they supplied a partition as the destination. |
| (...skipping 29 matching lines...) Expand all Loading... |
| 246 echo "The device you have specified is already mounted at some point " | 219 echo "The device you have specified is already mounted at some point " |
| 247 echo "that is not visible from inside the chroot. Please unmount the " | 220 echo "that is not visible from inside the chroot. Please unmount the " |
| 248 echo "device manually from outside the chroot and try again." | 221 echo "device manually from outside the chroot and try again." |
| 249 echo | 222 echo |
| 250 exit 1 | 223 exit 1 |
| 251 fi | 224 fi |
| 252 done | 225 done |
| 253 sleep 3 | 226 sleep 3 |
| 254 | 227 |
| 255 if [ ${FLAGS_install} -ne ${FLAGS_TRUE} ]; then | 228 if [ ${FLAGS_install} -ne ${FLAGS_TRUE} ]; then |
| 256 echo "Copying ${SRC_IMAGE} to ${FLAGS_to}..." | 229 echo "Copying with dd ${SRC_IMAGE} to ${FLAGS_to}..." |
| 257 if type pv >/dev/null 2>&1; then | 230 sudo ${COMMON_PV_CAT} "${SRC_IMAGE}" | |
| 258 # pv displays file size in k=1024 while dd uses k=1000. | 231 sudo dd of="${FLAGS_to}" bs=4M oflag=sync status=noxfer |
| 259 # To prevent confusion, we suppress the summary report from dd. | |
| 260 sudo pv -ptreb -B 4m "${SRC_IMAGE}" | | |
| 261 sudo dd of="${FLAGS_to}" bs=4M oflag=sync status=noxfer | |
| 262 else | |
| 263 sudo dd if="${SRC_IMAGE}" of="${FLAGS_to}" bs=4M oflag=sync | |
| 264 fi | |
| 265 sync | 232 sync |
| 266 else | 233 else |
| 267 if [ ${INSIDE_CHROOT} -ne 1 ]; then | 234 if [ ${INSIDE_CHROOT} -ne 1 ]; then |
| 268 echo "Installation must be done from inside the chroot." | 235 echo "Installation must be done from inside the chroot." |
| 269 exit 1 | 236 exit 1 |
| 270 fi | 237 fi |
| 271 | 238 |
| 272 echo "Installing ${SRC_IMAGE} to ${FLAGS_to}..." | 239 echo "Installing ${SRC_IMAGE} to ${FLAGS_to}..." |
| 273 "${FLAGS_build_root}/${FLAGS_board}/usr/sbin/chromeos-install" \ | 240 "${FLAGS_build_root}/${FLAGS_board}/usr/sbin/chromeos-install" \ |
| 274 --yes \ | 241 --yes \ |
| 275 --skip_src_removable \ | 242 --skip_src_removable \ |
| 276 --skip_dst_removable \ | 243 --skip_dst_removable \ |
| 277 --arch="${FLAGS_arch}" \ | 244 --arch="${FLAGS_arch}" \ |
| 278 --payload_image="${SRC_IMAGE}" \ | 245 --payload_image="${SRC_IMAGE}" \ |
| 279 --dst="${FLAGS_to}" | 246 --dst="${FLAGS_to}" |
| 280 fi | 247 fi |
| 281 echo "Done." | 248 echo "Done." |
| 282 else | 249 else |
| 283 # Output to a file, so just make a copy. | 250 # Output to a file, so just make a copy. |
| 284 echo "Copying ${SRC_IMAGE} to ${FLAGS_to}..." | 251 echo "Copying ${SRC_IMAGE} to ${FLAGS_to}..." |
| 285 cp -f "${SRC_IMAGE}" "${FLAGS_to}" | 252 ${COMMON_PV_CAT} "${SRC_IMAGE}" >"${FLAGS_to}" |
| 286 | 253 |
| 287 echo "Done. To copy to a USB drive, do something like:" | 254 echo "Done. To copy to a USB drive, do something like:" |
| 288 echo " sudo dd if=${FLAGS_to} of=/dev/sdX bs=4M oflag=sync" | 255 echo " sudo dd if=${FLAGS_to} of=/dev/sdX bs=4M oflag=sync" |
| 289 echo "where /dev/sdX is the entire drive." | 256 echo "where /dev/sdX is the entire drive." |
| 290 fi | 257 fi |
| OLD | NEW |