我正在尝试让 OpenStack Nova 计算节点在容器内运行,以启动嵌套容器中的服务器。
一切正常,直到我要求控制器中的 Nova 启动服务器。在计算容器中的服务器启动过程中,libvirt 使用 qemu-nbd 导出从 OpenStack Glance 下载的 qcow2 磁盘映像,作为启动嵌套容器的上一步。使用默认 lxc 配置,qemu-nbd 会失败。
我已经制定了 lxc.conf 文件以允许在容器内使用 qemu-nbd,但我一定是遗漏了一些东西,因为即使容器激活了节点 /dev/nbd0,我也看不到与 qcow2 磁盘映像中的分区相对应的 /dev/nbd0p1 条目。
这是我的 Nova 容器的 lxc.conf 文件:
# Template used to create this container: /usr/share/lxc/templates/lxc-download
# Parameters passed to the template: -d ubuntu -r trusty -a i386
# For additional config options, please look at lxc.container.conf(5)
# Distribution configuration
lxc.include = /usr/share/lxc/config/ubuntu.common.conf
lxc.arch = x86
# Container specific configuration
lxc.rootfs = /var/lib/lxc/compute/rootfs
lxc.utsname = compute
# Network configuration
lxc.network.type = veth
lxc.network.flags = up
lxc.network.link = lxcbr0
lxc.network.hwaddr = 00:16:3e:90:16:e0
lxc.network.type = veth
lxc.network.flags = up
lxc.network.link = br0.1000
lxc.network.hwaddr = 00:16:3e:90:16:e1
# This is the public interface
lxc.network.type = veth
lxc.network.flags = up
lxc.network.link = br0.2000
lxc.network.hwaddr = 00:16:3e:90:16:e2
# Added so certain functions (iptables, nova-compute, ...) work
lxc.mount.entry = /lib/modules/3.13.0-43-generic /var/lib/lxc/compute/rootfs/lib/modules/3.13.0-43-generic none ro,bind 0 0
# Added so the compute node can run LXC VMs
lxc.mount.auto = cgroup
lxc.aa_profile = lxc-container-default-with-nesting
# Allow the container to mknod (needed by qemu-nbd...)
lxc.cgroup.devices.allow = c *:* m
lxc.cgroup.devices.allow = b *:* m
# Allow the container to use the host's nbd devices
lxc.cgroup.devices.allow = b 43:* rwm # Every nbd device in the host
可以在命令行上轻松验证。假设我们有 qcow 磁盘映像/root/cirros-0.3.3-i386-disk.img
:
root@compute:~# qemu-nbd -c /dev/nbd0 cirros-0.3.3-i386-disk.img -f qcow2
root@compute:~# ls -d /sys/class/block/nbd0p1
/sys/class/block/nbd0 /sys/class/block/ndb0p1
root@compute:~# ls /dev/nbd0*
/dev/nbd0
看来内核中存在块设备,但尚未创建 /dev/nbd0p1 设备节点。有人知道我的容器配置中缺少什么吗?
PS:我知道 OpenStack Nova 默认不适用于容器虚拟机,我需要对 Nova 代码进行一些更改;但我需要先克服这个障碍
答案1
对我来说似乎有效(使用 KVM 主机之上的 KVM 客户机内的 LXC 主机内的 cirros qcow2 映像启动 LXC 实例;Icehouse 版本)。
确实必须手动创建一些 nbd 节点:
stack@ctl-template:~/devstack$ ls -l /dev/nbd*
brw-r--r-- 1 root root 43, 0 Apr 13 14:31 /dev/nbd0
brw-r--r-- 1 root root 43, 16 Apr 13 14:33 /dev/nbd1
brw-r--r-- 1 root root 43, 32 Apr 13 14:33 /dev/nbd2
brw-r--r-- 1 root root 43, 48 Apr 13 14:33 /dev/nbd3
brw-r--r-- 1 root root 43, 64 Apr 13 14:34 /dev/nbd4
nbd1 正在被以下实例使用:
stack@ctl-template:~/devstack$ dmesg | tail | grep nbd
[94516.110986] EXT4-fs (nbd1): mounting ext3 file system using the ext4 subsystem
[94516.205551] EXT4-fs (nbd1): mounted filesystem with ordered data mode. Opts:
没有为映像内的分区创建其他设备:
stack@ctl-template:~/devstack$ ls /sys/class/block/
loop0 loop4 nbd0 nbd12 nbd2 nbd6 ram0 ram12 ram2 ram6 sr0 vda5
loop1 loop5 nbd1 nbd13 nbd3 nbd7 ram1 ram13 ram3 ram7 vda
loop2 loop6 nbd10 nbd14 nbd4 nbd8 ram10 ram14 ram4 ram8 vda1
loop3 loop7 nbd11 nbd15 nbd5 nbd9 ram11 ram15 ram5 ram9 vda2