To create debian template for lxc you need fresh copy of debian system.
Well, we do have one installed recently on guruplug.
All debian install on guruplug steps are here.
So, lets archive all system to tar.gz.
Firstly it’s a good practice to exclude unneeded files.
Create /tmp/exclude file with this content:
1 2 3 4 5 6 7 |
# cat /tmp/exclude /tmp/* /proc/* /dev/* /sys/* /mnt/* /usr/src/* |
Edit templates /etc/fstab file and comment everything out.
Create new file /etc/fstab.lxc
Contents of that file:
1 2 3 |
# cat etc/fstab.lxc none /path/to/your/virtual/dir/proc proc defaults 0 0 none /path/to/your/virtual/dir/sys sysfs defaults 0 0 |
Well, this file doesn’t have to be in virtual machine, but I think that’s more convenient, when lxc fstab configuration is kept inside virtual host. And you have more than one of them.
It’s a good idea to delete udev startup file from /etc/rcS.d/
as it makes unnecessary longer boot.
1 |
rm /etc/rcS.d/S02udev |
And create archive:
1 |
# tar -czvf /root/debian.tar.gz -X /tmp/exclude / |
Lets make one virtual host (commands are made on host machine).
You can use this bridge configuration for lxc containers.
I assume lxc is already installed on your host system. If not, You can do that with command.
1 |
apt-get install lxc |
1 |
mkdir /cgroup |
and add line to /etc/fstab
1 |
none /cgroup cgroup defaults 0 0 |
You can mount everything what’s on fstab by command “mount -a”.
Assume lxc containers are in /lxc on host machine.
So extract template to that directory:
1 |
tar zxvf debian.tar.gz -C /lxc/ |
Make configuration file in /etc/lxc/
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 |
# cat /etc/lxc/debian.conf lxc.utsname = debian lxc.network.type = veth lxc.network.flags = up lxc.network.link = br0 lxc.network.hwaddr = 00:1D:1F:00:01:0D lxc.network.ipv4 = 192.168.1.13/24 #path to extracted container root lxc.rootfs = /lxc/debian #path to fstab.lxc in container lxc.mount = /lxc/debian/etc/fstab.lxc lxc.tty = 4 lxc.cgroup.devices.deny = a # consoles lxc.cgroup.devices.allow = c 5:1 rwm lxc.cgroup.devices.allow = c 5:0 rwm lxc.cgroup.devices.allow = c 4:0 rwm lxc.cgroup.devices.allow = c 4:1 rwm # /dev/pts/* - pts namespaces are "coming soon" lxc.cgroup.devices.allow = c 136:* rwm lxc.cgroup.devices.allow = c 5:2 rwm # /dev/null and zero lxc.cgroup.devices.allow = c 1:3 rwm lxc.cgroup.devices.allow = c 1:5 rwm # /dev/{,u}random lxc.cgroup.devices.allow = c 1:9 rwm lxc.cgroup.devices.allow = c 1:8 rwm |
Yes, machine IP is static, if You want to get it by DHCP, You need to write:
1 |
lxc.network.ipv4 = 0.0.0.0/24 |
Make script in /bin/ directory (for fixing dev directory in container):
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 |
# cat /bin/fix_dev.sh #!/bin/bash ROOT=$(pwd) DEV=${ROOT}/dev mv ${DEV} ${DEV}.old mkdir -p ${DEV} mknod -m 666 ${DEV}/null c 1 3 mknod -m 666 ${DEV}/zero c 1 5 mknod -m 666 ${DEV}/random c 1 8 mknod -m 666 ${DEV}/urandom c 1 9 mkdir -m 755 ${DEV}/pts mkdir -m 1777 ${DEV}/shm mknod -m 666 ${DEV}/tty c 5 0 mknod -m 600 ${DEV}/console c 5 1 mknod -m 666 ${DEV}/tty0 c 4 0 mknod -m 666 ${DEV}/full c 1 7 mknod -m 600 ${DEV}/initctl p mknod -m 666 ${DEV}/ptmx c 5 2 |
Make it executable:
1 |
chmod +x /bin/fix_dev.sh |
Go to virtual machine root directory and start the script:
1 2 |
cd /lxc/debian fix_dev.sh |
Create virtual machine:
1 |
lxc-create -f /etc/lxc/debian.conf -n debian |
Edit /etc/default/lxc to make container boot automatically.
Uncomment:
1 2 3 4 5 6 7 8 9 |
# cat /etc/default/lxc # Comment out to run the lxc init script RUN=yes # Directory containing the container configurations CONF_DIR=/etc/lxc # Start /etc/lxc/example.conf, /etc/lxc/autostart.conf, etc. CONTAINERS="debian" |
That’s it.
You can start container with command:
1 |
lxc-start -n debian & |
Now connect to it using ssh.