Common Issues with Zoneminder Installation on Ubuntu
11OCT15
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 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 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 (press ENTER after each command)
mysql < /usr/share/zoneminder/db/zm_create.sql
mysql
grant select,insert,update,delete on zm.* to 'zmuser'@localhost identified by 'zmpass';
\q (enter) (to quit)
Note for upgrade from prior version of Zoneminder: The latest version from the PPA Master contains a new table. If you try to run zmupdate.pl to upgrade the database you will ge an error. You need to run the entry:
grant select,insert,update,delete,create on zm.* to 'zmuser'@localhost identified by 'zmpass';
Remove password file
rm .my.cnf
Continue with the Zoneminder installation
Getting the API to work
WARNING! If your Zoneminder is exposed to the internet make sure you have OPT_USE_AUTH enabled.
The API is needed to get Zoneminder to work with zmNinja (under development as of 1OCT15) and possibly household automation software.
The "official" documentation is here:https://github.com/pliablepixels/zmNinja/wiki/Configuring-ZoneMinder-with-API But can be done in two steps.
Enable rewrite
a2enmod rewrite
Change owner of /usr/share/zoneminder/www sub directories and files to: www-data:www-data
chown -R www-data:www-data /usr/share/zoneminder/www
Restart Apache
Testing. if you have OPT_USE_AUTH turned on make sure you are logged into Zoneminder before you try the following tests or turn off OPT_USE_AUTH.
Test to see if cake is working: http://localhost/zm/api/
Test API using: http://localhost/zm/api/host/getVersion.json Should return something like:
{ "version": "1.28.107", "apiversion": "1.28.107.1" }
Upgrades
Ubuntu 14.04 with MySQL 5.6 and Zoneminder from PPA Master
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
Add Repository
add-apt-repository ppa:iconnor/zoneminder-master
apt-get update
Install Zoneminder
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 teh
command line which is not secure!
Go to the root dir
cd ~
Create a hidden password file
nano .my.cnf
Enter this content
[client] user=root password=(mysqlpass)
Ctrl+o Enter to save
CTRL+x to exit
Create database
mysql < /usr/share/zoneminder/db/zm_create.sql
mysql
grant select,insert,update,delete on zm.* to 'zmuser'@localhost identified by 'zmpass';
\q (enter) (to quit)
Remove password file
rm .my.cnf
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
Add 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
Create a symbolic link
ln -s /etc/zm/apache.conf /etc/apache2/conf-enabled/zoneminder.conf
Create a new user
adduser www-data video
Enable CGI and Zoneminder configuration in Apache.
a2enmod cgi
a2enconf zoneminder
a2enmod rewrite
Start Zoneminder
service zoneminder start
Restart Apache
service apache2 reload
Ubuntu 14.04 - ZM 1.26.5 to 1.28.1
Become root
sudo su
Add Repository
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 should update but to be sure run:
/usr/bin/zmupdate.pl
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
Start Zoneminder
service zoneminder restart
Reload Apache
service apache2 reload
Ubuntu 14.04 - ZM 1.26.5 to 1.28.107 or the latest PPA Master version
Become root
sudo su
Add Repository
add-apt-repository ppa:iconnor/zoneminder-master
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. Replace "abc123" with your MySQL root password.
Change permissions in your "ZM database to allow the creation of a table
mysql -uroot -pabc123 -e "grant select,insert,update,delete,create on zm.* to 'zmuser'@localhost identified by 'zmpass';"
Run the database upgrade
/usr/bin/zmupdate.pl --version=1.26.5
Reset database permissions
mysql -uroot -pabc123 -e "grant select,insert,update,delete on zm.* to 'zmuser'@localhost identified by 'zmpass';"
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
Enable rewrite for API function
a2enmod rewrite
Start Zoneminder
service zoneminder start
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 to 1.28.1
Become root
sudo su
Add Repository
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 should update but to be sure run:
/usr/bin/zmupdate.pl
Start Zoneminder
service zoneminder start
Restart Apache
service apache restart
Ubuntu 15.04 - ZM 1.26.5 to 1.28.107 or the latest PPA Master version
Thanks to "asker" for this procedure. Original posted at: https://github.com/pliablepixels/zmNinja/wiki/Easy-Way:-Upgrading-from-non-API-package-to-API-package
Become root
sudo su
Remove old repository if you used it
add-apt-repository -r ppa:iconnor/zoneminder
Add Repository
add-apt-repository ppa:iconnor/zoneminder-master
apt-get update
Stop Zoneminder
systemctl stop zoneminder.service
Upgrade the installation
apt-get install zoneminder
The database will not automatically update. Replace "abc123" with your MySQL root password.
Change permissions in your "ZM database to allow the creation of a table
mysql -uroot -pabc123 -e "grant create,select,insert,update,delete on zm.* to 'zmuser'@localhost identified by 'zmpass';"
Run the database upgrade
/usr/bin/zmupdate.pl
Configure Apache
rm /etc/apache2/conf-enabled/zoneminder.conf
a2enmod rewrite
a2enmod cgi
a2enconf zoneminder
Fix Permissions
chown -R www-data:www-data /usr/share/zoneminder/
Restart Services
service apache2 reload
systemctl start zoneminder.service
Open Zoneminder in a browser. Click on Options - Paths
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.