In order to install **Mini-CCNx**, follow the steps below. All of them are required!

### What equipment will I need ? 
 
Basically, you'll need a laptop/desktop with a recent Linux distro (Ubuntu, Fedora). We recommend Ubuntu. For this guide, the _Ubuntu 12.04 LTS_ was used. Also, note that you'll need administrative privileges in order to download and install extra packages and also to execute **Mini-CCNx**.

### Installing CCNx

Each node in **Mini-CCNx** will run the official implementation of CCNx. Let's get it.

In the [Project CCNx](www.ccnx.org) webpage, you'll find all the details for installing the CCNx. See [Installing CCNx](https://www.ccnx.org/wiki/CCNx/InstallingCCNx). To use **Mini-CCNx** you won't need to create the init script as outlined in the prior link. But please, pay attention to the necessary pre-requisite packages, as they are, indeed, necessary.

Now, to **Mini-CCNx** itself.

### Downloading and installing **Mini-CCNx**

 If you don't have it yet, you'll need to have _git_ installed first. In Ubuntu, that would be:

`sudo apt-get install git`

Now, let's get the source code of **Mini-CCNx**.
Go to your home directory and use the following command:

`git clone git://github.com/carlosmscabral/mn-ccnx`

As result, there will be a directory named _mn-ccnx_ in your home directory, containing all the source code.

Still in your home directory, use the utility install script with the _-fnv_ options:

`sudo ./mn-ccnx/util/install.sh -fnv`

Pre-requisite packages will be downloaded and installed during the process. 
