OpenVZ (Photo credit: Wikipedia)

This guide is a reference for myself on how to create a RedHat Enterprise Linux v6 template for OpenVZ.  I am publishing it in case others find it useful.  There are other ways and variations on how one can go about this.  The method I will present here is the way I do it.


The basic idea is to install the physical server then transfer it to an OpenVZ virtual server.  In OpenVZ terminology a virtual server is a functioning ‘container’ with operating system installed.  Container basically refers to the virtual shell of the virtual server.  I will use the 2 terms interchangeably.


There are 3 major steps:


  1. 1.   Install the Linux OS on a physical server (or VMware).
  2. 2.   Transfer the installed OS to an OpenVZ virtual server (container) on an OpenVZ physical server (node) we have root access to.
  3. 3.   Modify the transferred install to work on OpenVZ.





Step 1, install Linux


For the first step you simply download the operating system ISO and install the OS on to a physical server.  Ideally you will want to make the install as minimal as possible to keep things small and simple.  In the case of RHEL that usually means not selecting any options to install.  Not even “base”.  All an OpenVZ template requires is for networking, SSH server, and yum to be working.  Once you have that up and running at a command line on a physical server you are done.  Disable SElinux which is not compatible with OpenVZ.  You do that by editing /etc/selinux/config and set SELINUX=disabled.  If the file does not exist you have to create it.  Lastly, you need to install rsync for the transfer to work (yum install rsync).


If you are planning to transfer an existing server running Linux + some application then all you need to do is disable selinux and install rsync.


Step 2, transfer to OpenVZ


For the second step we need to set up a Physical OpenVZ server.  You will require a second physical server or VMware.  Physical server is better since OpenVZ will run slower on VMware.  A couple GUI OpenVZ options are Proxmox VE andHyperVM.  One can also just install barebones OpenVZ on top of Linux and use command lines which is a bit more involved.  I use HyperVM for RHEL 5 based nodes.  For RHEL 6 based nodes I use OpenVZ web panel.  Ideally the Linux server and OpenVZ server should be on the same private subnet so you don’t have to deal with any NAT, router, and firewall issues.


NOTE: You cannot use a Debian based OpenVZ node such as ProxMox for this procedure.  The reason is because the MAKEDEV program is quite a bit different in Debian compared to Redhat and it’s clones.  If you wanted to modify this procedure to work with a Debian OpenVZ node you would have to figure out how to alter the 2 MAKEDEV command lines in this procedure.


What I do is create an OpenVZ VPS on HyperVM via the GUI using a CentOS 5 template.  Once the VPS is created I shut it down then I log into the OpenVZ server node as root and work directly on the VPS files from there.


Create a variable for the OpenVZ container which in this example is 110.






NOTE: Make sure to substitute 110 for the container ID number (CTID) of the OpenVZ container you will be using to create a template in.  After you do this the container directory on the node will be accessed by using $CTID.


Check that the path variable is now set to the desired container.  This will persist until we close the console window (shell).



#echo $CTID



It should respond with the proper CTID number.


Now delete the container and its contents. Then recreate the directory.  Be careful to cut and paste the entire line.  There is no second chance once the command is entered and “rm -rf /” will wipe out the entire server.



#rm -rf /vz/private/$CTID
#mkdir /vz/private/$CTID



Make sure the container directory has default group/owner set to root and default permissions set to 0755.  This should be the defaults set for all directories created in this procedure.


You can also create a container manually from a command line using this procedure but I prefer my method for simplicity.


For the transfer we run the following rsync command on the OpenVZ node we are transferring the server to:



#rsync -arvpz –exclude=/dev –exclude=/mnt –exclude=/proc –exclude=/sys –exclude=/tmp -e ssh root@xx.xx.xx.xx:/ /vz/private/$CTID/



Where xx.xx.xx.xx is the IP of the physical server or VMware virtual machine etc. we want to transfer from.




Step 3, Modify the transferred files


Once the files are transferred we need to do several things in order for the transferred server to work on OpenVZ.


A container does not have real ttys, so you have to disable getty.



#sed -i -e ‘s/^[0-9].*getty.*tty/#&/g’  /vz/private/$CTID/etc/inittab



Disk partitions are not needed in a container so delete everything in vz/private/$CTID/etc/fstab and replace it with:



#vi  /vz/private/$CTID/etc/fstab
none /dev/pts devpts rw 0 0



Create /dev /mnt /proc /sys /tmp which we excluded in the rsync transfer above.



#mkdir /vz/private/$CTID/dev
#mkdir /vz/private/$CTID/mnt
#mkdir /vz/private/$CTID/proc
#mkdir /vz/private/$CTID/sys
#mkdir /vz/private/$CTID/tmp



Verify that default group/owner is root and default permissions are 0755 for all the above directories as well as all other directories created in this procedure.


Create /dev/pts



#mkdir /vz/private/$CTID/dev/pts

Create /etc/udev/devices



#mkdir /vz/private/$CTID/etc/udev/devices

Create device nodes




#/sbin/MAKEDEV -d /vz/private/$CTID/dev -x {p,t}ty{a,p}{0,1,2,3,4,5,6,7,8,9,a,b,c,d,e,f} console core full kmem kmsg mem null port ptmx random urandom zero ram0

#/sbin/MAKEDEV -d /vz/private/$CTID/etc/udev/devices -x {p,t}ty{a,p}{0,1,2,3,4,5,6,7,8,9,a,b,c,d,e,f} console core full kmem kmsg mem null port ptmx random urandom zero ram0



Make sure /tmp and /var/tmp have proper permissions



#chmod 1777 /vz/private/$CTID/tmp
#chmod 1777 /vz/private/$CTID/var/tmp



Edit /vz/private/$CTID/etc/sysconfig/network-scripts/ifcfg-ethx. Where x is 0, 1, 2 etc.
Make the following look like this:



For RHEL 6 and clone distributions, you must comment out “console” in /vz/private/$CTID/etc/init/rc.conf and /vz/private/$CTID/etc/init/rcS.conf.  You must also delete or rename tty.conf and start-ttys.conf.  If you do not the container will not boot up.


Create yum respository for OpenVZ rpm’s




#vi /vz/private/$CTID/etc/yum.repos.d/vz.repo

Add the following text







Now boot or reboot the newly created OpenVZ virtual private server.  Open a terminal window via SSH to the IP address of the newly created VPS and log in as root with the password you assigned to the VPS.  If it is not working for some reason go back and verify you correctly completed all of the above steps.


Now that you are logged in to your newly created VPS with a command line check that networking and yum work by doing “yum update” from the command prompt.  If it finds and asks to update any packages then type (Y)es.





#yum install vzdev vzdummy-apache vzdummy-jre-el5 vzdummy-glibc vzdummy-init-fc13



None of the above packages are absolutely critical and some may not be found depending on which repositories you have configured. You may have some problems with some things if you do not install them but chances are you won’t.  You should now have a fully functioning OpenVZ container ported over from a physical server.




Miscellaneous clean up and removal


OpenVZ containers do not need a kernel or boot section since they run off the host kernel.  So remove the kernel and all files in the boot directory of the container.


NOTE: Remember, we are doing this from a command line inside an OpenVZ container.  Not on the OpenVZ node (physical host server) itself which would render it inoperable.



#rm -rf /boot/*.*
#rpm -e –nodeps kernel



Depending on what you are doing, sometimes you will have things on the transferred server that are are dependent on the kernel and will not run if you remove it even though they cannot use it on an OpenVZ virtual server.  In that case you are better off just leaving the kernel alone.  It should not cause any problems by leaving it on.


Now you can go through and remove all un-necessary packages.  The list is too long and varied to lay out in a step by step.  One way to go about it is list all rpm packages.



#rpm -qa



Then go through the list one by one and remove anything to do with hardware such as hardware monitoring, BIOS functions, hard drives and partitions etc.  If in doubt you can list the details of a package by doing the following.



#rpm -qi package_name



Create Template File


After testing your running VPS you can create the template file.  In HyperVM GUI you simply press the “Create Template” button.  If you are using ProxMox or running without a GUI you can do the following.


From command line on the actual node.
Stop the container by typing vzctl stop $CTID.


Make sure you are in the /vz/private/$CTID folder.


#vzctl stop $CTID
#cd /vz/private/$CTID
#tar -czvf /vz/template/cache/centos-5-<ARCH>-<DISTRO>.tar.gz ./

“centos-5” can also be “centos-6” or “scientificlinux-6” or ?  OpenVZ expects the format “OS + “-” + “version”.


<ARCH> is also mandatory and MUST be one of the following:
i386, x86, x86_64
<DISTRO> can be whatever you want it to be.


The template is ready for use