Chromium Code Reviews
chromiumcodereview-hr@appspot.gserviceaccount.com (chromiumcodereview-hr) | Please choose your nickname with Settings | Help | Chromium Project | Gerrit Changes | Sign out
(167)

Side by Side Diff: enter_chroot.sh

Issue 5331009: crosutils: add scripts/.local_mounts to allow mounting additional (RO) folders in chroot Base URL: ssh://git@gitrw.chromium.org:9222/crosutils.git@master
Patch Set: Add into .gitignore, and refine local variable names Created 10 years ago
Use n/p to move between diff chunks; N/P to move between comments. Draft comments are only viewable by you.
Jump to:
View unified diff | Download patch | Annotate | Revision Log
« no previous file with comments | « .gitignore ('k') | no next file » | no next file with comments »
Toggle Intra-line Diffs ('i') | Expand Comments ('e') | Collapse Comments ('c') | Show Comments Hide Comments ('s')
OLDNEW
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 # 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 60 matching lines...) Expand 10 before | Expand all | Expand 10 after
71 FUSE_DEVICE="/dev/fuse" 71 FUSE_DEVICE="/dev/fuse"
72 AUTOMOUNT_PREF="/apps/nautilus/preferences/media_automount" 72 AUTOMOUNT_PREF="/apps/nautilus/preferences/media_automount"
73 SAVED_AUTOMOUNT_PREF_FILE="/tmp/.automount_pref" 73 SAVED_AUTOMOUNT_PREF_FILE="/tmp/.automount_pref"
74 74
75 sudo chmod 0777 "$FLAGS_chroot/var/lock" 75 sudo chmod 0777 "$FLAGS_chroot/var/lock"
76 76
77 LOCKFILE="$FLAGS_chroot/var/lock/enter_chroot" 77 LOCKFILE="$FLAGS_chroot/var/lock/enter_chroot"
78 78
79 function setup_env { 79 function setup_env {
80 ( 80 (
81 local mounted_path
81 flock 200 82 flock 200
82 echo $$ >> "$LOCKFILE" 83 echo $$ >> "$LOCKFILE"
83 84
84 info "Mounting chroot environment." 85 info "Mounting chroot environment."
85 86
86 # Mount only if not already mounted 87 # Mount only if not already mounted
87 MOUNTED_PATH="$(readlink -f "$FLAGS_chroot/proc")" 88 mounted_path="$(readlink -f "$FLAGS_chroot/proc")"
88 if [ -z "$(mount | grep -F "on $MOUNTED_PATH ")" ] 89 if [ -z "$(mount | grep -F "on $mounted_path ")" ]
89 then 90 then
90 sudo mount none -t proc "$MOUNTED_PATH" || \ 91 sudo mount none -t proc "$mounted_path" || \
91 die "Could not mount $MOUNTED_PATH" 92 die "Could not mount $mounted_path"
92 fi 93 fi
93 94
94 MOUNTED_PATH="$(readlink -f "$FLAGS_chroot/sys")" 95 mounted_path="$(readlink -f "$FLAGS_chroot/sys")"
95 if [ -z "$(mount | grep -F "on $MOUNTED_PATH ")" ] 96 if [ -z "$(mount | grep -F "on $mounted_path ")" ]
96 then 97 then
97 sudo mount none -t sysfs "$MOUNTED_PATH" || \ 98 sudo mount none -t sysfs "$mounted_path" || \
98 die "Could not mount $MOUNTED_PATH" 99 die "Could not mount $mounted_path"
99 fi 100 fi
100 101
101 MOUNTED_PATH="$(readlink -f "${FLAGS_chroot}/dev")" 102 mounted_path="$(readlink -f "${FLAGS_chroot}/dev")"
102 if [ -z "$(mount | grep -F "on $MOUNTED_PATH ")" ] 103 if [ -z "$(mount | grep -F "on $mounted_path ")" ]
103 then 104 then
104 sudo mount --bind /dev "$MOUNTED_PATH" || \ 105 sudo mount --bind /dev "$mounted_path" || \
105 die "Could not mount $MOUNTED_PATH" 106 die "Could not mount $mounted_path"
106 fi 107 fi
107 108
108 if [ $FLAGS_ssh_agent -eq $FLAGS_TRUE ]; then 109 if [ $FLAGS_ssh_agent -eq $FLAGS_TRUE ]; then
109 TARGET_DIR="$(readlink -f "${FLAGS_chroot}/home/${USER}/.ssh")" 110 TARGET_DIR="$(readlink -f "${FLAGS_chroot}/home/${USER}/.ssh")"
110 if [ -n "${SSH_AUTH_SOCK}" \ 111 if [ -n "${SSH_AUTH_SOCK}" \
111 -a -d "${HOME}/.ssh" ] 112 -a -d "${HOME}/.ssh" ]
112 then 113 then
113 mkdir -p "${TARGET_DIR}" 114 mkdir -p "${TARGET_DIR}"
114 cp -r "${HOME}/.ssh/known_hosts" "${TARGET_DIR}" 115 cp -r "${HOME}/.ssh/known_hosts" "${TARGET_DIR}"
115 ASOCK="$(dirname "${SSH_AUTH_SOCK}")" 116 ASOCK="$(dirname "${SSH_AUTH_SOCK}")"
116 mkdir -p "${FLAGS_chroot}/${ASOCK}" 117 mkdir -p "${FLAGS_chroot}/${ASOCK}"
117 sudo mount --bind "${ASOCK}" "${FLAGS_chroot}/${ASOCK}" || \ 118 sudo mount --bind "${ASOCK}" "${FLAGS_chroot}/${ASOCK}" || \
118 die "Count not mount ${ASOCK}" 119 die "Count not mount ${ASOCK}"
119 fi 120 fi
120 fi 121 fi
121 122
122 MOUNTED_PATH="$(readlink -f "${FLAGS_chroot}/dev/pts")" 123 mounted_path="$(readlink -f "${FLAGS_chroot}/dev/pts")"
123 if [ -z "$(mount | grep -F "on $MOUNTED_PATH ")" ] 124 if [ -z "$(mount | grep -F "on $mounted_path ")" ]
124 then 125 then
125 sudo mount none -t devpts "$MOUNTED_PATH" || \ 126 sudo mount none -t devpts "$mounted_path" || \
126 die "Could not mount $MOUNTED_PATH" 127 die "Could not mount $mounted_path"
127 fi 128 fi
128 129
129 MOUNTED_PATH="$(readlink -f "${FLAGS_chroot}$CHROOT_TRUNK_DIR")" 130 mounted_path="$(readlink -f "${FLAGS_chroot}$CHROOT_TRUNK_DIR")"
130 if [ -z "$(mount | grep -F "on $MOUNTED_PATH ")" ] 131 if [ -z "$(mount | grep -F "on $mounted_path ")" ]
131 then 132 then
132 sudo mount --bind "$FLAGS_trunk" "$MOUNTED_PATH" || \ 133 sudo mount --bind "$FLAGS_trunk" "$mounted_path" || \
133 die "Could not mount $MOUNTED_PATH" 134 die "Could not mount $mounted_path"
134 fi 135 fi
135 136
136 MOUNTED_PATH="$(readlink -f "${FLAGS_chroot}${INNER_CHROME_ROOT}")" 137 mounted_path="$(readlink -f "${FLAGS_chroot}${INNER_CHROME_ROOT}")"
137 if [ -z "$(mount | grep -F "on $MOUNTED_PATH ")" ] 138 if [ -z "$(mount | grep -F "on $mounted_path ")" ]
138 then 139 then
139 ! CHROME_ROOT="$(readlink -f "$FLAGS_chrome_root")" 140 ! CHROME_ROOT="$(readlink -f "$FLAGS_chrome_root")"
140 if [ -z "$CHROME_ROOT" ]; then 141 if [ -z "$CHROME_ROOT" ]; then
141 ! CHROME_ROOT="$(cat "${FLAGS_chroot}${CHROME_ROOT_CONFIG}" \ 142 ! CHROME_ROOT="$(cat "${FLAGS_chroot}${CHROME_ROOT_CONFIG}" \
142 2>/dev/null)" 143 2>/dev/null)"
143 fi 144 fi
144 if [[ ( -z "$CHROME_ROOT" ) || ( ! -d "${CHROME_ROOT}/src" ) ]]; then 145 if [[ ( -z "$CHROME_ROOT" ) || ( ! -d "${CHROME_ROOT}/src" ) ]]; then
145 info "Not mounting chrome source" 146 info "Not mounting chrome source"
146 sudo rm -f "${FLAGS_chroot}${CHROME_ROOT_CONFIG}" 147 sudo rm -f "${FLAGS_chroot}${CHROME_ROOT_CONFIG}"
147 else 148 else
148 info "Mounting chrome source at: $INNER_CHROME_ROOT" 149 info "Mounting chrome source at: $INNER_CHROME_ROOT"
149 echo "$CHROME_ROOT" | \ 150 echo "$CHROME_ROOT" | \
150 sudo dd of="${FLAGS_chroot}${CHROME_ROOT_CONFIG}" 151 sudo dd of="${FLAGS_chroot}${CHROME_ROOT_CONFIG}"
151 mkdir -p "$MOUNTED_PATH" 152 mkdir -p "$mounted_path"
152 sudo mount --bind "$CHROME_ROOT" "$MOUNTED_PATH" || \ 153 sudo mount --bind "$CHROME_ROOT" "$mounted_path" || \
153 die "Could not mount $MOUNTED_PATH" 154 die "Could not mount $mounted_path"
154 fi 155 fi
155 fi 156 fi
156 157
157 MOUNTED_PATH="$(readlink -f "${FLAGS_chroot}${INNER_DEPOT_TOOLS_ROOT}")" 158 mounted_path="$(readlink -f "${FLAGS_chroot}${INNER_DEPOT_TOOLS_ROOT}")"
158 if [ -z "$(mount | grep -F "on $MOUNTED_PATH ")" ] 159 if [ -z "$(mount | grep -F "on $mounted_path ")" ]
159 then 160 then
160 if [ $(which gclient 2>/dev/null) ]; then 161 if [ $(which gclient 2>/dev/null) ]; then
161 info "Mounting depot_tools" 162 info "Mounting depot_tools"
162 DEPOT_TOOLS=$(dirname $(which gclient) ) 163 DEPOT_TOOLS=$(dirname $(which gclient) )
163 mkdir -p "$MOUNTED_PATH" 164 mkdir -p "$mounted_path"
164 if ! sudo mount --bind "$DEPOT_TOOLS" "$MOUNTED_PATH"; then 165 if ! sudo mount --bind "$DEPOT_TOOLS" "$mounted_path"; then
165 warn "depot_tools failed to mount; perhaps it's on NFS?" 166 warn "depot_tools failed to mount; perhaps it's on NFS?"
166 warn "This may impact chromium build." 167 warn "This may impact chromium build."
167 fi 168 fi
168 fi 169 fi
169 fi 170 fi
170 171
171 # Install fuse module. 172 # Install fuse module.
172 if [ -c "${FUSE_DEVICE}" ] ; then 173 if [ -c "${FUSE_DEVICE}" ] ; then
173 sudo modprobe fuse 2> /dev/null ||\ 174 sudo modprobe fuse 2> /dev/null ||\
174 warn "-- Note: modprobe fuse failed. gmergefs will not work" 175 warn "-- Note: modprobe fuse failed. gmergefs will not work"
175 fi 176 fi
176 177
177 # Turn off automounting of external media when we enter the 178 # Turn off automounting of external media when we enter the
178 # chroot; thus we don't have to worry about being able to unmount 179 # chroot; thus we don't have to worry about being able to unmount
179 # from inside. 180 # from inside.
180 if [ $(which gconftool-2 2>/dev/null) ]; then 181 if [ $(which gconftool-2 2>/dev/null) ]; then
181 gconftool-2 -g ${AUTOMOUNT_PREF} > \ 182 gconftool-2 -g ${AUTOMOUNT_PREF} > \
182 "${FLAGS_chroot}${SAVED_AUTOMOUNT_PREF_FILE}" 183 "${FLAGS_chroot}${SAVED_AUTOMOUNT_PREF_FILE}"
183 if [ $(gconftool-2 -s --type=boolean ${AUTOMOUNT_PREF} false) ]; then 184 if [ $(gconftool-2 -s --type=boolean ${AUTOMOUNT_PREF} false) ]; then
184 warn "-- Note: USB sticks may be automounted by your host OS." 185 warn "-- Note: USB sticks may be automounted by your host OS."
185 warn "-- Note: If you plan to burn bootable media, you may need to" 186 warn "-- Note: If you plan to burn bootable media, you may need to"
186 warn "-- Note: unmount these devices manually, or run image_to_usb.sh" 187 warn "-- Note: unmount these devices manually, or run image_to_usb.sh"
187 warn "-- Note: outside the chroot." 188 warn "-- Note: outside the chroot."
188 fi 189 fi
189 fi 190 fi
190 191
192 # Mount additional directories
193 local local_mounts="${FLAGS_trunk}/src/scripts/.local_mounts"
194 if [ -f "${local_mounts}" ]; then
195 info "Mounting local folders (read-only for safety concern)"
196 # format: mount_source
197 # or mount_source mount_point
198 # or # comments
199 local mount_source mount_point
200 cat "${local_mounts}" | while read mount_source mount_point; do
201 if [ "$(echo "${mount_source}" | cut -b 1)" = "#" ] ||
202 [ -z "${mount_source}" ]; then
203 continue
204 fi
205 # if only source is assigned, use source as mount point.
206 mount_point="${mount_point:-$mount_source}"
207 mounted_path="$(readlink -f "${FLAGS_chroot}${mount_point}")"
208 if [ -z "$(mount | grep -F "on ${mounted_path} ")" ]
209 then
210 # --bind can't be initialized as RO, so we have to use "ro,remount".
211 (sudo mount --bind "${mount_source}" "${mounted_path}" &&
212 sudo mount -o ro,remount "${mounted_path}") ||
213 die "Failed to mount ${mounted_path} from ${mount_source}."
214 fi
215 done
216 fi
217
191 ) 200>>"$LOCKFILE" || die "setup_env failed" 218 ) 200>>"$LOCKFILE" || die "setup_env failed"
192 } 219 }
193 220
194 function teardown_env { 221 function teardown_env {
195 # Only teardown if we're the last enter_chroot to die 222 # Only teardown if we're the last enter_chroot to die
196 ( 223 (
224 local mounted_path
197 flock 200 225 flock 200
198 226
199 # check each pid in $LOCKFILE to see if it's died unexpectedly 227 # check each pid in $LOCKFILE to see if it's died unexpectedly
200 TMP_LOCKFILE="$LOCKFILE.tmp" 228 TMP_LOCKFILE="$LOCKFILE.tmp"
201 229
202 echo -n > "$TMP_LOCKFILE" # Erase/reset temp file 230 echo -n > "$TMP_LOCKFILE" # Erase/reset temp file
203 cat "$LOCKFILE" | while read PID; do 231 cat "$LOCKFILE" | while read PID; do
204 if [ "$PID" = "$$" ]; then 232 if [ "$PID" = "$$" ]; then
205 # ourself, leave PROC_NAME empty 233 # ourself, leave PROC_NAME empty
206 PROC_NAME="" 234 PROC_NAME=""
(...skipping 12 matching lines...) Expand all
219 if [ $(which gconftool-2 2>/dev/null) ]; then 247 if [ $(which gconftool-2 2>/dev/null) ]; then
220 SAVED_PREF=$(cat "${FLAGS_chroot}${SAVED_AUTOMOUNT_PREF_FILE}") 248 SAVED_PREF=$(cat "${FLAGS_chroot}${SAVED_AUTOMOUNT_PREF_FILE}")
221 gconftool-2 -s --type=boolean ${AUTOMOUNT_PREF} ${SAVED_PREF} || \ 249 gconftool-2 -s --type=boolean ${AUTOMOUNT_PREF} ${SAVED_PREF} || \
222 warn "could not re-set your automount preference." 250 warn "could not re-set your automount preference."
223 fi 251 fi
224 252
225 if [ -s "$LOCKFILE" ]; then 253 if [ -s "$LOCKFILE" ]; then
226 info "At least one other pid is running in the chroot, so not" 254 info "At least one other pid is running in the chroot, so not"
227 info "tearing down env." 255 info "tearing down env."
228 else 256 else
229 MOUNTED_PATH=$(readlink -f "$FLAGS_chroot") 257 mounted_path=$(readlink -f "$FLAGS_chroot")
230 info "Unmounting chroot environment." 258 info "Unmounting chroot environment."
231 # sort the list of mounts in reverse order, to ensure umount of 259 # sort the list of mounts in reverse order, to ensure umount of
232 # cascading mounts in proper order 260 # cascading mounts in proper order
233 for i in \ 261 for i in \
234 $(mount | grep -F "on $MOUNTED_PATH/" | sort -r | awk '{print $3}'); do 262 $(mount | grep -F "on $mounted_path/" | sort -r | awk '{print $3}'); do
235 safe_umount "$i" 263 safe_umount "$i"
236 done 264 done
237 fi 265 fi
238 ) 200>>"$LOCKFILE" || die "teardown_env failed" 266 ) 200>>"$LOCKFILE" || die "teardown_env failed"
239 } 267 }
240 268
241 if [ $FLAGS_mount -eq $FLAGS_TRUE ] 269 if [ $FLAGS_mount -eq $FLAGS_TRUE ]
242 then 270 then
243 setup_env 271 setup_env
244 info "Make sure you run" 272 info "Make sure you run"
(...skipping 56 matching lines...) Expand 10 before | Expand all | Expand 10 after
301 # Run command or interactive shell. Also include the non-chrooted path to 329 # Run command or interactive shell. Also include the non-chrooted path to
302 # the source trunk for scripts that may need to print it (e.g. 330 # the source trunk for scripts that may need to print it (e.g.
303 # build_image.sh). 331 # build_image.sh).
304 sudo chroot "$FLAGS_chroot" sudo -i -u $USER $CHROOT_PASSTHRU \ 332 sudo chroot "$FLAGS_chroot" sudo -i -u $USER $CHROOT_PASSTHRU \
305 EXTERNAL_TRUNK_PATH="${FLAGS_trunk}" LANG=C SSH_AGENT_PID="${SSH_AGENT_PID}" \ 333 EXTERNAL_TRUNK_PATH="${FLAGS_trunk}" LANG=C SSH_AGENT_PID="${SSH_AGENT_PID}" \
306 SSH_AUTH_SOCK="${SSH_AUTH_SOCK}" -- "$@" 334 SSH_AUTH_SOCK="${SSH_AUTH_SOCK}" -- "$@"
307 335
308 # Remove trap and explicitly unmount 336 # Remove trap and explicitly unmount
309 trap - EXIT 337 trap - EXIT
310 teardown_env 338 teardown_env
OLDNEW
« no previous file with comments | « .gitignore ('k') | no next file » | no next file with comments »

Powered by Google App Engine
This is Rietveld 408576698