21434653d1ecceca0900900b382cd716a81ccd3b
[easy-deb-chroot] / fremantle / easy-chroot / src / sbin / qchroot
1 #!/bin/sh
2 # Sets up (if necessary) and chroots into a different environment.
3 # Expects root privileges, does not drop them. 
4
5 # By Alan M Bruce (qole) with help from Benson Mitchell and Thomas Perl
6 #
7 # GPL licensed; keep code free!
8
9 # This script should have a wrapper to set up extra variables,
10 # OR, it can be run as a command:
11 # ezchroot <part/file/'none'> <chroot dir> <command> <params...>
12
13 if [ "`whoami`" != "root" ] ; then
14   echo "please run me as root!"
15   exit 9
16 fi
17
18 IMGFILE=$1
19 shift 1
20
21 CHROOT=$1
22 shift 1
23
24 # echo ezchroot $IMGFILE $CHROOT $*
25
26 qmount $IMGFILE $CHROOT
27 MOUNTSUCCESS=$?
28
29 if [ "$MOUNTSUCCESS" != "1" ] && [ "$MOUNTSUCCESS" != "0" ] ; then
30   echo Cancelling chroot...
31   exit $MOUNTSUCCESS
32 fi
33
34 if [ "$MOUNTSUCCESS" = "0" ] ; then
35   #Make the tablet's devices available to the chroot
36   echo . >/dev/stderr
37   mount -o bind /dev "$CHROOT/dev"
38   mount -o bind /proc "$CHROOT/proc"
39
40   #Gentoo wiki says this will make X work
41   echo .. >/dev/stderr
42   mount -t devpts none "$CHROOT/dev/pts"
43   mount -o bind /tmp "$CHROOT/tmp"
44
45   #Open e-mail attachments, etc
46   mount -o bind /var/tmp "$CHROOT/var/tmp"
47
48   #Any external devices
49   echo ... >/dev/stderr
50   MNTD=`cat /proc/mounts | grep ' /media/' | awk '{print $2}'`
51
52   for MDRV in $MNTD ; do
53     if [ ! -d "$CHROOT$MDRV" ] ; then
54       mkdir -p "$CHROOT$MDRV"
55     fi
56     mount -o bind "$MDRV" "$CHROOT$MDRV"
57   done
58
59   #Mount the user's home dir
60   echo .... >/dev/stderr
61   #mount -o bind /home/user "$CHROOT/home/user"
62
63   # Do it the Fremantle way.
64   mount /dev/mmcblk0p2 "$CHROOT/home"
65   mount /dev/mmcblk0p1 "$CHROOT/home/user/MyDocs"
66   
67   #Make DBus work
68   mount -o bind /var/run/dbus "$CHROOT/var/run/dbus"
69
70   #Make DBus work
71   mount -o bind /var/run/pulse "$CHROOT/var/run/pulse"
72
73   #Speed hacks: lower the priority of processes
74   #renice 0 `pidof mmcqd`
75   #renice 20 `pidof trackerd`
76
77   # Sync the chroot if requested...
78   if [ -f /home/user/.synchroot ] ; then 
79     /sbin/synchroot $CHROOT
80     rm /home/user/.synchroot
81   fi
82
83   # Place any commands you wish to run the first time you chroot
84   # into the /var/run/onfirstchroot-ext.rc file (inside your rootfs)
85
86   if [ -f "$CHROOT/var/run/onfirstchroot-ext.rc" ] ; then
87     . "$CHROOT/var/run/onfirstchroot-ext.rc"
88   fi
89
90   # Place any commands you wish to run from inside the chroot 
91   # the first time you chroot into the /var/run/onfirstchroot.rc
92   # file (inside your rootfs)
93
94   if [ -f "$CHROOT/var/run/onfirstchroot.rc" ] ; then
95     chroot $CHROOT "/var/run/onfirstchroot.rc"
96   fi
97
98 fi
99
100 # Place any commands you wish to run every time you chroot
101 # into the /var/run/onchroot-ext.rc file (inside your rootfs)
102
103 if [ -f "$CHROOT/var/run/onchroot-ext.rc" ] ; then
104   . "$CHROOT/var/run/onchroot-ext.rc"
105 fi
106
107 # Place any commands you wish to run from inside the chroot
108 # every time you chroot into the /var/run/onchroot.rc
109 # file (inside your rootfs)
110
111 if [ -f "$CHROOT/var/run/onchroot.rc" ] ; then
112   chroot $CHROOT "/var/run/onchroot.rc"
113 fi
114
115 #All set up. Set flag for next time...
116
117 if [ ! -d "$CHROOT/var/lock" ] ; then
118   mkdir -p "$CHROOT/var/lock"
119 fi
120
121 trap "rm -f $CHROOT/var/lock/chroot-complete ; echo -ne '\033]0;osso_xterm\007' ; exit" INT TERM EXIT
122 echo $IMGFILE $@ > "$CHROOT/var/lock/chroot-complete"
123
124 #Custom prompt and xterm title. Reduces confusion.
125 CHRLABEL=`blkid -s LABEL $IMGFILE | cut -d' ' -f2 | cut -d'=' -f2 | sed 's/"//g'`
126 if [ "x$CHRLABEL" = "x" ] ; then
127   CHRLABEL=chroot
128 fi
129 echo -ne "\033]0;$CHRLABEL\007" >/dev/stderr
130 export PS1="[\u@$CHRLABEL: \w]"
131
132 #Actually chroot
133 echo "Everything set up, running chroot..." >/dev/stderr
134 chroot $CHROOT "$@"
135
136 #All done, reset.
137 exit 0
138