Dec 21 2011

Installing Cacti on Ubuntu Server 10.04 LTS

Published by at 11:54 am under Cacti,Programming,Software,Ubuntu Linux

I wish I could say that instaling Cacti, “the complete rrdtool-based graphing solution”, is a piece of cake, simple and straight forward. Well, it isn’t. Things have gotten better over the last couple of years, but if you have never done it before, it’s still one of those Open Source Software nightmares that the guy behind the Linux Hater’s Blog loves to rant about.

But that does not change the simple fact that Cacti provides a solution for problems that administrators of larger networks actually have, and the team behind Cacti does not charge thousands of Euros for a license for their software. If you need to keep an eye on the performance of thousands of network devices, then Cacti, bitchy, defiant and demanding as it might be, is your friend.

People with a stuffed wallet might rather look at Paessler PRTG Network Monitor and IPSwitch WhatsUp Gold; Paessler is much better in the graphing area than WhatsUp, but WhatsUp probably is a bit easier to use for sending alarms when devices go down.

With certain plugins, Cacti can also be used for monitoring and alarming, and with other plugins it can even be integrated into Nagios, which is -the- Open Source network monitoring solution. However, at my company, we use Cacti exclusively for graphing purposes.

Now what does that mean? It’s rather simple: Cacti uses SNMP (Simple Network Management Protocol) to query values from devices that support the SNMP protocol. This can be the current CPU load of a server or its currently used amount of system memory. This can also be the current amount of traffic that runs through an Ethernet interface of a router. It can be the running state of an Uninterruptable Power Supply or the Eb/N0 (energy per bit to noise power spectral density ratio) of a satellite modem.

Cacti queries such values at a defined interval and puts the results in graphs that are stored in a round robin database (RRD) so that you have nice performance statistics over periods of time. It’s pretty useful in our business, not only for us technicians, but also for our customers who use it as a reference for the quality of our and their own service. (Just for clarification, neither we nor our customers are end-users.)

You will find more information about Cacti and what it does on But since you are reading this, I assume that you already know what Cacti generally can do for you but that you, like myself, have a hard time getting it up and running on Ubuntu Linux Server 10.04 LTS.

I will provide some hints and information about this in the following. These are roughly the steps that I took to install Cacti 0.8.7i on a 64-Bit Ubuntu Server. 64.Bit Ubuntu 10.04 LTS is the standard Linux server operating system at my company, so going with something like “CactiEZ”,which is based upon CentOS, was not an option for me.

I will -not- cover the basic usage of Cacti here. To be honest, I am not even remotely qualified to write about that. I install Cacti and make sure that it is running and that my colleagues can use it. But adding data sources and graphs to the server is not what I do on a daily basis. I managed to get the software running on Ubuntu and I also managed to fix or work around some of the bugs, and I also found solutions for some of the things that do not work as advertised or documented by the Cacti team.

Don’t regard the following notes as a checklist that you can follow blindly. You can’t. I also don’t promise that this will work for you. I just pinned down the most important steps that help –ME– installing a new Cacti Server from scratch. If you need more details, you should pay me to write an exhaustive book on the subject. Since none of you is doing this, these free hints will have to do.

First, install a default Ubuntu LAMP (Linux, Apache, MySQL,  PHP) Server 10.04 LTS with OpenSSH.
Once you’re done, login to a shell on the server and perform a basic configuration.


sudo apt-get update
sudo apt-get upgrade


I use joe as my default text editor:

sudo apt-get install joe


Install compiler package ‘build-essential’

sudo apt-get install build-essential


Install command line utilities to add software repositories.

sudo apt-get install python-software-properties


Set server time zone to UTC:

sudo dpkg-reconfigure tzdata

sudo apt-get install ntp

I configure the ntp server to query the time servers of my company’s backbone routers. If you don’t have own time servers in your network, leave the configuration untouched.

sudo joe /etc/ntp.conf

# You do need to talk to an NTP server or two (or three).
server <aaa.bbb.ccc.ddd>
server <eee.fff.ggg.hhh>


If you have a Syslog server running in your environment, you probably want to make sure that it receives the syslog messages of this server.

sudo joe /etc/rsyslog.conf


Make sure that this file contains the following:

#  /etc/rsyslog.conf    Configuration file for rsyslogd.
*.*     @<ip.address.of.yoursyslogserver>:<port>


Configure the primary network interface by editing the file /etc/network/interfaces


# The primary network interface
auto eth0
iface eth0 inet static
        dns-nameservers <ip.address.of.yourdnsserver>
        dns-search <your.domain>
        pre-up iptables-restore < /etc/iptables.rules
        pre-down iptables-save > /etc/iptables.rules


Create the file /etc/iptables.rules for a simple iptables-based firewall.


:OUTPUT ACCEPT [122:8712]
-A INPUT -i lo -j ACCEPT
-A INPUT -p tcp -m tcp --dport 80 -j ACCEPT
-A INPUT -p tcp -m tcp --dport 443 -j ACCEPT


Enable iptables settings via

sudo iptables-restore < /etc/iptables.rules


Make sure that /etc/resolv.conf contains a nameserver reference to the Windows Domain controller:

nameserver <ip.address.of.yourdnsserver>


If you want to authenticate against a Microsoft Active Directory server (which we do at our company), you might want to install Centrify Express on your Linux server. Although Centrify Express is NOT Open Source, I found the free edition of their server to be BY FAR the best and most reliable tool to integrate Linux machines into a Microsoft Windows domain structure.


Add the repository for Centrify Express:

sudo add-apt-repository "deb lucid partner"
sudo apt-get update


Now install Centrify-Express

sudo apt-get install centrifydc

sudo adjoin –w <your.domain>


You should have a user group defined in your domain that is allowed to obtain root privileges on the Linux box.

sudo visudo


Add the group to the sudoers file:

%<yourWindowsDomainName>\\<WindowsUserGroupName> ALL=(ALL) ALL


In the next step, we usually disable the SSH login for non-Active Directory Users:

sudo joe /etc/ssh/sshd_config


Make sure that those configuration lines are in there:

PermitRootLogin no
DenyUsers <localUserAccount>


Note: All local user accounts that can gain root privileges should not be allowed to use ssh access! Local user accounts are only there for fallback purposes!

sudo apt-get dist-upgrade
sudo apt-get autoremove


Now reboot the server

sudo reboot


Now we begin with the actual Cacti installation.


Login to the server via ssh and execute

sudo -s
cd /var/www
rm index.html
tar xvfz cacti-0.8.7i-PIA-3.1.tar.gz
cd cacti-0.8.7i-PIA-3.1/
cp -R * /var/www
cd /var/www
rm -Rf cacti-0.8.7i-PIA-3.1/
rm cacti-0.8.7i-PIA-3.1.tar.gz
apt-get install rrdtool
apt-get install snmp snmpd
apt-get install php5-cli
apt-get install php5-gd
apt-get install php5-curl
apt-get install unzip
mysql –u root -p
mysql> create database cacti;
mysql> grant all privileges on cacti.* to 'cacti'@'localhost' identified by 'cactidbpassword';
mysql> quit

mysql -u cacti -p -D cacti < cacti.sql
cd include
joe config.php


Change config.php so it looks like this:

$database_type = "mysql";
$database_default = "cacti";
$database_hostname = "localhost";
$database_username = "cacti";
$database_password = "cactidbpassword";
$database_port = "3306";
$database_ssl = false;
sudo chmod –R a+wr /var/www
sudo /etc/init.d/apache2 restart


On your client workstation/notebook, open a web browser and connect to the Linux server. The Cacti installation dialog should appear.

Click Next.
Select “New install” and click Next.
In the next dialog, everything should be marked as FOUND. If not, install the missing pieces and re-try.

Make sure that RRDTool 1.3 and Net-SNMP5 are selected.

Click “Finish” to proceed
Login to Cacti with the username admin and the password admin.
You are required to change the admin password. Do so now.
Go back to the console of the Linux server.


Create a new file named cati in /etc/cron.d:

joe /etc/cron.d/cacti


Add the following contents to it:

*/1 * * * * root /usr/bin/php -q /var/www/poller.php --force >> /var/log/poller.log 2>&1


Note: The Cacti documentation advises to use a five minute interval. However, at our company, that setting did not work for us when we applied a one minute polling interval in Cacti’s system console. Be advised that a one minute polling interval causes a lot of stress even on an eight core Xeon server with 16 GB RAM when you use the PHP poller. Unfortunately, for a couple of reasons, at my work place we have to use both the one minute polling interval AND the PHP poller instead of Spine. If you can avoid the PHP poller, by all means, use Spine and if you can live with bigger polling intervals, reduce the stress of your system and go for it.


Change /etc/snmp/snmpd.conf so that it contains the following lines:

com2sec paranoid  default         <yourSNMPcommunitykey>
com2sec readonly  default         <yourSNMPcommunitykey>
com2sec readwrite default         <yourSNMPcommunitykey>


In Cacti’s web interface, change the device localhost to use SNMPv1 and your community name <yourSNMPcommunitykey>.
Now reboot the Linux server, log back into Cacti’s web interface and check whether the graphs for the device localhost begin to show actual data.
Login back to the Linux server.
We will now install the Spine poller for Cacti.


In your home directory, perform

tar xvfz cacti-spine-0.8.7i.tar.gz
cd cacti-spine-0.8.7i/
sudo apt-get install libmysqlclient16-dev
sudo apt-get install libsnmp-dev
sudo make install
sudo cp /usr/local/spine/etc/spine.conf.dist /usr/local/spine/bin/spine.conf


Change /usr/local/spine/bin/spine.conf so that it contains the following lines:

DB_Host         localhost
DB_Database     cacti
DB_User         cacti
DB_Pass         cactidbpassword
DB_Port         3306
DB_PreG         0


Now go the web interface of Cacti, login as admin and go to Console/Settings/Paths and change the Spine poller path to /usr/local/spine/bin/spine and save the changes.
In Console/Settings/Poller, select spine and save the changes. You now have to rebuild Cacti’s poller cache to make the poller changes work (you find this option in Cacti’s web interface under Console/System Utilites).

Select Console/User Management and select the admin user.
Check “Plugin Management” and click on Save.
Now we will install several Cacti plugins.

The website will be our main source for Cacti plugins.


Go back to your ssh session and go to the plugin directory of your Cacti installation.

cd /var/www/plugins
sudo -s
wget -O aggregate.tgz
tar xvfz aggregate.tgz
rm aggregate.tgz


In your web browser, go to the Cacti website, login as admin (when you are not logged in already) and navigate to Console/Plugin Management.

It is possible that the freshly installed aggregate plugin does not appear immediately. Refresh the page a couple of times until your browser has caught up with the updated website.

Under “Actions”, first click on the icon to install the plugin, then click on the next icon to activate the plugin.

The first plugin should now be up and running.

wget -O boost.tgz
tar xvfz boost.tgz
rm boost.tgz

Install and activate the plugin through Cacti’s plugin management interface as described above.

sudo mkdir /var/www/imagecache
sudo chmod –R a+wr /var/www/imagecache

In Cacti’s web interface, go to Console/Settings/Boost. Find the “Image Caching” section, enable image caching and set the “location for image files” to /var/www/imagecache.

wget -O realtime.tgz
tar xvfz realtime.tgz
rm realtime.tgz

Install and activate the plugin through Cacti’s plugin management interface as described above.

sudo mkdir /var/www/realtimegraphs
sudo chmod –R a+wr /var/www/realtimegraphs

In Cacti’s web interface, go to Console/Settings/Misc. Find the “Realtime Graphs” section and set the “Cache Directory” to /var/www/realtimegraphs.

Note: Your user account must have permissions to access this plugin.

wget -O rrdclean.tgz
tar xvfz rrdclean.tgz
rm rrdclean.tgz

Install and activate the plugin through Cacti’s plugin management interface as described above.

sudo mkdir /var/www/rra/backup/
sudo mkdir /var/www/rra/archive/
sudo chmod -R a+wr /var/www/rra

tar xvfz nmid_039a_update.tgz
rm nmid_039a_update.tgz

Install and activate the plugin through Cacti’s plugin management interface as described above.

tar xvfz nmidWebService.tgz
rm nmidWebService.tgz

Install and activate the plugin through Cacti’s plugin management interface as described above.


Install and activate the plugin through Cacti’s plugin management interface as described above.

wget -O fix64bit.tgz
tar xvfz fix64bit.tgz
rm fix64bit.tgz

Install and activate the plugin through Cacti’s plugin management interface as described above.

Change /var/www/include/global.php so that the variable url_path is defined:

/* set URL path */
if (! isset($url_path)) {
        $url_path = "http://your.cactiserver.url/";

Important: the url_path must end with a slash!

cd /var/www
wget -O nmidWeb2.tgz
tar xvfz nmidWeb2.tgz
rm nmidWeb2.tgz
mysql –u root –D cacti –p < nmidweb2.sql
rm nmidweb2.sql


For Spine to work cleanly, we also need to install the “settings” plugin and the “syslog” plugin.

wget -O settings.tgz
tar xvfz settings.tgz
rm settings.tgz

Install and activate the plugin through Cacti’s plugin management interface as described above.

wget -O syslog.tgz
tar xvfz syslog.tgz
rm syslog.tgz

Install and activate the plugin through Cacti’s plugin management interface as described above.


Now we install Smokeping.

sudo mkdir /var/nmid
sudo chmod –R a+wr /var/nmid
sudo apt-get install fping
sudo apt-get install echoping
sudo apt-get install sendmail
sudo apt-get install smokeping
apt-get install libsoap-lite-perl
sudo chmod –R a+wr /usr/share/smokeping
sudo chmod -R a+wr /var/lib/smokeping


The URL http://your.cactiserver.url/cgi-bin/smokeping.cgi should now show you the smokeping website.

cd /usr/lib/cgi-bin
chmod a+wxr


Copy the following to a file named /etc/cron.d/nmid:

*/5 * * * * root /etc/smokeping/nmid


Copy the following to a file named /etc/cron.d/smokeping:

*/5 * * * * root /etc/smokeping/smokecron


Copy the following to a file named /etc/smokeping/nmid:

cat /etc/smokeping/config_header > /etc/smokeping/config.d/Targets
cat /var/nmid/smokeping_nmid_spserver1_config.txt >> /etc/smokeping/config.d/Targets
/etc/init.d/smokeping reload > /dev/null 2>&1


Copy the following to a file named /etc/smokeping/smokecron:

# Stellt sicher, dass smokeping immer wieder gestartet wird.
if [ $(ps -A | grep -c smokeping) = 0 ];
echo .$(date) Smokeping wiederbeleben. >> $logfile
/etc/init.d/smokeping restart > /dev/null 2>&1


To make the nmidSmokeping plugin 1.01 work, we had to add the following code to the file /var/www/plugins/nmidSmokeping/getSmokepingImage.php:

function readConfigOption( $option )
    $query = "select value from settings where name='".$option."'";
    $result = mysql_query($query);
    $config_option = mysql_fetch_assoc($result);
    // Free the result set
    return $config_option['value'];

If you use brackets and colons in your device or network names, you must change the file /var/www/plugins/nmidSmokeping/setup.php and make sure that “::”, “[“ and “]” are replaced in the respective host names.

Make sure that occurrences like this are added to the source code where the original nmid source code processes similar replacements for umlauts and other special characters:

            $treeName = preg_replace("@\[@","_",$treeName);
            $treeName = preg_replace("@\]@","_",$treeName);
            $treeName = preg_replace("/::/","__",$treeName);

In the same file, you also have to fix a bug in the source code:


function plugin_nmidSmokeping_device_action_execute(

make sure that the following lines look like this:

if ( preg_match("/^s1/",$current_nwmgmt_settings) == 0)
                  /* Smokeping not set, yet */
                  $current_nwmgmt_settings = preg_replace("/^s\d/","s1",$current_nwmgmt_settings);
                  db_execute("UPDATE host SET nwmgmt_settings = \"$current_nwmgmt_settings\" WHERE id=".$data["host_id"]);
                  db_execute("UPDATE host SET nwmgmt_smokeping_server=\"".read_config_option("nmid_spserver".$matches[1])."\" WHERE id=".$data["host_id"]);

The important part is the $data[“host_id”] code at the end of the line; the original source code ends with “$host_id”, which will not work.

cd /var/www
sudo tar xvfz nmidWeb2_files_087g.tgz
tar xvfz nmidWeb2_files_087g.tgz

I know, hardcore Unix security fanatics will hate me for this, but I don’t care. I simply want this thing to work:

sudo chmod -R a+wr /var/www

Now reboot the server. Again, I know, this sounds like typical Windows administration, but I like to be sure that all systems come up properly after a restart or power failure. So just reboot the box and when it is up again, open a web browser on your client and check if your new Cacti server is actually working.

2 responses so far

2 Responses to “Installing Cacti on Ubuntu Server 10.04 LTS”

  1. Evrenon 22 Dec 2011 at 11:20 am

    Very very good article,
    Thank you.

  2. ccnajon 29 Dec 2011 at 3:36 am

    Well done – great work!

    I had a few issues that I hope to share to learn and help others who may vary in their installations

    1: I used apt-get tasksel and sudo tasksel to get a clean lamp server install done.

    2: I did not like having the cacti install in the /var/www so I altered it to /var/www/cacti and it works as long as you also edit the line if the /include/config.php about the location of cacti to /cacti/

    3: This was the most frustrating – the cron.d/cacti cron. As if this fails then you are lost to understand what to do for new linux admins. Some things that helped me overcome my issues
    > 1: manually kickstarting the poller is a good idea in case for whatever reason it is not able to work – usually a permission problem and also good to check your path
    # sudo php /var/www/cacti/poller.php
    (should give you a poller stat output and should also show up in the log) this way you know your poller can work.
    >2 : Permissions of the cron user and the log folder you choose – I found that because my cron user was not able to write to /var/log/ folder the cron job failed and I did not see an error – maybe this is something I did as a mistake but it helped to check it
    > 3 : # service cron stop and start to force the cron service to run
    > 4 : make sure that during the install process that no other cron is running anywhere else – like admin or root user – #crontab -l will display this for the current user and sudo crontab -u [user] -l for other users.

    This is the crontab command I finally got working after also changing the permissions based on the cacti -how-to
    1- permissions run from the /var/www/cacti folder
    chown www-data:www-data ./* -R
    chmod 775 ./* -R
    2: changed the log location to match the /var/www/cacti/log folder so I can go to the one place to see both logs
    3: added the following lines to /etc/cron.d/cacti
    */1 * * * * www-data php /var/www/cacti/poller.php –force /var/www/cacti/log/poller-crond-error.log 2>&1

    Hope it may help someone 🙂