Objective: To install ZM on an rpi3 with mmal support and verify it's using mmal. Evaluate. Preface: I tried before to install Devuan directly from IMG provided, and then build ffmpeg with mmal included. I don't think was necessary as we are not compiling ffmpeg, but instead using libavcodec (I know this now, but didn't at the time). In any case, if you want ZM to have mmal working you must have the libavcodec development headers that include mmal and you can confirm it by switching debug logging on zmc_m1 (if 1 is your test camera) But let's cover install steps. The goal is to: install raspbian stretch lite update install ffmpeg, verify mmal is included if it does, then install git of zm compile zm, from a more recent branch that includes the Hardware peripheral calls (HWACCEL) migrate to devuan (this ended up being required for my setup, as the docker entrypoint.sh doesn't run with zmsystemctl) it's important to migrate to devuan after installing ffmpeg, as i think the raspbian mirrors are supposed to have support for mmal in ffmpeg but the devuan mirrors may not. Devuan pulls from debian, not Raspbian. Don't bother trying to custom compile ffmpeg, as I mentioned before, you need libavcodec, not ffmpeg. OK, now to install ZM from git... git clone https://github.com/zoneminder/zoneminder.git also this dockerfile has instructions for building a ubuntu img. That might work... https://github.com/ZoneMinder/zmdockerfiles/blob/master/development/ubuntu/xenial/Dockerfile the only changes we will make is: remove libjpeg-turbo8 remove libjpeg-turbo8-dev remove libmysqlclient-dev remove libmime-perl from list as they are named differently. We'll add them back in later. also removing the no depends... so apt-get update apt-get dist-upgrade then the command I'll run (similar to docker file) is apt-get install -y \ apache2 \ build-essential \ cmake \ dh-autoreconf \ dpatch \ git \ libapache2-mod-php \ libarchive-zip-perl \ libavcodec-dev \ libavdevice-dev \ libavfilter-dev \ libavformat-dev \ libavresample-dev \ libav-tools \ libavutil-dev \ libbz2-dev \ libcurl4-gnutls-dev \ libdate-manip-perl \ libdbd-mysql-perl \ libdbi-perl \ libdevice-serialport-perl \ libgcrypt-dev \ libgnutls-openssl-dev \ libmime-lite-perl \ libmp4v2-dev \ libnet-sftp-foreign-perl \ libnetpbm10-dev \ libpcre3 \ libpcre3-dev \ libpolkit-gobject-1-dev \ libpostproc-dev \ libssl-dev \ libswscale-dev \ libsys-cpu-perl \ libsys-meminfo-perl \ libsys-mmap-perl \ libtheora-dev \ libtool \ libv4l-dev \ libvlc5 \ libvlccore8 \ libvlccore-dev \ libvlc-dev \ libvorbis-dev \ libvpx-dev \ libwww-perl \ libx264-dev \ mysql-client \ mysql-server \ php \ php-cli \ php-gd \ php-mysql \ ssmtp \ software-properties-common \ vlc-data \ yasm \ zip hopefully that finishes without any errors. I had dpkg stall halfway through, but that was because I forgot to resize the fs when originally using the Devuan img. With the raspbian img, I think it might auto resize the FS. I reinstalled at that point. easy enough. and it went through without error. The four libraries we had to remove we will now add back in libturbojpeg0 - TurboJPEG runtime library - SIMD optimized libturbojpeg0-dev - Development files for the TurboJPEG library default-libmysqlclient-dev - MySQL database development files (metapackage) libmariadbclient-dev-compat - MariaDB database development files (libmysqlclient compatibility) libmime-base32-perl - Base32 encoder/decoder libmime-base64-urlsafe-perl - Perl version of Python's URL-safe base64 codec libmime-charset-perl - module for MIME character set information libmime-encwords-perl - Perl interface to deal with RFC 2047 encoded words libmime-explode-perl - Perl extension to explode MIME messages libmime-lite-html-perl - Transform HTML page into MIME email libmime-lite-perl - module for convenient MIME message creation libmime-lite-tt-html-perl - module to create HTML mail with MIME::Lite and T T libmime-lite-tt-perl - module to generate MIME messages from Template Toolki t templates libmime-tools-perl - Perl5 modules for MIME-compliant messages libmime-types-perl - Perl extension for determining MIME types and Transfer Encoding libemail-mime-perl probably a few extra here we don't need, but regardless... so apt-get install libturbojpeg0 libturbojpeg0-dev default-libmysqlclient-dev \ libmariadbclient-dev-compat libmime-base32-perl libmime-base64-urlsafe-perl \ libmime-charset-perl libmime-encwords-perl libmime-explode-perl libmime-lite-html-perl \ libmime-lite-perl libmime-lite-tt-html-perl libmime-lite-tt-perl libmime-tools-perl \ libmime-types-perl libemail-mime-perl then follow the docker guide: git clone --recursive https://github.com/ZoneMinder/ZoneMinder cd ZoneMinder If you want a certain tagged or commit of ZM now's the time to git checkout e.g. I am doing git checkout f07b1105d33c088cce4130970ee2f776867f67d0 just so I'm always using the same commit. then cmake . this comes up with a jpeg error... that is explained here: in CMakeLists.txt // # jpeg find_package(JPEG) if(JPEG_FOUND) set(HAVE_LIBJPEG 1) list(APPEND ZM_BIN_LIBS "${JPEG_LIBRARIES}") #link_directories(${JPEG_LIBRARY}) include_directories("${JPEG_INCLUDE_DIR}") set(CMAKE_REQUIRED_INCLUDES "${JPEG_INCLUDE_DIR}") check_include_files("stdio.h;jpeglib.h" HAVE_JPEGLIB_H) if(NOT HAVE_JPEGLIB_H) message(FATAL_ERROR "ZoneMinder requires libjpeg headers - check that libjpeg development packages are installed") endif(NOT HAVE_JPEGLIB_H) else(JPEG_FOUND) message(FATAL_ERROR "ZoneMinder requires jpeg but it was not found on your system") endif(JPEG_FOUND) // /usr/lib/aarch64-linux-gnu/ so do this. apt-get install libjpeg-dev libjpeg62-turbo-dev libjpeg62-turbo libjpeg-turbo-progs one of those will handle jpeg NOTE: we might be losing turbo jpeg support, with libjpeg, so beware this is not optimized for MJPEG... I only plan to use this for RTSP H264 streams, (whole point of this) so your needs may vary. # Configure ZoneMinder RUN cmake . # Build & install ZoneMinder RUN make && make install # ensure writable folders RUN ./zmlinkcontent.sh this all worked, no problem. Devuan ascii. I skipped the volumes part, as we are not using docker. service mysql stop && service apache2 stop # Configure Apache cp misc/apache.conf /etc/apache2/sites-available/000-default.conf echo "ServerName localhost" > /etc/apache2/conf-available/servername.conf && a2enconf -q servername a2enmod -q cgi && a2enmod -q rewrite This came up with an error for rewite.. // AH00526: Syntax error on line 62 of /etc/apache2/sites-enabled/000-default.conf: Invalid command 'RewriteEngine', perhaps misspelled or defined by a module not included in the server configuration // It can be ignored, as we hadn't enabled module rewrite when that loaded. echo "sql_mode=NO_ENGINE_SUBSTITUTION" >> /etc/mysql/mysql.conf.d/mysqld.cnf this fails, but you can change /etc/mysql/mysql.conf.d/mysqld.cnf to /etc/mysql/my.cnf We have ZM, but not init scripts. Since we are testing, here. Let's just use the dockerfile's entrypoint.sh That works just as well, as an init script. wget https://raw.githubusercontent.com/ZoneMinder/zmdockerfiles/master/utils/entrypoint.sh root@devuan:~# mv entrypoint.sh /usr/local/bin/. root@devuan:~# chmod 755 /usr/local/bin/entrypoint.sh root@devuan:~# now run /usr/local/bin/entrypoint.sh I sometimes run it in a screen session apt-get install screen # screen type ctrl-a :sessionname entrypoint ctrl-d to disconnect root@devuan:~# /usr/local/bin/entrypoint.sh mysql: unknown variable 'sql_mode=NO_ENGINE_SUBSTITUTION' * Removing stale lock file * Starting MySQL database server service ...done. * Warning: Mysql startup timer expired! mysql: unknown variable 'sql_mode=NO_ENGINE_SUBSTITUTION' * First run of mysql in the container, creating ZoneMinder dB. mysql: unknown variable 'sql_mode=NO_ENGINE_SUBSTITUTION' * Starting Apache http web server service ...done. * Starting ZoneMinder video surveillance recorder ...failed! // this fails, but we are close. The error I had made before was accidentally following the docker exactly. It added the 'sql_mode=NO_ENGINE_SUBSTITUTION' to my.cnf and my.cnf didn't understand it. So simply comment that out, if you added that by accident. when you run entrypoint you should see root@devuan:~# /usr/local/bin/entrypoint.sh * Removing stale lock file * MySQL database server already running. * First run of mysql in the container, creating ZoneMinder dB. * Starting Apache http web server service ...done. * Starting ZoneMinder video surveillance recorder ...done. And that tells us everything is working. If you go to ZM at the IP address, you should see it "Running". If you see it stopped, and you still have raspbian... read below. NOW, one problem I had is that when I was testing this is raspbian, it tried to call zmsystemctl which failed to actually run ZM. At this point I migrated to Devuan, following the dev1fanboy ascii migration guide (this is what I did) * add devuan repos to apt/sources * apt-get install sysvinit-core * make sure /etc/inittab is there and has init data * reboot And then running the entrypoint.sh didn't try to call zmsystemctl, and it worked. Now follow the next guide for details about my testing with mmal and a camera.