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 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 # Load common constants. This should be the first executable line. | 9 # Load common constants. This should be the first executable line. |
10 # The path to common.sh should be relative to your script's location. | 10 # The path to common.sh should be relative to your script's location. |
(...skipping 61 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
72 fi | 72 fi |
73 fi | 73 fi |
74 | 74 |
75 # Convert args to paths. Need eval to un-quote the string so that shell | 75 # Convert args to paths. Need eval to un-quote the string so that shell |
76 # chars like ~ are processed; just doing FOO=`readlink -f ${FOO}` won't work. | 76 # chars like ~ are processed; just doing FOO=`readlink -f ${FOO}` won't work. |
77 FLAGS_from=`eval readlink -f ${FLAGS_from}` | 77 FLAGS_from=`eval readlink -f ${FLAGS_from}` |
78 FLAGS_to=`eval readlink -f ${FLAGS_to}` | 78 FLAGS_to=`eval readlink -f ${FLAGS_to}` |
79 | 79 |
80 # Uses this rootfs image as the source image to copy | 80 # Uses this rootfs image as the source image to copy |
81 ROOTFS_IMAGE="${FLAGS_from}/rootfs.image" | 81 ROOTFS_IMAGE="${FLAGS_from}/rootfs.image" |
| 82 PART_SIZE=$(stat -c%s "${ROOTFS_IMAGE}") # Bytes |
| 83 |
| 84 # Setup stateful partition variables |
| 85 STATEFUL_IMG="${FLAGS_from}/stateful_partition.image" |
| 86 STATEFUL_DIR="${FLAGS_from}/stateful_partition" |
| 87 |
| 88 # TODO(sosa@chromium.org) - Remove legacy support. |
| 89 if [ ! -f "${STATEFUL_IMG}" ] ; then |
| 90 echo "WARNING! Stateful partition not found. Creating clean stateful" |
| 91 STATEFUL_LOOP_DEV=$(sudo losetup -f) |
| 92 if [ -z "${STATEFUL_LOOP_DEV}" ] ; then |
| 93 echo "No free loop device. Free up a loop device or reboot. exiting. " |
| 94 exit 1 |
| 95 fi |
| 96 set -x |
| 97 dd if=/dev/zero of="${STATEFUL_IMG}" bs=1 count=1 \ |
| 98 seek=$(( (${PART_SIZE} - 1) )) |
| 99 set +x |
| 100 sudo losetup "$STATEFUL_LOOP_DEV" "$STATEFUL_IMG" |
| 101 sudo mkfs.ext3 "$STATEFUL_LOOP_DEV" |
| 102 sudo tune2fs -L "C-STATE" -c 0 -i 0 "$STATEFUL_LOOP_DEV" |
| 103 sudo losetup -d "${STATEFUL_LOOP_DEV}" |
| 104 fi |
82 | 105 |
83 # Modifies image for test if requested | 106 # Modifies image for test if requested |
84 if [ ${FLAGS_test_image} -eq ${FLAGS_TRUE} ] ; then | 107 if [ ${FLAGS_test_image} -eq ${FLAGS_TRUE} ] ; then |
85 if [ ! -f "${FLAGS_from}/rootfs_test.image" ] ; then | 108 if [ ! -f "${FLAGS_from}/rootfs_test.image" ] ; then |
86 echo "Test image not found, creating test image from original ... " | 109 echo "Test image not found, creating test image from original ... " |
87 cp "${FLAGS_from}/rootfs.image" "${FLAGS_from}/rootfs_test.image" | 110 cp "${FLAGS_from}/rootfs.image" "${FLAGS_from}/rootfs_test.image" |
88 "${SCRIPTS_DIR}/mod_image_for_test.sh" \ | 111 "${SCRIPTS_DIR}/mod_image_for_test.sh" \ |
89 --image "${FLAGS_from}/rootfs_test.image" | 112 --image "${FLAGS_from}/rootfs_test.image" |
90 fi | 113 fi |
91 # Use the test image instead | 114 # Use the test image instead |
92 ROOTFS_IMAGE="${FLAGS_from}/rootfs_test.image" | 115 ROOTFS_IMAGE="${FLAGS_from}/rootfs_test.image" |
93 fi | 116 fi |
94 | 117 |
95 function do_cleanup { | 118 function do_cleanup { |
96 sudo losetup -d "${LOOP_DEV}" | 119 sudo losetup -d "${LOOP_DEV}" |
97 } | 120 } |
98 | 121 |
99 STATEFUL_DIR=${FLAGS_from}/stateful_partition | |
100 mkdir -p "${STATEFUL_DIR}" | |
101 | |
102 function install_autotest { | 122 function install_autotest { |
103 if [ -d ${AUTOTEST_SRC} ] | 123 if [ -d ${AUTOTEST_SRC} ] |
104 then | 124 then |
| 125 local stateful_loop_dev=$(sudo losetup -f) |
| 126 if [ -z "${stateful_loop_dev}" ] |
| 127 then |
| 128 echo "No free loop device. Free up a loop device or reboot. exiting." |
| 129 exit 1 |
| 130 fi |
| 131 |
| 132 sudo mount "${stateful_loop_dev}" "${STATEFUL_DIR}" |
| 133 |
105 echo -ne "Install autotest into stateful partition..." | 134 echo -ne "Install autotest into stateful partition..." |
106 local autotest_client="/home/autotest-client" | 135 local autotest_client="/home/autotest-client" |
107 sudo mkdir -p "${STATEFUL_DIR}${autotest_client}" | 136 sudo mkdir -p "${STATEFUL_DIR}${autotest_client}" |
108 sudo cp -fpru ${AUTOTEST_SRC}/client/* \ | 137 sudo cp -fpru ${AUTOTEST_SRC}/client/* \ |
109 "${STATEFUL_DIR}${autotest_client}" | 138 "${STATEFUL_DIR}${autotest_client}" |
110 sudo chmod 755 "${STATEFUL_DIR}${autotest_client}" | 139 sudo chmod 755 "${STATEFUL_DIR}${autotest_client}" |
111 sudo chown -R 1000:1000 "${STATEFUL_DIR}${autotest_client}" | 140 sudo chown -R 1000:1000 "${STATEFUL_DIR}${autotest_client}" |
112 echo "Done." | 141 |
113 sudo umount "${STATEFUL_DIR}" | 142 sudo umount ${STATEFUL_DIR} |
| 143 sudo losetup -d "${stateful_loop_dev}" |
114 else | 144 else |
115 echo "/usr/local/autotest under ${DEFAULT_CHROOT_DIR} is not installed." | 145 echo "/usr/local/autotest under ${DEFAULT_CHROOT_DIR} is not installed." |
116 echo "Please call make_autotest.sh inside chroot first." | 146 echo "Please call make_autotest.sh inside chroot first." |
117 sudo umount "${STATEFUL_DIR}" | 147 sudo umount "${STATEFUL_DIR}" |
118 exit -1 | 148 exit -1 |
119 fi | 149 fi |
120 } | 150 } |
121 | 151 |
122 # Copy MBR and rootfs to output image | 152 # Copy MBR and rootfs to output image |
123 if [ -b "${FLAGS_to}" ] | 153 if [ -b "${FLAGS_to}" ] |
(...skipping 26 matching lines...) Expand all Loading... |
150 exit 1 | 180 exit 1 |
151 fi | 181 fi |
152 fi | 182 fi |
153 | 183 |
154 echo "attempting to unmount any mounts on the USB device" | 184 echo "attempting to unmount any mounts on the USB device" |
155 for i in "${FLAGS_to}"* | 185 for i in "${FLAGS_to}"* |
156 do | 186 do |
157 ! sudo umount "$i" | 187 ! sudo umount "$i" |
158 done | 188 done |
159 sleep 3 | 189 sleep 3 |
160 | 190 |
161 PART_SIZE=$(stat -c%s "${ROOTFS_IMAGE}") # Bytes | 191 if [ ${FLAGS_install_autotest} -eq ${FLAGS_TRUE} ] ; then |
162 | |
163 echo "Copying root fs..." | |
164 sudo "${SCRIPTS_DIR}"/file_copy.py \ | |
165 if="${ROOTFS_IMAGE}" \ | |
166 of="${FLAGS_to}" bs=4M \ | |
167 seek_bytes=$(( (${PART_SIZE} * 2) + 512 )) | |
168 | |
169 # Set up loop device | |
170 LOOP_DEV=$(sudo losetup -f) | |
171 if [ -z "${LOOP_DEV}" ] | |
172 then | |
173 echo "No free loop device. Free up a loop device or reboot. exiting." | |
174 exit 1 | |
175 fi | |
176 | |
177 trap do_cleanup EXIT | |
178 | |
179 echo "Creating stateful partition..." | |
180 sudo losetup -o 512 "${LOOP_DEV}" "${FLAGS_to}" | |
181 sudo mkfs.ext3 -F -b 4096 -L C-STATE "${LOOP_DEV}" $(( ${PART_SIZE} / 4096 )) | |
182 if [ ${FLAGS_install_autotest} -eq ${FLAGS_TRUE} ] | |
183 then | |
184 sudo mount "${LOOP_DEV}" "${STATEFUL_DIR}" | |
185 install_autotest | 192 install_autotest |
186 fi | 193 fi |
187 sync | 194 |
188 sudo losetup -d "${LOOP_DEV}" | 195 # Write stateful partition to first partition. |
189 sync | 196 echo "Copying stateful partition ..." |
| 197 sudo "${SCRIPTS_DIR}"/file_copy.py \ |
| 198 if="${STATEFUL_IMG}" of="${FLAGS_to}" bs=4M \ |
| 199 seek_bytes=512 |
190 | 200 |
| 201 # Write root fs to third partition. |
| 202 echo "Copying root fs partition ..." |
| 203 sudo "${SCRIPTS_DIR}"/file_copy.py \ |
| 204 if="${ROOTFS_IMAGE}" of="${FLAGS_to}" bs=4M \ |
| 205 seek_bytes=$(( (${PART_SIZE} * 2) + 512 )) |
| 206 |
191 trap - EXIT | 207 trap - EXIT |
192 | 208 |
193 if [ ${FLAGS_copy_kernel} -eq ${FLAGS_TRUE} ] | 209 if [ ${FLAGS_copy_kernel} -eq ${FLAGS_TRUE} ] |
194 then | 210 then |
195 echo "Copying Kernel..." | 211 echo "Copying Kernel..." |
196 "${SCRIPTS_DIR}"/kernel_fetcher.sh \ | 212 "${SCRIPTS_DIR}"/kernel_fetcher.sh \ |
197 --from "${FLAGS_from}" \ | 213 --from "${FLAGS_from}" \ |
198 --to "${FLAGS_to}" \ | 214 --to "${FLAGS_to}" \ |
199 --offset "$(( (${PART_SIZE} * 3) + 512 ))" | 215 --offset "$(( (${PART_SIZE} * 3) + 512 ))" |
200 fi | 216 fi |
201 | 217 |
202 echo "Copying MBR..." | 218 echo "Copying MBR..." |
203 sudo "${SCRIPTS_DIR}"/file_copy.py \ | 219 sudo "${SCRIPTS_DIR}"/file_copy.py \ |
204 if="${FLAGS_from}/mbr.image" of="${FLAGS_to}" | 220 if="${FLAGS_from}/mbr.image" of="${FLAGS_to}" |
205 sync | 221 sync |
206 echo "Done." | 222 echo "Done." |
207 else | 223 else |
208 # Output to a file, so just cat the source images together | 224 # Output to a file, so just cat the source images together |
209 | 225 |
210 PART_SIZE=$(stat -c%s "${ROOTFS_IMAGE}") | 226 PART_SIZE=$(stat -c%s "${ROOTFS_IMAGE}") |
211 | 227 |
212 echo "Creating empty stateful partition" | 228 if [ ${FLAGS_install_autotest} -eq ${FLAGS_TRUE} ] ; then |
213 dd if=/dev/zero of="${FLAGS_from}/stateful_partition.image" bs=1 count=1 \ | |
214 seek=$((${PART_SIZE} - 1)) | |
215 mkfs.ext3 -F -L C-STATE "${FLAGS_from}/stateful_partition.image" | |
216 | |
217 if [ ${FLAGS_install_autotest} -eq ${FLAGS_TRUE} ] | |
218 then | |
219 sudo mount -o loop "${FLAGS_from}/stateful_partition.image" \ | |
220 "${STATEFUL_DIR}" | |
221 install_autotest | 229 install_autotest |
222 fi | 230 fi |
223 | 231 |
224 # Create a sparse output file | 232 # Create a sparse output file |
225 dd if=/dev/zero of="${FLAGS_to}" bs=1 count=1 \ | 233 dd if=/dev/zero of="${FLAGS_to}" bs=1 count=1 \ |
226 seek=$(( (${PART_SIZE} * 2) + 512 - 1)) | 234 seek=$(( (${PART_SIZE} * 2) + 512 - 1)) |
227 | 235 |
228 echo "Copying USB image to file ${FLAGS_to}..." | 236 echo "Copying USB image to file ${FLAGS_to}..." |
229 | 237 |
230 dd if="${FLAGS_from}/mbr.image" of="${FLAGS_to}" conv=notrunc | 238 dd if="${FLAGS_from}/mbr.image" of="${FLAGS_to}" conv=notrunc |
231 dd if="${FLAGS_from}/stateful_partition.image" of="${FLAGS_to}" seek=1 bs=512
\ | 239 dd if="${FLAGS_from}/stateful_partition.image" of="${FLAGS_to}" seek=1 bs=512
\ |
232 conv=notrunc | 240 conv=notrunc |
233 cat "${ROOTFS_IMAGE}" >> "${FLAGS_to}" | 241 cat "${ROOTFS_IMAGE}" >> "${FLAGS_to}" |
234 | 242 |
235 echo "Done. To copy to USB keyfob, outside the chroot, do something like:" | 243 echo "Done. To copy to USB keyfob, outside the chroot, do something like:" |
236 echo " sudo dd if=${FLAGS_to} of=/dev/sdb bs=4M" | 244 echo " sudo dd if=${FLAGS_to} of=/dev/sdb bs=4M" |
237 echo "where /dev/sdb is the entire keyfob." | 245 echo "where /dev/sdb is the entire keyfob." |
238 if [ ${INSIDE_CHROOT} -eq 1 ] | 246 if [ ${INSIDE_CHROOT} -eq 1 ] |
239 then | 247 then |
240 echo "NOTE: Since you are currently inside the chroot, and you'll need to" | 248 echo "NOTE: Since you are currently inside the chroot, and you'll need to" |
241 echo "run dd outside the chroot, the path to the USB image will be" | 249 echo "run dd outside the chroot, the path to the USB image will be" |
242 echo "different (ex: ~/chromeos/trunk/src/build/images/SOME_DIR/usb.img)." | 250 echo "different (ex: ~/chromeos/trunk/src/build/images/SOME_DIR/usb.img)." |
243 fi | 251 fi |
244 fi | 252 fi |
OLD | NEW |