Provided by: proot_5.1.0-1.3_amd64 bug

NAME

       PRoot - chroot, mount --bind, and binfmt_misc without privilege/setup

SYNOPSIS

       proot [option] ... [command]

DESCRIPTION

       PRoot  is  a  user-space  implementation of chroot, mount --bind, and binfmt_misc.  This means that users
       don't need any privileges or setup to do things like  using  an  arbitrary  directory  as  the  new  root
       filesystem,  making  files  accessible  somewhere else in the filesystem hierarchy, or executing programs
       built for another CPU architecture transparently through QEMU user-mode.  Also, developers can use  PRoot
       as  a  generic  Linux  process  instrumentation engine thanks to its extension mechanism, see CARE for an
       example.  Technically PRoot relies on ptrace,  an  unprivileged  system-call  available  in  every  Linux
       kernel.

       The  new root file-system, a.k.a guest rootfs, typically contains a Linux distribution.  By default PRoot
       confines the execution of programs to  the  guest  rootfs  only,  however  users  can  use  the  built-in
       mount/bind mechanism to access files and directories from the actual root file-system, a.k.a host rootfs,
       just as if they were part of the guest rootfs.

       When  the  guest  Linux distribution is made for a CPU architecture incompatible with the host one, PRoot
       uses the CPU emulator QEMU user-mode to execute transparently guest programs.  It's a convenient  way  to
       develop,  to  build,  and  to validate any guest Linux packages seamlessly on users' computer, just as if
       they were in a native guest environment.  That way all of the cross-compilation issues are avoided.

       PRoot can also mix the execution of host programs and the execution of guest programs  emulated  by  QEMU
       user-mode.  This is useful to use host equivalents of programs that are missing from the guest rootfs and
       to speed up build-time by using cross-compilation tools or CPU-independent programs, like interpreters.

       It  is worth noting that the guest kernel is never involved, regardless of whether QEMU user-mode is used
       or not.  Technically, when guest programs perform access to  system  resources,  PRoot  translates  their
       requests  before  sending them to the host kernel.  This means that guest programs can use host resources
       (devices, network, ...) just as if they were "normal" host programs.

OPTIONS

       The command-line interface is composed of two parts: first PRoot's options (optional), then  the  command
       to  launch  (/bin/sh  if not specified).  This section describes the options supported by PRoot, that is,
       the first part of its command-line interface.

   Regular options
       -r path, --rootfs=path
              Use path as the new guest root file-system, default is /.

              The specified path typically contains  a  Linux  distribution  where  all  new  programs  will  be
              confined.   The  default  rootfs  is  /  when  none  is  specified, this makes sense when the bind
              mechanism is used to relocate host files and directories, see  the  -b  option  and  the  Examples
              section for details.

              It is recommended to use the -R or -S options instead.

       -b path, --bind=path, -m path, --mount=path
              Make the content of path accessible in the guest rootfs.

              This  option makes any file or directory of the host rootfs accessible in the confined environment
              just as if it were part of the guest rootfs.  By default the host path is bound to the  same  path
              in   the   guest   rootfs   but  users  can  specify  any  other  location  with  the  syntax:  -b
              *host_path*:*guest_location*.  If the guest location is a symbolic link,  it  is  dereferenced  to
              ensure  the  new  content  is accessible through all the symbolic links that point to the overlaid
              content.  In most cases this default behavior shouldn't be a problem, although it is  possible  to
              explicitly   not   dereference   the   guest   location  by  appending  it  the  !  character:  -b
              *host_path*:*guest_location!*.

       -q command, --qemu=command
              Execute guest programs through QEMU as specified by command.

              Each time a guest program is going to be executed, PRoot inserts the  QEMU  user-mode  command  in
              front  of  the  initial  request.   That  way,  guest programs actually run on a virtual guest CPU
              emulated by QEMU user-mode.  The native execution of host programs  is  still  effective  and  the
              whole host rootfs is bound to /host-rootfs in the guest environment.

       -w path, --pwd=path, --cwd=path
              Set the initial working directory to path.

              Some  programs  expect  to  be  launched  from  a  given directory but do not perform any chdir by
              themselves.  This option avoids the need for running a  shell  and  then  entering  the  directory
              manually.

       -v value, --verbose=value
              Set the level of debug information to value.

              The  higher  the  integer value is, the more detailed debug information is printed to the standard
              error stream.  A negative value makes PRoot quiet except on fatal errors.

       -V, --version, --about
              Print version, copyright, license and contact, then exit.

       -h, --help, --usage
              Print the version and the command-line usage, then exit.

   Extension options
       The following options enable built-in extensions.  Technically developers can add their own  features  to
       PRoot  or  use  it  as  a Linux process instrumentation engine thanks to its extension mechanism, see the
       sources for further details.

       -k string, --kernel-release=string
              Make current kernel appear as kernel release string.

              If a program is run on a kernel older than the one expected by its GNU C  library,  the  following
              error  is  reported:  "FATAL: kernel too old".  To be able to run such programs, PRoot can emulate
              some of the features that are available in the kernel release specified by  string  but  that  are
              missing in the current kernel.

       -0, --root-id
              Make current user appear as "root" and fake its privileges.

              Some  programs will refuse to work if they are not run with "root" privileges, even if there is no
              technical reason for that.  This is typically the case with package managers.  This option  allows
              users  to  bypass  this  kind  of  limitation by faking the user/group identity, and by faking the
              success of some operations like changing the ownership of files, changing the root directory to /,
              ...  Note that this option is quite limited compared to fakeroot.

       -i string, --change-id=string
              Make current user and group appear as string "uid:gid".

              This option makes the current user and group appear as uid  and  gid.   Likewise,  files  actually
              owned  by  the  current  user and group appear as if they were owned by uid and gid instead.  Note
              that the -0 option is the same as -i 0:0.

   Alias options
       The following options are aliases for handy sets of options.

       -R path
              Alias: -r *path* + a couple of recommended -b.

              Programs isolated in path, a guest rootfs, might still need to access information about  the  host
              system,  as  it  is illustrated in the Examples section of the manual.  These host information are
              typically: user/group definition, network setup, run-time information, users' files, ...   On  all
              Linux distributions, they all lie in a couple of host files and directories that are automatically
              bound by this option:

              • /etc/host.conf/etc/hosts

              • /etc/hosts.equiv

              • /etc/mtab

              • /etc/netgroup

              • /etc/networks/etc/passwd/etc/group/etc/nsswitch.conf/etc/resolv.conf/etc/localtime/dev//sys//proc//tmp//run/

              • /var/run/dbus/system_bus_socket

              • $HOME

              • path

       -S path
              Alias: -0 -r *path* + a couple of recommended -b.

              This  option is useful to safely create and install packages into the guest rootfs.  It is similar
              to the -R option expect it enables the -0 option and binds only the following minimal set of paths
              to avoid unexpected changes on host files:

              • /etc/host.conf/etc/hosts/etc/nsswitch.conf/etc/resolv.conf/dev//sys//proc//tmp//run/shm

              • $HOME

              • path

EXIT STATUS

       If an internal error occurs, proot returns a non-zero exit status, otherwise it returns the  exit  status
       of  the  last  terminated  program. When an error has occurred, the only way to know if it comes from the
       last terminated program or from proot itself is to have a look at the error message.

FILES

       PRoot reads links in /proc/<pid>/fd/ to support openat(2)-like syscalls made by the guest programs.

EXAMPLES

       In the following examples the directories /mnt/slackware-8.0  and  /mnt/armslack-12.2/  contain  a  Linux
       distribution respectively made for x86 CPUs and ARM CPUs.

   chroot equivalent
       To  execute  a  command  inside  a given Linux distribution, just give proot the path to the guest rootfs
       followed by the desired command.  The example below executes the program cat to print the  content  of  a
       file:

          proot -r /mnt/slackware-8.0/ cat /etc/motd

          Welcome to Slackware Linux 8.0

       The  default  command  is /bin/sh when none is specified. Thus the shortest way to confine an interactive
       shell and all its sub-programs is:

          proot -r /mnt/slackware-8.0/

          $ cat /etc/motd
          Welcome to Slackware Linux 8.0

   mount --bind equivalent
       The bind mechanism enables one to relocate files and directories.  This  is  typically  useful  to  trick
       programs that perform access to hard-coded locations, like some installation scripts:

          proot -b /tmp/alternate_opt:/opt

          $ cd to/sources
          $ make install
          [...]
          install -m 755 prog "/opt/bin"
          [...] # prog is installed in "/tmp/alternate_opt/bin" actually

       As shown in this example, it is possible to bind over files not even owned by the user.  This can be used
       to overlay system configuration files, for instance the DNS setting:

          ls -l /etc/hosts
          -rw-r--r-- 1 root root 675 Mar  4  2011 /etc/hosts

          proot -b ~/alternate_hosts:/etc/hosts

          $ echo '1.2.3.4 google.com' > /etc/hosts
          $ resolveip google.com
          IP address of google.com is 1.2.3.4
          $ echo '5.6.7.8 google.com' > /etc/hosts
          $ resolveip google.com
          IP address of google.com is 5.6.7.8

       Another  example:  on most Linux distributions /bin/sh is a symbolic link to /bin/bash, whereas it points
       to /bin/dash on Debian and Ubuntu.  As a consequence a #!/bin/sh script tested with Bash might  not  work
       with Dash.  In this case, the binding mechanism of PRoot can be used to set non-disruptively /bin/bash as
       the default /bin/sh on these two Linux distributions:

          proot -b /bin/bash:/bin/sh [...]

       Because  /bin/sh  is  initially  a symbolic link to /bin/dash, the content of /bin/bash is actually bound
       over this latter:

          proot -b /bin/bash:/bin/sh

          $ md5sum /bin/sh
          089ed56cd74e63f461bef0fdfc2d159a  /bin/sh
          $ md5sum /bin/bash
          089ed56cd74e63f461bef0fdfc2d159a  /bin/bash
          $ md5sum /bin/dash
          089ed56cd74e63f461bef0fdfc2d159a  /bin/dash

       In most cases this shouldn't be a problem, but it is still  possible  to  strictly  bind  /bin/bash  over
       /bin/sh -- without dereferencing it -- by specifying the ! character at the end:

          proot -b '/bin/bash:/bin/sh!'

          $ md5sum /bin/sh
          089ed56cd74e63f461bef0fdfc2d159a  /bin/sh
          $ md5sum /bin/bash
          089ed56cd74e63f461bef0fdfc2d159a  /bin/bash
          $ md5sum /bin/dash
          c229085928dc19e8d9bd29fe88268504  /bin/dash

   chroot + mount --bind equivalent
       The  two  features above can be combined to make any file from the host rootfs accessible in the confined
       environment just as if it were initially part of the guest rootfs.   It  is  sometimes  required  to  run
       programs that rely on some specific files:

          proot -r /mnt/slackware-8.0/

          $ ps -o tty,command
          Error, do this: mount -t proc none /proc

       works better with:

          proot -r /mnt/slackware-8.0/ -b /proc

          $ ps -o tty,command
          TT       COMMAND
          ?        -bash
          ?        proot -b /proc /mnt/slackware-8.0/
          ?        -
          ?        ps -o tty,command

       Actually  there's  a  bunch  of  such  specific  files,  that's  why PRoot provides the option -R to bind
       automatically a pre-defined list of recommended paths:

          proot -R /mnt/slackware-8.0/

          $ ps -o tty,command
          TT       COMMAND
          pts/6    -bash
          pts/6    proot -R /mnt/slackware-8.0/
          pts/6    -
          pts/6    ps -o tty,command

   chroot + mount --bind + su equivalent
       Some programs will not work correctly if they are not run by the "root" user, this is typically the  case
       with  package managers.  PRoot can fake the root identity and its privileges when the -0 (zero) option is
       specified:

          proot -r /mnt/slackware-8.0/ -0

          # id
          uid=0(root) gid=0(root) [...]

          # mkdir /tmp/foo
          # chmod a-rwx /tmp/foo
          # echo 'I bypass file-system permissions.' > /tmp/foo/bar
          # cat /tmp/foo/bar
          I bypass file-system permissions.

       This option is typically required to create or install packages into the guest rootfs.  Note  it  is  not
       recommended  to  use  the  -R  option  when installing packages since they may try to update bound system
       files, like /etc/group.  Instead, it is recommended to use the -S option.  This  latter  enables  the  -0
       option and binds only paths that are known to not be updated by packages:

          proot -S /mnt/slackware-8.0/

          # installpkg perl.tgz
          Installing package perl...

   chroot + mount --bind + binfmt_misc equivalent
       PRoot  uses  QEMU  user-mode  to execute programs built for a CPU architecture incompatible with the host
       one.  From users' point-of-view, guest programs handled by QEMU  user-mode  are  executed  transparently,
       that  is,  just  like host programs.  To enable this feature users just have to specify which instance of
       QEMU user-mode they want to use with the option -q:

          proot -R /mnt/armslack-12.2/ -q qemu-arm

          $ cat /etc/motd
          Welcome to ARMedSlack Linux 12.2

       The parameter of the -q option is actually a whole QEMU user-mode command, for instance to enable its GDB
       server on port 1234:

          proot -R /mnt/armslack-12.2/ -q "qemu-arm -g 1234" emacs

       PRoot allows one to mix transparently the emulated execution of guest programs and the  native  execution
       of  host  programs  in  the  same  file-system  namespace.   It's  typically useful to extend the list of
       available programs and to speed up build-time significantly.  This mixed-execution feature is enabled  by
       default  when  using  QEMU  user-mode,  and  the  content  of  the host rootfs is made accessible through
       /host-rootfs:

          proot -R /mnt/armslack-12.2/ -q qemu-arm

          $ file /bin/echo
          [...] ELF 32-bit LSB executable, ARM [...]
          $ /bin/echo 'Hello world!'
          Hello world!

          $ file /host-rootfs/bin/echo
          [...] ELF 64-bit LSB executable, x86-64 [...]
          $ /host-rootfs/bin/echo 'Hello mixed world!'
          Hello mixed world!

       Since both host and guest programs use the guest rootfs as /, users may  want  to  deactivate  explicitly
       cross-filesystem  support  found in most GNU cross-compilation tools.  For example with GCC configured to
       cross-compile to the ARM target:

          proot -R /mnt/armslack-12.2/ -q qemu-arm

          $ export CC=/host-rootfs/opt/cross-tools/arm-linux/bin/gcc
          $ export CFLAGS="--sysroot=/"   # could be optional indeed
          $ ./configure; make

       As with regular files, a host instance of a program can be bound over its guest  instance.   Here  is  an
       example where the guest binary of make is overlaid by the host one:

          proot -R /mnt/armslack-12.2/ -q qemu-arm -b /usr/bin/make

          $ which make
          /usr/bin/make
          $ make --version # overlaid
          GNU Make 3.82
          Built for x86_64-slackware-linux-gnu

       It's  worth  mentioning  that  even  when  mixing  the native execution of host programs and the emulated
       execution of guest programs, they still believe they are running in a native  guest  environment.   As  a
       demonstration, here is a partial output of a typical ./configure script:

          checking whether the C compiler is a cross-compiler... no

DOWNLOADS

   PRoot
       The  latest  release  of  PRoot  is  packaged  on  http://packages.proot.me  and  sources  are  hosted on
       http://github.proot.me.  It is also available as highly compatible static binaries:

       • for x86_64: http://static.proot.me/proot-x86_64

       • for x86: http://static.proot.me/proot-x86

       • for ARM: http://static.proot.me/proot-arm

       • other architectures: on demand.

   Rootfs
       Here follows a couple of URLs where some rootfs archives can  be  freely  downloaded.   Note  that  mknod
       errors  reported  by  tar  when  extracting  these archives can be safely ignored since special files are
       typically bound (see -R option for details).

       • http://download.openvz.org/template/precreated/https://images.linuxcontainers.org/images/http://distfiles.gentoo.org/releases/http://cdimage.ubuntu.com/ubuntu-core/releases/http://archlinuxarm.org/developers/downloads

       Technically such rootfs archive can be created by running the following command  on  the  expected  Linux
       distribution:

          tar --one-file-system --create --gzip --file my_rootfs.tar.gz /

   QEMU user-mode
       QEMU user-mode is required only if the guest rootfs was made for a CPU architecture incompatible with the
       host  one,  for  instance  when  using  a ARM rootfs on a x86_64 computer.  This package can be installed
       either from http://qemu.proot.me or from the host package manager under the name of "qemu-user"  on  most
       Linux  distro.   In  case  one  would  like to build QEMU user-mode from sources, the --enable-linux-user
       option has to be specified to the ./configure script.

SEE ALSO

       chroot(1), mount(8), binfmt_misc, ptrace(2), qemu(1), sb2(1), bindfs(1), fakeroot(1), fakechroot(1)

COLOPHON

       Visit  http://proot.me  for  help,  bug  reports,  suggestions,  patches,   ...    Copyright   (C)   2014
       STMicroelectronics, licensed under GPL v2 or later.

           _____ _____              ___
          |  __ \  __ \_____  _____|   |_
          |   __/     /  _  \/  _  \    _|
          |__|  |__|__\_____/\_____/\____|

5.1.0                                              2014-12-12                                           PROOT(1)