2012-06-28 20:57:03
前几天给你起好了名字,爸爸决定了就叫“王余羲”了!
2012-06-28 20:57:03
前几天给你起好了名字,爸爸决定了就叫“王余羲”了!
2012-06-16 10:59:55
今天爸爸坐汽车去东阳,去给爸爸的姑父送电脑,爸爸的姑父你该叫什么?爸爸也不知道,⊙﹏⊙b汗,是姑姥爷吗?
路上很无聊,就给你说会儿话吧。
爸爸这几天都在给你想名字呢,不过还是没想好,想了一个,王余曦,因为按照老家的辈分,你排在余字辈。不知道这个名字你喜不喜欢,爸爸感觉太普通了,不够响亮,还得再想一个。其实也就是把余字替换成别的字而已。爸爸给你取余字的意思是为了让你不要忘本,要记住自己的老家以及老家的亲人,他们可都是很勤劳善良的好人,你长大以后也要做这样的人。
还有爸爸还想说的是关于爸爸的人生观,爸爸希望自己可以生活的比较洒脱快乐,虽然没有完全做到,至少我有
追求的目标。人生的很多时候,目标比结果更有意义,比如说高考,追女朋友,赚钱买房等等。
爸爸想活的洒脱快乐,不知道到目前为止算不算做到了,我想应该还不算吧,原因有很多,比如要赚钱,买房,养活你和妈妈,还有之前爱感情方面的一些事情,当然不是和你妈妈的问题,哪个男生还能没暗恋过几个女生呢。
不过爸爸希望你的人生能实现这个目标,做人洒脱快乐一些,凡事不要太计较得失,快乐痛苦都是一辈子,何苦为难自己呢!但是我不是说做人可以没有追求,爸爸的网名aspirer你可以查下词典看看是什么意思。追求必须得有,不然人生就没有目标,就会浑浑噩噩,也就不会有挑战,不会有成就感,也就不会被别人尊重。
人生的不同阶段肯定会有不同的追求,这很明显,小时候,你的追求可能是很多玩具,很多好吃的零食,没有老师和爸妈的管教,自由自在。但更多的情况是同一个阶段你的追求跟爸妈老师期望的追求可能不一样,尤其是当你还不懂事的时候,这时候爸妈总是希望你能听我们的话,为什么呢?因为你还小,不知道你的这个人生阶段应该追求什么,至少是各种追求应该有主次之分,爸爸妈妈老师的教导就是让你在目前的人生阶段分清主次,为你以后的人生有更多更好的机会追求自己想要的东西,比如物质生活,女朋友等等。
你要时刻记住一点,爸爸妈妈做任何决定都是为你好。
好了,爸爸快到了,先聊到这吧。宝宝在妈妈肚子里要乖乖的,过几天顺利出生,爸爸回老家看你和妈妈。
2012-06-04 14:17:07
没有打草稿,信手涂鸦,望你见谅
图裂请查看原文!
原文地址:http://aspirer2004.blog.163.com/blog/static/1067647201531452142289/
本文结构及部分内容参考了:http://files.meetup.com/10602292/kvm%20features.pdf(海云捷迅–Dexin(Mark) Wu)
本文主要介绍KVM(QEMU)在OpenStack开源云平台中的地位、作用、用途,以及目前各种功能的应用情况,最后介绍了一些常见场景的具体使用方式和流程。 目录结构如下:
KVM是Kernel-based Virtual Machine的简称,一套X86平台CPU架构下的完全虚拟化解决方案,它依赖Intel-VT或者AMD-V硬件辅助虚拟化技术[1],同时支持EPT和AMD NPT内存虚拟化技术[2],以提升CPU和内存的虚拟化性能[3]。 06年10月以色列qumranet公司发布,2.6.20加入内核主干(充分利用Linux内核既有代码),08年qumranet被redhat收购,之后由redhat主导开发。 kvm提供可动态加载的内核模块kvm.ko,以及支持具体的CPU厂商的kvm_intel.ko或kvm_amd.ko。 提供与内核交互的途径(/dev/kvm)、管理内核中虚拟机数据结构、状态信息、捕获并处理虚拟机遇到的特殊指令等,不模拟具体的设备。 简化版架构图如下:
从上图中可以看出,KVM主要是负责kernel-mode部分。
既然KVM不负责具体的虚拟机运行必须的硬件如BIOS、磁盘、IO设备、PCI设备等,那么就得依靠其他软件来实现,目前来说,实现这部分硬件模拟功能的软件就是QEMU。 QEMU:quick emulate简写而成,一个开源的硬件设备模拟软件,比KVM历史更早,优点是可以模拟多种架构和设备[4],不足在于原始的qemu是不支持硬件加速的,所以效率比较低。 qemu本身不依赖kvm,没有kvm,qemu照样可以做到配合kvm可以做的任何事(只是性能很差,这一点可以从Android设备模拟的时候体验到),qemu本身就不是为kvm而生的。 kvm出现后,为了专门支持kvm,形成了qemu-kvm,目前qemu已经原生支持kvm,也就是不需要做任何改动就可以配合kvm使用(当然还有专门支持Xen而形成了qemu-xen),KVM与QEMU二者在内核态和用户态互相配合,极大的提升了虚拟化性能,二者目前来说是一个整体,打个比方来解释二者的关系:QEMU是普通发动机汽车,KVM+QEMU就是喷气式发动机汽车!
目前要直接使用QEMU,只能用命令行方式运行,没有相关API提供,使用不方便,很多在线命令,如热插拔磁盘、网卡等,是需要交互式执行的,显然是不适合大规模环境下应用,要记住那么多的参数也是一件及其痛苦的事情[5]。
为了解决这一问题,也为了形成统一的管理接口层,libvirt诞生了,最初libvirt是为了解决qemu-xen遇到的上述管理问题,但由redhat主导开发的libvirt的目标远不止于此。 libvirt[6],顾名思义,是lib+virt的意思,虚拟化软件库,专门提供各种虚拟化平台的统一接口,支持很多虚拟化软件如:qemu、xen、virtual box,lxc等等。 原生C开发,提供各种绑定语言接口,C#、python、Java、ruby等,各大开源云计算平台几乎都是用libvirt作为底层虚拟化软件接口层提供服务。 libvirt使用更加人性化的xml格式配置来定义虚拟机各种参数信息,libvirt会解析这些xml配置,并最终转化为qemu的命令行参数,并在用户执行启动虚拟机命令时把qemu进程拉起来(用xml中的各种参数)。
主要有启动、关机、暂停、休眠、恢复、唤醒、磁盘冷热插拔、网卡冷热插拔、快照、VNC、在线迁移等
[1] X86虚拟化: http://zh.wikipedia.org/wiki/X86虚拟化 [2] AMD NPT/Intel EPT简介: http://blog.pchome.net/article/458429.html [3] Extending KVM with new Intel ? Virtualization technology: http://www.linux-kvm.org/wiki/images/c/c7/KvmForum2008$kdf2008_11.pdf [4] http://zh.wikipedia.org/wiki/QEMU, http://blog.chinaunix.net/uid-25714487-id-3560065.html [5] http://linux.die.net/man/1/qemu-kvm, [6] http://www.xuebuyuan.com/930444.html,
《系统虚拟化——原理与实现》 《KVM虚拟化技术:实战与原理解》 《云计算与OpenStack(虚拟机Nova篇)》 http://www.linux-kvm.org/ http://wiki.qemu.org/ http://libvirt.org/ http://docs.openstack.org/
原文地址:http://aspirer2004.blog.163.com/blog/static/1067647201521934533215/
功能 | 阿里云 | 青云 | UStack | Ucloud | AWS | Rackspace | |
---|---|---|---|---|---|---|---|
生命周期管理 (创建、删除、列表、详情、修改规格、重启、启动、停止、重命名) |
y | y | y | y | y | y | |
系统盘快照 | y | y | y | y | y | y | |
VNC | y | y | y | y | ? | ? | |
public key注入及数量 | n? | y | y | y | y | ||
支持镜像数量 | 多 | 多 | 多 | 多 | 很多 | 多 | |
用户帮助文档 | 很详细 | 详细 | 一般 | 一般 | 很详细 | 很详细 | |
用户操作tips指引 | y | y | y | y | y | 有 | |
查看控制台输出 | n | n | y | n | y | y | |
云主机状态检查 | y | n | n | n | y | n | |
开放API | y | y | y | y | y | y | |
API SDK | y | y | n | n | y | y | |
监控报警 | 多 | 一般 | 一般 | 一般 | 多 | 一般 | |
本地镜像启动云主机 | y | n | n | y? | y | n | |
云硬盘启动云主机 | y | y | y | n | y | y | |
本地实例存储盘 | y | n | n | n | n? | n | |
配额管理 | y | y | y | y | y | y | |
报警通知人员管理 | y | y | y | y | y | y | |
离线迁移 | n | n | n | n | n | n | |
资源使用量报表(使用时长、费用等) | y | y | y | y | y | y | |
资源利用率报表(cpu、mem、disk等维度) | y | y | y | y | y | y | |
资源及配额概览(cpu、内存等资源的使用量及配额) | y | y | y | y | y | y | |
服务健康状态显示(AZ、Region等级别、网络状态监控、故障记录等) | n | y | n | n | y | y | |
资源回收站 | n | y | n | n | n | n | |
计费相关(账单报表、余额等信息) | y | y | y | y | y | y | |
欠费资源处理 | y | y | y | y | y | y | |
计划任务支持 | n | n | n | n | y | y | |
工单支持 | y | y | y | y | y | y | |
账户锁(控制台、API,锁定后无法执行操作) | n | y | n | n | n? | n | |
操作日志 | y | y | y | y | y | y | |
子账户(子账户共享主账户配额、余额等资源,受控于主账户) | n | y | y | n | n | y | |
镜像重置(镜像替换修复) | y | y | n | y | n | n | |
镜像弃用或替换(排序、过滤等,API级别支持) | y | y | y | y | y | y | |
镜像共享(跨租户) | n | n | n | n | n | n | |
多语言用户界面支持 | n | y | y | n | 部分页面 | y | |
云主机分组管理功能(instance group) | n | n | n | n | y | y | |
创建时启动脚本支持(startup scripts) | n | y | n | n | y | y | |
云主机故障自动重启 | n | n | n | n | n | y | |
节点维护时自动迁移云主机 | y | ||||||
从已有云主机复制出相同的云主机 | n | n | n | n | y | y | |
云主机模板 | n | n | n | n | y | y | |
云主机自动伸缩 | y | n | n | n | y | y | |
高级特性(内存复用、QoS、HA、在线迁移、内核热升级。。。) |
QoS、
内核热升级
|
QoS
|
QoS
|
QoS、
在线迁移、
内核热升级
|
QoS
|
功能 | 阿里 | 青云 | UStack | Ucloud | AWS | Rackspace | |
---|---|---|---|---|---|---|---|
私有网 | N | Y | Y | Y | Y | Y | |
私有网接入 | – | VPN | 需额外公网IP 虚拟机转发 |
需额外公网IP 虚拟机转发 |
VPN | VPN | |
机房内网 | Y | Y | Y | Y | Y (经典网络) | N | |
外网 IP | Y | Y | Y | Y | Y | Y | |
端口转发 [1] | N | Y | Y | N | N | Y | |
DHCP | N | Y | Y | Y | Y | Y | |
DNS | N | P (内网CNAME) | N | N | Y | Y | |
流量监控 | Y | Y | Y | Y | Y | Y | |
虚拟路由器 | N | Y | Y | Y | P [2] | P [2] | |
防火墙 | P [3] | Y | Y (安全组) | Y (安全组) | Y | Y | |
带宽限制 | Y | Y | Y | Y | Y | Y | |
计费 | Y | Y | Y | Y | Y | Y | |
负载均衡 (L4/L7) | Y | Y | N | Y | Y | Y | |
API | P [4] | Y | Y | Y | Y | Y | |
CDN | Y | Y | N | Y | Y | Y |
[1] 端口转发可以通过 L4 负载均衡实现
[2] AWS 和 Google 可为子网分配私有和公网网关,允许用户修改路由设置,但同一个网关不能直接设置为连通多个子网
[3] 拥有无法配置,工作机制不明的云盾
[4] 没有单独提供网络 API,主要是主机 API
云硬盘
Ucloud不支持云硬盘
功能 | 阿里云 | 青云 | UStack | Ucloud | AWS | Rackspace | |
---|---|---|---|---|---|---|---|
生命周期管理(创建/删除/改名) | 支持 | 支持 | 支持 | / | 支持 | 支持(普通,SSD) | |
挂载/卸载云硬盘 | 支持 | 支持 | 支持 | 支持 | 支持, 还支持挂载模式,可读写还是只读 |
||
重新初始化磁盘 | 支持 | 不支持 | 不支持 | 不支持 | 不支持 | ||
磁盘监控 | 支持 | 支持 | 支持 | 支持 | 支持 | ||
创建/删除快照 | 支持 | 支持 | 支持 | 支持 | 支持 | ||
利用快照会滚磁盘 | 支持 | 不支持 | 不支持 | 不支持 | 不支持 | ||
从快照创建云硬盘 | 不支持 | 支持 | 支持 | 支持 | 支持 | ||
从快照创建自定义镜像 | 支持 | 支持 | 不支持 | 支持 | 不支持,但支持从快照启动云主机 | ||
跨区拷贝快照 | 不支持 | 不支持 | 不支持 | 支持 | 不支持,但支持快照在各可用域共享 | ||
设置快照为public/private | 不支持 | 不支持 | 不支持 | 支持 | 不支持 | ||
共享快照给其他用户 | 不支持 | 不支持 | 不支持 | 支持 | 不支持 | ||
共享卷给其他用户 | 不支持 | 不支持 | 不支持 | 不支持 | 不支持 | ||
多区域 | 支持 | 支持 | 支持 | 支持 | 不支持 | ||
多可用域 | 支持 | 不支持 | 不支持 | 支持 | 支持 | ||
API,SDK,用户手册 | 支持 | 支持 | 支持 | 支持 | 支持 | ||
云硬盘扩容 | 不支持 | 支持 | 支持 | 不支持 | 不支持,通过快照间接实现 | ||
云硬盘QoS | ? | ? | 创建云硬盘时设置默认qos, 不提供修改qos api |
支持,创建时指定大小,不提供api | 支持,设置默认大小 |
原文地址:http://aspirer2004.blog.163.com/blog/static/1067647201502715020494/
请教kvm-monitor问题 8 封邮件 |
njupt_student <njupt_student#njupt.edu.cn> | 2015年1月23日 下午10:33 | ||||||||||||||||||||||||||||
收件人:aspirer2004 <aspirer2004#gmail.com> | |||||||||||||||||||||||||||||
|
ME <aspirer2004#gmail.com> | 2015年1月26日 上午9:33 | |
收件人:njupt_student <njupt_student#njupt.edu.cn> | ||
|
njupt_student <njupt_student#njupt.edu.cn> | 2015年1月26日 上午10:56 | |
收件人:aspirer2004 <aspirer2004#gmail.com> | ||
|
ME <aspirer2004#gmail.com> | 2015年1月26日 下午1:11 | |
收件人:njupt_student <njupt_student#njupt.edu.cn> | ||
|
njupt_student <njupt_student#njupt.edu.cn> | 2015年1月26日 下午8:03 | |
收件人:aspirer2004 <aspirer2004#gmail.com> | ||
|
ME <aspirer2004#gmail.com> | 2015年1月27日 上午10:42 | |
收件人:njupt_student <njupt_student#njupt.edu.cn> | ||
|
njupt_student <njupt_student#njupt.edu.cn> | 2015年1月27日 上午11:43 | |
收件人:aspirer2004 <aspirer2004#gmail.com> | ||
|
ME <aspirer2004#gmail.com> | 2015年1月27日 下午1:41 | |
收件人:njupt_student <njupt_student#njupt.edu.cn> | ||
|
原文地址:http://aspirer2004.blog.163.com/blog/static/1067647201411119615820/
1. 问题症状
1 2 3 4 5 6 7 8 9 10 |
2014-12-04 14:27:45.037 5243 ERROR nova.openstack.common.rpc.amqp [req-cae51866-d040-406c-91db-503954f4289e 19cf25635e8f4f64b7884eacf0b2d707 e2e52a8b4a1442e994675c0be721d42 b] Exception during message handling 2014-12-04 14:27:45.037 5243 TRACE nova.openstack.common.rpc.amqp Traceback (most recent call last): 2014-12-04 14:27:45.037 5243 TRACE nova.openstack.common.rpc.amqp File "/usr/lib/python2.7/dist-packages/nova/openstack/common/rpc/amqp.py", line 461, in _process_data 2014-12-04 14:27:45.037 5243 TRACE nova.openstack.common.rpc.amqp **args) 2014-12-04 14:27:45.037 5243 TRACE nova.openstack.common.rpc.amqp File "/usr/lib/python2.7/dist-packages/nova/openstack/common/rpc/dispatcher.py", line 172, in dispatch 2014-12-04 14:27:45.037 5243 TRACE nova.openstack.common.rpc.amqp result = getattr(proxyobj, method)(ctxt, **kwargs) 2014-12-04 14:27:45.037 5243 TRACE nova.openstack.common.rpc.amqp File "/usr/lib/python2.7/dist-packages/nova/compute/manager.py", line 4938, in detach_interface 2014-12-04 14:27:45.037 5243 TRACE nova.openstack.common.rpc.amqp "attached") % port_id) 2014-12-04 14:27:45.037 5243 TRACE nova.openstack.common.rpc.amqp PortNotFound: Port 4559c7d7-5242-4d4d-9807-c558f1b76f77 is not attached |
1 2 |
wwww@10-xxx-0-xxx:~$ grep "10.xxx.xxx.71" nova-compute.log.1 | grep Updating 2014-12-04 14:17:07.359 5243 DEBUG nova.network.api [req-f5b7febd-ffe9-4859-850c-69cff88a5659 19cf25635e8f4f64b7884eacf0b2d707 e2e52a8b4a1442e994675c0be721d42b] Updating cache with info: [VIF({'ovs_interfaceid': u'b375c304-f610-4f09-bb1c-f59e24cd2730', 'network': Network({'bridge': u'br-int', 'subnets': [Subnet({'ips': [FixedIP({'meta': {}, 'version': 4, 'type': u'fixed', 'floating_ips': [], 'address': u'10.xxx.xxx.11'})], 'version': 4, 'meta': {u'dhcp_server': u'10.xxx.xxx.5'}, 'dns': [], 'routes': [], 'cidr': u'10.xxx.xxx.0/23', 'gateway': IP({'meta': {}, 'version': 4, 'type': u'gateway', 'address': u'10.xxx.xxx.1'})})], 'meta': {u'injected': False, u'tenant_id': u'e2e52a8b4a1442e994675c0be721d42b'}, 'id': u'ac968912-d491-4380-914d-213483d8104e', 'label': u'private_e2e52a8b4a1442e994675c0be721d42b'}), 'devname': u'tapb375c304-f6', 'qbh_params': None, 'meta': {}, 'address': u'fa:16:3e:15:8f:4d', 'type': u'ovs', 'id': u'b375c304-f610-4f09-bb1c-f59e24cd2730', 'qbg_params': None}), VIF({'ovs_interfaceid': u'4559c7d7-5242-4d4d-9807-c558f1b76f77', 'network': Network({'bridge': 'br-int', 'subnets': [Subnet({'ips': [FixedIP({'meta': {}, 'version': 4, 'type': 'fixed', 'floating_ips': [], 'address': u'10.xxx.xxx.71'})], 'version': 4, 'meta': {'dhcp_server': u'10.xxx.xxx.68'}, 'dns': [], 'routes': [], 'cidr': u'10.xxx.xxx.64/26', 'gateway': IP({'meta': {}, 'version': None, 'type': 'gateway', 'address': None})})], 'meta': {'injected': False, 'tenant_id': u'e2e52a8b4a1442e994675c0be721d42b'}, 'id': u'b11d8ca7-27cb-48bc-b65a-a7a66c6b7e9b', 'label': u'idc_e2e52a8b4a1442e994675c0be721d42b'}), 'devname': u'tap4559c7d7-52', 'qbh_params': None, 'meta': {}, 'address': u'fa:16:3e:84:76:ab', 'type': u'ovs', 'id': u'4559c7d7-5242-4d4d-9807-c558f1b76f77', 'qbg_params': None})] update_instance_cache_with_nw_info /usr/lib/python2.7/dist-packages/nova/network/api.py:72 |
1 2 3 |
wwww@10-xxx-0-xxx:~$ grep "update_instance_cache_with_nw_info" nova-compute.log.1 2014-12-05 00:53:27.099 5243 DEBUG nova.network.api [-] Updating cache with info: [VIF({'ovs_interfaceid': u'9e9dff77-46bb-41c4-aed2-35370314544a', 'network': Network({'bridge': 'br-int', 'subnets': [Subnet({'ips': [FixedIP({'meta': {}, 'version': 4, 'type': 'fixed', 'floating_ips': [], 'address': u'10.xxx.xxx.12'})], 'version': 4, 'meta': {'dhcp_server': u'10.xxx.xxx.5'}, 'dns': [], ...... |
1 2 |
@periodic_task.periodic_task def _heal_instance_info_cache(self, context): |
1 2 |
grep 9e9df nova-compute.log.1 | grep "Updating " grep 9e9df nova-compute.log.1 | grep "Updating " | grep -v 4559c |
1 |
2014-12-04 14:17:07.612 5243 DEBUG nova.network.api [-] Updating cache with info: [VIF({'ovs_interfaceid': u'b375c304-f610-4f09-bb1c-f59e24cd2730', 'network': Network({'bridge': 'br-int', 'subnets': [Subnet({'ips': [FixedIP({'meta': {}, 'version': 4, 'type': 'fixed', 'floating_ips': [], 'address': u'10.xxx.xxx.11'})], 'version': 4, 'meta': {'dhcp_server': u'10.xxx.xxx.5'}, 'dns': [], 'routes': [], 'cidr': u'10.xxx.xxx.0/23', 'gateway': IP({'meta': {}, 'version': 4, 'type': 'gateway', 'address': u'10.xxx.xxx.1'})})], 'meta': {'injected': False, 'tenant_id': u'e2e52a8b4a1442e994675c0be721d42b'}, 'id': u'ac968912-d491-4380-914d-213483d8104e', 'label': u'private_e2e52a8b4a1442e994675c0be721d42b'}), 'devname': u'tapb375c304-f6', 'qbh_params': None, 'meta': {}, 'address': u'fa:16:3e:15:8f:4d', 'type': u'ovs', 'id': u'b375c304-f610-4f09-bb1c-f59e24cd2730', 'qbg_params': None})] update_instance_cache_with_nw_info /usr/lib/python2.7/dist-packages/nova/network/api.py:72 |
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 |
diff --git a/nova/compute/manager.py b/nova/compute/manager.py index f240709..9184e08 100644 --- a/nova/compute/manager.py +++ b/nova/compute/manager.py @@ -5358,6 +5358,10 @@ class ComputeManager(manager.Manager): break if instance: + if instance['uuid'] == '61c1159c-3999-4bd5-9029-1757a55bce3d': + LOG.debug("xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx-------------------------xxxxxxxxxxxxx") + time.sleep(30) + LOG.debug("yyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyy-------------------------xxxxxxxxxxxxx") # We have an instance now to refresh try: # Call to network API to get instance info.. this will |
首先尝试在debian7 wheezy kvm虚拟机中安装运行docker,试验可以成功,步骤如下:
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 |
Hello from Docker. This message shows that your installation appears to be working correctly. To generate this message, Docker took the following steps: 1. The Docker client contacted the Docker daemon. 2. The Docker daemon pulled the "hello-world" image from the Docker Hub. (Assuming it was not already locally available.) 3. The Docker daemon created a new container from that image which runs the executable that produces the output you are currently reading. 4. The Docker daemon streamed that output to the Docker client, which sent it to your terminal. To try something more ambitious, you can run an Ubuntu container with: $ docker run -it ubuntu bash For more examples and ideas, visit: http://docs.docker.com/userguide/ |
1 2 |
libvirt-bin/libvirt0:1.2.9-3~bpo70+1 python-libvirt:1.2.1-2~bpo70+1 |
1 2 3 4 5 |
#iface eth0 inet dhcp iface br0 inet dhcp bridge_ports eth0 bridge_fd 0 bridge_maxwait 0 |
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 |
<domain type="lxc"> <uuid>f0cc641c-16d8-4a12-8793-1e8c2f3f7717</uuid> <name>instance-00004def</name> <memory>256288</memory> <vcpu>1</vcpu> <os> <type>exe</type> <cmdline>console=tty0 console=ttyS0</cmdline> <init>/sbin/init</init> </os> <clock offset="utc"/> <devices> <filesystem type="mount"> <source dir="/mnt"/> <target dir="/"/> </filesystem> <interface type="bridge"> <source bridge="br0"/> </interface> <console type="pty"/> </devices> </domain> |
1 2 |
virsh -c lxc:/// define lxc.xml virsh -c lxc:/// start instance-00004def |
1 2 |
root@10-<span style="color: #008800;">xxx</span>-0-<span style="color: #008800;">xxx</span>:~# docker run --rm hello-world 2014/11/18 05:40:29 Error response from daemon: Cannot start container 89eed4e0f900e6165d17f2cde3c21737d1efc4f83fdc6235602438bd8612720b: write /sys/fs/cgroup/devices/machine/instance-00004def.libvirt-lxc/docker/89eed4e0f900e6165d17f2cde3c21737d1efc4f83fdc6235602438bd8612720b/devices.allow: operation not permitted |
1 2 |
root@10-<span style="color: #008800;">xxx</span>-0-<span style="color: #008800;">xxx</span>:~# docker run --rm -t -i --privileged hello-world setup mount namespace create device nodes mknod /dev/full operation not permitted2014/11/18 05:41:54 Error response from daemon: Cannot start container 70d63cc71b9aca18ef16057add1c16e05a62d0631eb5170c5e529a0c74f62e23: setup mount namespace create device nodes mknod /dev/full operation not permitted |
docker in lxc on host
OpenStack Nova创建云主机API支持personality参数,用来把用户文件注入到新创建的云主机内部,该参数由两个部分组成,文件的目标路径和文件内容,比如用户想把
abc
efg
这个文件注入到云主机内部的 /etc/path/to/file 路径下,则参数可以设置为:
“personality”: [{“path”: “/etc/vm_monitor/info”, “contents”: “ZXhwb3J0IE9TX1VTRVJOQdJ…T05fTkFNRT1SZWdpb25Ud28K”}]
其中文件内容是需要经过base64转码的,可以支持同时注入多个不同路径的文件,在目标路径不存在的情况下会新创建整个路径和文件,在目标文件存在的情况下,会覆盖已有内容。 API说明页面
另外需要说明的是:key、密码、网络配置等文件的注入有专门的API参数支持,不虽然最终的注入逻辑是基本相同的,但是API参数却不是这个personality。
nova文件注入序列图(简化版)如下:
文字描述
关于guestfs介绍可以参考guestfs-python, 它是基于libguestfs开发的Python库,其最大好处就是可以不mount镜像就可以操作镜像内部文件系统里面的文件,支持read,write,writeappend,stat,mkdirp等基本文件读写操作。
libguestfs是一个C库,可以参考libguestfs,可以看出这是个功能非常强大的虚拟机镜像访问修改工具,其不足主要有两点,一是速度比较慢,二是有些系统上没有软件包,需要编译安装(redhat系列都支持,因为libguestfs是redhat主导开发的)
localfs driver则是完全依赖宿主机各种工具软件来实现的文件注入(loop或者nbd,如果是raw格式镜像使用loop设备,其它格式则使用nbd设备),这里以qcow2+nbd方式作为示例进行说明,这种情况下文件注入流程主要用到了如下几个软件:
主要流程就是:
需要注意的一点是,windows镜像的文件系统格式一般都是ntfs,如果要在宿主机上mount Windows分区,需要安装ntfs-3g软件,并且由于Windows vista及之后系统,都有一个保留分区,kpartx分区后,Nova默认选择注入到第一个分区,对于Windows系统镜像来说就是保留分区,而不是真正的系统分区,这一点需要注意,要么做镜像的时候,去掉保留分区,要么修改Nova代码,对Windows镜像特殊处理。
上面的流程都是基于镜像文件已经保存到计算节点上这个前提下的,而从云硬盘启动的云主机,则没有镜像文件(是远程挂载过来的),虽说也是有一个mapper设备,但是在Nova代码流程里,挂载云硬盘是在文件注入流程之后才执行的,换句话说,注入文件的过程中,云硬盘还没有存在在计算节点上。Nova代码里也有明确说明,从云硬盘启动的云主机是不支持文件注入的,包括personality,key,password,net等。 简而言之,从云硬盘启动的云主机不支持文件注入!
综合考虑推荐使用方法1,成熟方案且使用广泛。
需要注意的是,不论使用上面哪种方法,都不支持把已有的没有安装cloud-init或者没有打开user_data配置的云主机,转换成云硬盘系统盘,来恢复出一台支持文件注入的云主机。
nova/doc/api_samples/all_extensions/extensions-get-resp.json
nova/tests/integrated/api_samples/all_extensions/extensions-get-resp.json.tpl
OS-EXT-SRV-ATTR: