--- /dev/null
+package lxc;
+
+use warnings;
+use strict;
+use autodie;
+
+use file;
+
+use Data::Dump qw/dump/;
+
+sub create {
+ my ( $hostname, $ip, $path ) = @_;
+
+ file::append "$path/etc/initab" => $_ foreach qw(
+z6:6:respawn:/sbin/sulogin
+1:2345:respawn:/sbin/getty 38400 console
+c1:12345:respawn:/sbin/getty 38400 tty1 linux
+c2:12345:respawn:/sbin/getty 38400 tty2 linux
+c3:12345:respawn:/sbin/getty 38400 tty3 linux
+c4:12345:respawn:/sbin/getty 38400 tty4 linux
+ );
+
+ file::append '/etc/fstab' => 'cgroup /cgroup cgroup rw 0 0' && mkdir '/cgroup';
+ system "mount /cgroup";
+
+ system "lxc-stop -n $hostname";
+ system "lxc-destroy -n $hostname";
+
+ file::replace "$path/etc/hostname" => $hostname;
+ file::append "$path/hosts" => "$ip $hostname";
+
+ my $conf = "/virtual/$hostname.conf";
+
+ file::replace $conf => qq|
+lxc.utsname = $hostname
+lxc.tty = 4
+lxc.pts = 1024
+lxc.network.type = veth
+lxc.network.flags = up
+lxc.network.link = br0
+lxc.network.name = eth0
+lxc.network.mtu = 1500
+#lxc.mount = MNTFILE
+lxc.rootfs = $path
+lxc.cgroup.devices.deny = a
+# /dev/null and zero
+lxc.cgroup.devices.allow = c 1:3 rwm
+lxc.cgroup.devices.allow = c 1:5 rwm
+# 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/{,u}random
+lxc.cgroup.devices.allow = c 1:9 rwm
+lxc.cgroup.devices.allow = c 1:8 rwm
+lxc.cgroup.devices.allow = c 136:* rwm
+lxc.cgroup.devices.allow = c 5:2 rwm
+# rtc
+lxc.cgroup.devices.allow = c 254:0 rwm
+ |;
+
+ system "lxc-create -n $hostname -f $conf";
+
+ warn "created $hostname $ip $path";
+}
+
+warn 'loaded';
+
+1;