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

Side by Side Diff: src/scripts/enter_chroot.sh

Issue 584010: Chroot: allow multiple simultaneous entry. (Closed)
Patch Set: fix for review Created 10 years, 10 months 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
« no previous file with comments | « no previous file | 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 41 matching lines...) Expand 10 before | Expand all | Expand 10 after
52 if [ $FLAGS_official_build -eq $FLAGS_TRUE ] 52 if [ $FLAGS_official_build -eq $FLAGS_TRUE ]
53 then 53 then
54 CHROMEOS_OFFICIAL=1 54 CHROMEOS_OFFICIAL=1
55 fi 55 fi
56 56
57 # Only now can we die on error. shflags functions leak non-zero error codes, 57 # Only now can we die on error. shflags functions leak non-zero error codes,
58 # so will die prematurely if 'set -e' is specified before now. 58 # so will die prematurely if 'set -e' is specified before now.
59 # TODO: replace shflags with something less error-prone, or contribute a fix. 59 # TODO: replace shflags with something less error-prone, or contribute a fix.
60 set -e 60 set -e
61 61
62 sudo chmod 0777 "$FLAGS_chroot/var/lock"
63
64 LOCKFILE="$FLAGS_chroot/var/lock/enter_chroot"
65
62 function setup_env { 66 function setup_env {
63 echo "Mounting chroot environment." 67 (
68 flock 200
69 echo $$ >> "$LOCKFILE"
64 70
65 # Mount only if not already mounted 71 echo "Mounting chroot environment."
66 MOUNTED_PATH="$(readlink -f "$FLAGS_chroot/proc")"
67 if [ -z "$(mount | grep -F "on $MOUNTED_PATH")" ]
68 then
69 sudo mount none -t proc "$MOUNTED_PATH"
70 fi
71 72
72 MOUNTED_PATH="$(readlink -f "$FLAGS_chroot/dev/pts")" 73 # Mount only if not already mounted
73 if [ -z "$(mount | grep -F "on $MOUNTED_PATH")" ] 74 MOUNTED_PATH="$(readlink -f "$FLAGS_chroot/proc")"
74 then 75 if [ -z "$(mount | grep -F "on $MOUNTED_PATH")" ]
75 sudo mount none -t devpts "$MOUNTED_PATH" 76 then
76 fi 77 sudo mount none -t proc "$MOUNTED_PATH"
78 fi
77 79
78 MOUNTED_PATH="$(readlink -f "${FLAGS_chroot}$CHROOT_TRUNK_DIR")" 80 MOUNTED_PATH="$(readlink -f "$FLAGS_chroot/dev/pts")"
79 if [ -z "$(mount | grep -F "on $MOUNTED_PATH")" ] 81 if [ -z "$(mount | grep -F "on $MOUNTED_PATH")" ]
80 then 82 then
81 sudo mount --bind "$FLAGS_trunk" "$MOUNTED_PATH" 83 sudo mount none -t devpts "$MOUNTED_PATH"
82 fi 84 fi
85
86 MOUNTED_PATH="$(readlink -f "${FLAGS_chroot}$CHROOT_TRUNK_DIR")"
87 if [ -z "$(mount | grep -F "on $MOUNTED_PATH")" ]
88 then
89 sudo mount --bind "$FLAGS_trunk" "$MOUNTED_PATH"
90 fi
91 ) 200>>"$LOCKFILE"
83 } 92 }
84 93
85 function teardown_env { 94 function teardown_env {
86 echo "Unmounting chroot environment." 95 # Only teardown if we're the last enter_chroot to die
87 mount | grep "on $(readlink -f "$FLAGS_chroot")" | awk '{print $3}' \ 96
88 | xargs -r -L1 sudo umount 97 (
98 flock 200
99
100 # check each pid in $LOCKFILE to see if it's died unexpectedly
101 TMP_LOCKFILE="$LOCKFILE.tmp"
102
103 echo -n > "$TMP_LOCKFILE" # Erase/reset temp file
104 cat "$LOCKFILE" | while read PID; do
105 if [ "$PID" = "$$" ]; then
106 # ourself, leave PROC_NAME empty
107 PROC_NAME=""
108 else
109 PROC_NAME=$(ps --pid $PID -o comm=)
110 fi
111
112 if [ ! -z "$PROC_NAME" ]; then
113 # All good, keep going
114 echo "$PID" >> "$TMP_LOCKFILE"
115 fi
116 done
117 # Remove any dups from lock file while installing new one
118 sort -n "$TMP_LOCKFILE" | uniq > "$LOCKFILE"
119
120 if [ -s "$LOCKFILE" ]; then
121 echo "At least one other pid is running in the chroot, so not"
122 echo "tearing down env."
123 else
124 echo "Unmounting chroot environment."
125 mount | grep "on $(readlink -f "$FLAGS_chroot")" | awk '{print $3}' \
126 | xargs -r -L1 sudo umount
127 fi
128 ) 200>>"$LOCKFILE"
89 } 129 }
90 130
91 if [ $FLAGS_mount -eq $FLAGS_TRUE ] 131 if [ $FLAGS_mount -eq $FLAGS_TRUE ]
92 then 132 then
93 setup_env 133 setup_env
94 echo "Make sure you run" 134 echo "Make sure you run"
95 echo " $0 --unmount" 135 echo " $0 --unmount"
96 echo "before deleting $FLAGS_chroot" 136 echo "before deleting $FLAGS_chroot"
97 echo "or you'll end up deleting $FLAGS_trunk too!" 137 echo "or you'll end up deleting $FLAGS_trunk too!"
98 exit 0 138 exit 0
(...skipping 39 matching lines...) Expand 10 before | Expand all | Expand 10 after
138 178
139 # Run command or interactive shell. Also include the non-chrooted path to 179 # Run command or interactive shell. Also include the non-chrooted path to
140 # the source trunk for scripts that may need to print it (e.g. 180 # the source trunk for scripts that may need to print it (e.g.
141 # build_image.sh). 181 # build_image.sh).
142 sudo chroot "$FLAGS_chroot" sudo -i -u $USER $CHROOT_PASSTHRU \ 182 sudo chroot "$FLAGS_chroot" sudo -i -u $USER $CHROOT_PASSTHRU \
143 EXTERNAL_TRUNK_PATH="${FLAGS_trunk}" LANG=C "$@" 183 EXTERNAL_TRUNK_PATH="${FLAGS_trunk}" LANG=C "$@"
144 184
145 # Remove trap and explicitly unmount 185 # Remove trap and explicitly unmount
146 trap - EXIT 186 trap - EXIT
147 teardown_env 187 teardown_env
OLDNEW
« no previous file with comments | « no previous file | no next file » | no next file with comments »

Powered by Google App Engine
This is Rietveld 408576698