diff --git a/scripts/container-manager.sh b/scripts/container-manager.sh new file mode 100755 index 0000000000000000000000000000000000000000..c4570d269dde0fa8abafa1464932a7a941eeaded --- /dev/null +++ b/scripts/container-manager.sh @@ -0,0 +1,8 @@ +#!/bin/bash + +# Make sure our setup path for the container rootfs +# is present as lxc is statically configured for +# this path. +mkdir -p $SNAP_COMMON/lxc + +exec $SNAP/bin/anbox container-manager diff --git a/scripts/container-shell.sh b/scripts/container-shell.sh new file mode 100755 index 0000000000000000000000000000000000000000..eef8c2e152e6acf672c438e5ac975edfc53726a7 --- /dev/null +++ b/scripts/container-shell.sh @@ -0,0 +1,10 @@ +#!/bin/bash + +$SNAP/bin/lxc-attach \ + --lxcpath=$SNAP_COMMON/var/lib/anbox/containers \ + --name default \ + --clear-env \ + --set-var PATH=/system/bin:/system/sbin:/system/xbin \ + --set-var ANDROID_DATA=/data \ + -- \ + /system/bin/sh diff --git a/scripts/setup-rootfs.sh b/scripts/setup-rootfs.sh new file mode 100755 index 0000000000000000000000000000000000000000..23904140fa7f7dbc21f153454594459da4008b40 --- /dev/null +++ b/scripts/setup-rootfs.sh @@ -0,0 +1,16 @@ +#!/bin/bash + +# We need to put the rootfs somewhere where we can modify some +# parts of the content on first boot (namely file permissions). +# Other than that nothing should ever modify the content of the +# rootfs. + +ROOTFS_PATH=$SNAP_COMMON/var/lib/anbox/rootfs + +if [ -d $ROOTFS_PATH ] ; then + rm -rf $ROOTFS_PATH +fi + +echo "Copying rootfs into $ROOTFS_PATH .." +mkdir -p $ROOTFS_PATH +tar xf $SNAP/anbox-android-rootfs.tar -C $ROOTFS_PATH/ --strip-components=1 diff --git a/scripts/shell.sh b/scripts/shell.sh new file mode 100755 index 0000000000000000000000000000000000000000..89d12945138c322735891c6ba4a29ffb70b5691d --- /dev/null +++ b/scripts/shell.sh @@ -0,0 +1,3 @@ +#!/bin/bash + +exec /bin/bash $@ diff --git a/scripts/snap-wrapper.sh b/scripts/snap-wrapper.sh new file mode 100755 index 0000000000000000000000000000000000000000..c2884fdbed8752c0a91ef4017229111665ffa377 --- /dev/null +++ b/scripts/snap-wrapper.sh @@ -0,0 +1,43 @@ +#!/bin/bash + +if [ "$SNAP_ARCH" == "amd64" ]; then + ARCH="x86_64-linux-gnu" +elif [ "$SNAP_ARCH" == "armhf" ]; then + ARCH="arm-linux-gnueabihf" +else + ARCH="$SNAP_ARCH-linux-gnu" +fi + +export LD_LIBRARY_PATH=$SNAP/usr/lib/$ARCH:$LD_LIBRARY_PATH + +# Mesa Libs +export LD_LIBRARY_PATH=$SNAP/usr/lib/$ARCH/mesa:$LD_LIBRARY_PATH +export LD_LIBRARY_PATH=$SNAP/usr/lib/$ARCH/mesa-egl:$LD_LIBRARY_PATH + +# XDG Config +export XDG_CONFIG_DIRS=$SNAP/etc/xdg:$XDG_CONFIG_DIRS +export XDG_CONFIG_DIRS=$SNAP/usr/xdg:$XDG_CONFIG_DIRS +# Note: this doesn't seem to work, QML's LocalStorage either ignores +# or fails to use $SNAP_USER_DATA if defined here +export XDG_DATA_DIRS=$SNAP_USER_DATA:$XDG_DATA_DIRS +export XDG_DATA_DIRS=$SNAP/usr/share:$XDG_DATA_DIRS + +# Not good, needed for fontconfig +export XDG_DATA_HOME=$SNAP/usr/share + +# Tell libGL where to find the drivers +export LIBGL_DRIVERS_PATH=$SNAP/usr/lib/$ARCH/dri + +# ensure the snappy gl libs win +export LD_LIBRARY_PATH="$SNAP_LIBRARY_PATH:$LD_LIBRARY_PATH" + +cd $SNAP + +if [ "$(id -u)" == "0" ] ; then + # Make sure our setup path for the container rootfs + # is present as lxc is statically configured for + # this path. + mkdir -p $SNAP_COMMON/lxc +fi + +exec $SNAP/usr/bin/anbox $@ diff --git a/scripts/start-container.sh b/scripts/start-container.sh new file mode 100755 index 0000000000000000000000000000000000000000..15cf4b80f4986bb454e746a3b04bb055aa5f7a95 --- /dev/null +++ b/scripts/start-container.sh @@ -0,0 +1,3 @@ +#!/bin/bash + +exec $SNAP/bin/lxc-start -P $SNAP_COMMON/var/lib/anbox/containers -n default -F diff --git a/snapcraft.yaml b/snapcraft.yaml index 7449a4145970a80dde785c1d91b66a1bd4df7c40..37f7bad2e5d5122b3eda7c323342b528e9258e69 100644 --- a/snapcraft.yaml +++ b/snapcraft.yaml @@ -8,48 +8,117 @@ description: | confinement: devmode apps: - anbox: - command: usr/bin/anbox + anbox: + command: bin/anbox-wrapper.sh + container-manager: + command: bin/anbox-wrapper.sh container-manager + # daemon: simple + setup-rootfs: + command: bin/setup-rootfs.sh + shell: + command: bin/container-shell.sh + sh: + command: bin/shell.sh + start-container: + command: bin/start-container.sh parts: - anbox: - plugin: cmake - source: . - configflags: - # FIXME: Anbox currently has some paths with hard coded prefixes. Once - # that is fixed we can avoid using a prefix here. - - -DCMAKE_INSTALL_PREFIX:PATH=/usr - # FIXME: When building in release mode we get a lot of error which cause - # the build to fail. - - -DCMAKE_BUILD_TYPE=debug - build-packages: - - build-essential - - cmake - - cmake-data - - debhelper - - dbus - - google-mock - - libboost-dev - - libboost-filesystem-dev - - libboost-log-dev - - libboost-iostreams-dev - - libboost-program-options-dev - - libboost-system-dev - - libboost-thread-dev - - libcap-dev - - libdbus-1-dev - - libdbus-cpp-dev - - libegl1-mesa-dev - - libgles2-mesa-dev - - libglib2.0-dev - - libgtest-dev - - libprotobuf-dev - - pkg-config - - protobuf-compiler - stage-packages: - - lxc1 - snap: - - usr/bin/anbox - - usr/bin/anbox-container - - usr/bin/lxc-usernsexec - - usr/lib/*-linux-*/ + android-rootfs: + plugin: dump + source: . + snap: + - anbox-android-rootfs.tar + anbox-common: + plugin: dump + source: . + organize: + scripts/snap-wrapper.sh: bin/anbox-wrapper.sh + scripts/setup-rootfs.sh: bin/setup-rootfs.sh + scripts/container-shell.sh: bin/container-shell.sh + scripts/shell.sh: bin/shell.sh + scripts/start-container.sh: bin/start-container.sh + snap: + - bin/anbox-wrapper.sh + - bin/setup-rootfs.sh + - bin/container-shell.sh + - bin/shell.sh + - bin/start-container.sh + lxc: + source: git://github.com/morphis/lxc + source-branch: snappy-support + build-packages: + - libapparmor-dev + - libcap-dev + - libgnutls28-dev + - libseccomp-dev + - pkg-config + plugin: autotools + configflags: + - --disable-selinux + - --disable-python + - --disable-lua + - --disable-tests + - --disable-examples + - --disable-doc + - --disable-api-docs + - --disable-bash + - --disable-cgmanager + # FIXME: Enable again once stacked AppArmor support landed + - --disable-apparmor + - --disable-seccomp + - --enable-capabilities + - --with-rootfs-path=/var/snap/anbox/common/lxc/ + snap: + - bin/lxc-attach + - bin/lxc-ls + - bin/lxc-start + - bin/lxc-stop + - lib/liblxc.so.1 + - lib/liblxc.so.1.2.0 + - libexec/lxc/lxc-monitord + anbox: + plugin: cmake + after: + - lxc + source: . + configflags: + # FIXME: Anbox currently has some paths with hard coded prefixes. Once + # that is fixed we can avoid using a prefix here. + - -DCMAKE_INSTALL_PREFIX:PATH=/usr + # FIXME: When building in release mode we get a lot of error which cause + # the build to fail. + - -DCMAKE_BUILD_TYPE=debug + build-packages: + - build-essential + - cmake + - cmake-data + - debhelper + - dbus + - google-mock + - libboost-dev + - libboost-filesystem-dev + - libboost-log-dev + - libboost-iostreams-dev + - libboost-program-options-dev + - libboost-system-dev + - libboost-thread-dev + - libcap-dev + - libdbus-1-dev + - libdbus-cpp-dev + - libegl1-mesa-dev + - libgles2-mesa-dev + - libglib2.0-dev + - libgtest-dev + - libprotobuf-dev + - libsdl2-dev + - pkg-config + - protobuf-compiler + stage-packages: + - libegl1-mesa + - libgles2-mesa + - libgl1-mesa-glx + - libsdl2-2.0-0 + - libsdl2-gfx-1.0-0 + snap: + - usr/bin/anbox + - usr/lib/*-linux-*/ diff --git a/src/anbox/cmds/start_container.cpp b/src/anbox/cmds/start_container.cpp index f7ee94cec01a64eb0fef0d46d57fbf54347feaa6..c689f70818733689643473170bf478bf19a418f6 100644 --- a/src/anbox/cmds/start_container.cpp +++ b/src/anbox/cmds/start_container.cpp @@ -34,9 +34,11 @@ anbox::cmds::StartContainer::StartContainer() }); auto rt = Runtime::create(); + auto container = std::make_shared(); + container::Configuration config; rt->start(); - + container->start(config); trap->run(); rt->stop();