在容器中使用 qemu-nbd 挂载 qcow2 镜像

在容器中使用 qemu-nbd 挂载 qcow2 镜像

我正在尝试让 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

相关内容