Mosquitto MQTT on TinyCore Linux
Author: | akeil |
---|---|
Date: | 2017-01-14 |
Version: | 1 |
This post describes how to install the Mosquitto [1] MQTT [2] broker on a Raspberry Pi with TinyCore [3] Linux.
Build an Extension
There is no prebuilt extension for Mosquitto which means that have to build the program from source and create a custom extension for TinyCore Linux.
First, download the source and unpack:
$ wget http://mosquitto.org/files/source/mosquitto-1.4.10.tar.gz $ tar -xzf mosquitto-1.4.10.tar.gz
Next, install build dependencies.
$ tce-load -w make $ tce-load -w gcc $ tce-load -w compiletc $ tce-load -w openssl-dev $ tce-load -w squashfs-tools $ tce-load -i make $ tce-load -i gcc $ tce-load -i compiletc $ tce-load -i openssl-dev $ tce-load -i squashfs-tools
Edit Makefiles
There are several Makefiles in the Mosquitto project directory. Some of these contain the command install -s --strip-program foo but the --strip-program option is not supported by busybox install. Remove that option (not the call) in all affected Makefiles:
./Makefile ./lib/Makefile ./lib/cpp/Makefile ./client/Makefile ./src/Makefile
Build and Install
According to the Mosquitto README, optional dependencies are c-ares and libuuid, both of which are not available. So we will call make WITH_SRV=no WITH_UUID=no to build.
Note
The README says to use WITH_DNS_SRV=no to build without ares. We need to do this if we do not want to build ares ourselves. This is not quite correct, it is WITH_SRV=no.
$ cd mosquitto-1.4.10/ $ make $ make WITH_SRV=no WITH_UUID=no
Install into /tmp:
$ sudo make install WITH_DOCS=no DESTDIR=/tmp/mosquitto
Installation is done as root so we have the correct permissions on all installed files.
TinyCore Linux recommends to not include the docs in the extension (optionally package them in a separate -docs extension). The WITH_DOCS=no option does exactly this.
The TinyCore Linux guide recommends to strip the created binaries. This has already been done in the Makefiles with install -s.
After installation, all relevant files are located in /tmp/mosquitto. Execute /tmp/mosquitto/usr/local/sbin/mosquitto to make a test-run.
Create User
To run Mosquitto with a dedicated user, create that user:
$ sudo adduser -S mosquitto
And edit configuration accordingly.
Configuration
The config file goes into /usr/local/etc/mosquitto.conf. This is not the default location, so we need to use the --config-file option when starting Mosquitto to tell it where to look for configuration.
Of course, the config file should be included in the list of files to be backed up and restored on boot. Include it in /opt/.filetool.lst:
usr/local/etc/mosquitto.conf
Logging
TinyCore Linux does not come with a syslog daemon. If logging is desired, write to a log file:
log_dest file /var/log/mosquitto.log
On boot, make sure that the file is writable for the mosquitto user.
Persistence
Mosquitto can write connection, subscription and message data to disk and reload it on every restart. To enable this in combination with TinyCore Linux, configure Mosquitto with persistence and include the mosquitto.db in backup/restore.
Configuration:
persistence true persistence_location /var/lib/mosquitto/ persistence_file mosquitto.db autosave_interval 1800
The autosave_interval means that data is saved every 1800 seconds (30 minutes). Additionally, state is stored on exit.
The persistence directory should be created and chown`ed to mosquitto on boot.
To include it in backup and restore, include it in /opt/.filetool.lst:
var/lib/mosquitto
PID File
To help with shutdown and monitoring, we let Mosquitto write a pidfile:
pid_file /var/run/mosquitto.pid
Start on boot
To start the service on boot, include this in /opt/bootlocal.sh:
# start Mosquitto in background touch /var/log/mosquitto.log chown mosquitto:staff /var/log/mosquitto.log mkdir -p /var/lib/mosquitto chown mosquitto:staff /var/lib/mosquitto mosquitto --daemon --config-file /usr/local/etc/mosquitto.conf
This will start Mosquitto as root unless the configuration file defines the user to run as:
user mosquitto
Which is recommended.
Shutdown
To shutdown gracefully, include this in /opt/shutdown.sh:
# stop mosquitto mosquitto_pid=$(cat /var/run/mosquitto.pid) if [ -n "$mosquitto_pid" ]; then kill "$pid" fi
Monitoring with monit
To use monit [6] to monitor Mosquitto, add these checks to monitrc (or in a separate file in monit.d/):
check process mosquitto pidfile /var/run/mosquitto.pid group mqtt if failed uid mosquitto then alert check program mqtt-connect with path "/usr/local/bin/mosquitto_sub --quiet -C 1 --id monit --topic $SYS/broker/version" group mqtt if status != 0 then alert
In order to check if the broker is running, connect to it and retrieve one message. We request a message from the $SYS hierarchy and pick one that is static so that we can be sure that it exists. The $SYS hierarchy is described in the Mosquitto docs [7].
mosquitto_sub comes with the Mosquitto installation an we can use it like this:
$ mosquitto_sub --quiet -C 1 --id monit --topic \$SYS/broker/version
This should be sufficient, i.e. exit with "0" if the connection was possible. The -C 1 options is necessary to exit the program after the first message. Note that you need to escape the "$" for the command line but not in monitrc.
[1] | http://mosquitto.org/ |
[2] | http://mqtt.org/ |
[3] | http://tinycorelinux.net/ |
[4] | http://distro.ibiblio.org/tinycorelinux/corebook.pdf |
[5] | http://wiki.tinycorelinux.net/wiki:creating_extensions |
[6] | https://mmonit.com/monit/ |
[7] | https://mosquitto.org/man/mosquitto-8.html#idm46187459232016 |