return iso path
[pxelator] / lib / PXElator / lxc.pm
1 package lxc;
2
3 use warnings;
4 use strict;
5 use autodie;
6
7 use file;
8
9 use Data::Dump qw/dump/;
10
11 sub create {
12         my ( $hostname, $path, $ip, $netmask, $server_ip ) = @_;
13
14         die "$path: $!" unless -d $path;
15
16         file::append "$path/etc/initab" => "$_\n" foreach split(/\n/, qq|
17 z6:6:respawn:/sbin/sulogin
18 1:2345:respawn:/sbin/getty 38400 console
19 c1:12345:respawn:/sbin/getty 38400 tty1 linux
20 c2:12345:respawn:/sbin/getty 38400 tty2 linux
21 c3:12345:respawn:/sbin/getty 38400 tty3 linux
22 c4:12345:respawn:/sbin/getty 38400 tty4 linux
23         |);
24
25         file::append '/etc/fstab' => 'cgroup /cgroup cgroup rw 0 0' && mkdir '/cgroup';
26         system "mount /cgroup";
27
28         system "lxc-stop    --name $hostname";
29         system "lxc-destroy --name $hostname";
30
31         file::replace "$path/etc/hostname" => $hostname;
32         file::append  "$path/etc/hosts"    => "$ip $hostname";
33
34         file::replace "$path/etc/network/interfaces" => qq|
35 auto eth0 lo
36
37 iface lo inet loopback
38
39 iface eth0 inet static
40     address $ip
41     netmask $netmask
42     gateway $server_ip
43         |;
44
45         file::replace "$path/etc/resolv.conf" => "nameserver $server_ip";
46
47         my $conf = "/virtual/$hostname.conf";
48
49         file::replace $conf => qq|
50 lxc.utsname = $hostname
51 lxc.tty = 4
52 lxc.pts = 1024
53 lxc.network.type = veth
54 lxc.network.flags = up
55 lxc.network.link = virtual
56 lxc.network.name = eth0
57 lxc.network.mtu = 1500
58 #lxc.mount = MNTFILE
59 lxc.rootfs = $path
60 lxc.cgroup.devices.deny = a
61 # /dev/null and zero
62 lxc.cgroup.devices.allow = c 1:3 rwm
63 lxc.cgroup.devices.allow = c 1:5 rwm
64 # consoles
65 lxc.cgroup.devices.allow = c 5:1 rwm
66 lxc.cgroup.devices.allow = c 5:0 rwm
67 lxc.cgroup.devices.allow = c 4:0 rwm
68 lxc.cgroup.devices.allow = c 4:1 rwm
69 # /dev/{,u}random
70 lxc.cgroup.devices.allow = c 1:9 rwm
71 lxc.cgroup.devices.allow = c 1:8 rwm
72 lxc.cgroup.devices.allow = c 136:* rwm
73 lxc.cgroup.devices.allow = c 5:2 rwm
74 # rtc
75 lxc.cgroup.devices.allow = c 254:0 rwm
76         |;
77
78         system "lxc-create --name $hostname --rcfile $conf";
79
80         warn "created $hostname $ip $path";
81 }
82
83 warn 'loaded';
84
85 1;