Libvirt - 从块设备启动 LXC

https://blueprints.launchpad.net/nova/+spec/libvirt-start-lxc-from-block-devices

此蓝图的目的是启用从块设备卷启动 LXC 容器。

问题描述

目前,LXC 容器只能从 Glance 镜像启动。然而,只需要进行微小的调整,就可以支持使用块设备卷作为其根操作系统文件系统进行启动。

提议的变更

将 lxc 磁盘处理代码从 _create_domain() 分离到 _lxc_disk_handler 上下文管理器。它将使用 block_device_mapping 映射实例启动所使用的设备,否则将使用镜像。

_lxc_disk_handler 将处理磁盘的“pre”和“post” lxc 启动操作,以便在启动后挂载它并清理 lxc 命名空间。这些操作对于镜像和卷都是 LXC 特有的。

将支持以下卷的布局。

  • 未分区,文件系统跨越整个内容。

  • 已分区。仅挂载第一个分区中的文件系统。如果存在多个分区,则仅考虑第一个分区,而忽略其他分区。

用户可以从现有的 Glance 镜像创建卷,并使用一条命令启动 LXC 容器

nova boot –flavor FLAVOR –block-device source=image,id=ID,dest=volume,

size=SIZE,shutdown=PRESERVE,bootindex=0 NAME

或者从现有的卷启动 LXC 容器

nova boot –flavor FLAVOR –block-device source=volume,id=ID,dest=volume,

size=SIZE,shutdown=PRESERVE,bootindex=0 NAME

备选方案

数据模型影响

REST API 影响

安全影响

由于 LXC 将始终与主机共享内核,因此所有实例之间,内核中的任何漏洞都可能被用于危害主机。通常,内核的文件系统驱动程序应该被信任,以避免用户文件系统镜像可能利用的漏洞。

通知影响

其他最终用户影响

性能影响

其他部署者影响

开发人员影响

实现

负责人

Vladik Romanovsky <vladik.romanovsky@enovance.com>

工作项

  • 引入一个 _lxc_disk_handler 上下文管理器方法,并将所有 lxc 磁盘处理代码从 _create_domain() 分离到它。

  • 向 _lxc_disk_handler 添加逻辑,以使用提供的 block_device_mapping 挂载卷

  • 删除 blockinfo.py 中的 lxc 特定映射创建

依赖项

测试

文档影响

参考资料

[1] https://review.openstack.org/#/c/74537