3 SCRIPTNAME
=termux-chroot
5 echo "Usage: $SCRIPTNAME [command]"
6 echo "termux-chroot: Setup a chroot to mimic a normal Linux file system"
8 echo "Execute a command in a chroot with traditional file system hierarchy"
9 echo "(having e.g. the folders /bin, /etc and /usr) within Termux."
10 echo "If run without argument, the default shell will be executed"
14 while getopts :h option
18 ?
) echo "$SCRIPTNAME: illegal option -$OPTARG"; exit 1;
23 # For the /system/bin/linker(64) to be found:
24 ARGS
="-b /system:/system"
26 # On some devices /vendor is required for termux packages to work correctly
27 # See https://github.com/termux/proot/issues/2#issuecomment-303995382
28 ARGS
="$ARGS -b /vendor:/vendor"
30 # Bind /data to include system folders such as /data/misc. Also $PREFIX
31 # and $HOME so that Termux programs with hard-coded paths continue to work:
32 ARGS
="$ARGS -b /data:/data"
35 # Bind Magisk binary directories so root works, closing per Issue #2100.
36 if [ -d
/sbin
] && [ -d
/root
]; then
37 # Both of these directories exist under Android even without Magisk installed,
38 # The existence check is to ensure that it doesn't break if this changes.
39 ARGS
="$ARGS -b /sbin:/sbin -b /root:/root"
42 if [ -f
/property_contexts
]; then
43 # Used by getprop (see https://github.com/termux/termux-packages/issues/1076)
44 # but does not exist on Android 8.
45 ARGS
="$ARGS -b /property_contexts:/property_contexts"
48 # Expose external and internal storage:
49 if [ -d
/storage
]; then
50 ARGS
="$ARGS -b /storage:/storage"
53 # Mimic traditional Linux file system hierarchy - /usr:
54 ARGS
="$ARGS -b $PREFIX:/usr"
56 # Mimic traditional Linux file system hierarchy - other Termux dirs:
57 for f
in bin etc lib share tmp var
; do
58 ARGS
="$ARGS -b $PREFIX/$f:/$f"
61 # Mimic traditional Linux file system hierarchy- system dirs:
63 ARGS
="$ARGS -b /$f:/$f"
66 # Set /home as current directory:
67 ARGS
="$ARGS --cwd=/home"
69 # Root of the file system:
70 ARGS
="$ARGS -r $PREFIX/.."
76 if [ -x
$HOME/.termux
/shell
]; then
77 PROGRAM
=`readlink -f $HOME/.termux/shell`
79 # Execute shell if no command has been supplied
81 ARGS
="$ARGS $PROGRAM -l"
82 exec $PREFIX/bin
/proot
$ARGS
84 # When a command is executed directly instead of opening a shell run
85 # the command in the current working directory instead of in /home
87 # Start supplied command with "sh -c" so things like these work:
88 # termux-chroot "make;make install"
89 # termux-chroot "SOME_CONFIG=value ./configure"
90 exec $PREFIX/bin
/proot
$ARGS sh
-c
"$*"