Prepare documentation for release

This commit is contained in:
Lucas Ramage 2020-04-10 22:12:55 -04:00
parent e35d15834b
commit a4db64532f
16 changed files with 146 additions and 2082 deletions

2
.gitignore vendored
View File

@ -4,7 +4,9 @@
*.html
*.info
*.o
*.1
doc/*.h
*rpm-spec
doc/public_html/
gcov-latest/
public/

View File

@ -30,3 +30,6 @@ Denis FERRANTI <denis.ferranti@st.com>
Paul GHALEB <paul.ghaleb@st.com>
User manual review.
Lucas Ramage <ramage.lucas@protonmail.com>
Website re-design, documentation, maintainer.

105
CHANGELOG.rst Normal file
View File

@ -0,0 +1,105 @@
Changelog
=========
All notable changes to this project will be documented in this file.
The format is based on `Keep a Changelog`_, and this project adheres to
`Semantic Versioning`_.
Unreleased
------------
Please see `Unreleased Changes`_ for more information.
5.2.0-alpha - 2020-04-14
------------------------
Added
~~~~~
- GitLab CI/CD pipelines for static binaries.
- Python extension.
- Secure disclosure instructions.
- Vagrantfiles for kernel-specific testing.
- Support for Musl libc.
- Use shellcheck for scripts.
- link2symlink extension.
- Contributor scripts care2docker.sh, and care_rearchiver.sh
- Clang scan-build and gcov/lcov for source code analysis.
- Trivial chroot using relative paths.
- port_mapper extension.
- Commandline option --kill-on-exit.
- Hidden PROOT_TMPDIR option.
- Support for sudo via fake_id0 extension.
Changed
~~~~~~~
- Started using top-level changelog instead of individual ones.
- Limit testsuite to five minutes.
- Updated release instructions.
- Renamed tests to test.
- Replace .exe file extension with .elf for loader binaries.
- Use LC_ALL instead of LANG.
- Semantics for HOST_PATH extension event arguments.
Removed
~~~~~~~
- Disabled, deprecated, or unreliable tests.
- Drop Coverity from Travis CI.
- Cross-compiling scripts for Slackware.
- FHS assumptions from tests.
- References to proot.me domain.
Fixed
~~~~~
- Error-code handling in substitute_binding_stat.
- Prevent tracees from becoming undumpable.
- Merged patches for detecting kernels >= 4.8.
- GIT_VERSION for development binaries.
- Replace mktemp with mkstemp.
- File permissions for test scripts.
- Filter renamteat2 syscall.
- Honor GNU standards regarding DESTDIR variable.
- Cleanup tmp on non-ext file systems.
- Reallocation of heap for CLONE_VM on execve syscall.
- Non-executable stack for binaries.
.. _Unreleased Changes: https://github.com/proot-me/proot/compare/v5.2.0-alpha...master
.. _Keep a Changelog: https://keepachangelog.com/en/1.0.0
.. _Semantic Versioning: https://semver.org/spec/v2.0.0.html

View File

@ -21,26 +21,26 @@ dist: $(OUTPUTS)
@cp ${DOC_DIR}/../README.rst ${SITE_DIR}/
@cp ${DOC_DIR}/../HACKING.rst ${SITE_DIR}/
%/man.1: %/manual.txt
%/man.1: %/manual.rst
$(RST2MAN) $< $@
%.xml: %.txt
%.xml: %.rst
$(RST2XML) --no-doctype $< $@
%.html: %.txt
%.html: %.rst
$(RST2HTML) $< $@
# Workaround to avoid unescaped C character.
%/manual-quoted.txt: %/manual.txt
%/manual-quoted.rst: %/manual.rst
sed 's/"/\\\\"/g' $^ > $@
%.h: %/stylesheets/cli.xsl %/manual-quoted.xml
xsltproc --output $@ $^
%/rpm-spec: %/stylesheets/rpm-spec.xsl %/manual.xml # %/changelog.txt
%/rpm-spec: %/stylesheets/rpm-spec.xsl %/manual.xml # %/changelog.rst
xsltproc --output $@ $^
echo "* $(shell date +'%a %b %d %Y') PRoot Team <proot_me@googlegroups.com>" >> $@
cat $*/changelog.txt >> $@
cat $*/changelog.rst >> $@
%/index.html: stylesheets/website.xsl %/stylesheets/website.xsl %/manual.xml
xsltproc --output $@ $*/stylesheets/website.xsl $*/manual.xml

View File

@ -1,3 +1,13 @@
=======================================================================
=======================================================================
This file is no longer used for tracking changes for CARE. For
user visible changes, please look in the top-level CHANGELOG.rst
file.
=======================================================================
=======================================================================
CARE v2.2
=========

View File

@ -452,7 +452,7 @@ Colophon
========
Visit https://proot-me.github.io for help, bug reports, suggestions, patches, ...
Copyright (C) 2015 STMicroelectronics, licensed under GPL v2 or later.
Copyright (C) 2020 PRoot Developers, licensed under GPL v2 or later.
::

View File

@ -44,9 +44,9 @@ which can be optionally distributed for each release:
Documentation Update
--------------------
0. update "doc/changelog.txt"
0. update "doc/changelog.rst"
1. update the release number in "doc/proot/manual.txt"
1. update the release number in "doc/proot/manual.rst"
2. regenerate the documentation: `make -C doc`

View File

@ -1,3 +1,13 @@
=======================================================================
=======================================================================
This file is no longer used for tracking changes for PRoot. For
user visible changes, please look in the top-level CHANGELOG.rst
file.
=======================================================================
=======================================================================
Release v5.1.0
==============

View File

@ -1,832 +0,0 @@
.\" Man page generated from reStructuredText.
.
.TH PROOT 1 "2016-08-09" "5.1.0" ""
.SH NAME
PRoot \- chroot, mount --bind, and binfmt_misc without privilege/setup
.
.nr rst2man-indent-level 0
.
.de1 rstReportMargin
\\$1 \\n[an-margin]
level \\n[rst2man-indent-level]
level margin: \\n[rst2man-indent\\n[rst2man-indent-level]]
-
\\n[rst2man-indent0]
\\n[rst2man-indent1]
\\n[rst2man-indent2]
..
.de1 INDENT
.\" .rstReportMargin pre:
. RS \\$1
. nr rst2man-indent\\n[rst2man-indent-level] \\n[an-margin]
. nr rst2man-indent-level +1
.\" .rstReportMargin post:
..
.de UNINDENT
. RE
.\" indent \\n[an-margin]
.\" old: \\n[rst2man-indent\\n[rst2man-indent-level]]
.nr rst2man-indent-level -1
.\" new: \\n[rst2man-indent\\n[rst2man-indent-level]]
.in \\n[rst2man-indent\\n[rst2man-indent-level]]u
..
.SH SYNOPSIS
.sp
\fBproot\fP [\fIoption\fP] ... [\fIcommand\fP]
.SH DESCRIPTION
.sp
PRoot is a user\-space implementation of \fBchroot\fP, \fBmount \-\-bind\fP,
and \fBbinfmt_misc\fP\&. This means that users don\(aqt 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 \fI\%CARE\fP for an example. Technically
PRoot relies on \fBptrace\fP, an unprivileged system\-call available in
every Linux kernel.
.sp
The new root file\-system, a.k.a \fIguest rootfs\fP, 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
\fImount/bind\fP mechanism to access files and directories from the actual
root file\-system, a.k.a \fIhost rootfs\fP, just as if they were part of
the guest rootfs.
.sp
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\(aqs a convenient
way to develop, to build, and to validate any guest Linux packages
seamlessly on users\(aq computer, just as if they were in a \fInative\fP
guest environment. That way all of the cross\-compilation issues are
avoided.
.sp
PRoot can also \fImix\fP 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.
.sp
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.
.SH OPTIONS
.sp
The command\-line interface is composed of two parts: first PRoot\(aqs
options (optional), then the command to launch (\fB/bin/sh\fP if not
specified). This section describes the options supported by PRoot,
that is, the first part of its command\-line interface.
.SS Regular options
.INDENT 0.0
.TP
.BI \-r \ path\fP,\fB \ \-\-rootfs\fB= path
Use \fIpath\fP as the new guest root file\-system, default is \fB/\fP\&.
.sp
The specified \fIpath\fP typically contains a Linux distribution where
all new programs will be confined. The default rootfs is \fB/\fP
when none is specified, this makes sense when the bind mechanism
is used to relocate host files and directories, see the \fB\-b\fP
option and the \fBExamples\fP section for details.
.sp
It is recommended to use the \fB\-R\fP or \fB\-S\fP options instead.
.TP
.BI \-b \ path\fP,\fB \ \-\-bind\fB= path\fP,\fB \ \-m \ path\fP,\fB \ \-\-mount\fB= path
Make the content of \fIpath\fP accessible in the guest rootfs.
.sp
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: \fB\-b *host_path*:*guest_location*\fP\&. 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\(aqt be a problem, although it is possible to
explicitly not dereference the guest location by appending it the
\fB!\fP character: \fB\-b *host_path*:*guest_location!*\fP\&.
.TP
.BI \-q \ command\fP,\fB \ \-\-qemu\fB= command
Execute guest programs through QEMU as specified by \fIcommand\fP\&.
.sp
Each time a guest program is going to be executed, PRoot inserts
the QEMU user\-mode \fIcommand\fP 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
\fB/host\-rootfs\fP in the guest environment.
.TP
.BI \-w \ path\fP,\fB \ \-\-pwd\fB= path\fP,\fB \ \-\-cwd\fB= path
Set the initial working directory to \fIpath\fP\&.
.sp
Some programs expect to be launched from a given directory but do
not perform any \fBchdir\fP by themselves. This option avoids the
need for running a shell and then entering the directory manually.
.TP
.BI \-v \ value\fP,\fB \ \-\-verbose\fB= value
Set the level of debug information to \fIvalue\fP\&.
.sp
The higher the integer \fIvalue\fP is, the more detailed debug
information is printed to the standard error stream. A negative
\fIvalue\fP makes PRoot quiet except on fatal errors.
.TP
.B \-V\fP,\fB \-\-version\fP,\fB \-\-about
Print version, copyright, license and contact, then exit.
.TP
.B \-h\fP,\fB \-\-help\fP,\fB \-\-usage
Print the version and the command\-line usage, then exit.
.UNINDENT
.SS Extension options
.sp
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.
.INDENT 0.0
.TP
.BI \-k \ string\fP,\fB \ \-\-kernel\-release\fB= string
Make current kernel appear as kernel release \fIstring\fP\&.
.sp
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
\fIstring\fP but that are missing in the current kernel.
.TP
.B \-0\fP,\fB \-\-root\-id
Make current user appear as "root" and fake its privileges.
.sp
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
\fB/\fP, ... Note that this option is quite limited compared to
\fBfakeroot\fP\&.
.TP
.BI \-i \ string\fP,\fB \ \-\-change\-id\fB= string
Make current user and group appear as \fIstring\fP "uid:gid".
.sp
This option makes the current user and group appear as \fIuid\fP and
\fIgid\fP\&. Likewise, files actually owned by the current user and
group appear as if they were owned by \fIuid\fP and \fIgid\fP instead.
Note that the \fB\-0\fP option is the same as \fB\-i 0:0\fP\&.
.TP
.BI \-p \ string\fP,\fB \ \-\-port\fB= string
Map ports to others with the syntax as \fIstring\fP "port_in:port_out ...".
.sp
This option makes PRoot intercept bind and connect system calls,
and change the port they use. The port map is specified
with the syntax: \fB\-b *port_in*:*port_out*\fP\&. For example,
an application that runs a MySQL server binding to 5432 wants
to cohabit with other similar application, but doesn\(aqt have an
option to change its port. PRoot can be used here to modify
this port: \fBproot \-p 5432:5433 myapplication\fP\&. With this command,
the MySQL server will be bound to the port 5433.
This command can be repeated multiple times to map multiple ports.
.TP
.B \-n\fP,\fB \-\-netcoop
Activates the network cooperation mode.
.sp
This option makes PRoot intercept bind() system calls and
change the port they are binding to to 0. With this, the system will
allocate an available port. Each time this is done, a new entry is added
to the port mapping entries, so that corresponding connect() system calls
use the same resulting port.
.UNINDENT
.SS Alias options
.sp
The following options are aliases for handy sets of options.
.INDENT 0.0
.TP
.BI \-R \ path
Alias: \fB\-r *path*\fP + a couple of recommended \fB\-b\fP\&.
.sp
Programs isolated in \fIpath\fP, a guest rootfs, might still need to
access information about the host system, as it is illustrated in
the \fBExamples\fP section of the manual. These host information
are typically: user/group definition, network setup, run\-time
information, users\(aq files, ... On all Linux distributions, they
all lie in a couple of host files and directories that are
automatically bound by this option:
.INDENT 7.0
.IP \(bu 2
/etc/host.conf
.IP \(bu 2
/etc/hosts
.IP \(bu 2
/etc/hosts.equiv
.IP \(bu 2
/etc/mtab
.IP \(bu 2
/etc/netgroup
.IP \(bu 2
/etc/networks
.IP \(bu 2
/etc/passwd
.IP \(bu 2
/etc/group
.IP \(bu 2
/etc/nsswitch.conf
.IP \(bu 2
/etc/resolv.conf
.IP \(bu 2
/etc/localtime
.IP \(bu 2
/dev/
.IP \(bu 2
/sys/
.IP \(bu 2
/proc/
.IP \(bu 2
/tmp/
.IP \(bu 2
/run/
.IP \(bu 2
/var/run/dbus/system_bus_socket
.IP \(bu 2
$HOME
.IP \(bu 2
\fIpath\fP
.UNINDENT
.TP
.BI \-S \ path
Alias: \fB\-0 \-r *path*\fP + a couple of recommended \fB\-b\fP\&.
.sp
This option is useful to safely create and install packages into
the guest rootfs. It is similar to the \fB\-R\fP option except it
enables the \fB\-0\fP option and binds only the following minimal set
of paths to avoid unexpected changes on host files:
.INDENT 7.0
.IP \(bu 2
/etc/host.conf
.IP \(bu 2
/etc/hosts
.IP \(bu 2
/etc/nsswitch.conf
.IP \(bu 2
/etc/resolv.conf
.IP \(bu 2
/dev/
.IP \(bu 2
/sys/
.IP \(bu 2
/proc/
.IP \(bu 2
/tmp/
.IP \(bu 2
/run/shm
.IP \(bu 2
$HOME
.IP \(bu 2
\fIpath\fP
.UNINDENT
.UNINDENT
.SH EXIT STATUS
.sp
If an internal error occurs, \fBproot\fP 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 \fBproot\fP itself is to have a
look at the error message.
.SH FILES
.sp
PRoot reads links in \fB/proc/<pid>/fd/\fP to support \fIopenat(2)\fP\-like
syscalls made by the guest programs.
.SH EXAMPLES
.sp
In the following examples the directories \fB/mnt/slackware\-8.0\fP and
\fB/mnt/armslack\-12.2/\fP contain a Linux distribution respectively made
for x86 CPUs and ARM CPUs.
.SS \fBchroot\fP equivalent
.sp
To execute a command inside a given Linux distribution, just give
\fBproot\fP the path to the guest rootfs followed by the desired
command. The example below executes the program \fBcat\fP to print the
content of a file:
.INDENT 0.0
.INDENT 3.5
.sp
.nf
.ft C
proot \-r /mnt/slackware\-8.0/ cat /etc/motd
Welcome to Slackware Linux 8.0
.ft P
.fi
.UNINDENT
.UNINDENT
.sp
The default command is \fB/bin/sh\fP when none is specified. Thus the
shortest way to confine an interactive shell and all its sub\-programs
is:
.INDENT 0.0
.INDENT 3.5
.sp
.nf
.ft C
proot \-r /mnt/slackware\-8.0/
$ cat /etc/motd
Welcome to Slackware Linux 8.0
.ft P
.fi
.UNINDENT
.UNINDENT
.SS \fBmount \-\-bind\fP equivalent
.sp
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:
.INDENT 0.0
.INDENT 3.5
.sp
.nf
.ft C
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
.ft P
.fi
.UNINDENT
.UNINDENT
.sp
As shown in this example, it is possible to bind over files not even
owned by the user. This can be used to \fIoverlay\fP system configuration
files, for instance the DNS setting:
.INDENT 0.0
.INDENT 3.5
.sp
.nf
.ft C
ls \-l /etc/hosts
\-rw\-r\-\-r\-\- 1 root root 675 Mar 4 2011 /etc/hosts
.ft P
.fi
.UNINDENT
.UNINDENT
.INDENT 0.0
.INDENT 3.5
.sp
.nf
.ft C
proot \-b ~/alternate_hosts:/etc/hosts
$ echo \(aq1.2.3.4 google.com\(aq > /etc/hosts
$ resolveip google.com
IP address of google.com is 1.2.3.4
$ echo \(aq5.6.7.8 google.com\(aq > /etc/hosts
$ resolveip google.com
IP address of google.com is 5.6.7.8
.ft P
.fi
.UNINDENT
.UNINDENT
.sp
Another example: on most Linux distributions \fB/bin/sh\fP is a symbolic
link to \fB/bin/bash\fP, whereas it points to \fB/bin/dash\fP on Debian
and Ubuntu. As a consequence a \fB#!/bin/sh\fP script tested with Bash
might not work with Dash. In this case, the binding mechanism of
PRoot can be used to set non\-disruptively \fB/bin/bash\fP as the default
\fB/bin/sh\fP on these two Linux distributions:
.INDENT 0.0
.INDENT 3.5
.sp
.nf
.ft C
proot \-b /bin/bash:/bin/sh [...]
.ft P
.fi
.UNINDENT
.UNINDENT
.sp
Because \fB/bin/sh\fP is initially a symbolic link to \fB/bin/dash\fP, the
content of \fB/bin/bash\fP is actually bound over this latter:
.INDENT 0.0
.INDENT 3.5
.sp
.nf
.ft C
proot \-b /bin/bash:/bin/sh
$ md5sum /bin/sh
089ed56cd74e63f461bef0fdfc2d159a /bin/sh
$ md5sum /bin/bash
089ed56cd74e63f461bef0fdfc2d159a /bin/bash
$ md5sum /bin/dash
089ed56cd74e63f461bef0fdfc2d159a /bin/dash
.ft P
.fi
.UNINDENT
.UNINDENT
.sp
In most cases this shouldn\(aqt be a problem, but it is still possible to
strictly bind \fB/bin/bash\fP over \fB/bin/sh\fP \-\- without dereferencing
it \-\- by specifying the \fB!\fP character at the end:
.INDENT 0.0
.INDENT 3.5
.sp
.nf
.ft C
proot \-b \(aq/bin/bash:/bin/sh!\(aq
$ md5sum /bin/sh
089ed56cd74e63f461bef0fdfc2d159a /bin/sh
$ md5sum /bin/bash
089ed56cd74e63f461bef0fdfc2d159a /bin/bash
$ md5sum /bin/dash
c229085928dc19e8d9bd29fe88268504 /bin/dash
.ft P
.fi
.UNINDENT
.UNINDENT
.SS \fBchroot\fP + \fBmount \-\-bind\fP equivalent
.sp
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:
.INDENT 0.0
.INDENT 3.5
.sp
.nf
.ft C
proot \-r /mnt/slackware\-8.0/
$ ps \-o tty,command
Error, do this: mount \-t proc none /proc
.ft P
.fi
.UNINDENT
.UNINDENT
.sp
works better with:
.INDENT 0.0
.INDENT 3.5
.sp
.nf
.ft C
proot \-r /mnt/slackware\-8.0/ \-b /proc
$ ps \-o tty,command
TT COMMAND
? bash
? proot \-b /proc /mnt/slackware\-8.0/
? sh
? ps \-o tty,command
.ft P
.fi
.UNINDENT
.UNINDENT
.sp
Actually there\(aqs a bunch of such specific files, that\(aqs why PRoot
provides the option \fB\-R\fP to bind automatically a pre\-defined list of
recommended paths:
.INDENT 0.0
.INDENT 3.5
.sp
.nf
.ft C
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 sh
pts/6 ps \-o tty,command
.ft P
.fi
.UNINDENT
.UNINDENT
.SS \fBchroot\fP + \fBmount \-\-bind\fP + \fBsu\fP equivalent
.sp
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 \fB\-0\fP (zero)
option is specified:
.INDENT 0.0
.INDENT 3.5
.sp
.nf
.ft C
proot \-r /mnt/slackware\-8.0/ \-0
# id
uid=0(root) gid=0(root) [...]
# mkdir /tmp/foo
# chmod a\-rwx /tmp/foo
# echo \(aqI bypass file\-system permissions.\(aq > /tmp/foo/bar
# cat /tmp/foo/bar
I bypass file\-system permissions.
.ft P
.fi
.UNINDENT
.UNINDENT
.sp
This option is typically required to create or install packages into
the guest rootfs. Note it is \fInot\fP recommended to use the \fB\-R\fP
option when installing packages since they may try to update bound
system files, like \fB/etc/group\fP\&. Instead, it is recommended to use
the \fB\-S\fP option. This latter enables the \fB\-0\fP option and binds
only paths that are known to not be updated by packages:
.INDENT 0.0
.INDENT 3.5
.sp
.nf
.ft C
proot \-S /mnt/slackware\-8.0/
# installpkg perl.tgz
Installing package perl...
.ft P
.fi
.UNINDENT
.UNINDENT
.SS \fBchroot\fP + \fBmount \-\-bind\fP + \fBbinfmt_misc\fP equivalent
.sp
PRoot uses QEMU user\-mode to execute programs built for a CPU
architecture incompatible with the host one. From users\(aq
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 \fB\-q\fP:
.INDENT 0.0
.INDENT 3.5
.sp
.nf
.ft C
proot \-R /mnt/armslack\-12.2/ \-q qemu\-arm
$ cat /etc/motd
Welcome to ARMedSlack Linux 12.2
.ft P
.fi
.UNINDENT
.UNINDENT
.sp
The parameter of the \fB\-q\fP option is actually a whole QEMU user\-mode
command, for instance to enable its GDB server on port 1234:
.INDENT 0.0
.INDENT 3.5
.sp
.nf
.ft C
proot \-R /mnt/armslack\-12.2/ \-q "qemu\-arm \-g 1234" emacs
.ft P
.fi
.UNINDENT
.UNINDENT
.sp
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\(aqs 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 \fB/host\-rootfs\fP:
.INDENT 0.0
.INDENT 3.5
.sp
.nf
.ft C
proot \-R /mnt/armslack\-12.2/ \-q qemu\-arm
$ file /bin/echo
[...] ELF 32\-bit LSB executable, ARM [...]
$ /bin/echo \(aqHello world!\(aq
Hello world!
$ file /host\-rootfs/bin/echo
[...] ELF 64\-bit LSB executable, x86\-64 [...]
$ /host\-rootfs/bin/echo \(aqHello mixed world!\(aq
Hello mixed world!
.ft P
.fi
.UNINDENT
.UNINDENT
.sp
Since both host and guest programs use the guest rootfs as \fB/\fP,
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:
.INDENT 0.0
.INDENT 3.5
.sp
.nf
.ft C
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
.ft P
.fi
.UNINDENT
.UNINDENT
.sp
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
\fBmake\fP is overlaid by the host one:
.INDENT 0.0
.INDENT 3.5
.sp
.nf
.ft C
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
.ft P
.fi
.UNINDENT
.UNINDENT
.sp
It\(aqs 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 \fB\&./configure\fP
script:
.INDENT 0.0
.INDENT 3.5
.sp
.nf
.ft C
checking whether the C compiler is a cross\-compiler... no
.ft P
.fi
.UNINDENT
.UNINDENT
.SH DOWNLOADS
.SS PRoot
.sp
The source code for PRoot and CARE are hosted in the same repository on \fI\%GitHub\fP\&.
Previous PRoot releases were packaged at \fI\%https://github.com/proot\-me/proot\-static\-build/releases\fP, however, that
repository has since been archived. The latest builds can be found under the job artifacts for the \fI\%GitLab CI/CD Pipelines\fP for each commit.
.SS Rootfs
.sp
Here follows a couple of URLs where some rootfs archives can be freely
downloaded. Note that \fBmknod\fP errors reported by \fBtar\fP when
extracting these archives can be safely ignored since special files
are typically bound (see \fB\-R\fP option for details).
.INDENT 0.0
.IP \(bu 2
\fI\%https://download.openvz.org/template/precreated\fP
.IP \(bu 2
\fI\%https://images.linuxcontainers.org/images\fP
.IP \(bu 2
\fI\%http://distfiles.gentoo.org/releases\fP
.IP \(bu 2
\fI\%http://cdimage.ubuntu.com/ubuntu\-core\fP
.IP \(bu 2
\fI\%https://archlinuxarm.org/about/downloads\fP
.IP \(bu 2
\fI\%https://alpinelinux.org/downloads\fP
.UNINDENT
.sp
Technically such rootfs archive can be created by running the
following command on the expected Linux distribution:
.INDENT 0.0
.INDENT 3.5
.sp
.nf
.ft C
tar \-\-one\-file\-system \-\-create \-\-gzip \-\-file my_rootfs.tar.gz /
.ft P
.fi
.UNINDENT
.UNINDENT
.SH ECOSYSTEM
.sp
The following ecosystem has developed around PRoot since it has been
made publicly available.
.SS Projects using PRoot or CARE
.INDENT 0.0
.IP \(bu 2
\fI\%CARE\fP: archive material used during an execution to make it
reproducible on any Linux system.
.IP \(bu 2
\fI\%GNURoot\fP:
use several Linux distros on Android without root access.
.IP \(bu 2
\fI\%Debian noroot\fP:
use Debian Linux on Android without root access.
.IP \(bu 2
\fI\%Polysquare Travis Container\fP:
use several Linux distros on Travis\-CI without root access.
.IP \(bu 2
\fI\%JuNest\fP:
use Arch Linux on any Linux distros without root access.
.IP \(bu 2
\fI\%Portable PyPy\fP:
portable 32 and 64 bit x86 PyPy binaries.
.IP \(bu 2
\fI\%OpenMOLE\fP:
execute programs on distributed computing environments.
.IP \(bu 2
\fI\%ATOS\fP:
find automatically C/C++ compiler options that provide best
optimizations.
.IP \(bu 2
\fI\%OPAM2Debian\fP:
create Debian packages which contains a fully compiled OPAM
installation.
.IP \(bu 2
\fI\%SIO Workers\fP:
batch long\-term computations with Python.
.UNINDENT
.SS Third party packages
.sp
Binaries from the \fI\%Downloads\fP section are likely more up\-to\-date.
.INDENT 0.0
.IP \(bu 2
\fI\%Alpine Linux\fP
.IP \(bu 2
\fI\%Arch Linux\fP
.IP \(bu 2
\fI\%Void Linux\fP
.IP \(bu 2
\fI\%Gentoo\fP
.IP \(bu 2
\fI\%Debian\fP
.IP \(bu 2
\fI\%Ubuntu\fP
.IP \(bu 2
\fI\%NixOS\fP
.IP \(bu 2
\fI\%University of Chicago RCC\fP
.UNINDENT
.SS Public material about PRoot or CARE
.INDENT 0.0
.IP \(bu 2
articles on \fI\%Rémi\(aqs blog\fP\&. Rémi (a.k.a Ivoire)
is one of the PRoot developers.
.IP \(bu 2
presentation "\fI\%Software engineering tools based on syscall
instrumentation\fP" during
FOSDEM 2014.
.IP \(bu 2
presentation "\fI\%SW testing & Reproducing a LAVA failures locally
using CARE\fP"
during Linaro Connect USA 2014
.IP \(bu 2
presentation and essay "\fI\%CARE: the Comprehensive Archiver for
Reproducible Execution\fP"
(\fI\%essay\fP)
during TRUST 2014
.IP \(bu 2
presentation "\fI\%An Introduction to the CARE tool (dead link)\fP"
during HiPEAC CSW 2013
.IP \(bu 2
presentation and essay "\fI\%PRoot: a Step Forward for QEMU User\-Mode\fP" (\fI\%proceedings\fP) during
QUF\(aq11
.IP \(bu 2
tutorial "\fI\%How to install nix in home (on another distribution)\fP"
.UNINDENT
.SS Companies using PRoot or CARE internally
.INDENT 0.0
.IP \(bu 2
STMicroelectronics
.IP \(bu 2
Sony
.IP \(bu 2
Ericsson
.IP \(bu 2
Cisco
.IP \(bu 2
Gogo
.UNINDENT
.SH SEE ALSO
.sp
chroot(1), mount(8), binfmt_misc, ptrace(2), qemu(1), sb2(1),
bindfs(1), fakeroot(1), fakechroot(1)
.SH COLOPHON
.sp
Visit \fI\%https://proot\-me.github.io\fP for help, bug reports, suggestions, patches, ...
Copyright (C) 2015 STMicroelectronics, licensed under GPL v2 or later.
.INDENT 0.0
.INDENT 3.5
.sp
.nf
.ft C
_____ _____ ___
| __ \e __ \e_____ _____| |_
| __/ / _ \e/ _ \e _|
|__| |__|__\e_____/\e_____/\e____|
.ft P
.fi
.UNINDENT
.UNINDENT
.\" Generated by docutils manpage writer.
.

View File

@ -6,8 +6,8 @@
``chroot``, ``mount --bind``, and ``binfmt_misc`` without privilege/setup
-------------------------------------------------------------------------
:Date: 2016-08-09
:Version: 5.1.0
:Date: 2020-04-14
:Version: 5.2.0-alpha
:Manual section: 1
@ -666,7 +666,7 @@ Colophon
========
Visit https://proot-me.github.io for help, bug reports, suggestions, patches, ...
Copyright (C) 2015 STMicroelectronics, licensed under GPL v2 or later.
Copyright (C) 2020 PRoot Developers, licensed under GPL v2 or later.
::

File diff suppressed because it is too large Load Diff

View File

@ -191,7 +191,7 @@ $(USE_BUILD_H): build.h
$(COMPILE)
.INTERMEDIATE: manual
manual: $(VPATH)/../doc/care/manual.txt
manual: $(VPATH)/../doc/care/manual.rst
$(Q)cp $< $@
cli/care-manual.o: manual cli/cli.o

View File

@ -73,7 +73,7 @@ static Cli care_cli = {
.subtitle = "Comprehensive Archiver for Reproducible Execution",
.synopsis = "care [option] ... command",
.colophon = "Visit https://proot-me.github.io for help, bug reports, suggestions, patches, ...\n\
Copyright (C) 2015 STMicroelectronics, licensed under GPL v2 or later.",
Copyright (C) 2020 PRoot Developers, licensed under GPL v2 or later.",
.logo = "\
_____ ____ _____ ____\n\
/ __/ __ | __ \\ __|\n\

View File

@ -6,7 +6,7 @@
#include "cli/cli.h"
#ifndef VERSION
#define VERSION "5.1.0"
#define VERSION "5.2.0-alpha"
#endif
static const char *recommended_bindings[] = {
@ -77,7 +77,7 @@ static Cli proot_cli = {
.subtitle = "chroot, mount --bind, and binfmt_misc without privilege/setup",
.synopsis = "proot [option] ... [command]",
.colophon = "Visit https://proot-me.github.io for help, bug reports, suggestions, patchs, ...\n\
Copyright (C) 2015 STMicroelectronics, licensed under GPL v2 or later.",
Copyright (C) 2020 PRoot Developers, licensed under GPL v2 or later.",
.logo = "\
_____ _____ ___\n\
| __ \\ __ \\_____ _____| |_\n\