| 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 enter the chroot environment | 7 # Script to enter the chroot environment |
| 8 | 8 |
| 9 # Load common constants. This should be the first executable line. | 9 # --- BEGIN COMMON.SH BOILERPLATE --- |
| 10 # The path to common.sh should be relative to your script's location. | 10 # Load common CrOS utilities. Inside the chroot this file is installed in |
| 11 . "$(dirname "$0")/common.sh" | 11 # /usr/lib/crosutils. Outside the chroot we find it relative to the script's |
| 12 # location. |
| 13 find_common_sh() { |
| 14 local common_paths=(/usr/lib/crosutils $(dirname "$(readlink -f "$0")")) |
| 15 local path |
| 16 |
| 17 SCRIPT_ROOT= |
| 18 for path in "${common_paths[@]}"; do |
| 19 if [ -r "${path}/common.sh" ]; then |
| 20 SCRIPT_ROOT=${path} |
| 21 break |
| 22 fi |
| 23 done |
| 24 } |
| 25 |
| 26 find_common_sh |
| 27 . "${SCRIPT_ROOT}/common.sh" || (echo "Unable to load common.sh" && exit 1) |
| 28 # --- END COMMON.SH BOILERPLATE --- |
| 12 | 29 |
| 13 # Script must be run outside the chroot and as a regular user. | 30 # Script must be run outside the chroot and as a regular user. |
| 14 assert_outside_chroot | 31 assert_outside_chroot |
| 15 assert_not_root_user | 32 assert_not_root_user |
| 16 | 33 |
| 17 # Define command line flags | 34 # Define command line flags |
| 18 # See http://code.google.com/p/shflags/wiki/Documentation10x | 35 # See http://code.google.com/p/shflags/wiki/Documentation10x |
| 19 DEFINE_string chroot "$DEFAULT_CHROOT_DIR" \ | 36 DEFINE_string chroot "$DEFAULT_CHROOT_DIR" \ |
| 20 "The destination dir for the chroot environment." "d" | 37 "The destination dir for the chroot environment." "d" |
| 21 DEFINE_string trunk "$GCLIENT_ROOT" \ | 38 DEFINE_string trunk "$GCLIENT_ROOT" \ |
| (...skipping 58 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
| 80 fi | 97 fi |
| 81 shift | 98 shift |
| 82 done | 99 done |
| 83 eval set -- "${_FLAGS_FIXED}" | 100 eval set -- "${_FLAGS_FIXED}" |
| 84 | 101 |
| 85 | 102 |
| 86 # Parse command line flags | 103 # Parse command line flags |
| 87 FLAGS "$@" || exit 1 | 104 FLAGS "$@" || exit 1 |
| 88 eval set -- "${FLAGS_ARGV}" | 105 eval set -- "${FLAGS_ARGV}" |
| 89 | 106 |
| 90 if [ $FLAGS_official_build -eq $FLAGS_TRUE ] | 107 if [ $FLAGS_official_build -eq $FLAGS_TRUE ]; then |
| 91 then | |
| 92 CHROMEOS_OFFICIAL=1 | 108 CHROMEOS_OFFICIAL=1 |
| 93 fi | 109 fi |
| 94 | 110 |
| 95 # Only now can we die on error. shflags functions leak non-zero error codes, | 111 # Only now can we die on error. shflags functions leak non-zero error codes, |
| 96 # so will die prematurely if 'set -e' is specified before now. | 112 # so will die prematurely if 'set -e' is specified before now. |
| 97 # TODO: replace shflags with something less error-prone, or contribute a fix. | 113 # TODO: replace shflags with something less error-prone, or contribute a fix. |
| 98 set -e | 114 set -e |
| 99 | 115 |
| 100 INNER_CHROME_ROOT=$FLAGS_chrome_root_mount # inside chroot | 116 INNER_CHROME_ROOT=$FLAGS_chrome_root_mount # inside chroot |
| 101 CHROME_ROOT_CONFIG="/var/cache/chrome_root" # inside chroot | 117 CHROME_ROOT_CONFIG="/var/cache/chrome_root" # inside chroot |
| 102 INNER_DEPOT_TOOLS_ROOT="/home/$USER/depot_tools" # inside chroot | 118 INNER_DEPOT_TOOLS_ROOT="/home/$USER/depot_tools" # inside chroot |
| 103 FUSE_DEVICE="/dev/fuse" | 119 FUSE_DEVICE="/dev/fuse" |
| 104 AUTOMOUNT_PREF="/apps/nautilus/preferences/media_automount" | 120 AUTOMOUNT_PREF="/apps/nautilus/preferences/media_automount" |
| 105 SAVED_AUTOMOUNT_PREF_FILE="/tmp/.automount_pref" | 121 SAVED_AUTOMOUNT_PREF_FILE="/tmp/.automount_pref" |
| 106 | 122 |
| 107 sudo chmod 0777 "$FLAGS_chroot/var/lock" | 123 sudo chmod 0777 "$FLAGS_chroot/var/lock" |
| 108 | 124 |
| 109 LOCKFILE="$FLAGS_chroot/var/lock/enter_chroot" | 125 LOCKFILE="$FLAGS_chroot/var/lock/enter_chroot" |
| 110 | 126 |
| 111 function setup_env { | 127 function setup_env { |
| 112 ( | 128 ( |
| 113 flock 200 | 129 flock 200 |
| 114 echo $$ >> "$LOCKFILE" | 130 echo $$ >> "$LOCKFILE" |
| 115 | 131 |
| 116 info "Mounting chroot environment." | 132 info "Mounting chroot environment." |
| 117 | 133 |
| 118 # Mount only if not already mounted | 134 # Mount only if not already mounted |
| 119 MOUNTED_PATH="$(readlink -f "$FLAGS_chroot/proc")" | 135 MOUNTED_PATH="$(readlink -f "$FLAGS_chroot/proc")" |
| 120 if [ -z "$(mount | grep -F "on $MOUNTED_PATH ")" ] | 136 if [ -z "$(mount | grep -F "on $MOUNTED_PATH ")" ]; then |
| 121 then | |
| 122 sudo mount none -t proc "$MOUNTED_PATH" || \ | 137 sudo mount none -t proc "$MOUNTED_PATH" || \ |
| 123 die "Could not mount $MOUNTED_PATH" | 138 die "Could not mount $MOUNTED_PATH" |
| 124 fi | 139 fi |
| 125 | 140 |
| 126 MOUNTED_PATH="$(readlink -f "$FLAGS_chroot/sys")" | 141 MOUNTED_PATH="$(readlink -f "$FLAGS_chroot/sys")" |
| 127 if [ -z "$(mount | grep -F "on $MOUNTED_PATH ")" ] | 142 if [ -z "$(mount | grep -F "on $MOUNTED_PATH ")" ]; then |
| 128 then | |
| 129 sudo mount none -t sysfs "$MOUNTED_PATH" || \ | 143 sudo mount none -t sysfs "$MOUNTED_PATH" || \ |
| 130 die "Could not mount $MOUNTED_PATH" | 144 die "Could not mount $MOUNTED_PATH" |
| 131 fi | 145 fi |
| 132 | 146 |
| 133 MOUNTED_PATH="$(readlink -f "${FLAGS_chroot}/dev")" | 147 MOUNTED_PATH="$(readlink -f "${FLAGS_chroot}/dev")" |
| 134 if [ -z "$(mount | grep -F "on $MOUNTED_PATH ")" ] | 148 if [ -z "$(mount | grep -F "on $MOUNTED_PATH ")" ]; then |
| 135 then | |
| 136 sudo mount --bind /dev "$MOUNTED_PATH" || \ | 149 sudo mount --bind /dev "$MOUNTED_PATH" || \ |
| 137 die "Could not mount $MOUNTED_PATH" | 150 die "Could not mount $MOUNTED_PATH" |
| 138 fi | 151 fi |
| 139 | 152 |
| 140 if [ $FLAGS_ssh_agent -eq $FLAGS_TRUE ]; then | 153 if [ $FLAGS_ssh_agent -eq $FLAGS_TRUE ]; then |
| 141 TARGET_DIR="$(readlink -f "${FLAGS_chroot}/home/${USER}/.ssh")" | 154 TARGET_DIR="$(readlink -f "${FLAGS_chroot}/home/${USER}/.ssh")" |
| 142 if [ -n "${SSH_AUTH_SOCK}" \ | 155 if [ -n "${SSH_AUTH_SOCK}" -a -d "${HOME}/.ssh" ]; then |
| 143 -a -d "${HOME}/.ssh" ] | |
| 144 then | |
| 145 mkdir -p "${TARGET_DIR}" | 156 mkdir -p "${TARGET_DIR}" |
| 146 cp -r "${HOME}/.ssh/known_hosts" "${TARGET_DIR}" | 157 cp -r "${HOME}/.ssh/known_hosts" "${TARGET_DIR}" |
| 147 cp -r "${HOME}/.ssh/config" "${TARGET_DIR}" | 158 cp -r "${HOME}/.ssh/config" "${TARGET_DIR}" |
| 148 ASOCK="$(dirname "${SSH_AUTH_SOCK}")" | 159 ASOCK="$(dirname "${SSH_AUTH_SOCK}")" |
| 149 mkdir -p "${FLAGS_chroot}/${ASOCK}" | 160 mkdir -p "${FLAGS_chroot}/${ASOCK}" |
| 150 sudo mount --bind "${ASOCK}" "${FLAGS_chroot}/${ASOCK}" || \ | 161 sudo mount --bind "${ASOCK}" "${FLAGS_chroot}/${ASOCK}" || \ |
| 151 die "Count not mount ${ASOCK}" | 162 die "Count not mount ${ASOCK}" |
| 152 fi | 163 fi |
| 153 fi | 164 fi |
| 154 | 165 |
| 155 MOUNTED_PATH="$(readlink -f "${FLAGS_chroot}/dev/pts")" | 166 MOUNTED_PATH="$(readlink -f "${FLAGS_chroot}/dev/pts")" |
| 156 if [ -z "$(mount | grep -F "on $MOUNTED_PATH ")" ] | 167 if [ -z "$(mount | grep -F "on $MOUNTED_PATH ")" ]; then |
| 157 then | |
| 158 sudo mount none -t devpts "$MOUNTED_PATH" || \ | 168 sudo mount none -t devpts "$MOUNTED_PATH" || \ |
| 159 die "Could not mount $MOUNTED_PATH" | 169 die "Could not mount $MOUNTED_PATH" |
| 160 fi | 170 fi |
| 161 | 171 |
| 162 MOUNTED_PATH="$(readlink -f "${FLAGS_chroot}$CHROOT_TRUNK_DIR")" | 172 MOUNTED_PATH="$(readlink -f "${FLAGS_chroot}$CHROOT_TRUNK_DIR")" |
| 163 if [ -z "$(mount | grep -F "on $MOUNTED_PATH ")" ] | 173 if [ -z "$(mount | grep -F "on $MOUNTED_PATH ")" ]; then |
| 164 then | |
| 165 sudo mount --bind "$FLAGS_trunk" "$MOUNTED_PATH" || \ | 174 sudo mount --bind "$FLAGS_trunk" "$MOUNTED_PATH" || \ |
| 166 die "Could not mount $MOUNTED_PATH" | 175 die "Could not mount $MOUNTED_PATH" |
| 167 fi | 176 fi |
| 168 | 177 |
| 169 MOUNTED_PATH="$(readlink -f "${FLAGS_chroot}${INNER_CHROME_ROOT}")" | 178 MOUNTED_PATH="$(readlink -f "${FLAGS_chroot}${INNER_CHROME_ROOT}")" |
| 170 if [ -z "$(mount | grep -F "on $MOUNTED_PATH ")" ] | 179 if [ -z "$(mount | grep -F "on $MOUNTED_PATH ")" ]; then |
| 171 then | |
| 172 ! CHROME_ROOT="$(readlink -f "$FLAGS_chrome_root")" | 180 ! CHROME_ROOT="$(readlink -f "$FLAGS_chrome_root")" |
| 173 if [ -z "$CHROME_ROOT" ]; then | 181 if [ -z "$CHROME_ROOT" ]; then |
| 174 ! CHROME_ROOT="$(cat "${FLAGS_chroot}${CHROME_ROOT_CONFIG}" \ | 182 ! CHROME_ROOT="$(cat "${FLAGS_chroot}${CHROME_ROOT_CONFIG}" \ |
| 175 2>/dev/null)" | 183 2>/dev/null)" |
| 176 fi | 184 fi |
| 177 if [[ ( -z "$CHROME_ROOT" ) || ( ! -d "${CHROME_ROOT}/src" ) ]]; then | 185 if [[ ( -z "$CHROME_ROOT" ) || ( ! -d "${CHROME_ROOT}/src" ) ]]; then |
| 178 info "Not mounting chrome source" | 186 info "Not mounting chrome source" |
| 179 sudo rm -f "${FLAGS_chroot}${CHROME_ROOT_CONFIG}" | 187 sudo rm -f "${FLAGS_chroot}${CHROME_ROOT_CONFIG}" |
| 180 else | 188 else |
| 181 info "Mounting chrome source at: $INNER_CHROME_ROOT" | 189 info "Mounting chrome source at: $INNER_CHROME_ROOT" |
| 182 echo "$CHROME_ROOT" | \ | 190 echo "$CHROME_ROOT" | \ |
| 183 sudo dd of="${FLAGS_chroot}${CHROME_ROOT_CONFIG}" | 191 sudo dd of="${FLAGS_chroot}${CHROME_ROOT_CONFIG}" |
| 184 mkdir -p "$MOUNTED_PATH" | 192 mkdir -p "$MOUNTED_PATH" |
| 185 sudo mount --bind "$CHROME_ROOT" "$MOUNTED_PATH" || \ | 193 sudo mount --bind "$CHROME_ROOT" "$MOUNTED_PATH" || \ |
| 186 die "Could not mount $MOUNTED_PATH" | 194 die "Could not mount $MOUNTED_PATH" |
| 187 fi | 195 fi |
| 188 fi | 196 fi |
| 189 | 197 |
| 190 MOUNTED_PATH="$(readlink -f "${FLAGS_chroot}${INNER_DEPOT_TOOLS_ROOT}")" | 198 MOUNTED_PATH="$(readlink -f "${FLAGS_chroot}${INNER_DEPOT_TOOLS_ROOT}")" |
| 191 if [ -z "$(mount | grep -F "on $MOUNTED_PATH ")" ] | 199 if [ -z "$(mount | grep -F "on $MOUNTED_PATH ")" ]; then |
| 192 then | |
| 193 if [ $(which gclient 2>/dev/null) ]; then | 200 if [ $(which gclient 2>/dev/null) ]; then |
| 194 info "Mounting depot_tools" | 201 info "Mounting depot_tools" |
| 195 DEPOT_TOOLS=$(dirname $(which gclient) ) | 202 DEPOT_TOOLS=$(dirname "$(which gclient)") |
| 196 mkdir -p "$MOUNTED_PATH" | 203 mkdir -p "$MOUNTED_PATH" |
| 197 if ! sudo mount --bind "$DEPOT_TOOLS" "$MOUNTED_PATH"; then | 204 if ! sudo mount --bind "$DEPOT_TOOLS" "$MOUNTED_PATH"; then |
| 198 warn "depot_tools failed to mount; perhaps it's on NFS?" | 205 warn "depot_tools failed to mount; perhaps it's on NFS?" |
| 199 warn "This may impact chromium build." | 206 warn "This may impact chromium build." |
| 200 fi | 207 fi |
| 201 fi | 208 fi |
| 202 fi | 209 fi |
| 203 | 210 |
| 204 # Install fuse module. | 211 # Install fuse module. |
| 205 if [ -c "${FUSE_DEVICE}" ] ; then | 212 if [ -c "${FUSE_DEVICE}" ]; then |
| 206 sudo modprobe fuse 2> /dev/null ||\ | 213 sudo modprobe fuse 2> /dev/null ||\ |
| 207 warn "-- Note: modprobe fuse failed. gmergefs will not work" | 214 warn "-- Note: modprobe fuse failed. gmergefs will not work" |
| 208 fi | 215 fi |
| 209 | 216 |
| 210 # Turn off automounting of external media when we enter the | 217 # Turn off automounting of external media when we enter the |
| 211 # chroot; thus we don't have to worry about being able to unmount | 218 # chroot; thus we don't have to worry about being able to unmount |
| 212 # from inside. | 219 # from inside. |
| 213 if [ $(which gconftool-2 2>/dev/null) ]; then | 220 if [ $(which gconftool-2 2>/dev/null) ]; then |
| 214 gconftool-2 -g ${AUTOMOUNT_PREF} > \ | 221 gconftool-2 -g ${AUTOMOUNT_PREF} > \ |
| 215 "${FLAGS_chroot}${SAVED_AUTOMOUNT_PREF_FILE}" | 222 "${FLAGS_chroot}${SAVED_AUTOMOUNT_PREF_FILE}" |
| (...skipping 48 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
| 264 # sort the list of mounts in reverse order, to ensure umount of | 271 # sort the list of mounts in reverse order, to ensure umount of |
| 265 # cascading mounts in proper order | 272 # cascading mounts in proper order |
| 266 for i in \ | 273 for i in \ |
| 267 $(mount | grep -F "on $MOUNTED_PATH/" | sort -r | awk '{print $3}'); do | 274 $(mount | grep -F "on $MOUNTED_PATH/" | sort -r | awk '{print $3}'); do |
| 268 safe_umount "$i" | 275 safe_umount "$i" |
| 269 done | 276 done |
| 270 fi | 277 fi |
| 271 ) 200>>"$LOCKFILE" || die "teardown_env failed" | 278 ) 200>>"$LOCKFILE" || die "teardown_env failed" |
| 272 } | 279 } |
| 273 | 280 |
| 274 if [ $FLAGS_mount -eq $FLAGS_TRUE ] | 281 if [ $FLAGS_mount -eq $FLAGS_TRUE ]; then |
| 275 then | |
| 276 setup_env | 282 setup_env |
| 277 info "Make sure you run" | 283 info "Make sure you run" |
| 278 info " $0 --unmount" | 284 info " $0 --unmount" |
| 279 info "before deleting $FLAGS_chroot" | 285 info "before deleting $FLAGS_chroot" |
| 280 info "or you'll end up deleting $FLAGS_trunk too!" | 286 info "or you'll end up deleting $FLAGS_trunk too!" |
| 281 exit 0 | 287 exit 0 |
| 282 fi | 288 fi |
| 283 | 289 |
| 284 if [ $FLAGS_unmount -eq $FLAGS_TRUE ] | 290 if [ $FLAGS_unmount -eq $FLAGS_TRUE ]; then |
| 285 then | |
| 286 teardown_env | 291 teardown_env |
| 287 exit 0 | 292 exit 0 |
| 288 fi | 293 fi |
| 289 | 294 |
| 290 # Apply any hacks needed to update the chroot. | 295 # Apply any hacks needed to update the chroot. |
| 291 chroot_hacks_from_outside "${FLAGS_chroot}" | 296 chroot_hacks_from_outside "${FLAGS_chroot}" |
| 292 | 297 |
| 293 | 298 |
| 294 # Make sure we unmount before exiting | 299 # Make sure we unmount before exiting |
| 295 trap teardown_env EXIT | 300 trap teardown_env EXIT |
| (...skipping 43 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
| 339 # Run command or interactive shell. Also include the non-chrooted path to | 344 # Run command or interactive shell. Also include the non-chrooted path to |
| 340 # the source trunk for scripts that may need to print it (e.g. | 345 # the source trunk for scripts that may need to print it (e.g. |
| 341 # build_image.sh). | 346 # build_image.sh). |
| 342 sudo -- chroot "$FLAGS_chroot" sudo -i -u $USER $CHROOT_PASSTHRU \ | 347 sudo -- chroot "$FLAGS_chroot" sudo -i -u $USER $CHROOT_PASSTHRU \ |
| 343 EXTERNAL_TRUNK_PATH="${FLAGS_trunk}" LANG=C SSH_AGENT_PID="${SSH_AGENT_PID}" \ | 348 EXTERNAL_TRUNK_PATH="${FLAGS_trunk}" LANG=C SSH_AGENT_PID="${SSH_AGENT_PID}" \ |
| 344 SSH_AUTH_SOCK="${SSH_AUTH_SOCK}" "$@" | 349 SSH_AUTH_SOCK="${SSH_AUTH_SOCK}" "$@" |
| 345 | 350 |
| 346 # Remove trap and explicitly unmount | 351 # Remove trap and explicitly unmount |
| 347 trap - EXIT | 352 trap - EXIT |
| 348 teardown_env | 353 teardown_env |
| OLD | NEW |