Building an LXC Server on Ubuntu with ZFS and a container with public IP address
First update Ubuntu
1 2 3 |
apt-get update apt-get dist-upgrade |
Setup ZFS
1 2 3 4 5 |
apt-add-repository ppa:zfs-native/stable apt-get update apt-get install ubuntu-zfs |
Configure LXC
1 |
sudo apt-get install lxc |
Configure ZFS
Create ZFS pool:
1 |
sudo zpool create -f tank /dev/sdX |
Keep in mind that deduplication takes much more memory and sometimes CPU.
The rule of Thumb says to have 1GB of Ram per TB of Data. For deduplicated ZPools you actually should have 5 GB of Ram for 1TB of Data. I don’t use it.
1 |
zfs set dedup=on tank |
Turn on compression and create fs:
1 2 3 4 5 6 7 8 9 |
zfs set compression=on tank zpool set feature@lz4_compress=enabled tank zfs set compression=lz4 tank zfs create tank/lxc zfs create tank/lxc/containers |
To configure LXC to use ZFS as the backing store and set the default LXC path, add the following to /etc/lxc/lxc.conf:
1 2 3 |
lxc.lxcpath = /tank/lxc/containers lxc.bdev.zfs.root = tank/lxc/containers |
Creating a Container
Create the first container by doing:
1 |
lxc-create -t ubuntu -n node.name -B zfs |
Setup Bridged Network
1 |
apt-get install bridge-utils |
Important Commands
Show bridge interfaces:
1 |
brctl show |
Simple Bridge
This setup can be used to connect multiple network interfaces. The bridge acts as a switch: each additional network interface is directly connected to the physical network.
Edit /etc/network/interfaces, remove eth0, add br0.
For dynamic IP:
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 |
#auto eth0 #iface eth0 inet dhcp auto br0 iface br0 inet dhcp bridge_ports eth0 bridge_stp off bridge_fd 0 bridge_maxwait 0 |
For static IP:
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 |
auto br0 iface br0 inet static bridge_ports eth0 bridge_stp off bridge_fd 0 bridge_maxwait 0 address 192.168.0.101 netmask 255.255.255.0 network 192.168.0.0 broadcast 192.168.0.255 gateway 192.168.0.254 dns-nameservers 8.8.8.8 8.8.4.4 |
reboot server
Is all OK?
Edit /tank/lxc/containers/node.name/config
1 2 3 4 5 6 7 |
lxc.network.type = veth lxc.network.flags = up lxc.network.link = br0 lxc.network.hwaddr = 00:16:3e:30:fa:4a |
start the node:
1 |
lxc-start -n node.name -d |
connect to the node:
1 |
lxc-console -n node.name |
On the lxc node /etc/network/interfaces:
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 |
auto eth0 iface eth0 inet static address 192.168.0.102 netmask 255.255.255.0 network 192.168.0.0 broadcast 192.168.0.255 gateway 192.168.0.254 dns-nameservers 8.8.8.8 8.8.4.4 |
It’s possible to use static IP address in node config and use dhcp inside the node, that works too.
But IPv6 didn’t work inside the node, I disabled it and then the node stopped receiving IP address at all.
I had to use static IP.
I’m going to solve this problem later.