Common Issues with Zoneminder Installation on Ubuntu
05JAN15
With some changes “in-the-works” for Ubuntu installs by the hard working volunteers who keep Zoneminder up-to-date, it was recommended that we post fixes/instructions for some issues that continue to surface. One difference will be that the Zoneminder install will no longer automatically install the zm database in MySQL. This document will likely grow over time but may become obsolete as procedures become better documented.
Zoneminder "Master" PPA This is to remind you that software installed from the iconnor zoneminder-master PPA is BETA software and NOT recommended for production systems! BETA software may have some features that do not work correctly!
Zoneminder Database
See Database Tips and Tricks for more topics: http://www.zoneminder.com/wiki/index.php/General_Notes#Database_Tricks.2FTips
Enable and convert MySQL to innodb_file_per_table for Zoneminder
Note: You may wish to convert MyISAM tables to InnoDB tables before you proceed. Upgrading Zoneminder to 1.26 or newer should do this for you.
innodb_file_per_table is by default ON Mysql 5.6.6 and onwards. There is plenty of stuff on Google about pros & cons of innodb_file_per_table. This post details how to enable innodb_file_per_table on an existing database. Because innodb_file_per_table affects new tables only, created after innodb_file_per_table is enabled, we need to recreate old databases to force innodb_file_per_table on old tables and reclaim some disk space.
Become root
sudo su
Backup First Create a dir to take backups:
cd ~
Note: I found it helpful to create a file which contained the MySQL user and password. Otherwise you will have to enter the user and password for every operation.
nano .my.cnf
Enter this content
[client] user=root password=mysqlpass
Ctrl+o Enter to save
CTRL+x to exit
Make backup directory
mkdir backup
cd backup
Copy MySQL data files (raw) (If all goes well, we will not need this)
Stop Zoneminder
service zoneminder stop
If you have other services that use MySQL you will want to stop them and possibly Apache.
service mysql stop && cp -ra /var/lib/mysql mysqldata && service mysql start
Take mysqldump As soon as above line completes, take a mysqldump of all databases
mysqldump --routines --events --flush-privileges --all-databases > all-db.sql
Drop Databases Create a sql file to drop all databases EXCEPT mysql database
mysql -e "SELECT DISTINCT CONCAT ('DROP DATABASE ',TABLE_SCHEMA,' ;') FROM INFORMATION_SCHEMA.TABLES WHERE TABLE_SCHEMA <> 'mysql' AND TABLE_SCHEMA <> 'information_schema';" | tail -n+2 > drop.sql
Verify if drop.sql has correct database names and then execute drop.sql queries.
mysql < drop.sql
Verify all InnoDB tables gone
SELECT table_name, table_schema, engine FROM information_schema.tables WHERE engine = 'InnoDB';
Remove InnoDB files Stop mysql server first
service mysql stop
Then
rm /var/lib/mysql/ibdata1 && rm /var/lib/mysql/ib_logfile0 && rm /var/lib/mysql/ib_logfile1
At this point most likely you will have only /var/lib/mysql/mysql directory only.
Enable innodb_file_per_table
Open my.cnf file
nano /etc/mysql/my.cnf
Add following line after [mysqld]
innodb_file_per_table
Ctrl+o Enter to save
CTRL+x to exit
Time to import from mysqldump Start mysql server now
service mysql start
Run mysql import
mysql < all-db.sql
Force mysql_upgrade (to generate performance_schema)
mysql_upgrade --force
That’s All!
Restart Zoneminder (and any other services you have stopped)
service zoneminder start
Check for proper operation and that all your events are present.
When you are satisfied that all is worling well remove the backup directory and password filr=e
cd ~
rm -r backup
rm .my.cnf
You are finished!
This procedure has been adopted from https://rtcamp.com/tutorials/mysql/enable-innodb-file-per-table. Thanks to Rahul Bansal!
Adding Permissions to allow Database Upgrade
Versions of Zoneminder up to and including 1.28.1 in Ubuntu would automatically add the zm database to MySQL. Beginning about August 2015 the development version from the iconnor-master PPA omitted this step becoming like the Debian install process. Manually adding the database to MySQL will be necessary.
To install the zm database (after doing apt-get install zoneminder)
Create Zoneminder database in MySQL (Note: this also creates the default Zoneminder user and permissions in MySQL)
This next step creates a file which contained the MySQL user and password. Otherwise you will have to enter the user and password on the command line which is not secure!
Go to the root directory
cd ~
Create a hidden password file
nano .my.cnf
Enter this content (but use your MySQL root password!)
[client] user=root password=(mysqlpass)
Ctrl+o Enter to save
CTRL+x to exit
Create database permissions
mysql -e "grant select,insert,update,delete,create,alter,lock tables on zm.* to 'zmuser'@localhost identified by 'zmpass';"
Remove password file
rm .my.cnf
Continue with the Zoneminder installation
Upgrades
Ubuntu 14.04 with MySQL 5.6 and Zoneminder from PPA
This procedure starts with Ubuntu Server 14.04-3 with LAMP added. Zoneminder is not installed. It is possible to upgrade a system running Zoneminder but it is not covered in this procedure.
Become root
sudo su
Stop MySQL
service mysql stop
Remove MySQL
apt-get purge mysql
Install MySQL 5.6 (will upgrade the MySQL client)
apt-get install mysql-server-5.6
Note: You may need to edit my.cnf and change the value: sql_mode= to sql_mode=NO_ENGINE_SUBSTITUTION
Follow the install instructions: https://wiki.zoneminder.com/Ubuntu_Server_14.04_64-bit_with_Zoneminder_1.29.0_the_easy_way
Ubuntu 14.04 - ZM 1.26.5 or later to 1.29.0 or the latest PPA version
Become root
sudo su
Add Repository (not needed if you are running ZM 1.28.1) Note: if you need to remove a repository use: add-apt-repository --remove ppa:iconnor/zoneminder
add-apt-repository ppa:iconnor/zoneminder
apt-get update
Stop Zoneminder
service zoneminder stop
Upgrade the installation
apt-get upgrade (may return nothing to upgrade)
apt-get dist-upgrade
You will be asked if you want to replace /etc/init.d/zoneminder. Choose "Y"
The database will not automatically update.
Change permissions in your "ZM database to allow the creation of a table
mysql -uroot -p -e "grant all on zm.* to 'zmuser'@localhost identified by 'zmpass';"
Run the database upgrade
/usr/bin/zmupdate.pl
Install PHP5-GD
apt-get install php5-gd
Add back the delay to allow MySQL to start before Zoneminder
nano /etc/init.d/zoneminder
Add sleep 15 as shown:
start() { sleep 15 echo -n "Starting $prog: "
Ctrl+o Enter to save
CTRL+x to exit
Remove symbolic link
rm /etc/apache2/conf-enabled/zoneminder.conf
Set permissions of /etc/zm/zm.conf to root:www-data 740
chmod 740 /etc/zm/zm.conf
chown root:www-data /etc/zm/zm.conf
Enable Zoneminder and rewrite
a2enconf zoneminder
a2enmod rewrite
Start Zoneminder
service zoneminder start
Add timezone to PHP
nano /etc/php5/apache2/php.ini
Search for [Date] and make changes as follows for your time zone
[Date] ; Defines the default timezone used by the date functions ; http://php.net/date.timezone date.timezone = America/New_York
Ctrl+o Enter to save
CTRL+x to exit
Restart Apache
service apache2 restart
Open Zoneminder. Click on Options - Paths
Change PATH_ZMS to /zm/cgi-bin/nph-zms
Ubuntu 15.04 - ZM 1.26.5 or later to 1.29.0 or the latest PPA version
Become root
sudo su
Add Repository (not needed if you run 1.27.x or later)
add-apt-repository ppa:iconnor/zoneminder
apt-get update
Stop Zoneminder
systemctl stop zoneminder.service
There are some database changes which should update automatically. To preclude problems, run:
mysql -uroot -p -e "grant all on zm.* to 'zmuser'@localhost identified by 'zmpass';"
Upgrade the installation
apt-get upgrade (may return nothing to upgrade)
apt-get dist-upgrade
Note: the 1.29.0-vivid from the PPA does a database upgrade automatically.
Install PHP5-GD
apt-get install php5-gd
Configure Apache
rm /etc/apache2/conf-enabled/zoneminder.conf
a2enmod rewrite
a2enconf zoneminder
Start Zoneminder
service zoneminder start
Fix Permissions
chown -R www-data:www-data /usr/share/zoneminder/
Add timezone to PHP
nano /etc/php5/apache2/php.ini
Search for [Date] and make changes as follows for your time zone
[Date] ; Defines the default timezone used by the date functions ; http://php.net/date.timezone date.timezone = America/New_York
Ctrl+o Enter to save
CTRL+x to exit
Restart Services
service apache2 reload
systemctl start zoneminder.service
Open Zoneminder. Click on Options - Paths
Italic text
Change PATH_ZMS to /zm/cgi-bin/nph-zms
If Zoneminder does not start when you boot your server, run these commands:
systemctl stop zoneminder.service
systemctl disable zoneminder.service
systemctl enable zoneminder.service
systemctl start zoneminder.service
Reboot your server and check that Zoneminder started.
Ubuntu 15.10 - ZM 1.28.1 to 1.29.0 the the latest PPA version
Become root
sudo su
Add Repository (This adds the PPA master which is for testing only!)
add-apt-repository ppa:iconnor/zoneminder
Update package list
apt-get update
Stop Zoneminder
systemctl stop zoneminder.service
There are some database changes which should update automatically. To preclude problems, run:
mysql -uroot -p -e "grant all on zm.* to 'zmuser'@localhost identified by 'zmpass';"
Upgrade the installation
apt-get upgrade
apt-get dist-upgrade
Install PHP5-GD
apt-get install php5-gd
Configure Apache
rm /etc/apache2/conf-enabled/zoneminder.conf
a2enmod rewrite a2enconf zoneminder
Fix Permissions
chown -R www-data:www-data /usr/share/zoneminder/
Add timezone to PHP
nano /etc/php5/apache2/php.ini
Search for [Date] and make changes as follows for your time zone
[Date] ; Defines the default timezone used by the date functions ; http://php.net/date.timezone date.timezone = America/New_York
Ctrl+o Enter to save
CTRL+x to exit
Restart Services
systemctl start zoneminder
service apache2 reload
Open Zoneminder in a browser. Click on Options - Paths
Check that PATH_ZMS is set to: /zm/cgi-bin/nph-zms
Ubuntu 16.04 - ZM 1.29.0 Upgrade
Ubuntu 16.04 contains Zoneminder 1.29.0. The official release date is 21APR16. I have done some initial testing with the 16.04 final beta and the results are good!
Ubuntu 15.10 with ZM 1.29.0 from the PPA to Ubuntu 16.04
do-release-upgrade -d
Fix Permissions
chown -R www-data:www-data /usr/share/zoneminder/
Fix to allow API to work
nano /etc/apache2/apache2.conf
Change "AllowOverride None" to "AllowOverride All" two places as shown below
<Directory /usr/share> AllowOverride All Require all granted </Directory>
<Directory /var/www/> Options Indexes FollowSymLinks AllowOverride All Require all granted </Directory>
Restart Apache
service apache2 reload
If you want to switch to MariaDB server see: https://wiki.zoneminder.com/Install_MariaDB_Server_10.0
Ubuntu 14.04 with ZM 1.29.0 from the PPA to Ubuntu 16.04
02MAY16 This upgrade procedure has been tested successfully! It may not be necessary to take a dump of your zm database but I did it just-in-case MySQL messed something up.
Make sure your install is up to date!
sudo apt-get update sudo apt-get upgrade sudo apt-get dist-upgrade
Reboot if needed
Login to a console and stop Zoneminder
sudo service zoneminder stop
Take a dump of the Zoneminder (zm) database (the zm.sql will be saved in your "home" directory)
mysqldump -u root -p zm > zm.sql
Drop the "zm" database
mysqladmin -uroot -p drop zm
Run the Ubuntu upgrade (note: the "-d" is required until Ubuntu 16.04-1 is released)
sudo do-release-upgrade -d
When prompted, overwrite the zoneminder configuration with the package maintainers version.
My upgrade informed me MySQL server upgrade failed. I had to continue and reboot (Ctrl+Alt+Del) the server manually.
Log in and become root
sudo su
Clean up packages that were not removed when the upgrade failed (may not be needed in the future)
apt-get autoremove
Install PHP7
apt-get install php php-gd libapache2-mod-php php7.0-mysql
Secure MySQL
mysql_secure_installation
Create Zoneminder (zm) database in MySQL
mysqladmin -uroot -p create zm
Import the zm database
mysql -uroot -p zm < zm.sql
Set permissions
mysql -uroot -p -e "grant all on zm.* to 'zmuser'@localhost identified by 'zmpass';"
To better manage the MySQL server I recommend you copy the sample config file and replace the default my.cnf symbolic link.
rm /etc/mysql/my.cnf (this removes the current symbolic link)
cp /etc/mysql/mysql.conf.d/mysqld.cnf /etc/mysql/my.cnf
To change MySQL settings:
nano /etc/mysql/my.cnf
In the [mysqld] section add the following
sql_mode = NO_ENGINE_SUBSTITUTION
Ctrl+o Enter to save
CTRL+x to exit
Restart MySQL
systemctl restart mysql
Set the Timezone on PHP7
nano /etc/php/7.0/apache2/php.ini
Search for [Date] (Ctrl + w then type Date and press Enter) and make changes as follows for your time zone
[Date] ; Defines the default timezone used by the date functions ; http://php.net/date.timezone date.timezone = America/New_York
Ctrl+o Enter to save
CTRL+x to exit
Fix Permissions
chown -R www-data:www-data /usr/share/zoneminder/
Fix to allow API to work
nano /etc/apache2/apache2.conf
Change "AllowOverride None" to "AllowOverride All" two places as shown below
<Directory /usr/share> AllowOverride All Require all granted </Directory>
<Directory /var/www/> Options Indexes FollowSymLinks AllowOverride All Require all granted </Directory>
Enable and start Zoneminder
systemctl enable zoneminder
service zoneminder start
Restart Apache
service apache2 reload
You should be able to connect to Zoneminder in your web browser!
Ubuntu with ZM 1.28.1 or Earlier Upgrade to Ubuntu 16.04
Upgrade Ubuntu running Zoneminder 1.28.1 or earlier.
05MAY16 This has been run on Ubuntu 14.04 with Zoneminder 1.26.5 and Ubuntu 15.10 with Zoneminder 1.28.1. You have two database options: (1)MySQL 5.7 or (2)Mariadb 10.1. Switching to Mariadb Server is a good thing as it seems to work smoother than MySQL 5.7.
Make sure your install is up to date!
sudo apt-get update sudo apt-get upgrade sudo apt-get dist-upgrade
Reboot if needed
Login to a console and stop Zoneminder
sudo service zoneminder stop
Take a dump of the Zoneminder (zm) database (the zm.sql will be saved in your "home" directory)You will need this if you choose Mariadb or if something goes wrong with the upgrade.
mysqldump -u root -p zm > zm.sql
Run the Ubuntu upgrade (note: the "-d" is required until Ubuntu 16.04-1 is released)
sudo do-release-upgrade -d
When prompted, overwrite the zoneminder configuration with the package maintainers version.
If, for some reason, you get an error message that MySQL did not upgrade, continue to reboot, manually if needed, and run on restart
apt-get autoremove
Log in and become root
sudo su
Install PHP7
apt-get install php php-gd libapache2-mod-php php7.0-mysql
Use the default MySQL 5.7
To allow the database upgrade to work you will need to edit one sql file
nano /usr/share/zoneminder/db/zm_update-1.28.99.sql
Search for [ALTER IGNORE TABLE] (Ctrl + w then type ALTER IGNORE TABLE and press Enter. Remove IGNORE then
Ctrl+o Enter to save
CTRL+x to exit
To better manage the MySQL server I recommend you copy the sample config file and replace the default my.cnf symbolic link.
rm /etc/mysql/my.cnf (this removes the current symbolic link)
cp /etc/mysql/mysql.conf.d/mysqld.cnf /etc/mysql/my.cnf
To change MySQL settings:
nano /etc/mysql/my.cnf
In the [mysqld] section add the following
sql_mode = NO_ENGINE_SUBSTITUTION
Ctrl+o Enter to save
CTRL+x to exit
Restart MySQL
systemctl restart mysql
Recommended: Secure MySQL.
mysql_secure_installation
Scroll down to Continue Installation and skip Mariadb
Replace MySQL 5.7 with Mariadb 10
apt-get install mariadb-server
Secure Mariadb (set root password in Mariadb and etc.)
mysql_secure_installation
Create Zoneminder (zm) database in MySQL
mysqladmin -uroot -p create zm
Import the zm database
mysql -uroot -p zm < zm.sql
Set permissions
mysql -uroot -p -e "grant all on zm.* to 'zmuser'@localhost identified by 'zmpass';"
Run the database upgrade
/usr/bin/zmupdate.pl
To better manage the MySQL server I recommend you copy the sample config file and replace the default my.cnf symbolic link.
rm /etc/mysql/my.cnf (this removes the current symbolic link)
cp /etc/mysql/mariadb.conf.d/50-server.cnf /etc/mysql/my.cnf
When you want to change MySQL settings:
nano /etc/mysql/my.cnf
Continue Installation
Set permissions
mysql -uroot -p -e "grant all on zm.* to 'zmuser'@localhost identified by 'zmpass';"
Run the database upgrade
/usr/bin/zmupdate.pl
Set the Timezone on PHP7
nano /etc/php/7.0/apache2/php.ini
Search for [Date] (Ctrl + w then type Date and press Enter) and make changes as follows for your time zone
[Date] ; Defines the default timezone used by the date functions ; http://php.net/date.timezone date.timezone = America/New_York
Ctrl+o Enter to save
CTRL+x to exit
Fix Permissions
chown -R www-data:www-data /usr/share/zoneminder/
Fix to allow API to work
nano /etc/apache2/apache2.conf
Change "AllowOverride None" to "AllowOverride All" two places as shown below
<Directory /usr/share> AllowOverride All Require all granted </Directory>
<Directory /var/www/> Options Indexes FollowSymLinks AllowOverride All Require all granted </Directory>
Enable and start Zoneminder
systemctl enable zoneminder
service zoneminder start
Restart Apache
service apache2 reload
Connect to Zoneminder in your web browser, open Options and set PATH_ZMS to /zm/cgi-bin/nph-zms
Ubuntu Swap File
I have been puzzled for some time as to why Ubuntu will write to the swap file when there is plenty of RAM installed. I've discovered that writing to the swap file is controlled by the "swappiness" setting! By default, Ubuntu uses a swappiness value of 60 which means that when 40% of memory is used, teh system will start swapping data from memory to the swap file. Here is some info you can use to check and/or change swappiness:
To check the swappiness value
cat /proc/sys/vm/swappiness
To change the swappiness value A temporary change (lost on reboot) with a swappiness value of 10 can be made with
sudo sysctl vm.swappiness=10
To make a change permanent, edit the configuration file with your favorite editor:
sudo nano /etc/sysctl.conf
Search for vm.swappiness and change its value as desired. If vm.swappiness does not exist, add it to the end of the file like so:
vm.swappiness=10
The more RAM your system has the lower the swappiness value can be. Possibly even "0" My production system with 16 GIG of RAM works well with a value of "10"
Save the file and reboot.