Provided by: care_2.2.1-1_amd64 bug

NAME

       CARE - Comprehensive Archiver for Reproducible Execution

SYNOPSIS

       care [option] ... command

DESCRIPTION

       CARE  monitors  the  execution of the specified command to create an archive that contains
       all the material required to re-execute it in the same context.   That  way,  the  command
       will  be  reproducible  everywhere,  even  on  Linux  systems  that are supposed to be not
       compatible with the original Linux system.  CARE is typically useful to get  reliable  bug
       reports,  demonstrations,  artifact  evaluation, tutorials, portable applications, minimal
       rootfs, file-system coverage, ...

       By design, CARE does not record events at all.  Instead, it archives environment variables
       and accessed file-system components -- before modification -- during the so-called initial
       execution.  Then, to reproduce this execution, the re-execute.sh script embedded into  the
       archive  restores  the  environment variables and relaunches the command confined into the
       saved file-system.  That way, both initial and reproduced executions  should  produce  the
       same results as they use the same context, assuming they do not rely on external events --
       like key strokes or network packets -- or that these external events are replayed manually
       or  automatically,  using  umockdev  for  instance.   That  means  it is possible to alter
       explicitly the reproduced executions by changing content of the saved file-system,  or  by
       replaying different external events.

   Privacy
       To  ensure  that  no  sensitive  file  can  possibly  leak into the archive, CARE conceals
       recursively the content of $HOME and /tmp, that is, they appear empty during the  original
       execution.   Although, for consistency reasons, the content of $PWD is revealed even if it
       is nested into the two previous paths.

       As a consequence, a program executed under CARE may behave unexpectedly because a required
       path  is not accessible anymore.  In this case, such a path has to be revealed explicitly.
       For  details,  see  the  options  --concealed-path  and  --revealed-path,  and  the   file
       concealed-accesses.txt as well.

       It is advised to inspect the archived content before sharing it.

OPTIONS

       The  command-line  interface  is  composed  of  two  parts: first CARE's options, then the
       command to launch.  This section describes the options supported by  CARE,  that  is,  the
       first part of its command-line interface.

       -o path, --output=path
              Archive in path, its suffix specifies the format.

              The  suffix  of  path  is  used  to select the archive format, it can be one of the
              following:

                                 ┌────────┬──────────────────────────────────┐
                                 │suffix  │ comment                          │
                                 ├────────┼──────────────────────────────────┤
                                 │/       │ don't  archive,  copy  into  the │
                                 │        │ specified directory instead      │
                                 ├────────┼──────────────────────────────────┤
                                 │.tar    │ most common archive format       │
                                 ├────────┼──────────────────────────────────┤
                                 │.cpio   │ most portable archive format, it │
                                 │        │ can archive sockets too          │
                                 └────────┴──────────────────────────────────┘

                                 │?.gz    │ most common compression  format, │
                                 │        │ but slow                         │
                                 ├────────┼──────────────────────────────────┤
                                 │?.lzo   │ fast   compression  format,  but │
                                 │        │ uncommon                         │
                                 ├────────┼──────────────────────────────────┤
                                 │?.bin   │ see    Self-extracting    format │
                                 │        │ section                          │
                                 ├────────┼──────────────────────────────────┤
                                 │?.?.bin │ see    Self-extracting    format │
                                 │        │ section                          │
                                 ├────────┼──────────────────────────────────┤
                                 │.bin    │ see    Self-extracting    format │
                                 │        │ section                          │
                                 ├────────┼──────────────────────────────────┤
                                 │.raw    │ recommended  archive format, use │
                                 │        │ care -x to extract               │
                                 └────────┴──────────────────────────────────┘

              where "?" means the suffix must  be  combined  with  another  one.   For  examples:
              ".tar.lzo",  ".cpio.gz",  ".tar.bin",  ".cpio.lzo.bin",  ...  If this option is not
              specified, the default output path is care-<DATE>.bin or care-<DATE>.raw, depending
              on whether CARE was built with self-extracting format support or not.

       -c path, --concealed-path=path
              Make path content appear empty during the original execution.

              Some  paths  may  contain  sensitive  data  that should never be archived.  This is
              typically the case for most of the files in:

              • $HOME

              • /tmp

              That's why these directories are recursively concealed from the original execution,
              unless  the  -d  option  is  specified.   Concealed  paths  appear empty during the
              original execution, as a consequence their original content can't be  accessed  nor
              archived.

       -r path, --revealed-path=path
              Make path content accessible when nested in a concealed path.

              Concealed paths might make the original execution with CARE behave differently from
              an execution without CARE.  For example, a lot of No such file or directory  errors
              might  appear.  The solution is to reveal recursively any required paths that would
              be nested into a concealed path.  Note that $PWD is revealed, unless the -d  option
              is specified.

       -p path, --volatile-path=path
              Don't archive path content, reuse actual path instead.

              Some  paths  contain only communication means with programs that can't be monitored
              by CARE, like the kernel or a remote server.  Such paths are  said  volatile;  they
              shouldn't  be archived, instead they must be accessed from the actual rootfs during
              the  re-execution.   This  is  typically  the  case  for   the   following   pseudo
              file-systems, sockets, and authority files:

              • /dev/proc/sys/run/shm/tmp/.X11-unix/tmp/.ICE-unix

              • $XAUTHORITY

              • $ICEAUTHORITY

              • /var/run/dbus/system_bus_socket

              • /var/tmp/kdecache-$LOGNAME

              This  is  also  typically the case for any other fifos or sockets.  These paths are
              considered volatile, unless the -d option is specified.

       -e name, --volatile-env=name
              Don't archive name env. variable, reuse actual value instead.

              Some environment variables are used to communicate  with  programs  that  can't  be
              monitored  by  CARE,  like  remote  servers.   Such  environment variables are said
              volatile; they shouldn't be archived, instead they must be accessed from the actual
              environment  during the re-execution.  This is typically the case for the following
              ones:

              • DISPLAY

              • http_proxy

              • https_proxy

              • ftp_proxy

              • all_proxy

              • HTTP_PROXY

              • HTTPS_PROXY

              • FTP_PROXY

              • ALL_PROXY

              • DBUS_SESSION_BUS_ADDRESS

              • SESSION_MANAGER

              • XDG_SESSION_COOKIE

              These environment variables are  considered  volatile,  unless  the  -d  option  is
              specified.

       -m value, --max-archivable-size=value
              Set the maximum size of archivable files to value megabytes.

              To  keep  the  CPU  time  and the disk space used by the archiver reasonable, files
              whose size exceeds value megabytes are truncated down to 0 bytes.  The  default  is
              1GB, unless the -d option is specified.  A negative value means no limit.

       -d, --ignore-default-config
              Don't use the default options.

       -x file, --extract=file
              Extract content of the archive file, then exit.

              It  is  recommended  to use this option to extract archives created by CARE because
              most extracting tools -- that are not based on libarchive --  are  too  limited  to
              extract them correctly.

       -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  CARE  quiet  except  on  fatal
              errors.

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

       -h, --help, --usage
              Print the user manual, then exit.

EXIT STATUS

       If an internal error occurs, care 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 care itself is to have a look at
       the error message.

FILES

       The output archive contains the following files:

       re-execute.sh
              start the re-execution of the initial command as originally specified.  It is  also
              possible  to specify an alternate command.  For example, assuming gcc was archived,
              it can be re-invoked differently:
                 $ ./re-execute.sh gcc --version gcc (Ubuntu/Linaro 4.5.2-8ubuntu4) 4.5.2

                 $ echo 'int main(void) { return puts("OK"); }' > rootfs/foo.c $  ./re-execute.sh
                 gcc  -Wall  /foo.c  $  foo.c: In function "main": $ foo.c:1:1: warning: implicit
                 declaration of function "puts"

       rootfs/
              directory where all the files used during the  original  execution  were  archived,
              they will be required for the reproduced execution.

       proot  virtualization  tool  invoked  by re-execute.sh to confine the reproduced execution
              into the rootfs.  It also emulates the missing kernel features if needed.

       concealed-accesses.txt
              list of accessed paths that were concealed during the original execution.  Its main
              purpose  is  to know what are the paths that should be revealed if the the original
              execution didn't go as expected.  It  is  absolutely  useless  for  the  reproduced
              execution.

LIMITATIONS

       It's  not  possible  to  use  GDB, strace, or any programs based on ptrace under CARE yet.
       This latter is also based on this syscall, but the Linux kernel allows  only  one  ptracer
       per process.  This will be fixed in a future version of CARE thanks to a ptrace emulator.

EXAMPLE

       In this example, Alice wants to report to Bob that the compilation of PRoot v2.4 raises an
       unexpected warning:

          alice$ make -C PRoot-2.4/src/

          make: Entering directory `PRoot-2.4/src'
          [...]
          CC    path/proc.o
          ./path/proc.c: In function 'readlink_proc':
          ./path/proc.c:132:3: warning: ignoring return value of 'strtol'
          [...]

       Technically, Alice uses Ubuntu 11.04 for x86, whereas Bob uses Slackware 13.37 on  x86_64.
       Both  distros  are  supposed  to  be  shipped  with  GCC 4.5.2, however Bob is not able to
       reproduce this issue on his system:

          bob$ make -C PRoot-2.4/src/

          make: Entering directory `PRoot-2.4/src'
          [...]
          CC    path/proc.o
          [...]

       Since they don't have much time to investigate this issue by iterating between each other,
       they decide to use CARE.  First, Alice prepends care to her command:

          alice$ care make -C PRoot-2.4/src/

          care info: concealed path: $HOME
          care info: concealed path: /tmp
          care info: revealed path: $PWD
          care info: ----------------------------------------------------------------------
          make: Entering directory `PRoot-2.4/src'
          [...]
          CC    path/proc.o
          ./path/proc.c: In function 'readlink_proc':
          ./path/proc.c:132:3: warning: ignoring return value of 'strtol'
          [...]
          care info: ----------------------------------------------------------------------
          care info: Hints:
          care info:   - search for "conceal" in `care -h` if the execution didn't go as expected.
          care info:   - use `./care-130213072430.bin` to extract the output archive.

       Then she sends the care-130213072430.bin file to Bob.  Now, he should be able to reproduce
       her issue on his system:

          bob$ ./care-130213072430.bin
          [...]
          bob$ ./care-130213072430/re-execute.sh

          make: Entering directory `PRoot-2.4/src'
          [...]
          CC    path/proc.o
          ./path/proc.c: In function 'readlink_proc':
          ./path/proc.c:132:3: warning: ignoring return value of 'strtol'
          [...]

       So far so good!  This compiler warning doesn't make sense to  Bob  since  strtol  is  used
       there to check a string format; the return value is useless, only the errno value matters.
       Further investigations are required, so Bob re-execute Alice's GCC differently to get more
       details:

          bob$ ./care-130213072430/re-execute.sh gcc --version

          gcc (Ubuntu/Linaro 4.5.2-8ubuntu4) 4.5.2
          Copyright (C) 2010 Free Software Foundation, Inc.
          This is free software; see the source for copying conditions.  There is NO
          warranty; not even for MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.

       The same invocation on his system returns something slightly different:

          bob$ gcc --version

          gcc (GCC) 4.5.2
          Copyright (C) 2010 Free Software Foundation, Inc.
          This is free software; see the source for copying conditions.  There is NO
          warranty; not even for MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.

       This  confirms that both GCC versions are the same, however Alice's one seems to have been
       modified by Ubuntu.  Although, according to the web page related to  this  Ubuntu  package
       [1],  no  changes  regarding  strtol  were  made.  So Bob decides to search into the files
       coming from Alice's system, that is, the rootfs directory in the archive:

          bob$ grep -wIrl strtol ./care-130213072430/rootfs

          care-130213072430/rootfs/usr/include/inttypes.h
          care-130213072430/rootfs/usr/include/stdlib.h
          [...]

       Here, the file usr/include/stdlib.h contains a declaration of strtol with the "warn unused
       result"  attribute.   On  Ubuntu, this file belongs to the EGLIBC package, and its related
       web page [2] shows that this attribute was actually wrongly  introduced  by  the  official
       EGLIBC developers.  Ultimately Bob should notify them in this regard.

       Thanks to CARE, Bob was able to reproduce the issue reported by Alice without effort.  For
       investigations purpose, he was able to re-execute programs differently and to search  into
       the relevant files.

       [1]  https://launchpad.net/ubuntu/oneiric/+source/gcc-4.5/4.5.2-8ubuntu4

       [2]  https://launchpad.net/ubuntu/+source/eglibc/2.13-0ubuntu13.2

SELF-EXTRACTING FORMAT

       The  self-extracting  format used by CARE starts with an extracting program, followed by a
       regular archive, and it ends with a special footer.  This latter  contains  the  signature
       "I_LOVE_PIZZA" followed by the size of the embedded archive:

          +------------------------+
          |   extracting program   |
          +------------------------+
          |                        |
          |    embedded archive    |
          |                        |
          +------------------------+
          | uint8_t  signature[13] |
          | uint64_t archive_size  |  # big-endian
          +------------------------+

       The  command  care -x can be used against a self-extracting archive, even if they were not
       build for the same architecture.  For instance, a self-extracting archive produced for ARM
       can  be  extracted  with  a  care  program  built  for x86_64, and vice versa.  It is also
       possible to use external tools to extract the embedded archive, for example:

          $ care -o foo.tar.gz.bin /usr/bin/echo OK
          [...]
          OK
          [...]

          $ hexdump -C foo.tar.gz.bin | tail -3
          0015b5b0  00 b0 2e 00 49 5f 4c 4f  56 45 5f 50 49 5a 5a 41  |....I_LOVE_PIZZA|
          0015b5c0  00 00 00 00 00 00 12 b4  13                       |.........|
          0015b5c9

          $ file_size=`stat -c %s foo.tar.gz.bin`
          $ archive_size=$((16#12b413))
          $ footer_size=21
          $ skip=$(($file_size - $archive_size - $footer_size))

          $ dd if=foo.tar.gz.bin of=foo.tar.gz bs=1 skip=$skip count=$archive_size
          1225747+0 records in
          1225747+0 records out
          1225747 bytes (1.2 MB) copied, 2.99546 s, 409 kB/s

          $ file foo.tar.gz
          foo.tar.gz: gzip compressed data, from Unix

          $ tar -tzf foo.tar.gz
          foo/rootfs/usr/
          [...]
          foo/re-execute.sh
          foo/README.txt
          foo/proot

DOWNLOADS

       CARE is heavily based on PRoot, that's why they are both hosted in  the  same  repository:
       http://github.proot.me.   Since  CARE  is  supposed  to  work  on any Linux systems, it is
       recommended to use following highly compatible static binaries:

       • for x86_64: http://static.reproducible.io/care-x86_64

       • for x86: http://static.reproducible.io/care-x86

       • for ARM: http://static.reproducible.io/care-arm

       • other architectures: on demand.

COLOPHON

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

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