Tue Jan 5 2021
I moved all apps on my RPI2 to LXD (Linux Containers) a simple lightweight solution for OS virtualization. In another note I will share more details. Since it is a RPI2 - armv7l - and limited I really wanted to push all containers to the smallest possible container, being alpine musl images. To get domoticz running on LXD was pretty easy using a debian image, simply launch a standard debian image and install domoticz. This might still be the best/easiest/quickest way to run domoticz, but I still wanted to move to an alpine image .. so ..
It took me some puzzling and trial and error, but in the end I succeeded. This not is here for future reference (probably will have to do this again for an upgrade) and to share with potential others. Not that it is not the fastest solution for compiling since I ended up compiling via qemu. If I find a way I might add another note on cross compiling domoticz on alpine ;-)
chrootinto alpine musl!!
add binfmt-support and qemu-user-static and make sure binfmt-support is started
# note: binfmt-support must be installed first, not sure if it has to be started first xbps-install binfmt-support cd /var/services ln -s /etc/sv/binfmt-support . xbps-install qemu-user-static
curl -O https://dl-cdn.alpinelinux.org/alpine/v3.13/releases/armhf/alpine-minirootfs-3.13.0-armhf.tar.gz mkdir chroot cd chroot tar xvf ../alpine-minirootfs-3.13.0-armhf.tar.gz
cp /sbin/qemu-arm-static chroot/usr/bin
chrootinto the alpine musl armv7l chroot
uname -m # your current architecture: eg x86_64 # note the /bin/sh is required since alpine does not have bash installed by default chroot chroot /bin/sh uname -m # should give armv7l
Next steps is loosely based on a Dockerfile for building domoticz on alpine linux, and a lot of trial and error
# get into the chroot chroot chroot /bin/sh # add required packages for compiling on alpine apk add git python3-dev build-base cmae boost-dev boost-thread boost-system boost-date_time sqlite sqlite-dev curl libcurl curl-dev libressl-dev libusb libusb-dev libusb-compat libusb-compat-dev lua5.3-dev minizip-dev mosquitto-dev coreutils tzdata zlib zlib-dev udev eudev-dev linux-headers libssl1.1
On top of this
cereal is required. cereal is a header-only C++11 serialization library:
# download cereal from the website (download topright) or curl -OL https://github.com/USCiLab/cereal/archive/v1.3.0.tar.gz tar xvf v1.3.0.tar.gz # link the resulting cerual-1.3.0 dir to /usr/include cd /usr/include ln -s <path-to-cereal-1.3.0> .
git clone https://github.com/domoticz/domoticz.git dev-domoticz cd dev-domoticz
cmake -DBUILD_SHARED_LIBS=True -DCMAKE_BUILD_TYPE=Release -DUSE_BUILTIN_LUA=OFF -DUSE_BUILTIN_MINIZIP=OFF -DUSE_BUILTIN_MQTT=OFF -DUSE_BUILTIN_SQLITE=OFF -DLUA_LIBRARIES=/usr/lua5.3/lib/liblua-5.3.so.0 -DUSE_STATIC_BOOST=OFF CMakeLists.txt # should return without errors # build with parallel cores make -j13 # note that building is slower than normal compile since everything is run via qemu-arm-static!
The resulting binary should give sort of the following in ldd
~/dev-domoticz # ldd domoticz /lib/ld-musl-armhf.so.1 (0x40000000) libsqlite3.so.0 => /usr/lib/libsqlite3.so.0 (0x3ed8c000) libminizip.so.1 => /usr/lib/libminizip.so.1 (0x3ed73000) libssl.so.1.1 => /lib/libssl.so.1.1 (0x3ecf9000) libcrypto.so.1.1 => /lib/libcrypto.so.1.1 (0x3eb12000) libboost_thread.so.1.72.0 => /usr/lib/libboost_thread.so.1.72.0 (0x3eadf000) libusb-0.1.so.4 => /usr/lib/libusb-0.1.so.4 (0x3eacb000) libz.so.1 => /lib/libz.so.1 (0x3eaa6000) libcurl.so.4 => /usr/lib/libcurl.so.4 (0x3ea33000) libmosquitto.so.1 => /usr/lib/libmosquitto.so.1 (0x3ea0f000) liblua-5.3.so.0 => /usr/lua5.3/lib/liblua-5.3.so.0 (0x3e9d5000) libc.musl-armhf.so.1 => /lib/ld-musl-armhf.so.1 (0x40000000) libgcc_s.so.1 => /usr/lib/libgcc_s.so.1 (0x3e9bb000) libusb-1.0.so.0 => /usr/lib/libusb-1.0.so.0 (0x3e995000) libnghttp2.so.14 => /usr/lib/libnghttp2.so.14 (0x3e967000) libcares.so.2 => /usr/lib/libcares.so.2 (0x3e945000)
Add lxc container and copy domoticz into the container
# add base container lxc launch images:alpine/3.13 a1 # enter a1 container lxc exec a1 sh apk add sqlite-libs libcurl minizip boost-thread libusb-compat mosquitto-libs exit # copy domoticz into the container tar cvf domoticz.tar Config domoticz* plugins History.txt scripts License.txt dzVents www lxc file push domoticz.tar a1/root/domoticz.tar # setup container lxc exec a1 sh adduser domoticz cd /home/domoticz mkdir app cd app tar xvf /root/domoticz.tar cd .. chown -R domoticz.domoticz app chmod -R u+rwX,go-rwx . # etc, you probably know the drill
Alpine containers use /etc/local.d/
#!/bin/sh # /etc/local.d/domoticz.start su -l domoticz -c 'cd app; ./domoticz -www 8008 -sslwww 0 -noupdates -syslog local6 -loglevel status,normal,error -pidfile domoticz.pid -daemon' #!/bin/sh # /etc/local.d/domoticz.stop killall domoticz # and add local to the startup sequence rc-update add local
that’s it! Alpine running in an lxd/lxc alpine musl container!