Here is the bit of code we use to create a container with, it shells out
to lxc-create passing in a custom userdata file:
```
@classmethod
def create(cls, name, userdata):
""" creates a container from ubuntu-cloud template
"""
# NOTE: the -F template arg is a workaround. it flushes the lxc
# ubuntu template's image cache and forces a re-download. It
# should be removed after https://github.com/lxc/lxc/issues/381 is
# resolved.
flushflag = "-F"
if os.getenv("USE_LXC_IMAGE_CACHE"):
log.debug("USE_LXC_IMAGE_CACHE set, so not flushing in lxc-create")
flushflag = ""
out = utils.get_command_output(
'sudo -E lxc-create -t ubuntu-cloud '
'-n {name} -- {flushflag} '
'-u {userdatafilename}'.format(name=name,
flushflag=flushflag,
userdatafilename=userdata))
if out['status'] > 0:
raise Exception("Unable to create container: "
"{0}".format(out['output']))
return out['status']
```
We also setup a custom lxc config file:
```
def create_container_and_wait(self):
""" Creates container and waits for cloud-init to finish
"""
self.tasker.start_task("Creating Container",
self.read_container_status)
Container.create(self.container_name, self.userdata)
with open(os.path.join(self.container_abspath, 'fstab'), 'w') as f:
f.write("{0} {1} none bind,create=dir\n".format(
self.config.cfg_path,
'home/ubuntu/.cloud-install'))
f.write("/var/cache/lxc var/cache/lxc none bind,create=dir\n")
# Detect additional charm plugins and make available to the
# container.
charm_plugin_dir = self.config.getopt('charm_plugin_dir')
if charm_plugin_dir \
and self.config.cfg_path not in charm_plugin_dir:
plug_dir = os.path.abspath(
self.config.getopt('charm_plugin_dir'))
plug_base = os.path.basename(plug_dir)
f.write("{d} home/ubuntu/{m} "
"none bind,create=dir\n".format(d=plug_dir,
m=plug_base))
extra_mounts = os.getenv("EXTRA_BIND_DIRS", None)
if extra_mounts:
for d in extra_mounts.split(','):
mountpoint = os.path.basename(d)
f.write("{d} home/ubuntu/{m} "
"none bind,create=dir\n".format(d=d,
m=mountpoint))
# update container config
with open(os.path.join(self.container_abspath, 'config'), 'a') as f:
f.write("lxc.mount.auto = cgroup:mixed\n"
"lxc.start.auto = 1\n"
"lxc.start.delay = 5\n"
"lxc.mount = {}/fstab\n".format(self.container_abspath))
```
Here is the userdata.yaml file we output and pass into the container:
```
#cloud-config
write_files:
- content: |
#!/bin/sh
mkdir -p /dev/net || true
mknod /dev/kvm c 10 232
mknod /dev/net/tun c 10 200
exit 0
path: /etc/rc.local
permissions: '0755'
packages:
- software-properties-common
groups:
- libvirtd: [ubuntu]
- sudo: [ubuntu]
apt_proxy: http://10.0.3.1:3142
apt_https_proxy: http://10.0.3.1:3142
apt_get_wrapper:
command: eatmydata
enabled: auto
apt_sources:
- source: deb http://ppa.launchpad.net/juju/stable/ubuntu $RELEASE main
key: |
-----BEGIN PGP PUBLIC KEY BLOCK-----
Version: SKS 1.1.4
Comment: Hostname: keyserver.ubuntu.com
mI0ETDzUZwEEAK3pnEmDZFVTehdKEN6jWs5UBfiEuyqHOmeINREQVn2ue+3bvFb+pYnjaPoz
CxLRDa4gitS8Wt/rtLvC/Gl+0UNXl71yVdQoPCOPTjfcc4WfPe5EaVNUqNZsEou31jRLvuq9
D/047ZjUbEFjy/oMY5I/zBA5X0BjNc30Tlm9NoMRABEBAAG0FkxhdW5jaHBhZCBFbnNlbWJs
ZSBQUEGItgQTAQIAIAUCTDzUZwIbAwYLCQgHAwIEFQIIAwQWAgMBAh4BAheAAAoJEDdqKQ7I
BosRT50EAJQVKoSFSxyIlx4fdH9vhftKwvvmZK6KHYHqVY8Hee3exU/wdPCH+nssG2s/9/oW
ReHiRNgIhc+iIDr+OTh/9TNPoClybkvrlWBgqUh6CIUNXbJQMigZlly90gkaLtUMGfsfW2+1
u9j+vBKs9toPKDN1ybKu61k4lCrxoDUo9QDp
=4LP9
-----END PGP PUBLIC KEY BLOCK-----
- source: deb http://ppa.launchpad.net/cloud-installer/stable/ubuntu $RELEASE
main
key: |
-----BEGIN PGP PUBLIC KEY BLOCK-----
Version: SKS 1.1.4
Comment: Hostname: keyserver.ubuntu.com
mI0EUwap0AEEAOcvGspxrV0/83Xa6grEAplHLuuvj3CrOH26XwSleu/wzzTmNqKDnZLWjBkA
qdbfYzQ3T4aD2uWfMJ2doqemBmLZWKrkMInLcS2o3cqraFHJaZDAvJHg7wiDBYiuq0cCrj/m
enC351p/DLQ+QuiHE1hgX6JV4nF527rCmGbWSSTRABEBAAG0KExhdW5jaHBhZCBQUEEgZm9y
IFVidW50dSBDbG91ZCBJbnN0YWxsZXKIuAQTAQIAIgUCUwap0AIbAwYLCQgHAwIGFQgCCQoL
BBYCAwECHgECF4AACgkQ3eaD+NL/Ce1RuQQApA4AaFlsujGJ4i2lN1qLbxivXu2fs+D9aXAV
MgYINVj13/xxtn+1PqV7x7I9ej+Adhy9uLc+7T6mfx7Ahn791hbNr/gycSZEkvdp3gZRFWHS
MqPZ3uOvWieRR347tMTh/BgxEsTdTUcLbt7jZkk6NypGO+ej8WtWugJ9kwOPb9s=
=aDcI
-----END PGP PUBLIC KEY BLOCK-----
- source: deb http://ppa.launchpad.net/cloud-installer/testing/ubuntu
$RELEASE main
key: |
-----BEGIN PGP PUBLIC KEY BLOCK-----
Version: SKS 1.1.4
Comment: Hostname: keyserver.ubuntu.com
mI0EUwap0AEEAOcvGspxrV0/83Xa6grEAplHLuuvj3CrOH26XwSleu/wzzTmNqKDnZLWjBkA
qdbfYzQ3T4aD2uWfMJ2doqemBmLZWKrkMInLcS2o3cqraFHJaZDAvJHg7wiDBYiuq0cCrj/m
enC351p/DLQ+QuiHE1hgX6JV4nF527rCmGbWSSTRABEBAAG0KExhdW5jaHBhZCBQUEEgZm9y
IFVidW50dSBDbG91ZCBJbnN0YWxsZXKIuAQTAQIAIgUCUwap0AIbAwYLCQgHAwIGFQgCCQoL
BBYCAwECHgECF4AACgkQ3eaD+NL/Ce1RuQQApA4AaFlsujGJ4i2lN1qLbxivXu2fs+D9aXAV
MgYINVj13/xxtn+1PqV7x7I9ej+Adhy9uLc+7T6mfx7Ahn791hbNr/gycSZEkvdp3gZRFWHS
MqPZ3uOvWieRR347tMTh/BgxEsTdTUcLbt7jZkk6NypGO+ej8WtWugJ9kwOPb9s=
=aDcI
-----END PGP PUBLIC KEY BLOCK-----
ssh_authorized_keys:
- ssh-rsa
AAAAB3NzaC1yc2EAAAADAQABAAABAQCjInOUu3bhxOod18NUG5yF86z4FDLY78mzD53mYNEw52J8UT71/kzJgJZfGEkS5cE6UO/XazYIKDZtTsjK1euHOg/nQL93bJ+hwjlCjUINsXtkvul5odxqwlVB7BiJxXWxJqURYgpURR3GwUDGLx5W1gO8mA9sWzbTt5NXfE0gbdIXeb0TVUI6CcgNj+e9uW0xl/0kSA6VFDqyz9kidHm/dLGoakg8V3h08tbIjG9PfGz/M0L2j345iZP816NVpE0k2UAn1dS415wJwvUjZGF/vFoPqemdP0ecp/UECFAz0wt/CVOtdcnh/XGhiz4aNK0a/y0HNxgjzuN+jrx6fZ5h
stokachu@cabeiri
random_seed:
command: ['env', 'http_proxy=http://squid.internal:3128',
'https_proxy=http://squid.internal:3128', 'pollinate', '-q']
apt_mirror: http://us.archive.ubuntu.com/ubuntu/
package_update: true
password: ubuntu
chpasswd: { expire: False }
ssh_pwauth: True
manage_etc_hosts: localhost
resize_rootfs: False
# Make sure we load our modules on first creation
runcmd:
- [ sh, /etc/rc.local ]
- echo "export PATH=$PATH:/usr/sbin" >> /home/ubuntu/.bashrc
- echo "export http_proxy=http://squid.internal:3128" >> /home/ubuntu/.bashrc
- echo "export HTTP_PROXY=http://squid.internal:3128" >> /home/ubuntu/.bashrc
- echo "export https_proxy=http://squid.internal:3128" >> /home/ubuntu/.bashrc
- echo "export HTTPS_PROXY=http://squid.internal:3128" >> /home/ubuntu/.bashrc
```
And this is our lxc config output:
```
# Template used to create this container:
/usr/share/lxc/templates/lxc-ubuntu-cloud
# Parameters passed to the template: -u
/home/stokachu/.cloud-install/userdata.yaml
# For additional config options, please look at lxc.container.conf(5)
# Common configuration
lxc.include = /usr/share/lxc/config/ubuntu-cloud.common.conf
# Container specific configuration
lxc.rootfs = /var/lib/lxc/openstack-single-stokachu/rootfs
lxc.utsname = openstack-single-stokachu
lxc.arch = amd64
# Network configuration
lxc.network.type = veth
lxc.network.link = lxcbr0
lxc.network.flags = up
lxc.network.hwaddr = 00:16:3e:c8:95:cc
lxc.mount.auto = cgroup:mixed
lxc.start.auto = 1
lxc.start.delay = 5
lxc.mount = /var/lib/lxc/openstack-single-stokachu/fstab
```
--
You received this bug notification because you are a member of Ubuntu
Bugs, which is subscribed to Ubuntu.
https://bugs.launchpad.net/bugs/1486296
Title:
Unable to start VMs under a lxc container
To manage notifications about this bug go to:
https://bugs.launchpad.net/ubuntu/+source/libvirt/+bug/1486296/+subscriptions
--
ubuntu-bugs mailing list
[email protected]
https://lists.ubuntu.com/mailman/listinfo/ubuntu-bugs