Subject: Vservers on Slackware
From: Laurens Vets <laurens@daemon.be>
Date: Thu, 21 Aug 2008 20:13:20 +0200
Hi list,
I wrote a document a while back on how to install vservers on Slackware
and was wondering whether the procedure I used is correct or whether I
forgot something or ... Anyways, it's a rather large mail so hopefully
you won't get bored :)
You will need a kernel which has been patched to work with Linux-VServer
and the util-vserver software. I’ve created a couple of simple scripts
to aid in setting up minimal Slackware guests:
http://www.cilinder.be/slackware/svs-0.1.tar.gz.
Next, you will need the util-vserver tools which are the Linux-VServer
userland tools. You can download my Slackware 12 package here:
util-vserver-0.30.214-i486-1tfx.tgz. Install via the normal Slackware
method ("installpkg util-vserver-0.30.214-i486-1tfx.tgz").
We start by creating a template. I’ve based my list of installed
packages on the Linux from Slack and Minimal System pages on
Slackwiki.org. You can find the list of packages that will be installed
in the template VServer in the svs scripts above (look for the
"vserver.list" file). Download the above scripts and extract them to a
local directory:
$ wget http://www.cilinder.be/slackware/svs-0.1.tar.gz
$ tar zxpvf svs-0.1.tar.gz
The files get.sh, inst.sh and vserver.list should now be available in
your current working directory. Get.sh will fetch the necessary packages
from a Slackware mirror. Inst.sh will install the downloaded packages to
/vservers/template. The file vserver.list contains the necessary
packages for a minimal Slackware VServer. It’s probably a good idea to
change the Slackware mirror in the get.sh to something that’s closer to
your location.
We’ll begin by fetching the necessary Slackware 12.0 packages with get.sh:
$ ./get.sh
When this is done, there will be a new directory "slackware" in your
current working directory with a bunch of packages. For the next part,
you’ll have to become root. When you are, run inst.sh:
# ./inst.sh
This will install the above downloaded packages in /vservers/template
which will become our template directory for future Slackware VServers.
Next, descent in the directory /vservers/template/dev and remove the
devices listed there:
# cd /vservers/template/dev/
# rm -Rf *
We will also have to create a System V initialization script in
/vservers/template/etc/init.d/:
# vi /vservers/template/etc/init.d/rc
Add the following in the above file:
if [ $1 -eq 3 ]; then
echo "entering runlevel 3: multi";
/etc/rc.d/rc.M
fi
if [ $1 -eq 6 ]; then
echo "entering runlevel 6: reboot";
/etc/rc.d/rc.6
fi
if [ $1 -eq 0 ]; then
echo "entering runlevel 0: shutdown";
/etc/rc.d/rc.0
fi
if [ $1 -eq 4 ]; then
echo "entering runlevel 4";
fi
if [ $1 -eq 5 ]; then
echo "entering runlevel 5";
fi
if [ $1 -eq 1 ]; then
echo "entering runlevel 1:single";
/etc/rc.d/rc.K
fi
if [ $1 -eq 2 ]; then
echo "entering runlevel 2:multi";
/etc/rc.d/rc.M
fi
Don’t forget to give that file execution permissions otherwise it won’t
run when we start our VServer:
# chmod u+x /vservers/template/etc/init.d/rc
After this is done, we will need to apply a patch (found here:
slack12.diff) which will disable the Slackware hardware related startup
scripts:
# cd /vservers/template
# wget http://www.cilinder.be/slackware/slack12.diff
# patch -p1 < slack12.diff
We will also have to disable "/etc/rc.d/rc.inet1" from being run on startup:
# chmod -x /vservers/template/etc/rc.d/rc.inet1
The next command will create a new skeleton vserver under
/vservers/vserver1 with the necessary devices:
# NAME=vserver1
# INTERFACE=eth0:10.0.0.1/24
# CONTEXT=1000
# vserver ${NAME} build -m skeleton --context ${CONTEXT} --interface
${INTERFACE} --flags
lock,virt_mem,virt_uptime,virt_cpu,virt_load,sched_hard,hide_netif
--initstyle sysv
In the above example, change the NAME, INTERFACE and CONTEXT fiels to
whatever it needs to be on your machine. After that, you will have a new
directory /vserver/vserver1. Now we will copy our template directory
that newly created directory:
# cd /vservers/
# cp -a template/. vserver1/.
At this point, our VServer should already be able to boot. We can test
this with:
# /usr/sbin/vserver vserver1 start
You’ll probably see a lot of error messages, this is due to the
Slackware startup scripts that are executed in the VServer related to
configuring and starting hardware devices. I’m still working on a diff
to patch the template directory to remove those. When the VServer has
been booted, you can access it with:
# /usr/sbin/vserver vserver1 enter
At this point you can start "netconfig" and start configuring your newly
created Slackware 12.0 VServer. It’s probably a good idea to have a
'localhost' in your vserver. This can be achieved by creating a new
folder in /etc/vservers/${NAME}/interfaces/. Name the folder 1, if the
previous one that exists there is 0. Then create files named ‘ip’, ‘dev’
and ‘prefix’ and write 127.0.0.1 to ip, lo to dev and 32 to prefix:
# mkdir /etc/vservers/${NAME}/interfaces/1/
# echo 127.0.0.1 > /etc/vservers/${NAME}/interfaces/1/ip
# echo 32 > /etc/vservers/${NAME}/interfaces/1/prefix
# echo lo > /etc/vservers/${NAME}/interfaces/1/dev
Vservers created this way work, but start with some bootup related
errors, probably related to Slackware startup scripts which are not yet
full corrected...
Did I miss something? Does this all sound sane?
Thanks for checking and making it this far :)