dockerfile: finally produce a working dockerfile

This commit is contained in:
2026-01-18 15:04:41 +01:00
parent 81f30926a2
commit 7b0e79d45b
3 changed files with 172 additions and 113 deletions

View File

@ -1,68 +1,122 @@
# Set the base image to Ubuntu Xenial (16.04) # Set the base image to Ubuntu Jammy. Jammy includes the correct dependency versions except for LLVM.
FROM ubuntu:xenial FROM ubuntu:jammy
MAINTAINER Christian Dietrich <stettberger@dokucode.de> LABEL org.opencontainers.image.authors="Christian Dietrich <stettberger@dokucode.de>"
# Install Packages required to build FAIL* # TODO: Can shrink the image size down by a LOT:
RUN apt-get update # - A lot of dependencies are unnecessary, I just need to figure out which
RUN apt-get install -y \ # - Separate build-time / runtime dependencies, then do 2 stages
build-essential \ # - Combine multiple RUNs into a single one
libmysqlclient-dev \ # - Use apt-get --no-install-recommends during package install and apt-get clean afterwards
protobuf-compiler \
libprotobuf-dev \
libpcl1-dev \
libboost-thread-dev \
libboost-system-dev \
libboost-regex-dev \
libboost-coroutine-dev \
libboost-context-dev \
libdwarf-dev \
libelf-dev \
libfontconfig1-dev \
zlib1g-dev \
binutils-dev \
libiberty-dev \
llvm-3.9-dev \
clang-3.9 \
libsdl1.2-dev \
libgtk2.0-dev \
libwxgtk3.0-dev \
libncurses5-dev \
cmake \ # Install basic packages
cmake-curses-gui \ RUN apt-get update \
doxygen \ && DEBIAN_FRONTEND=noninteractive TZ=Europe/Berlin apt-get install -y --no-install-recommends \
git \ build-essential \
screen \ ca-certificates \
wget \ cmake \
openssh-server \ cmake-curses-gui \
vim \ wget \
git \
doxygen \
screen \
openssh-server \
neovim \
ranger ranger
# Symlink clang++ to match docs # NOTE: Only required if the base image is not Jammy
RUN ln -sf /usr/bin/clang++-3.9 /usr/bin/clang++ # Install Boost 1.74 (focal includes 1.71)
# Jammy includes the correct version but its llvm is too old
# RUN wget https://archives.boost.io/release/1.74.0/source/boost_1_74_0.tar.gz \
# && tar xvzf boost_1_74_0.tar.gz && cd boost_1_74_0 \
# && chmod +x ./bootstrap.sh \
# && ./bootstrap.sh --prefix=/usr/local \
# && ./b2 && ./b2 install
# && cd / && rm -rf boost_1_74_0.tar.gz && rm -rf boost_1_74_0
# ENV BOOST_ROOT=/usr/local
# NOTE: Only required if the base image is not Focal
# Install LLVM 6.0 from source
RUN git clone https://github.com/llvm/llvm-project.git && cd llvm-project \
&& git checkout llvmorg-6.0.0 \
&& mkdir build && cd build \
&& cmake -G "Unix Makefiles" ../llvm \
-DCMAKE_BUILD_TYPE=Release \
-DLLVM_ENABLE_TERMINFO=OFF \
-DLLVM_ENABLE_CURSES=OFF \
-DLLVM_ENABLE_PROJECTS="clang;lld" \
&& make -j$(nproc) && make install \
&& cd / && rm -rf ./llvm-project
# Install packages required to build FAIL*
RUN DEBIAN_FRONTEND=noninteractive TZ=Europe/Berlin apt-get install -y --no-install-recommends \
# binutils-dev \
libmysqlclient-dev \
libprotobuf-dev \
libtinfo-dev \
libpcl1-dev \
libdwarf-dev \
libelf-dev \
libiberty-dev \
libboost-thread-dev \
libboost-system-dev \
libboost-regex-dev \
libboost-coroutine-dev \
libboost-context-dev \
libfontconfig1-dev \
zlib1g-dev \
libz3-dev \
libsdl1.2-dev \
# libsdl2-dev \
libgtk2.0-dev \
# libgtk-3-dev \
# libwxbase3.0-dev \
libwxgtk3.0-gtk3-dev \
libncurses-dev \
# libncurses5-dev \
libx11-dev \
xorg-dev \
libasound2-dev
# Install packages required to run FAIL*
RUN DEBIAN_FRONTEND=noninteractive TZ=Europe/Berlin apt-get install -y --no-install-recommends \
protobuf-compiler \
libtinfo6 \
# libtinfo5 \
libmariadb3 \
libprotobuf23 \
libncurses6 \
&& apt-get clean
# NOTE: Only required if we install llvm from apt
# Symlink clang++/llvm-config to match docs
# RUN ln -sf /usr/bin/clang++-6.0 /usr/bin/clang++ \
# && ln -sf /usr/bin/llvm-config-6.0 /usr/bin/llvm-config
# Add a user for compiling FAIL* # Add a user for compiling FAIL*
RUN useradd fail; mkdir /home/fail; chown fail /home/fail RUN useradd fail \
RUN echo 'fail:fail' | chpasswd; chsh fail --shell /bin/bash && mkdir /home/fail && chown fail /home/fail \
RUN adduser fail sudo && echo 'fail:fail' | chpasswd && chsh fail --shell /bin/bash \
&& adduser fail sudo
# SSH login fix. Otherwise user is kicked off after login # SSH login fix. Otherwise user is kicked off after login
RUN mkdir /var/run/sshd RUN mkdir /var/run/sshd \
RUN sed 's@session\s*required\s*pam_loginuid.so@session optional pam_loginuid.so@g' -i /etc/pam.d/sshd && sed 's@session\s*required\s*pam_loginuid.so@session optional pam_loginuid.so@g' -i /etc/pam.d/sshd
ENV NOTVISIBLE "in users profile" ENV NOTVISIBLE="in users profile"
RUN echo "export VISIBLE=now" >> /etc/profile RUN echo "export VISIBLE=now" >> /etc/profile
USER fail USER fail
ENV HOME /home/fail ENV HOME=/home/fail
WORKDIR /home/fail WORKDIR /home/fail
# Get AspectC++ (originally v1.2) for 64 Bit # Get AspectC++ (originally v1.2) for 64 Bit
ARG acversion="2.0" ARG acversion="2.5"
RUN wget http://www.aspectc.org/releases/"$acversion"/ac-bin-linux-x86-64bit-"$acversion".tar.gz RUN wget http://www.aspectc.org/releases/"$acversion"/ac-bin-linux-x86-64bit-"$acversion".tar.gz \
RUN tar xvzf ac-bin-linux-x86-64bit-"$acversion".tar.gz; mkdir bin; mv aspectc++/ac++ aspectc++/ag++ bin/; rm -rf aspectc++ && tar xvzf ac-bin-linux-x86-64bit-"$acversion".tar.gz \
ENV PATH /home/fail/bin:/usr/local/sbin:/usr/local/bin:/usr/sbin:/usr/bin:/sbin:/bin && mkdir bin && mv aspectc++/ac++ aspectc++/ag++ bin/ \
&& rm -rf aspectc++ && rm -rf ac-bin-linux-x86-64bit-"$acversion".tar.gz
ENV PATH=/home/fail/bin:/usr/local/sbin:/usr/local/bin:/usr/sbin:/usr/bin:/sbin:/bin
# Clone FAIL* # Clone FAIL*
RUN git clone https://github.com/danceos/fail.git RUN git clone https://github.com/danceos/fail.git

View File

@ -4,19 +4,8 @@
# place (~fail/bin/*) # place (~fail/bin/*)
FROM danceos/fail-generic-tracing FROM danceos/fail-generic-tracing
MAINTAINER Christian Dietrich <stettberger@dokucode.de>
# Install Additional Packages
RUN apt-get install -y \
python-minimal \
grub-common \
xorriso \
grub-pc-bin \
mysql-client \
python-flask \
python-mysqldb \
python-yaml
LABEL org.opencontainers.image.authors="Christian Dietrich <stettberger@dokucode.de>"
# Passwort for MySQL Daemon # Passwort for MySQL Daemon
ADD my.cnf /home/fail/.my.cnf ADD my.cnf /home/fail/.my.cnf
@ -24,8 +13,8 @@ RUN chown fail /home/fail/.my.cnf
USER fail USER fail
WORKDIR /home/fail WORKDIR /home/fail
RUN echo 'export PATH=$HOME/bin:$PATH' >> ~/.profile;\ RUN echo 'export PATH=$HOME/bin:$PATH' >> ~/.profile \
echo 'cd $HOME/fail-targets' >> ~/.profile && echo 'cd $HOME/fail-targets' >> ~/.profile
RUN git clone https://github.com/danceos/fail-targets.git RUN git clone https://github.com/danceos/fail-targets.git
@ -36,7 +25,7 @@ WORKDIR build
RUN cmake \ RUN cmake \
-DAGXX=/home/fail/bin/ag++ \ -DAGXX=/home/fail/bin/ag++ \
-DBOOST_THREAD_LIBRARY=/usr/lib/x86_64-linux-gnu/libpthread.so \ -DBOOST_THREAD_LIBRARY=/usr/lib/x86_64-linux-gnu/libpthread.so \
# Enable / Disable features \
-DBUILD_ARM=OFF \ -DBUILD_ARM=OFF \
-DBUILD_BOCHS=ON \ -DBUILD_BOCHS=ON \
-DBUILD_CAPSTONE_DISASSEMBLER=OFF \ -DBUILD_CAPSTONE_DISASSEMBLER=OFF \
@ -54,17 +43,16 @@ RUN cmake \
-DBUILD_QEMU=OFF \ -DBUILD_QEMU=OFF \
-DBUILD_T32=OFF \ -DBUILD_T32=OFF \
-DBUILD_X86=ON \ -DBUILD_X86=ON \
# \
-DCLIENT_JOB_INITIAL=1 \ -DCLIENT_JOB_INITIAL=1 \
-DCLIENT_JOB_LIMIT=1000 \ -DCLIENT_JOB_LIMIT=1000 \
-DCLIENT_JOB_REQUEST_SEC=30 \ -DCLIENT_JOB_REQUEST_SEC=30 \
-DCLIENT_RAND_BACKOFF_TEND=8 \ -DCLIENT_RAND_BACKOFF_TEND=8 \
-DCLIENT_RAND_BACKOFF_TSTART=3 \ -DCLIENT_RAND_BACKOFF_TSTART=3 \
-DCLIENT_RETRY_COUNT=3 \ -DCLIENT_RETRY_COUNT=3 \
# ;-separated list \
# ;-separated list
-DCMAKE_AGPP_FLAGS="-D__NO_MATH_INLINES" \ -DCMAKE_AGPP_FLAGS="-D__NO_MATH_INLINES" \
# \
-DCMAKE_BUILD_TYPE=Release \ -DCMAKE_BUILD_TYPE=Release \
-DCMAKE_INSTALL_PREFIX=/usr/local \ -DCMAKE_INSTALL_PREFIX=/usr/local \
-DCONFIG_BOCHS_COMPRESS_STATE=ON \ -DCONFIG_BOCHS_COMPRESS_STATE=ON \
@ -89,18 +77,16 @@ RUN cmake \
-DCONFIG_SR_SAVE=ON \ -DCONFIG_SR_SAVE=ON \
-DCONFIG_SUPPRESS_INTERRUPTS=ON \ -DCONFIG_SUPPRESS_INTERRUPTS=ON \
-DENABLE_DATABASE_TESTS=OFF \ -DENABLE_DATABASE_TESTS=OFF \
# ;-separated list \
# ;-separated list
-DEXPERIMENTS_ACTIVATED="generic-experiment" \ -DEXPERIMENTS_ACTIVATED="generic-experiment" \
# \
-DLibIberty_INCLUDE_DIRS=/usr/include/libiberty \ -DLibIberty_INCLUDE_DIRS=/usr/include/libiberty \
-DLibIberty_LIBRARIES=/usr/lib/x86_64-linux-gnu/libiberty.a \ -DLibIberty_LIBRARIES=/usr/lib/x86_64-linux-gnu/libiberty.a \
-DMYSQL_CONFIG=/usr/bin/mysql_config \ -DMYSQL_CONFIG=/usr/bin/mysql_config \
-DMYSQL_CONFIG_PREFER_PATH=/bin \ -DMYSQL_CONFIG_PREFER_PATH=/bin \
# ;-separated list \
# ;-separated list
-DPLUGINS_ACTIVATED="serialoutput" \ -DPLUGINS_ACTIVATED="serialoutput" \
# \
-DSERVER_COMM_HOSTNAME=localhost \ -DSERVER_COMM_HOSTNAME=localhost \
-DSERVER_COMM_TCP_PORT=1111 \ -DSERVER_COMM_TCP_PORT=1111 \
-DSERVER_OUT_QUEUE_SIZE=0 \ -DSERVER_OUT_QUEUE_SIZE=0 \
@ -114,26 +100,48 @@ RUN cmake \
-DTEST_MYSQL_USER=fail_test \ -DTEST_MYSQL_USER=fail_test \
-DVERBOSE_MAKE=OFF \ -DVERBOSE_MAKE=OFF \
-D_filename=/usr/include/wx-3.0/wx/version.h \ -D_filename=/usr/include/wx-3.0/wx/version.h \
# ;-separated list \
# ;-separated list
-Dbochs_configure_params="--enable-a20-pin;--enable-x86-64;--enable-cpu-level=6;--enable-ne2000;--enable-acpi;--enable-pci;--enable-usb;--enable-trace-cache;--enable-fast-function-calls;--enable-host-specific-asms;--enable-disasm;--enable-readline;--enable-clgd54xx;--enable-fpu;--enable-vmx=2;--enable-monitor-mwait;--enable-cdrom;--enable-sb16=linux;--enable-gdb-stub;--disable-docbook;--with-nogui;--with-x11;--with-wx;--with-sdl" \ -Dbochs_configure_params="--enable-a20-pin;--enable-x86-64;--enable-cpu-level=6;--enable-ne2000;--enable-acpi;--enable-pci;--enable-usb;--enable-trace-cache;--enable-fast-function-calls;--enable-host-specific-asms;--enable-disasm;--enable-readline;--enable-clgd54xx;--enable-fpu;--enable-vmx=2;--enable-monitor-mwait;--enable-cdrom;--enable-sb16=linux;--enable-gdb-stub;--disable-docbook;--with-nogui;--with-x11;--with-wx;--with-sdl" \
# \
-Dbochs_install_prefix=/home/fail/fail/simulators/bochs/install \ -Dbochs_install_prefix=/home/fail/fail/simulators/bochs/install \
.. ..
# We need to manually build Bochs first to generate the bochs/config.h - the external_project configure step # We need to manually build Bochs first to generate the bochs/config.h - the external_project configure step
# (where this file is generated) is run at build time (not configure time), but the build order is not defined correctly. # (where this file is generated) is run at build time (not configure time), but the build order is not defined correctly.
RUN cmake --build . --target libfailbochs_external-configure -- -j$(nproc) # RUN cmake --build . --target libfailbochs_external-configure \
# && cmake --build .
RUN cmake --build . --target libfailbochs_external-configure -- -j$(nproc) \
&& cmake --build . -- -j$(nproc)
# Make FAIL* # Make FAIL*
RUN cmake --build . -- -j$(nproc) RUN ln -s /home/fail/fail/build/bin/fail-client /home/fail/bin/generic-experiment-client \
&& ln -s /home/fail/fail/build/bin/generic-experiment-server /home/fail/bin/ \
&& ln -s /home/fail/fail/tools/analysis/resultbrowser/run.py /home/fail/bin/resultbrowser
# Make FAIL* USER root
RUN ln -s /home/fail/fail/build/bin/fail-client /home/fail/bin/generic-experiment-client; \
ln -s /home/fail/fail/build/bin/generic-experiment-server /home/fail/bin/; \ # Install additional packages
ln -s /home/fail/fail/tools/analysis/resultbrowser/run.py /home/fail/bin/resultbrowser RUN apt-get update \
&& DEBIAN_FRONTEND=noninteractive TZ=Europe/Berlin apt-get install -y --no-install-recommends \
grub-common \
xorriso \
grub-pc-bin \
mysql-client \
python2-minimal \
python2-dev \
# python2-flask \
# python2-mysqldb \
# python2-yaml \
unzip \
&& apt-get clean
RUN ln -sf /usr/bin/python2 /usr/bin/python
# Install python packages
RUN wget https://bootstrap.pypa.io/pip/2.7/get-pip.py \
&& python2 get-pip.py \
&& wget https://raw.githubusercontent.com/paulfitz/mysql-connector-c/master/include/my_config.h -O /usr/include/mysql/my_config.h \
&& pip2 install flask pyyaml MySQL-python
# For the resultbrowser, we expose port 5000 to the outside world. # For the resultbrowser, we expose port 5000 to the outside world.
EXPOSE 5000 EXPOSE 5000
USER root

View File

@ -1,20 +1,21 @@
# Inherit from docker container that has the fail source code prepared, # Inherit from docker container that has the fail source code prepared,
# including all tools which are needed to build FAIL* # including all tools which are needed to build FAIL*
FROM danceos/fail-base FROM danceos/fail-base
MAINTAINER Christian Dietrich <stettberger@dokucode.de>
LABEL org.opencontainers.image.authors="Christian Dietrich <stettberger@dokucode.de>"
USER fail USER fail
# Configure the Weather Monitor Experiment # Configure the Weather Monitor Experiment
ENV PATH /home/fail/bin:/usr/local/sbin:/usr/local/bin:/usr/sbin:/usr/bin:/sbin:/bin ENV PATH=/home/fail/bin:/usr/local/sbin:/usr/local/bin:/usr/sbin:/usr/bin:/sbin:/bin
WORKDIR /home/fail/fail WORKDIR /home/fail/fail
RUN mkdir build-tracer; cd build-tracer RUN mkdir build-tracer && cd build-tracer
WORKDIR build-tracer WORKDIR build-tracer
RUN cmake \ RUN cmake \
-DAGXX=/home/fail/bin/ag++ \ -DAGXX=/home/fail/bin/ag++ \
-DBOOST_THREAD_LIBRARY=/usr/lib/x86_64-linux-gnu/libpthread.so \ -DBOOST_THREAD_LIBRARY=/usr/lib/x86_64-linux-gnu/libpthread.so \
# Enable / Disable features \
-DBUILD_ARM=OFF \ -DBUILD_ARM=OFF \
-DBUILD_BOCHS=ON \ -DBUILD_BOCHS=ON \
-DBUILD_CAPSTONE_DISASSEMBLER=OFF \ -DBUILD_CAPSTONE_DISASSEMBLER=OFF \
@ -32,17 +33,16 @@ RUN cmake \
-DBUILD_QEMU=OFF \ -DBUILD_QEMU=OFF \
-DBUILD_T32=OFF \ -DBUILD_T32=OFF \
-DBUILD_X86=ON \ -DBUILD_X86=ON \
# \
-DCLIENT_JOB_INITIAL=1 \ -DCLIENT_JOB_INITIAL=1 \
-DCLIENT_JOB_LIMIT=1000 \ -DCLIENT_JOB_LIMIT=1000 \
-DCLIENT_JOB_REQUEST_SEC=30 \ -DCLIENT_JOB_REQUEST_SEC=30 \
-DCLIENT_RAND_BACKOFF_TEND=8 \ -DCLIENT_RAND_BACKOFF_TEND=8 \
-DCLIENT_RAND_BACKOFF_TSTART=3 \ -DCLIENT_RAND_BACKOFF_TSTART=3 \
-DCLIENT_RETRY_COUNT=3 \ -DCLIENT_RETRY_COUNT=3 \
# ;-separated list \
# ;-separated list
-DCMAKE_AGPP_FLAGS="-D__NO_MATH_INLINES" \ -DCMAKE_AGPP_FLAGS="-D__NO_MATH_INLINES" \
# \
-DCMAKE_BUILD_TYPE=Release \ -DCMAKE_BUILD_TYPE=Release \
-DCMAKE_INSTALL_PREFIX=/usr/local \ -DCMAKE_INSTALL_PREFIX=/usr/local \
-DCONFIG_BOCHS_COMPRESS_STATE=ON \ -DCONFIG_BOCHS_COMPRESS_STATE=ON \
@ -67,18 +67,16 @@ RUN cmake \
-DCONFIG_SR_SAVE=ON \ -DCONFIG_SR_SAVE=ON \
-DCONFIG_SUPPRESS_INTERRUPTS=ON \ -DCONFIG_SUPPRESS_INTERRUPTS=ON \
-DENABLE_DATABASE_TESTS=OFF \ -DENABLE_DATABASE_TESTS=OFF \
# ;-separated list \
# ;-separated list
-DEXPERIMENTS_ACTIVATED="generic-tracing" \ -DEXPERIMENTS_ACTIVATED="generic-tracing" \
# \
-DLibIberty_INCLUDE_DIRS=/usr/include/libiberty \ -DLibIberty_INCLUDE_DIRS=/usr/include/libiberty \
-DLibIberty_LIBRARIES=/usr/lib/x86_64-linux-gnu/libiberty.a \ -DLibIberty_LIBRARIES=/usr/lib/x86_64-linux-gnu/libiberty.a \
-DMYSQL_CONFIG=/usr/bin/mysql_config \ -DMYSQL_CONFIG=/usr/bin/mysql_config \
-DMYSQL_CONFIG_PREFER_PATH=/bin \ -DMYSQL_CONFIG_PREFER_PATH=/bin \
# ;-separated list \
# ;-separated list
-DPLUGINS_ACTIVATED="tracing;serialoutput" \ -DPLUGINS_ACTIVATED="tracing;serialoutput" \
# \
-DSERVER_COMM_HOSTNAME=localhost \ -DSERVER_COMM_HOSTNAME=localhost \
-DSERVER_COMM_TCP_PORT=1111 \ -DSERVER_COMM_TCP_PORT=1111 \
-DSERVER_OUT_QUEUE_SIZE=0 \ -DSERVER_OUT_QUEUE_SIZE=0 \
@ -92,26 +90,25 @@ RUN cmake \
-DTEST_MYSQL_USER=fail_test \ -DTEST_MYSQL_USER=fail_test \
-DVERBOSE_MAKE=OFF \ -DVERBOSE_MAKE=OFF \
-D_filename=/usr/include/wx-3.0/wx/version.h \ -D_filename=/usr/include/wx-3.0/wx/version.h \
# ;-separated list \
# ;-separated list
-Dbochs_configure_params="--enable-a20-pin;--enable-x86-64;--enable-cpu-level=6;--enable-ne2000;--enable-acpi;--enable-pci;--enable-usb;--enable-trace-cache;--enable-fast-function-calls;--enable-host-specific-asms;--enable-disasm;--enable-readline;--enable-clgd54xx;--enable-fpu;--enable-vmx=2;--enable-monitor-mwait;--enable-cdrom;--enable-sb16=linux;--enable-gdb-stub;--disable-docbook;--with-nogui;--with-x11;--with-wx;--with-sdl" \ -Dbochs_configure_params="--enable-a20-pin;--enable-x86-64;--enable-cpu-level=6;--enable-ne2000;--enable-acpi;--enable-pci;--enable-usb;--enable-trace-cache;--enable-fast-function-calls;--enable-host-specific-asms;--enable-disasm;--enable-readline;--enable-clgd54xx;--enable-fpu;--enable-vmx=2;--enable-monitor-mwait;--enable-cdrom;--enable-sb16=linux;--enable-gdb-stub;--disable-docbook;--with-nogui;--with-x11;--with-wx;--with-sdl" \
# \
-Dbochs_install_prefix=/home/fail/fail/simulators/bochs/install \ -Dbochs_install_prefix=/home/fail/fail/simulators/bochs/install \
.. ..
# We need to manually build Bochs first to generate the bochs/config.h - the external_project configure step # We need to manually build Bochs first to generate the bochs/config.h - the external_project configure step
# (where this file is generated) is run at build time (not configure time), but the build order is not defined correctly. # (where this file is generated) is run at build time (not configure time), but the build order is not defined correctly.
RUN cmake --build . --target libfailbochs_external-configure -- -j$(nproc) # RUN cmake --build . --target libfailbochs_external-configure \
# && cmake --build .
RUN cmake --build . --target libfailbochs_external-configure -- -j$(nproc) \
&& cmake --build . -- -j$(nproc)
# Make FAIL* RUN ln -s /home/fail/fail/build-tracer/bin/fail-client /home/fail/bin/fail-x86-tracing \
RUN cmake --build . -- -j$(nproc) && ln -s /home/fail/fail/build-tracer/bin/import-trace /home/fail/bin/ \
&& ln -s /home/fail/fail/build-tracer/bin/prune-trace /home/fail/bin/ \
RUN ln -s /home/fail/fail/build-tracer/bin/fail-client /home/fail/bin/fail-x86-tracing; \ && ln -s /home/fail/fail/build-tracer/bin/dump-trace /home/fail/bin/ \
ln -s /home/fail/fail/build-tracer/bin/import-trace /home/fail/bin/; \ && ln -s /home/fail/fail/build-tracer/bin/convert-trace /home/fail/bin/ \
ln -s /home/fail/fail/build-tracer/bin/prune-trace /home/fail/bin/; \ && cp /home/fail/fail/tools/bochs-experiment-runner/bochs-experiment-runner.py /home/fail/bin/bochs-experiment-runner.py \
ln -s /home/fail/fail/build-tracer/bin/dump-trace /home/fail/bin/; \ && chmod a+x /home/fail/bin/bochs-experiment-runner.py
ln -s /home/fail/fail/build-tracer/bin/convert-trace /home/fail/bin/; \
cp /home/fail/fail/tools/bochs-experiment-runner/bochs-experiment-runner.py /home/fail/bin/bochs-experiment-runner.py; \
chmod a+x /home/fail/bin/bochs-experiment-runner.py;
USER root USER root