├── QF_optimize.md ├── urls.md ├── customzie_centos.md ├── driver_diff ├── qemu ├── PV_HVM_PVH.md ├── qemu_rfc_201401.md ├── xen.md ├── qemu_rfc_201403.md ├── GPU虚拟化.md ├── qemu_rfc_201402.md ├── qemu_2.0.md └── cpu_hot_plug原理.md ├── LSCOLOR.md ├── other ├── grub2配置方法 ├── virtual_network.md ├── notes.md ├── key.md ├── mongodb性能调优.md ├── mongodb.md └── cgroup限制内存.md ├── openstack ├── mysql_1040.md ├── tenants.md ├── nova_api.md ├── 3libs.md ├── nova.md ├── python.md ├── security_group.md ├── exportdb.sh ├── 防火墙环境下使用Devstack安装Magnum.md ├── policy.md ├── review_tricks.md ├── dynamic_scheduler.md ├── readonly_mode_update.md ├── spec_template.spec ├── cells.md ├── devstack_tricks.md ├── importdb.sh ├── devstack.md ├── DR.md ├── period_task.md ├── test.md ├── install_nova_docker.md ├── defer_delete.md └── nfvi-realtime.md ├── OSF_rules.md ├── nested_virtualization.md ├── README.md ├── LRC_SRT.md ├── OSF_numa_affinity.md ├── QF_TPM.md ├── QF_panic.md ├── litevirt_openstack_arch.md ├── NFV.md ├── QF_MEMQos.md ├── QF_postcopy_livemigration.md ├── git_review ├── libvirt_qemu_coderead.md ├── MOM.md ├── OSF_image_backend.md ├── OSF_numa.md ├── 一个qemu错误的解决办法.md ├── Kolla项目介绍.md ├── coreosVsatomic.md ├── git-review-error ├── QF_hugepage.md ├── .vimrc ├── ovirt_node.md ├── OSF_instance_action.md ├── summit.md ├── QF_rdm.md ├── .vimrc2 ├── QF_CPUQos.md ├── OSF_CPUBIND.md ├── QF_trim.md ├── no_boot_patch_kernel.md ├── OSF_trim.md ├── qemu_features.md ├── OSF_shelve.md ├── docker部署openstack.md ├── OSF_trottle_migrate_vol.md ├── OS_tricks.md ├── QF_mem_overcommit.md ├── vmware └── vmware_openstack.md ├── devstack └── No_module_named_MySQLdb.md ├── QF_vm_snapshot.md ├── QF_pci_passthrough_hotplug.md ├── QF_numa.md ├── spf13.sh ├── QF_pci2.md ├── OSF_snapshot.md ├── network.md ├── network3.md ├── trim.md ├── network4.md └── network2.md /QF_optimize.md: -------------------------------------------------------------------------------- 1 | http://www.slideshare.net/meituan/kvmopt-osforce-27669119 2 | -------------------------------------------------------------------------------- /urls.md: -------------------------------------------------------------------------------- 1 | http://devdocs.io/html/article 2 | DevDocs,各种语言工具的文档合集,查文档很方便 3 | -------------------------------------------------------------------------------- /customzie_centos.md: -------------------------------------------------------------------------------- 1 | http://www.360doc.com/content/10/1115/22/2054285_69692742.shtml 2 | -------------------------------------------------------------------------------- /driver_diff: -------------------------------------------------------------------------------- 1 | https://www.dropbox.com/s/kfs3hijyq1g9aq5/HowToEnterRegCodeImage.png 2 | -------------------------------------------------------------------------------- /qemu/PV_HVM_PVH.md: -------------------------------------------------------------------------------- 1 | ### 虚拟化的几种类型 2 | ### PV 3 | ### HVM 4 | ### PVH 5 | ### PVHVM 6 | -------------------------------------------------------------------------------- /LSCOLOR.md: -------------------------------------------------------------------------------- 1 | http://askubuntu.com/questions/466198/how-do-i-change-the-color-for-directories-with-ls-in-the-console 2 | -------------------------------------------------------------------------------- /other/grub2配置方法: -------------------------------------------------------------------------------- 1 | 1. 修改/etc/grub.d/下的配置文件 2 | 比如增加40_customzie文件 3 | 4 | 2. 运行grub2-config更新/boot/grub2/grub.cfg文件 5 | -------------------------------------------------------------------------------- /openstack/mysql_1040.md: -------------------------------------------------------------------------------- 1 | 使用glance出现以下错误: 2 | MySQL Server Error:Too many connections ( 1040 ) 3 | 4 | 解决办法: 5 | 修改my.cnf,在mysqld下增加max_connections=1000。 6 | 7 | 具体原因: 8 | 未知 9 | -------------------------------------------------------------------------------- /OSF_rules.md: -------------------------------------------------------------------------------- 1 | + 代码风格 2 | http://docs.openstack.org/developer/hacking/ 3 | + API规则 4 | https://wiki.openstack.org/wiki/APIChangeGuidelines 5 | + 代码提交 6 | http://blog.csdn.net/quqi99/article/details/9425385 7 | -------------------------------------------------------------------------------- /nested_virtualization.md: -------------------------------------------------------------------------------- 1 | http://www.rdoxenham.com/?p=275 2 | 3 | https://www.kernel.org/doc/Documentation/virtual/kvm/nested-vmx.txt 4 | 5 | http://docs.openstack.org/developer/devstack/guides/devstack-with-nested-kvm.html 6 | -------------------------------------------------------------------------------- /README.md: -------------------------------------------------------------------------------- 1 | note 2 | ==== 3 | 4 | mynote 5 | 6 | + 术语 7 | OSF:openstack feature 8 | OS: openstack 9 | QF: qemu feature 10 | 11 | + 文件说明 12 | .vimrc: 我的vimrc文件,放在~/下即可。使用vundle进行插件管理。 13 | 安装方法见https://github.com/gmarik/Vundle.vim.git 14 | -------------------------------------------------------------------------------- /openstack/tenants.md: -------------------------------------------------------------------------------- 1 | tenants/project 2 | --- 3 | ### tenants 4 | 一个tenant/project是多个用户的集合,openstack用它来定义这个组内用户的访问权限, 5 | 包括能够访问的虚拟机镜像以及相关资源的使用限制(quota),例如能创建多少个instances,ram限制 6 | tenants和project在openstack中可以认为是等同的概念。 7 | 8 | ### quota 9 | 用来定义tenants中的资源数量。 10 | 11 | 12 | -------------------------------------------------------------------------------- /openstack/nova_api.md: -------------------------------------------------------------------------------- 1 | nova api 2 | --- 3 | ### 分页 4 | 使用limit/marker参数进行分页。 5 | limit: 显示个数。 6 | marker:上次显示的最后一个的id。 7 | 8 | ### 高效polling 9 | 使用change-since查询某个时间后,变化的条目。 10 | 11 | 12 | ### limits 13 | + rate limit 14 | + absolute limit 15 | + 查询limit 16 | 17 | ### Version 18 | 19 | ### extensions 20 | 21 | 22 | 23 | -------------------------------------------------------------------------------- /openstack/3libs.md: -------------------------------------------------------------------------------- 1 | ### six 2 | 提供python2/python3的兼容适配层。 3 | + six用法 4 | ```python 5 | @add_metaclass(Meta) 6 | class MyClass(object): 7 | pass 8 | ``` 9 | + 对应python3 10 | ```python 11 | class MyClass(object, metaclass=Meta): 12 | pass 13 | ``` 14 | + 对应python2 15 | ```python 16 | class MyClass(object): 17 | __metaclass__ = MyMeta 18 | ``` 19 | -------------------------------------------------------------------------------- /LRC_SRT.md: -------------------------------------------------------------------------------- 1 | GO LRC: 2 | https://github.com/jthmath/lrc 3 | 4 | GO SRT: 5 | https://github.com/n00bDooD/gosrt 6 | 7 | PYSRT: 8 | https://pypi.python.org/pypi/pysrt 9 | 10 | PYDUB: 11 | https://github.com/jiaaro/pydub 12 | 13 | PYTHON: 14 | http://stackoverflow.com/questions/2952309/python-library-to-split-and-join-mp3-files 15 | 16 | 17 | 18 | -------------------------------------------------------------------------------- /openstack/nova.md: -------------------------------------------------------------------------------- 1 | nova 2 | ---- 3 | ### 主目录说明 4 | doc: 主要是文档类的文件 5 | etc: 主要是nova的各种配置文件 6 | nova: 主要是nova的代码 7 | tools: nova用的的各种小工具(如清理类。。。) 8 | 其他文件:主要是编译/打包/单元测试文件 9 | 10 | ### nova代码 11 | 1. 代码静态目录结构 12 | 2. 主干流程 13 | 3. 典型功能流程 14 | 4. 各功能流程 15 | 5. 其他功能(定时任务、task等) 16 | 17 | ### review技巧 18 | 1. 常见问题 19 | 2. 主要设计思想 20 | 21 | ### 22 | -------------------------------------------------------------------------------- /other/virtual_network.md: -------------------------------------------------------------------------------- 1 | MACvTAP技术: 2 | https://blog.kghost.info/2013/03/27/linux-network-tun/ 3 | http://blog.csdn.net/kl222/article/details/8513593 4 | 5 | 虚拟化技术: 6 | http://tbala.net/x/Cloud2010/CloudTech-BCC-201003.html 7 | 8 | 网络虚拟化: 9 | macvtap在sr-iov passthrough中的应用。 10 | http://www.ibm.com/developerworks/cn/linux/1312_xiawc_linuxvirtnet/ 11 | -------------------------------------------------------------------------------- /OSF_numa_affinity.md: -------------------------------------------------------------------------------- 1 | # 什么是NUMA 2 | NUMA全称是Non-Uniform Memory Access。在NUMA中每个CPU都会分配Local memory,CPU和local memory组成NUMA node。 3 | CPU访问local memory,速度会很快;而访问其他node上的memory(这个称作访问remote memory)速度会比较慢,延迟无法预知。 4 | 5 | 6 | # 什么是vNUMA 7 | 8 | ![numa](https://657cea1304d5d92ee105-33ee89321dddef28209b83f19f06774f.ssl.cf1.rackcdn.com/NUMA1-54bd8529f54ce4c5774b601f90de303a9e2629f1c10ccd593add3a17fe0fd83e.png) 9 | -------------------------------------------------------------------------------- /openstack/python.md: -------------------------------------------------------------------------------- 1 | openstack中的python高级用法 2 | ---- 3 | ### metaclass 4 | python的世界,一切皆是对象。类本身也是对象。 5 | 对象是类的实例,类是元类的实例。 6 | 7 | 通过元类,可以对对象进行负责的预操作。 8 | 不过一般情况下,我们无需使用复杂的元类。 9 | 10 | 我们通过以下两种方式实现类似的功能: 11 | 1. monkey patch 12 | 2. decorator(装饰器) 13 | 14 | ### monkey patch 15 | 可以理解为对函数的一种覆盖。 16 | 17 | ### decorator 18 | 可以理解为在函数调用前的预处理。 19 | 20 | ### 类方法 21 | 22 | ### yeild 23 | 24 | -------------------------------------------------------------------------------- /QF_TPM.md: -------------------------------------------------------------------------------- 1 | TPM 2 | ---- 3 | ### TPM结构 4 | ![Alt text](http://upload.wikimedia.org/wikipedia/commons/thumb/b/be/TPM.svg/580px-TPM.svg.png) 5 | 6 | ### 什么是TPM 7 | TPM的芯片首先必须具有产生加解密密匙的功能,此外还必须能够进行高速的资料加密和解密, 8 | 以及充当保护BIOS和操作系统不被修改的辅助处理器。 9 | 10 | ### 用途 11 | TPM安全芯片用途十分广泛,配合专用软件可以实现以下用途: 12 | + 存储、管理BIOS开机密码以及硬盘 密码。 13 | + TPM安全芯片可以进行范围较广的加密。 14 | + 加密硬盘的任意分区。 15 | + 其他如DRM、软件License上。 16 | 17 | 18 | -------------------------------------------------------------------------------- /other/notes.md: -------------------------------------------------------------------------------- 1 | ###wuyun 2 | 1. SQL注入/SQL盲注* 3 | 国内:啊d 4 | 国外:sqlmap pangolin 5 | 6 | 扫描工具:burpsuite、JSky、safe3wvs、wvs、nmap....... 7 | 注入工具:sqlmap(首选)、Havij、pangolin、Safe3SI... 8 | 2. 弱口令 9 | 3. 任意代码执行/任意代码写入/任意文件读取*/任意文件上传/远程命令执行 10 | 4. XSS 11 | 5. 程序逻辑bug 12 | 6. 未校验特殊值(尤其涉及计费,计时) 13 | 7. cookie泄露用户信息 14 | 8. CSRF 15 | 9. 社会工程学 16 | 10. 钓鱼漏洞(伪造网站链接) 17 | 11. root型shell 18 | 12. 暴力重置密码 19 | 13. 伪造消息 20 | -------------------------------------------------------------------------------- /QF_panic.md: -------------------------------------------------------------------------------- 1 | panic设备 2 | ----- 3 | panic设备可以让libvirt从qemu guest获取到panic通知。 4 | 5 | ### libvirt用法 6 | libvirt 1.2.1后支持该功能。 7 | ```xml 8 | 9 | 10 |
11 | 12 | 13 | ``` 14 | 大部分情况下用户无需指定address。 15 | ### qemu用法 16 | qemu 1.5以后开始支持。 17 | ```shell 18 | -device pvpanic 19 | ``` 20 | info qtree可以看到如下设备: 21 | ``` 22 | dev: pvpanic, id "" 23 | ioport = 1285 24 | ``` 25 | ### 实现原理 26 | 27 | ### openstack上应用 28 | 29 | -------------------------------------------------------------------------------- /litevirt_openstack_arch.md: -------------------------------------------------------------------------------- 1 | 1. 整体部署架构 2 | fuel-master可以使用虚拟机部署,也可以使用物理机部署。 3 | fuel支持将openstack部署在虚拟机中(主要做体验、演示使用),也可以将openstack部署在物理机上。 4 | 部署如图: 5 | 6 | 7 | litevirt_openstack软件堆栈如图: 8 | 9 | 2. 安装过程 10 | 【使用虚拟机方式部署】 11 | 推荐体验使用。 12 | a. 使用litevirt-hypervisor部署一台服务器。 13 | b. 使用litevirt-hypervisor中的kimchi,创建fuel-master虚拟机。 14 | c. 使用kimchi创建若干台虚拟机作为openstack环境使用。 15 | d. fuel-master识别出这些虚拟机。 16 | e. 通过fuel-master创建一套openstack环境。 17 | 18 | 【使用物理机方式部署】 19 | a. 使用fuel-master的iso部署一台服务器。 20 | b. fuel-masters 21 | -------------------------------------------------------------------------------- /NFV.md: -------------------------------------------------------------------------------- 1 | ### NFV 2 | + 什么是NFV? 3 | NFV是Network Functions Virtualization的简写。 4 | NFV由ETSI(欧洲电信标准组织)工作组制定。 5 | NFV定义了将过去单独存在的各种网络功能(如防火墙,NAT,入侵检测,缓存,网关,加速器)等,用虚拟机或者一组虚拟机来代替(他们也被称为NFV"Virtual Network FUnctions"。 6 | NFV的主要用户是电信运营商,为了加速新网络功能的部署,因此需要消除对专有硬件更新缓慢的问题(这些硬件无法自动扩容以及限制了演进)。 7 | OpenStack支持NFV的主要目的在于提供用于部署NFV负载虚拟机的最好的基础设施(当然同时遵守IaaS云的原则)。 8 | 为了VNF能正确的在云中运行,底层基础设施需要提供从调度到网络/从编排到监控的功能。这意味者Openstack很多项目需要适配(从Neutron到Nova)。 9 | + 同SDN区别 10 | SDN关注的领域主要是将网络控制层与网络转发层分离。 11 | NFV关注于将网络功能移植到虚拟环境,从而将基于专有硬件的应用转变为基于标准硬件和云。 12 | 13 | 14 | -------------------------------------------------------------------------------- /openstack/security_group.md: -------------------------------------------------------------------------------- 1 | 以下内容基于juno版openstack代码。 2 | ### 安全组 3 | 安全组用来对虚拟机的网络设置IP过滤规则。安全组隶属于project,project的成员可以编辑默认安全组规则以及增加新的工作集。 4 | 所有的project都有一个default安全组,默认组织一切流入流量。 5 | 6 | nova.conf有一个allow_same_net_traffic 参数,若设置为true,同一subnet中的所有虚拟机可以互相通信。 7 | 这意味着,在flat网络中所有project的虚拟机可以互相通信;在vlan网络中,同一project的虚拟机互相通信。 8 | 9 | 安全组的目的在于基于安全因素对虚拟机的网络流入流出进行控制。 10 | ### 安全组操作 11 | 12 | ### 安全组原理与代码分析 13 | 14 | 15 | 16 | 参考: 17 | RDO网站上将openstack网络细节的,讲的不错。 18 | https://openstack.redhat.com/Networking_in_too_much_detail 19 | -------------------------------------------------------------------------------- /openstack/exportdb.sh: -------------------------------------------------------------------------------- 1 | #!/usr/bin/env bash 2 | STACK_TEMPLATE="/etc/template/db/" 3 | 4 | mysqldump -u root -padmin cinder > ${STACK_TEMPLATE}/cinder.sql 5 | mysqldump -u root -padmin glance > ${STACK_TEMPLATE}/glance.sql 6 | mysqldump -u root -padmin heat > ${STACK_TEMPLATE}/heat.sql 7 | mysqldump -u root -padmin keystone > ${STACK_TEMPLATE}/keystone.sql 8 | mysqldump -u root -padmin neutron > ${STACK_TEMPLATE}/neutron.sql 9 | mysqldump -u root -padmin nova > ${STACK_TEMPLATE}/nova.sql 10 | mysqldump -u root -padmin mysql > ${STACK_TEMPLATE}/mysql.sql 11 | -------------------------------------------------------------------------------- /openstack/防火墙环境下使用Devstack安装Magnum.md: -------------------------------------------------------------------------------- 1 | .. 2 | 声明: 3 | 本博客欢迎转发,但请保留原作者信息! 4 | 博客地址:http://blog.csdn.net/halcyonbaby 5 | 新浪微博:寻觅神迹 6 | 7 | 内容系本人学习、研究和总结,如有雷同,实属荣幸! 8 | 9 | ================== 10 | 防火墙环境下使用Devstack安装Magnum 11 | ================== 12 | 13 | 1. 安装fedora21环境 14 | 2. 配置fedora、epel repo源使用国内的源,比如163、aliyun 15 | 3. 配置pip源,比如163、aliyun 16 | 4. 设置env GIT_SSL_NO_VERIFY=true 17 | 5. 设置stackrc中git头为http 18 | 6. 配置proxy参数 19 | 重要:no_proxy中一定要包含本机IP、proxy机IP。 20 | 7. 创建stack用户,并设置可以sudo 21 | 8. 切换成stack用户,下载devstack 22 | 9. 生成local.conf,增加“enable_plugin magnum https://github.com/openstack/magnum" 23 | 10. 运行stack.sh 24 | -------------------------------------------------------------------------------- /qemu/qemu_rfc_201401.md: -------------------------------------------------------------------------------- 1 | 1. 原生支持NFS 2 | http://lists.gnu.org/archive/html/qemu-devel/2014-01/msg04308.html 3 | 2. rework input handling, sdl2 support 4 | http://lists.gnu.org/archive/html/qemu-devel/2014-01/msg03748.html 5 | 3. dump-guest-memory witch compress backend 6 | http://lists.gnu.org/archive/html/qemu-devel/2014-01/msg03669.html 7 | 4. cpu hotplug for q35 8 | http://lists.gnu.org/archive/html/qemu-devel/2014-01/msg00997.html 9 | 5. vhost/vhost-net支持userspace 10 | http://lists.gnu.org/archive/html/qemu-devel/2014-01/msg04455.html 11 | 12 | 其他: 13 | trim的使用方法 14 | http://lists.gnu.org/archive/html/qemu-devel/2014-01/msg04123.html 15 | -------------------------------------------------------------------------------- /openstack/policy.md: -------------------------------------------------------------------------------- 1 | policy 2 | ---- 3 | ### 用途 4 | user/tenants/role三个概念。 5 | policy简单的说是控制一个user在tenants中的权限。即user可以执行哪些操作,不能执行哪些操作。 6 | role是权限的集合,可以赋予某个user一个role。 7 | policy直观看是一个json文件,位置在/etc/[SERVICE_CODENAME]/policy.json中。 8 | policy.json的格式类似与dict。其中key为action,value未rule。 9 | 10 | policy.json会由程序读取加载,并用于用户操作的权限验证。 11 | 12 | ### 使用 13 | 调用nova/policy.py模块中的enforce()。 14 | **似乎可以改进的地方**可以通过内核inotify改进。 15 | (该处已经确认,openstack通过文件修改时间识别文件是否修改,并重新加载) 16 | enforce()会导致policy.json被重新加载,也就是说修改权限不需要重启服务。 17 | 18 | ### 代码参考 19 | compute/api.py 20 | unlock()--->check_policy()----->policy.enforce() 21 | 22 | 23 | ### 待验证 24 | 修改policy,发送API消息验证。 25 | -------------------------------------------------------------------------------- /QF_MEMQos.md: -------------------------------------------------------------------------------- 1 | Mem Qos 2 | ----- 3 | 本质上也是通过cgroup实现,相关按照见CPU Qos。 4 | ### libvirt 5 | xml配置: 6 | ```xml 7 | 8 | 4194304 9 | 8388608 10 | 1024000> 11 | 4194304 12 | 13 | ``` 14 | 15 | 命令设置: 16 | ```shell 17 | memtune [--hard-limit ] [--soft-limit ] [--swap-hard-limit ] [--min-guarantee ] [--config] [--live] [--current] 18 | ``` 19 | 20 | 参数|说明| 21 | ----|----| 22 | hard_limit|强制最大内存| 23 | soft_limit|最大可用内存| 24 | min_guarantee|最小保证内存| 25 | swap_hard_limit|swap强制最大内存| 26 | -------------------------------------------------------------------------------- /QF_postcopy_livemigration.md: -------------------------------------------------------------------------------- 1 | ### 应用场景 2 | 1. big guest的迁移 3 | 2. 紧急疏散某个host上的虚拟机(比如可以预期的即将发生故障) 4 | 3. 升级qemu(可以用unix socket,避免遇到网络故障) 5 | 6 | ### matrix 7 | 8 | ```shell 9 | disk RAM internal snapshot 10 | non-live yes (0) yes (0) yes 11 | live, disk only yes (1) N/A yes (2) 12 | live, pre-copy yes (3) yes no 13 | live, post-copy yes (4) no no 14 | live, point-in-time yes (5) no no 15 | 16 | (0) just stop VM while doing normal pre-copy migration 17 | (1) blockdev-snapshot-sync 18 | (2) blockdev-snapshot-internal-sync 19 | (3) block-stream 20 | (4) drive-mirror 21 | (5) drive-backup 22 | ``` 23 | 24 | -------------------------------------------------------------------------------- /git_review: -------------------------------------------------------------------------------- 1 | 外网实验室无法git-review提交代码的解决方法: 2 | 3 | 1、使用非凡vpn网络加速器来代理目的至review.openstack.org的流量 4 | 软件下载地址:http://www.ffvpn.com 5 | 账户及密码信息获取地址:http://www.ffvpn.com/freetrial 6 | 缺点:每30分钟变化一次密码,需要重新获取密码并再次登录 7 | 8 | 9 | ◆◆◆◆◆◆◆◆◆◆◆◆◆◆◆◆◆ 10 | 11 | 卡:751992317272937 密:761876953473 12 | 13 | 使用方法:卡密使用教程www.hongyuevpn.com/kami.html 14 | 简略步骤1、前往鸿跃代理官网注册个账户(姓名,手机,邮箱随便写,用户级别选1) 15 | http://www.hongyuevpn.com 16 | 2、注册后,用客服发您的卡密对账户进行充值 17 | 3、账号充值后,下载鸿跃客户端,登陆后选择网速数值最小的线路,连接上,即可使用。 18 | 客户端下载地址www.hongyuevpn.com/download/hongyuevpn.zip 19 | 注意:如果一直卡在验证用户名密码,请使用L2TP连接。 20 | 4、手机等设备(或电脑客户端无法使用VPN),请自行创建VPN连接.教程:www.hongyuevpn.com/az.html 21 | 170.178.211.199到170.178.211.214 22 | 107.6.12.41到107.6.12.44 23 | 共20个服务器任您使用,L2TP共享密匙123456 24 | 25 | ◆◆◆◆◆◆◆ 26 | 27 | ◆◆◆◆◆◆◆◆◆◆◆◆◆◆◆◆◆ 28 | -------------------------------------------------------------------------------- /other/key.md: -------------------------------------------------------------------------------- 1 | 公钥私钥 2 | ---- 3 | 公钥私钥主要用于安全传输,典型的应用如邮件。 4 | 比如A/B两人通信,C是坏蛋。A为了通信安全,制作了一对公钥/私钥。 5 | A将公钥给B使用,这样B向A发邮件时,可以使用公钥对邮件加密。 6 | 因为只有A持有私钥,C无法解密该邮件。 7 | 8 | 但是这里存在一个问题,即C可能冒充B给A发邮件。解决的方法是B也制作自己 9 | 的公钥私钥,并将公钥发送给B。B向A发邮件时,不但使用A的公钥加密,还使用 10 | 自己的私钥加密。由于私钥加密的邮件只有对应的公钥可以解密,由于B的私钥 11 | 只有自己只有,因此我们可以认为该邮件是B发送的,而非伪造的。 12 | 13 | 数字证书 14 | ---- 15 | 数字证书用来使用户找到该授信机构的公钥。 16 | 避免C恶意散发/伪造/冒充公钥,欺骗获得用户发送的信息。 17 | 数字证书一般由权威的机构发布。 18 | 19 | 数字签名 20 | ---- 21 | 简单的说是利用公钥私钥机制完成的对用户本人的确认和记录。 22 | 23 | 24 | openstack中应用 25 | ---- 26 | 27 | openssl 28 | ---- 29 | openssl是为网络通信提供安全及数据完整性的一种安全协议,囊括了主要的密码算法、常用的密钥和证书封装管理功能以及SSL协议,并提供了丰富的应用程序供测试或其它目的使用。 30 | 31 | 32 | PKI/CA 33 | ---- 34 | PKI(Public Key Infrastructure)公钥基础设施是提供公钥加密和数字签名服务的系统或平台,目的是为了管理密钥和证书。 35 | -------------------------------------------------------------------------------- /openstack/review_tricks.md: -------------------------------------------------------------------------------- 1 | review技巧 2 | ----- 3 | ### 可参考资料 4 | + 代码风格 5 | http://docs.openstack.org/developer/hacking/ 6 | + API规则 7 | https://wiki.openstack.org/wiki/APIChangeGuidelines 8 | 9 | ### 具体样例 10 | + 无效log/错误的log 11 | 比如某个log已经失效,或者完全不对 12 | + API使用错误 13 | 对某个API的返回使用错误。 14 | 使用旧的,废弃的API。 15 | + 逻辑表达式(性能最优) 16 | 错误 17 | ```python 18 | if (fixedip.virtual_interface.address not in macs) and \ 19 | (fixedip.virtual_interface.address != vif_address): 20 | ``` 21 | 正确 22 | ```python 23 | if (fixedip.virtual_interface.address != vif_address) and \ 24 | (fixedip.virtual_interface.address not in macs): 25 | ``` 26 | + 指定参数对应关系 27 | 错误 28 | ```python 29 | call_func(context, network, vif.address) 30 | ``` 31 | 正确 32 | ```python 33 | call_func(context, network, vif_adress=vif.address) 34 | ``` 35 | -------------------------------------------------------------------------------- /qemu/xen.md: -------------------------------------------------------------------------------- 1 | xen4.4,qemu-xen-1.6编译安装 2 | 3 | 1. 下载xen源码 4 | 2. 安装依赖包(依赖包装那些,可以参考代码包的README) 5 | 3. ./configure --enable-githttp 6 | 4. make world 7 | 5. make install 8 | 6. 配置内核启动 9 | # grub2-mkconfig -o /boot/grub2/grub.cfg 10 | # grep ^menuentry /boot/grub2/grub.cfg | cut -d "'" -f2 11 | # grub2-set-default 12 | 7. 配置服务 13 | chkconfig xencommons on 14 | chkconfig xendomains on 15 | chkconfig xen-watchdog on 16 | 8. 重启系统 17 | 9. xl list显示成功 18 | [root@fedora vm]# xl list 19 | Name ID Mem VCPUs State Time(s) 20 | Domain-0 0 40375 24 r----- 100.2 21 | 22 | 23 | 参考: 24 | http://wiki.xenproject.org/wiki/Compiling_Xen_From_Source 25 | https://wiki.openstack.org/wiki/CodeReviewGuidelines 26 | -------------------------------------------------------------------------------- /openstack/dynamic_scheduler.md: -------------------------------------------------------------------------------- 1 | openstack动态调度现状 2 | ---- 3 | 最近一个哥们在openstack邮件列表提出来做动态调度,引出很热烈的讨论。 4 | 这里分析一下openstack动态调度功能当前的现状。 5 | 目前openstack并未提供DRS、DPM的功能。 6 | 7 | #### 实现思路 8 | 通过nova周期性任务或者独立的项目完成。 9 | 社区更倾向于通过单独的项目完成。 10 | 原因主要基于两点: 11 | 1. 实现比较复杂,放在nova中不合适 12 | 2. nova负责的计算资源管理,动态调度不应该放在nova中。 13 | (类似于linux设计思想中的机制和策略) 14 | 15 | #### Gantt项目 16 | 一个刚从nova分离出来的Scheduler as a service。 17 | 目前仍是初始阶段,尚未真正开始,至少juno版本仍无法使用。 18 | 初步目标仍是初始放置,未来也许有可能将动态放置放进来。 19 | https://github.com/openstack/gantt 20 | 21 | #### neat项目 22 | 似乎目前已经废弃,不再更新。 23 | http://openstack-neat.org 24 | Apache2.0 licence,部分代码使用了专利技术。 25 | 商业使用必须获得专利许可。 26 | 27 | #### IBM PRS项目(非开源) 28 | IBM PRS (Platform Resource Scheduler) 项目 29 | http://www-01.ibm.com/common/ssi/cgi-bin/ssialias?infotype=AN&subtype=CA&htmlfid=897/ENUS213-590&appname=USN 30 | -------------------------------------------------------------------------------- /libvirt_qemu_coderead.md: -------------------------------------------------------------------------------- 1 | qemu代码阅读 2 | ----- 3 | qemu monitor命令,比如savevm命令。 4 | 1. 查看hmp-commands.hx中该命令的处理函数。 5 | 2. 我们通过grep在savevm.c中找到do_savevm函数 6 | hmp-commands.hx例子: 7 | ```xml 8 | { 9 | .name = "savevm", 10 | .args_type = "name:s?", 11 | .params = "[tag|id]", 12 | .help = "save a VM snapshot. If no tag or id are provided, a new snapshot is created", 13 | .mhandler.cmd = do_savevm, 14 | }, 15 | ``` 16 | savevm.c中的do_savevm函数 17 | ```c 18 | void do_savevm(Monitor *mon, const QDict *qdict) 19 | { 20 | BlockDriverState *bs, *bs1; 21 | QEMUSnapshotInfo sn1, *sn = &sn1, old_sn1, *old_sn = &old_sn1; 22 | int ret; 23 | QEMUFile *f; 24 | ``` 25 | 26 | 27 | libvirt代码阅读 28 | ----- 29 | src/libvirt.c中定义了所有的API。 30 | 通过插件机制执行不同hypervisor的实现。 31 | 具体实现见插件目录,比如qemu在src/qemu下。 32 | -------------------------------------------------------------------------------- /MOM.md: -------------------------------------------------------------------------------- 1 | MOM 2 | ------ 3 | MOM: Memory overcommit management 4 | 最初由IBM一名员工开发并在IBM项目中使用。目前ovirt项目也引入了该组件。 5 | https://github.com/oVirt/mom 6 | ### 功能 7 | 提供KVM host上基于策略的内存overcommit管理。 8 | 可以根据从host和guest上收集的数据调整memory overcommit配置,从而达到最优的目的。 9 | 目前支持ballon和KSM策略控制。 10 | 11 | ### VDSM、MOM 12 | 架构图: 13 | ![architecture](http://www.ovirt.org/images/b/b4/Mom-vdsm.jpg) 14 | 交互图: 15 | ![architecture](http://www.ovirt.org/images/e/e6/Mom-flow.png) 16 | VDSM和MOM在部署上互相独立存在,VDSM向MOM提供policy使用。并使用MOM的RPC API进行控制。 17 | 18 | 19 | ### MOM内部 20 | 基于policy和收集的数据对memory overcommit进行控制。 21 | ![architecture](http://www.ibm.com/developerworks/cn/linux/l-overcommit-kvm-resources/figure2.gif) 22 | 23 | 24 | 其中各组件: 25 | controller:基于底层接口提供调控能力,比如触发ballon调整,ksm扫描合并。 26 | evaluator:基于collector的数据和policy,判断是否要触发管理动作。 27 | Policy:策略定义。定义何时应该触发管理动作执行。 28 | collector:负责收集各种数据。 29 | 30 | 31 | -------------------------------------------------------------------------------- /OSF_image_backend.md: -------------------------------------------------------------------------------- 1 | ### openstack image backend 2 | 目前openstack提供了raw,qcow2,lvm,rbd四种类型的image后端。 3 | 所谓后端,即image/临时卷root盘的管理存储方式。 4 | 5 | ![alter image](http://www.pixelbeat.org/docs/openstack_libvirt_images/openstack-libvirt-images.png) 6 | 7 | nova/virt/libvirt/imagebackend.py: 8 | 中有四个Raw,Qcow2,Lvm,Rbd四个类,均继承了image类,主要提供create_image方法和snapshot_extract方法。 9 | image父类提供了cache方法,会调用create_image方法。 10 | cache方法提供了image目录创建,调用create_image方法创建image, 完成preallocate(通过fallocate实现)。 11 | create_image方法提供了image下载,根据backend类型不同进行backing_image创建的能力。 12 | backend类主要提供对Raw,Qcow2, Lvm, Rbd的对象生成能力。 13 | 14 | 15 | cache方法的调用流: 16 | 17 | cache方法《------_create_image方法《------------------(rescue/finish_migration/spawn) 18 | cache方法《------_create_images_and_backing方法《-----(hard_reboot/pre_livemigration) 19 | 20 | 21 | 配置项: 22 | images_type 用于配置默认的image存储管理方式。可以设置为四种类型的任意一种。 23 | volume_clear 用于定义临时卷删除的方式(各种安全删除策略)。 24 | volume_clear_size 用于shred删除方式删除时破坏数据的大小。 25 | 26 | 注:版本现在的能力缺陷。 27 | -------------------------------------------------------------------------------- /other/mongodb性能调优.md: -------------------------------------------------------------------------------- 1 | ### mongodb性能调优 2 | 3 | http://blog.csdn.net/gardener_db有几篇mongodb的文章非常实用。 4 | 主要讲解了硬件选型,mongodb的cache机制。mongodb的高可靠。 5 | 6 | 调优具体手段: 7 | http://java.dzone.com/articles/mongodb-performance-tuning-and 8 | 9 | 官方调优文档: 10 | http://info.mongodb.com/rs/mongodb/images/MongoDB-Performance-Considerations_2.4.pdf 11 | 写的很详细,从硬件选型、应用角度,表的设计规划,磁盘IO方面对调优进行了说明。 12 | http://www.mongodb.com/presentations/mongosv-2012/mongodb-performance-tuning 13 | 14 | 具体的操作手法: 15 | http://docs.mongodb.org/manual/reference/program/mongostat/ 16 | http://docs.mongodb.org/manual/tutorial/evaluate-operation-performance/ 17 | http://docs.mongodb.org/manual/core/write-performance/ 18 | 19 | 核心开发者谈调优: 20 | http://www.csdn.net/article/2012-11-15/2811920-mongodb-quan-gong-lue 21 | 22 | 23 | ### 水平扩展 24 | 通过Sharding 分片进行水平扩展。 25 | http://www.lemge.com/index.php?c=news_index_c&l=YToxOntzOjE6ImkiO3M6NToiMTQ5MzEiO30%3D&m=ld#blz-insite 26 | 27 | ### Nosql分类 28 | http://www.lemge.com/index.php?c=news_index_c&m=ld&l=YToxOntzOjE6ImkiO3M6NToiMTU5MjQiO30= 29 | -------------------------------------------------------------------------------- /openstack/readonly_mode_update.md: -------------------------------------------------------------------------------- 1 | cinder readonly_mode_update 2 | --- 3 | ### cinder-client消息流 4 | ```shell 5 | REQ: curl -i http://186.100.8.214:35357/v2.0/tokens -X POST -H "Content-Type: application/json" -H "Accept: application/json" -H "User-Agent: python-cinderclient" -d '{"auth": {"tenantName": "admin", "passwordCredentials": {"username": "admin", "password": "admin"}}}' 6 | 7 | REQ: curl -i http://186.100.8.214:8776/v1/86196260e1694d0cbb5049cfba3883f8/volumes/9b7b450f-a815-4e05-8c22-3419b5e8a553 -X GET -H "X-Auth-Project-Id: admin" -H "User-Agent: python-cinderclient" -H "Accept: application/json" -H "X-Auth-Token: 284c379a621b4524b9f156e60f014f10" 8 | 9 | REQ: curl -i http://186.100.8.214:8776/v1/86196260e1694d0cbb5049cfba3883f8/volumes/9b7b450f-a815-4e05-8c22-3419b5e8a553/action -X POST -H "X-Auth-Project-Id: admin" -H "User-Agent: python-cinderclient" -H "Content-Type: application/json" -H "Accept: application/json" -H "X-Auth-Token: 284c379a621b4524b9f156e60f014f10" -d '{"os-update_readonly_flag": {"readonly": false}}' 10 | ``` 11 | ### os-update_readonly_flag处理过程 12 | 13 | ### 代码分析 14 | -------------------------------------------------------------------------------- /OSF_numa.md: -------------------------------------------------------------------------------- 1 | ### Openstack现状 2 | 支持vcpu cpuset设定。 3 | 不支持cpu亲和性的精细设置。(bp2解决范围) 4 | 不支持内存亲和性设置。() 5 | 不支持topology设置。(bp现状1的解决范围) 6 | 不支持guest numa设置。(yj邮件中询问) 7 | 8 | ### BP现状 9 | + [vm cpu topology] 10 | BP状态为new(尚未成为approved),作者已经提交代码并开始review。 11 | 实现方法:通过image的metadata设置“hw_cpu_topology”,比如: 12 | ``` 13 | "max_sockets=1" 14 | "max_cores=4,max_threads=2" 15 | ``` 16 | 只是设置sockets,threads,cores等信息。不包括node信息设置。 17 | 18 | [vm cpu topology]:https://blueprints.launchpad.net/nova/+spec/support-libvirt-vcpu-topology 19 | 项目wiki: https://wiki.openstack.org/wiki/VirtDriverGuestCPUTopology 20 | + [numa-aware-cpu-binding] 21 | BP尚未开始review。 22 | [numa-aware-cpu-binding]:https://blueprints.launchpad.net/nova/+spec/numa-aware-cpu-binding 23 | 24 | ### 其他 25 | + AutoNuma 26 | google code上的一个项目:[vm-balancer-numa] 27 | 主要完成cpu numa均衡放置以及重新均衡。 28 | [vm-balancer-numa]:https://code.google.com/p/vm-balancer-numa/downloads/list 29 | + opennebula的[numa aware vm blance]实现 30 | [numa aware vm blance]:http://opennebula.org/optimizing-large-numa-hypervisors-with-group-scheduling-part-1/ 31 | -------------------------------------------------------------------------------- /一个qemu错误的解决办法.md: -------------------------------------------------------------------------------- 1 | .. 2 | 声明: 3 | 本博客欢迎转发,但请保留原作者信息! 4 | 博客地址:http://blog.csdn.net/halcyonbaby 5 | 新浪微博:寻觅神迹 6 | 7 | 内容系本人学习、研究和总结,如有雷同,实属荣幸! 8 | 9 | ==================================== 10 | 最近使用libvirt/qemu创建虚拟机,qemu一直报这样的一个错误: 11 |

12 | [root@localhost centos65]# virsh create centos.xml
13 | error: Failed to create domain from centos.xml
14 | error: internal error: process exited while connecting to monitor: 2015-11-04T12:21:06.161304Z qemu-system-x86_64: -drive file=/home/temp/vms/centos65/centos.qcow2,if=none,id=drive-virtio-disk0,format=qcow2: could not open disk image /home/temp/vms/centos65/centos.qcow2: Could not open '/home/temp/vms/centos65/centos.qcow2': Permission denied
15 | 
16 | 百思不得其解,于是google之;答案不多,一般说是这种修改办法: 17 | 修改/etc/libvirt/qemu.conf中 18 |

19 | user="root"
20 | group="root"
21 | 
22 | 然后重启libvirt。 23 | 24 | 但是怎么尝试,仍然无法解决问题,依旧报上边相同的错误。 25 | 后来仔细排查,发现原因在与虚拟机的qcow2文件所放目录为/home/temp/vms/cento65下,由于temp这层目录的owner是temp:temp, 26 | 导致了qemu启动时访问qcow2文件失败。 27 | 28 | 试着将qcow2文件放在/home/vms/centos65下,整个目录树owner都是root。 29 | 创建虚拟机,成功! 30 | -------------------------------------------------------------------------------- /qemu/qemu_rfc_201403.md: -------------------------------------------------------------------------------- 1 | Qemu 2 | ----- 3 | #### [RFC]VM live snapshot proposal 4 | + UVP的live snapshot方案。 5 | 大致过程: 6 | 1. pause虚拟机 7 | 2. save device state到临时文件 8 | 3. 做卷快照 9 | 4. 打开dirty log和old dirty page开关[*] 10 | 5. resume虚拟机 11 | 6. 第一轮迭代拷贝memory到快照文件 12 | 7. 第二轮迭代拷贝old dirty page到快照文件 13 | 8. 合并device state的临时文件到快照文件 14 | 9. 结束内存快照 15 | [*]:需要实现截获ram的写指令,并保存在dirty log中。 16 | 17 | + 社区建议方案: 18 | a. 利用kernel的memory截获API进行实现(内核工作还在进行中) 19 | b. 利用postcopy migrate技术实现。 20 | 21 | https://www.mail-archive.com/kvm@vger.kernel.org/msg100029.html 22 | #### enable point-in-time snapshot exporting over NBD 23 | 支持PIT快照通过NBD暴露以及解除。 24 | 25 | http://lists.gnu.org/archive/html/qemu-devel/2014-03/msg01345.html 26 | 27 | #### block/json: Add JSON protocol driver 28 | 用途通过文件名指定块设备的option。 29 | http://lists.gnu.org/archive/html/qemu-devel/2014-03/msg00192.html 30 | 31 | #### [RFC 0/8] bus-less device hotplug 32 | 试验性的。实现bus-less的设备热插 33 | http://lists.gnu.org/archive/html/qemu-devel/2014-03/msg04177.html 34 | 35 | 36 | 其他 37 | ----- 38 | Cache qos monitoring 39 | https://lwn.net/Articles/579079/ 40 | -------------------------------------------------------------------------------- /qemu/GPU虚拟化.md: -------------------------------------------------------------------------------- 1 | ### GPU虚拟化的意义 2 | 满足以下场景: 3 | 游戏、视频编辑、渲染、计算机辅助设计等方面对GPU的需要。 4 | 5 | ### 当前GPU虚拟化的技术 6 | ![GPUVirtual](https://01.org/sites/default/files/xengt2.png) 7 | + 软件模拟 8 | 比如qemu中现在模拟了vga显卡等。提供简单的显示功能。(少量寄存器、很小的显存) 9 | + API转发 10 | 将openGL或者DirectX的API转发给host上的Graphics Driver上。 11 | 优点:性能佳、可以共享。 12 | 缺点:功能滞后。 13 | + 直通设备 14 | 利用VT-d将显卡直通给虚拟机。 15 | 优点:性能佳、功能完备。 16 | 缺点:不能共享。 17 | + 完全GPU虚拟化 18 | 优点:性能佳、功能完备、可以共享 19 | 备注:虽然SR-IOV标准允许一个GPU给多个虚拟机共享使用。由于硬件的复杂性,目前但是没有GPU厂商支持。 20 | 21 | Intel的mediated pass-through相当于软件实现的SR-IOV。将GPU直通给多个虚拟机。 22 | 23 | ### XenGT 24 | 在Xen中实现了mediated pass-through。架构图如下: 25 | ![GPUVirtual3](https://01.org/sites/default/files/xengt3.png) 26 | 27 | 28 | 参考: 29 | 1. xenGT文档 30 | https://01.org/zh/xen/blogs/srclarkx/2013/graphics-virtualization-xengt?langredirect=1 31 | http://lists.xenproject.org/archives/html/xen-devel/2013-09/pdf4ObWP0JtcP.pdf 32 | https://intel.lanyonevents.com/sz14/connect/fileDownload/session/7BFF04208A5CA171919FFCA4AFF8A8C7/SZ14_SFTS008_100_CHIf.pdf 33 | 2. KVMGT文档 34 | http://www.linux-kvm.org/wiki/images/f/f3/01x08b-KVMGT-a.pdf 35 | -------------------------------------------------------------------------------- /Kolla项目介绍.md: -------------------------------------------------------------------------------- 1 | # kolla项目 2 | kolla项目是TripleO项目的一部分,聚焦于使用docker容器部署openstack服务。 3 | 项目于2014年9月开始,目前发布了两个release。参与贡献者有约14人。是openstack的孵化项目。 4 | 5 | 在裸金属上部署openstack不是killo项目当前的目标。因此一个用于部署kolla cluseter的环境是必须的。 6 | 当前,使用heat模板在已经存在的openstack cloud上部署一个Kolla cluster。 7 | 8 | 当前Kolla项目在[Kollaglue repo]提供了以下服务的docker镜像。 9 |
$ sudo docker search kollaglue
10 | 11 | ### 代码目录结构 12 | + docker 13 | 创建docker image 14 | + k8s 15 | 创建kubenetes的pods和service配置文件 16 | + tools 17 | 与Kolla交互的各种工具 18 | + devenv 19 | 管理Kolla开发环境的一些工具。 20 | 21 | ### 当前的问题 22 | 当前升级和降级openstack主要有两种方式,基于image与基于package。 23 | 基于image的方式,更新是原子的。 24 | 基于package的更新方式通常不是原子的,升级过程中存在很多导致失败的原因,可能存在部分package更新失败的可能。 25 | 26 | ### 使用场景 27 | 1. 原子性的升级或者回退openstack部署。 28 | 2. 基于组件升级openstack。 29 | 3. 基于组件回退openstack。 30 | 31 | ### 安全与其他 32 | 某些容器可能需要privileged,某些可能需要host相同的namespace。 33 | 安全加强可以使用Selinux或者AppArmor。 34 | 35 | 36 | 37 | [Kollaglue repo]: https://registry.hub.docker.com/repos/kollaglue/ 38 | ### 参考 39 | 1. https://github.com/stackforge/kolla/blob/master/specs/containerize-openstack.rst 40 | 2. https://github.com/stackforge/kolla 41 | 3. https://github.com/sdake/compute-upgrade 42 | -------------------------------------------------------------------------------- /openstack/spec_template.spec: -------------------------------------------------------------------------------- 1 | Name: ConInit 2 | Version: 0.1 3 | Release: 1%{?dist} 4 | Source0: %{name}-%{version}.tar 5 | Summary: litevirt controller initialize tools 6 | Group: Development/Tools 7 | License: LGPLv2+ 8 | URL: https://github.com/litevirt 9 | Buildarch: noarch 10 | 11 | %description 12 | This tool allows user to initlize the openstack controller. 13 | 14 | %prep 15 | %setup -q 16 | 17 | %install 18 | rm -rf $RPM_BUILD_ROOT 19 | mkdir -p $RPM_BUILD_ROOT/etc/template 20 | mkdir -p $RPM_BUILD_ROOT/etc/template/db 21 | cp db/*.sql $RPM_BUILD_ROOT/etc/template/db/ 22 | cp "export.sh" $RPM_BUILD_ROOT/etc/template/ 23 | cp "import.sh" $RPM_BUILD_ROOT/etc/template/ 24 | 25 | %files 26 | %attr(0644,root,root) /etc/template/db/cinder.sql 27 | %attr(0644,root,root) /etc/template/db/glance.sql 28 | %attr(0644,root,root) /etc/template/db/heat.sql 29 | %attr(0644,root,root) /etc/template/db/keystone.sql 30 | %attr(0644,root,root) /etc/template/db/mysql.sql 31 | %attr(0644,root,root) /etc/template/db/neutron.sql 32 | %attr(0644,root,root) /etc/template/db/nova.sql 33 | %attr(0644,root,root) /etc/template/export.sh 34 | %attr(0644,root,root) /etc/template/import.sh 35 | 36 | %changelog 37 | * Thu May 22 2014 bohai - 0.1 38 | - Update to upstream 0.1 release 39 | -------------------------------------------------------------------------------- /coreosVsatomic.md: -------------------------------------------------------------------------------- 1 | 摘自https://major.io/2014/05/13/coreos-vs-project-atomic-a-review/。 2 | 3 | 【部署】 4 | coreOS: 5 | 通过云上的镜像或者PXE部署。在云上可以使用cloud-config进行配置。 6 | 提供了etcd这个key-value系统,提供类似于zookeeper的能力。而且可以用于放置node信息。 7 | 提供fleet进行docker容器生命周期的管理。 8 | container的自动迁移和loadbalance。 9 | 10 | atomic: 11 | atomic开始较晚,目前只提供了qemu/virtualbox的虚拟机镜像试用。 12 | 提供了geard工具部署容器。geard允许将多个容器关联起来为一个整体。并且可以跨多个host。 13 | 14 | 15 | 【管理】 16 | coreOS: 17 | 提供了A/B系统用于更新。 18 | 没有提供python/perl/compiler,但是提供了一个“toolbox”的fedora容器。可以通过systemd-nspawn使用。 19 | 没有GUI。 20 | 提供了叫fleet的管理系统,进行docker容器的管理。 21 | 22 | Atomic: 23 | 使用rpm-ostree(不使用yum)管理软件包。rpm-ostree类似于二进制版的git,可以提供软件的多个版本,并进行回退。 24 | 提供了叫cockpit的GUI组件用于管理docker容器。 25 | Atomic的基础OS为fedora,并且可以自己构建。从fedora21开始,每个版本都会有一个fedora atomic发布。 26 | 27 | 【安全】 28 | coreOS: 29 | 通过ssh key认证。 30 | 没有LDAP, Kerberos之类的认证。 31 | 没有Selinux,AppArmor和审计支持。 32 | 33 | Atomic: 34 | 有selinux和svirt进行保护。 35 | 但是Cockpit目前还无法与selinux良好协作。 36 | 37 | OStree参考: 38 | http://www.slideshare.net/i_yudai/ostree-osgit 39 | 40 | etcd: 41 | 是一个高可用的键值存储系统,主要用于共享配置和服务发现。etcd是由CoreOS开发并维护的,灵感来自于 ZooKeeper 和 Doozer, 42 | 它使用Go语言编写,并通过Raft一致性算法处理日志复制以保证强一致性。Raft是一个来自Stanford的新的一致性算法,适用于分布 43 | 式系统的日志复制,Raft通过选举的方式来实现一致性,在Raft中,任何一个节点都可能成为Leader。Google的容器集群管理系统 44 | Kubernetes、开源PaaS平台Cloud Foundry和CoreOS的Fleet都广泛使用了etcd。 45 | 46 | geard: 47 | 将多个容器关联起来作为一个整体管理。使用json描述。 48 | 49 | 50 | 51 | 52 | -------------------------------------------------------------------------------- /other/mongodb.md: -------------------------------------------------------------------------------- 1 | 调查mongodb /Haproxy/RabbitMQ/apache/memcached商业支持情况如下。 2 | 3 | 【mongodb 】 4 | https://www.mongodb.com/pa/products/mongodb-enterprise 5 | mongodb 提供了企业版,并且企业版提供有24*7的技术支持服务。 6 | 提供包括问题咨询,性能优化等方面的支持。 7 | 8 | 联系方式如下: 9 | 电话:Call +1.866.237.8815 10 | https://www.mongodb.com/office-locations 11 | 邮件:https://www.mongodb.com/contact-sales 12 | 13 | 技术支持情况: 14 | 国内有销售,隶属于新加坡亚太总部。 15 | 国内有两个架构师提供技术支持。 16 | 其他支持手段有电话(需要提供服务号),提供24*7的技术支持。并且有中文服务。 17 | 可以远程接入解决问题,并且会安排专门的负责人。 18 | 19 | 20 | 【HAProxy】 21 | https://www.haproxy.com/products/haproxy-enterprise-edition/ 22 | http://www.rabbitmq.com/services.html 23 | HAProxy提供了企业版,提供了多种技术支持服务。 24 | 25 | 联系方式如下: 26 | Phone : +1-857-366-5050 | contact@haproxy.com 27 | 28 | 29 | 【RabbitMQ】 30 | http://www.rabbitmq.com/services.html 31 | Pivotal公司对RabbitMQ提供了完整的商业支持。 32 | 33 | 联系方式如下: 34 | 邮件:support@rabbitmq.com 35 | 邮件列表:https://groups.google.com/forum/#!forum/rabbitmq-users 36 | IRC: irc://irc.freenode.net/rabbitmq . 37 | 38 | ticket方式: 39 | customer-service@gopivotal.com. follow-up 866-998-3365 40 | 41 | 【apache】 42 | http://httpd.apache.org/support.html 43 | apache目前没有提供商业support服务。 44 | 社区方式可以通过IRC( #httpd channel on the irc.freenode.net )、或者邮件列表咨询。 45 | 官方wiki提到有很多第三方公司提供技术支持服务。 46 | google搜索,如:http://olex.openlogic.com/support/apache-support 47 | 48 | 【memcached】 49 | memcached没有提供任务support服务。 50 | 社区方式主要有邮件列表(https://groups.google.com/forum/#!forum/memcached)。 51 | IRC频道:#memcached on freenode. 52 | -------------------------------------------------------------------------------- /git-review-error: -------------------------------------------------------------------------------- 1 | [root@centos nova]# git-review -d 115602 2 | Traceback (most recent call last): 3 | File "/usr/bin/git-review", line 10, in 4 | sys.exit(main()) 5 | File "/usr/lib/python2.6/site-packages/git_review/cmd.py", line 1160, in main 6 | local_branch = fetch_review(options.changeidentifier, branch, remote) 7 | File "/usr/lib/python2.6/site-packages/git_review/cmd.py", line 866, in fetch_review 8 | parse_exc=ReviewInformationNotFound) 9 | File "/usr/lib/python2.6/site-packages/git_review/cmd.py", line 416, in query_reviews 10 | parse_exc=parse_exc) 11 | File "/usr/lib/python2.6/site-packages/git_review/cmd.py", line 484, in query_reviews_over_ssh 12 | "--format=JSON %s" % query) 13 | File "/usr/lib/python2.6/site-packages/git_review/cmd.py", line 152, in run_command_exc 14 | raise klazz(rc, output, argv, env) 15 | git_review.cmd.CannotQueryPatchSet: Cannot query patchset information 16 | The following command failed with exit code 255 17 | "ssh -xp29418 boh.ricky@review.openstack.org gerrit query --format=JSON --current-patch-set change:115602" 18 | ----------------------- 19 | ssh: connect to host review.openstack.org port 29418: Network is unreachable 20 | ----------------------- 21 | [root@centos nova]# git review 22 | Problem running 'git remote update gerrit' 23 | Fetching gerrit 24 | ssh: connect to host review.openstack.org port 29418: Network is unreachable 25 | fatal: The remote end hung up unexpectedly 26 | error: Could not fetch gerrit 27 | -------------------------------------------------------------------------------- /QF_hugepage.md: -------------------------------------------------------------------------------- 1 | Huge Page 2 | ---- 3 | 适合大内存/内存密集型型应用虚拟机的调优。 4 | 减小也表尺寸,降低查找缓存(TLB)的cache-miss,加速VM内存转换。 5 | 默认Page size 4K / Huge Page 2M 6 | ### libvirt 7 | xml设置方法:(告诉hypervisor虚拟机内存使用hugepage分配) 8 | ```xml 9 | 10 | 11 | 12 | ``` 13 | 14 | ### [qemu设置方法] 15 | ```xml 16 | -mem-prealloc -mem-path /dev/hugepages/libvirt/qemu 17 | ``` 18 | 19 | ### 内核参数 20 | 通过内核参数***/proc/sys/vm/nr_hugepages***修改。 21 | 22 | Transparent Huge Page 23 | ---- 24 | 内核线程khugepaged周期性自动扫描内存,自动将地址连续可以合并的4KB的普通Page并成2MB的Huge Page。 25 | 26 | ### Redhat系统 27 | 通过内核参数***/sys/kernel/mm/redhat_transparent_hugepage/enabled***打开. 28 | ### 其他Linux系统 29 | 通过内核参数***/sys/kernel/mm/transparent_hugepage/enabled***打开. 30 | 31 | 32 | ### 确认方法 33 | ```shell 34 | [root@localhost transparent_hugepage]# grep AnonHugePages /proc/meminfo 35 | AnonHugePages: 405504 kB 36 | [root@localhost transparent_hugepage]# virsh list 37 | Id Name State 38 | ---------------------------------------------------- 39 | 2 numa running 40 | 41 | [root@localhost transparent_hugepage]# virsh destroy 2 42 | Domain 2 destroyed 43 | 44 | [root@localhost transparent_hugepage]# grep AnonHugePages /proc/meminfo 45 | AnonHugePages: 0 kB 46 | ``` 47 | [qemu设置方法]:http://pic.dhe.ibm.com/infocenter/lnxinfo/v3r0m0/index.jsp?topic=%2Fliaat%2Fliaattunconfighp.htm 48 | 49 | Openstack现状 50 | ----- 51 | BP已经有人提出,目前在实现中。通过metadata实现。 52 | https://blueprints.launchpad.net/nova/+spec/enable-libvirt-to-use-hugepages 53 | -------------------------------------------------------------------------------- /.vimrc: -------------------------------------------------------------------------------- 1 | set nocompatible " be iMproved, required 2 | filetype off " required 3 | 4 | "set the runtime path to include Vundle and initialize 5 | set rtp+=~/.vim/bundle/vundle/ 6 | call vundle#rc() 7 | 8 | " let Vundle manage Vundle, required 9 | Bundle 'gmarik/vundle' 10 | Bundle 'The-NERD-tree' 11 | Bundle 'Syntastic' 12 | 13 | "My plugins 14 | Bundle 'taglist.vim' 15 | Bundle 'https://github.com/Lokaltog/vim-powerline.git' 16 | Bundle 'https://github.com/Valloric/YouCompleteMe.git' 17 | Bundle 'Yggdroot/indentLine' 18 | 19 | filetype plugin indent on " required 20 | 21 | "YCM plugind 22 | let g:ycm_global_ycm_extra_conf = '~/.vim/.ycm_extra_conf.py' 23 | nnoremap gg :YcmCompleter GoToDefinitionElseDeclaration 24 | 25 | "Taglist plugin 26 | let Tlist_Show_Menu = 1 27 | let Tlist_Show_One_File = 1 28 | let Tlist_Exit_OnlyWindow = 1 29 | let Tlist_Use_Right_Window = 1 30 | let Tlist_Auto_Open=1 31 | 32 | "vim-powerline plugin 33 | set laststatus=2 34 | set t_Co=256 35 | "set g:Powerline_symbols='compatible' "only for gui mode 36 | set encoding=utf8 37 | 38 | "color 39 | color desert 40 | 41 | "cscope 42 | nmap s :cs find s =expand("") 43 | nmap g :cs find g =expand("") 44 | nmap c :cs find c =expand("") 45 | nmap t :cs find t =expand("") 46 | nmap e :cs find e =expand("") 47 | nmap f :cs find f =expand("") 48 | nmap i :cs find i =expand("") 49 | nmap d :cs find d =expand("") 50 | 51 | "auto indent 52 | set ts=4 53 | set expandtab 54 | set autoindent 55 | -------------------------------------------------------------------------------- /ovirt_node.md: -------------------------------------------------------------------------------- 1 | ### ovirt-node简介与定制方法 2 | 1. ovirt-node简介 3 | 1.1 ovirt-node在RHEV中的地位 4 | ovirt-node是Redhat ovirt项目中的一个子项目。ovirt项目的商业版本就是RHEV。ovirt-node目标是提供一个精简的面向裸金属安装的 5 | hypervisor。ovirt-node基于fedora定制,也支持基于centos/rhel定制。 6 | ovirt-node在RHEV中的位置类似于ESXi在VMWARE虚拟化方案中的位置。 7 | ![ovirt_arch][1] 8 | ovirt-node在整个ovirt中作为运行Guest的Host OS使用。ovirt-node本身包含了host安装配置升级的UI界面。 9 | ovirt-node中可以集成VDSM作为ovirt-engine在ovirt-node上的代理。 10 | ![ovirt_node_arch][2] 11 | 2. ovirt-node定制 12 | 3.1 ovirt-node的ISO出包方式 13 | ovirt-node的出包方式很简单: 14 |

15 | a. git clone https://github.com/litevirt/ovirt-node.git       
16 | b. cd ovirt-node      
17 | c. sh autobuild.sh     
18 | 
19 | 3.2 ovirt-node的定制方式 20 | ovirt-node使用livecd-tools进行ISO定制。定制脚本在recipe目录下。 21 | 由于ovirt-node支持多个fedora/centos/rhel版本,因此目录下很多如“ ovirt17*, centos*, rhevh* "相关的ks脚本。 22 | ovirt-node-image.ks.in是入口脚本,将相关的install, pkg, minimizer,post脚本串起来。 23 |

24 | # @DISTRO@ Node image recipe
25 | %include common-install.ks
26 | %include @DISTRO@-install.ks
27 | %include repos.ks
28 | %packages --excludedocs --nobase
29 | %include common-pkgs.ks
30 | %include @DISTRO@-pkgs.ks
31 | %end
32 | %post
33 | %include common-post.ks
34 | %include @DISTRO@-post.ks
35 | %end
36 | %post --nochroot
37 | %include common-nochroot.ks
38 | %end
39 | @IMAGE_MINIMIZER@
40 | @MANIFESTS_INCLUDED@
41 | 
42 | 43 | 参考: 44 | http://www.ovirt.org/images/2/2f/Ovirt-node.pdf 45 | http://www.ibm.com/developerworks/cn/linux/l-cn-ovirt/ 46 | http://www.ibm.com/developerworks/cn/linux/1306_qiaoly_ovirtnode/index.html 47 | 48 | [1]: http://img.ddvip.com/2012/0925/201209250321423983.jpg 49 | [2]: http://www.dedecms.com/uploads/allimg/c121015/13502F1GF10-602632.jpg 50 | -------------------------------------------------------------------------------- /OSF_instance_action.md: -------------------------------------------------------------------------------- 1 | + pause/unpause 2 | 将虚拟机状态保存在内存中,虚拟机仍在运行,但实际上处于冻结状态。 3 | 实际上底层调用的libvirt的suspend接口。 4 | 5 | 6 | + suspend/resume 7 | 将虚拟机状态/内存信息保存到磁盘。虚拟机处于stop状态。 8 | 内存和CPU资源会被释放出来。 9 | 一般用于维护以及不太常用的虚拟机。 10 | 实际上底层调用的libvirt的managedSave接口。 11 | 在这之前会卸载虚拟机的所有pci设备。 12 | 13 | 14 | + lock/unlock 15 | 设置虚拟机的lock状态,通过修改数据库中字段实现。 16 | lock状态的虚拟机几乎不可以做任何操作。 17 | 通过装饰器@check_instance_lock对方法入口检查。 18 | 19 | 20 | + migrate/resize 21 | migrate和resize本质上都是在做冷迁移。 22 | 差别在于resize会指定新的flavor,migrate只是迁移位置。 23 | 位置依靠scheduler自动选择,目前不能手工指定。 24 | 只支持对active和stop状态的虚拟机操作。 25 | + migrate 26 | 27 | + resize/confirmResize/revertResize 28 | resize会保留原虚拟机一定时间(一般24小时),可以进行回滚操作。或者confirm操作, 29 | confirm操作会删除原虚拟机。 30 | resize底层使用了快照能力。 31 | 32 | + rebuild/evacuate 33 | 两者底层实际上是一个处理函数(self.compute_rpcapi.rebuild_instance)。 34 | + rebuild 35 | rebuild操作可以近似理解为重装系统。 36 | 37 | 内部处理大致为:Shutdown, Re-Image, and then Reboot 。 38 | serverRef和IP地址保持不变。但是虚拟机中的所有注入信息和软件、配置会丢失。 39 | rebuild可以重新指定image, IP, 注入信息, 密码等内容。 40 | rebuild仅支持active和stopped、ERROR状态的虚拟机。 41 | 42 | + evacuate 43 | evacuate操作用于虚拟机所在host故障,在其他节点重新启动虚拟机。 44 | evacuate为上层进行HA提供基础能力。 45 | evacuate对非共享存储相当于重建,对共享存储才相当于通常意义上的HA。 46 | 47 | + backup/createImage 48 | 两者本质上都利用了snapshot能力。将虚拟机进行snapshot然后,传送glance上进行管理。 49 | + bakcup 50 | bakcup只支持active和stopped状态虚拟机进行操作。 51 | 该接口为上层周期性备份虚拟机提供了原子能力。 52 | 其中backup-type指定了备份类型,rotation提供了指定备份数的能力。 53 | 对backup-type相同的备份,最多保留rotation个备份。会替换最旧的备份。 54 | + createImage 55 | 可以对active,stopped,pause,suspend状态的虚拟机进行操作。 56 | 底层实际上也是利用snapshot的能力。 57 | 58 | + diagnostic 59 | 提供对虚拟机的磁盘读写,网络读写,cpu,内存使用等信息,用于进行故障诊断等目的。 60 | 61 | 62 | 63 | -------------------------------------------------------------------------------- /summit.md: -------------------------------------------------------------------------------- 1 | 为什么讲? 2 | 1. Openstack主要面向云场景,传统虚拟化场景不可能一蹴而就。因此两者的共存是一个长期的过程。 3 | 用户希望采用openstack,有希望能够满足传统业务的需要,并且希望有统一的接口。 4 | 2. 华为在实际业务中碰到的需求,以及在这方面的探索和积累。(当然我们更希望我们以类似与VCenter driver的方式在openstack中体现) 5 | 这样的渴望同时在IBM等其他虚拟化/云方案提供商也有类似的渴求。 6 | 7 | 讲什么内容? 8 | 将我们将FusionCompute连接到Openstack上所采取的探索和努力。以及我们的演进/思考。 9 | 10 | 我们在这个议题上有什么优势? 11 | 我们作为全球顶级的ICT解决方案提供商,我们对电信业务场景的以及我们在电信业的影响和优势。 12 | 将FusionCompute融入Openstack对Openstack在电信也中的推广使用也有很大的帮助。 13 | 而且我们有现实的业务需求和客户需求。 14 | 15 | 我们分享这个议题的目的? 16 | 1. 分享我们在参与openstack的一些实践经验 17 | 2. 推动我们FusionCompute作为driver进入openstack 18 | 3. 获取也业界同行的共鸣和合作,一起推动Openstack在这方面的open和框架规划 19 | 20 | 历史上是否有类似的议题?我们能提供哪些不一样的地方? 21 | 查阅了过去两届的议题,未见有类似的议题。 22 | 23 | --------------------- 24 | 25 | 26 | 申请地址:https://www.openstack.org/summit/openstack-paris-summit-2014/call-for-speakers/ 27 | 步骤: 28 | 1.Proposed Presentation Title 29 | 2.选择最合适的track 30 | 3.选择内容难度 31 | 4.内容摘要 32 | 33 | Products, Tools & Services 34 | 35 | OpenStack's vibrant ecosystem and the different ways to consume it are among it's greatest strengths. In this track, you'll hear about the latest products, tools and services from the OpenStack ecosystem. 36 | 37 | Practices of reliability & availability for Openstack in Telecom scenario 38 | 39 | Share the practices experience in improving reliability & availability for Openstack in telecom scenario. 40 | 41 | Many organizations choose OpenStack for it’s distributed architecture and ability to deliver Infrastructure-as-a-Service environment for scale-out applications to run on top of it, for private on premise clouds or public clouds. It is quite common for OpenStack to run mission critical applications. How to provide the cloud solution with enterprise Level reliability & availability based on Openstack? Here we share the experience based on the practices of Huawei in telecom scenario. 42 | -------------------------------------------------------------------------------- /QF_rdm.md: -------------------------------------------------------------------------------- 1 | ### RDM(raw device mapping) 2 | ----- 3 | 使用的virtio-scsi。目前主推的方式。在可扩展性,灵活性,可伸缩性上好于virtio-blk。 4 | 适用于IO密集型应用的场景。 5 | #####libvirt xml 6 | 第一种为推荐方式,可以实现LUN隔离。 7 | ```xml 8 | 9 | 10 | 11 | 12 |
13 | 14 | 15 | 21 | 22 | 23 | ``` 24 | ##### qemu命令 25 | + disk方式的RDM 26 | ```xml 27 | -drive file=/dev/sdb,if=none,id=drive-scsi0-0-0-1,format=raw,cache=none 28 | -device scsi-hd,bus=scsi0.0,channel=0,scsi-id=0,lun=1,drive=drive-scsi0-0-0-1,id=scsi0-0-0-1 29 | -device virtio-scsi-pci,id=scsi0,bus=pci.0,addr=0x4 30 | ``` 31 | + lun方式的RDM 32 | 33 | ###virtio-blk 34 | ----- 35 | 这个同RDM比较容易混淆,这个是用的virtio-blk。(不推荐使用) 36 | #####libvirt xml 37 | ```xml 38 | 39 | 40 | 41 | 42 |
43 | 44 | ``` 45 | #####qemu命令 46 | ```xml 47 | -drive file=/dev/sdb,if=none,id=drive-virtio-disk1,format=raw,cache=none 48 | -device virtio-blk-pci,scsi=off,bus=pci.0,addr=0x6,drive=drive-virtio-disk1,id=virtio-disk1 49 | ``` 50 | 51 | ###参考: 52 | http://www.ovirt.org/Features/Virtio-SCSI 53 | -------------------------------------------------------------------------------- /qemu/qemu_rfc_201402.md: -------------------------------------------------------------------------------- 1 | + qemu-img支持预占空间,通过参数“preallocation=full” 2 | http://lists.gnu.org/archive/html/qemu-devel/2014-02/msg01754.html 3 | 4 | + SSD deduplication(开发中) 5 | 在qcow2中提供block level的去重 6 | 7 | + Quorum block driver(社区review中) 8 | 提供类似raid的机制保护虚拟机。会写三份以上数据。读数据时会进行投票,判断是否最新版本的数据。 9 | 10 | + Basis of the block filter infrastructure 11 | 提供类似于kernel device mapper的机制。使用例子如:luks加密 block driver。 12 | 13 | + Block [throttling] infrastructure 14 | 提供对用户进行IO管理的能力。支持 bursting。 15 | 例子(burst为10000iops): 16 | 17 | >qemu -enable-kvm -drive file=debian.raw,iops=75,iops_max=10000,if=virtio,cache=none 18 | 19 | + [RFC] platform device passthrough 20 | Guest OS直接访问host设备得MMIO,DMA regions,以及接受host设备的中断。 21 | http://lists.gnu.org/archive/html/qemu-devel/2014-02/msg04666.html 22 | 23 | + 支持Intel MPX (Memory Protection Extensions) 24 | 支持Intel MPX特性(一种硬件辅助技术,目的在于加强指针使用安全性。 25 | http://lists.gnu.org/archive/html/qemu-devel/2014-02/msg04263.html 26 | 27 | + [RFC PATCH] block: optimize zero writes with bdrv_write_zer 28 | 自动使用bdrv_write_zeroes对快设备写0请求进行优化。 29 | http://lists.gnu.org/archive/html/qemu-devel/2014-02/msg04134.html 30 | 31 | + Add support for binding guest numa nodes 32 | http://lists.gnu.org/archive/html/qemu-devel/2014-02/msg03289.html 33 | 社区review中。 34 | 提供了guest memory绑定策略的设置能力。 35 | 避免某些情况下由此导致的性能下降。 36 | qemu配置方法范例: 37 | ```shell 38 | -object memory-ram,size=512M,host-nodes=1,policy=membind,id=ram-node0 39 | -numa node,nodeid=0,cpus=0,memdev=ram-node0 40 | -object memory-ram,size=1024M,host-nodes=2-3,policy=interleave,id=ram-node1 41 | -numa node,nodeid=1,cpus=1,memdev=ram-node1 42 | ``` 43 | 44 | + [RFC PATCH v2 00/12] mc: fault tolerante through micro-chec 45 | http://lists.gnu.org/archive/html/qemu-devel/2014-02/msg03042.html 46 | 基于微检查点的FT实现技术。(目前已经有原型实现,还在完善中) 47 | 48 | 49 | [throttling]:http://www.nodalink.com/blog_throttling_25_01_2014.html 50 | [qemu timer]:http://lists.gnu.org/archive/html/qemu-devel/2014-02/msg04177.html 51 | -------------------------------------------------------------------------------- /openstack/cells.md: -------------------------------------------------------------------------------- 1 | nova cells 2 | ---- 3 | cells为用户提供了一种以分布式风格Scacle Opensack的方式。用户不必使用复杂的数据库、消息总线cluster技术进行扩展。 4 | 两者相比,cells更像是scale-out, 后者更像是scacle-up。cells目标是支持非常大的规模。 5 | ***nova cells 目前仍是实验性质的***。 6 | ### 配置过程 7 | 详细配置过程请参考[配置文档]: 8 | + 修改nova.conf配置top-cell 9 | ``` 10 | [DEFAULT] 11 | compute_api_class=nova.compute.cells_api.ComputeCellsAPI 12 | ... 13 | [cells] 14 | enable=True 15 | name=api 16 | ``` 17 | + 修改nova.conf配置child-cell 18 | ``` 19 | [DEFAULT] 20 | # Disable quota checking in child cells. Let API cell do it exclusively. 21 | quota_driver=nova.quota.NoopQuotaDriver 22 | [cells] 23 | enable=True 24 | name=cell1 25 | ``` 26 | + 配置数据库 27 | ``` 28 | in the API cell: 29 | # nova-manage cell create --name=cell1 --cell_type=child --username=cell1_user 30 | --password=cell1_passwd --hostname=10.0.1.10 --port=5673 --virtual_host= 31 | cell1_vhost --woffset=1.0 --wscale=1.0 32 | in the child cell: 33 | # nova-manage cell create --name=api --cell_type=parent --username=api1_user 34 | --password=api1_passwd --hostname=10.0.0.10 --port=5672 --virtual_host= 35 | api_vhost --woffset=1.0 --wscale=1.0 36 | ``` 37 | + 配置scheduler 38 | ### 代码结构 39 | 40 | ### 消息流 41 | a. 如何进入cell的消息流程 42 | 从如上compute_api_class配置可以看出消息进入了nova.compute.cells_api.ComputeCellsAPI(继承nova.compute.api.API)。 43 | 非cell配置情况下,API消息会调用nova.compute.api.API。 44 | ComputeCellsAPI处理例子: 45 | ```python 46 | @check_instance_cell 47 | def unrescue(self, context, instance): 48 | """Unrescue the given instance.""" 49 | super(ComputeCellsAPI, self).unrescue(context, instance) 50 | self._cast_to_cells(context, instance, 'unrescue') 51 | ``` 52 | 备注:从代码看目前非cell部署中很多操作在cell中实际上是不支持或者有问题的。(可能理解不正确,待实际确认) 53 | b. cell内消息路由过程 54 | cells_api(1)->cell's rpcapi(2)->cell's manager(3)->next hop(4)->compute_api(5) 55 | (3): 判断消息是否该在本cell处理并处理,否则寻找下一跳的cell处理。 56 | (4): 重复2,3的步骤。 57 | (5): 最终完成消息的处理。 58 | ### 参考 59 | [配置文档]:http://docs.openstack.org/havana/config-reference/content/ 60 | 61 | 62 | 63 | 64 | 65 | -------------------------------------------------------------------------------- /.vimrc2: -------------------------------------------------------------------------------- 1 | set nocompatible " be iMproved, required 2 | filetype off " required 3 | 4 | "set the runtime path to include Vundle and initialize 5 | set rtp+=~/.vim/bundle/vundle/ 6 | call vundle#rc() 7 | 8 | "" let Vundle manage Vundle, required 9 | Bundle 'gmarik/vundle' 10 | "Bundle 'The-NERD-tree' 11 | Bundle 'Syntastic' 12 | 13 | "My plugins 14 | Bundle 'taglist.vim' 15 | Bundle 'https://github.com/Lokaltog/vim-powerline.git' 16 | "Bundle 'https://github.com/Valloric/YouCompleteMe.git' 17 | Bundle 'Yggdroot/indentLine' 18 | Bundle 'https://github.com/hallettj/jslint.vim' 19 | Bundle 'https://github.com/vim-scripts/The-NERD-tree.git' 20 | 21 | filetype plugin indent on " required 22 | 23 | ""YCM plugind 24 | let g:ycm_global_ycm_extra_conf = '~/.vim/.ycm_extra_conf.py' 25 | nnoremap gg :YcmCompleter GoToDefinitionElseDeclaration 26 | 27 | "Taglist plugin 28 | let Tlist_Show_Menu = 1 29 | let Tlist_Show_One_File = 1 30 | let Tlist_Exit_OnlyWindow = 1 31 | let Tlist_Use_Right_Window = 1 32 | let Tlist_Auto_Open=1 33 | 34 | ""vim-powerline plugin 35 | set laststatus=2 36 | set t_Co=256 37 | "set g:Powerline_symbols='compatible' "only for gui mode 38 | set encoding=utf8 39 | 40 | ""color 41 | color desert 42 | 43 | "cscope 44 | nmap s :cs find s =expand("") 45 | nmap g :cs find g =expand("") 46 | nmap c :cs find c =expand("") 47 | nmap t :cs find t =expand("") 48 | nmap e :cs find e =expand("") 49 | nmap f :cs find f =expand("") 50 | nmap i :cs find i =expand("") 51 | nmap d :cs find d =expand("") 52 | 53 | "tabs indent 54 | set tabstop=4 55 | set softtabstop=4 56 | set shiftwidth=4 57 | set cindent 58 | set expandtab 59 | set nu 60 | 61 | "disable jslint highlight 62 | let g:JSLintHighlightErrorLine = 0 63 | 64 | "color column 79chars 65 | set colorcolumn=79 66 | 67 | " NerdTree 68 | map :NERDTreeMirror 69 | map :NERDTreeToggle 70 | -------------------------------------------------------------------------------- /openstack/devstack_tricks.md: -------------------------------------------------------------------------------- 1 | 1. 安装运行create-stack-user.sh脚本时,当前目录不要是devstack 2 | 2. 安装时如果提示pbr版本不对 3 | 运行pip install --upgrade pbr, pip install --upgrade setuptools 4 | 3. 安装时提示下载超时,可以使用pip install --upgrade安装失败的包 5 | 4. 安装时提示提示mysql没权限 6 | 执行下列命令: 7 | service mysqld stop 8 | mysqld_safe --user=mysql --skip-grant-tables --skip-networking & 9 | mysql -u root mysql 10 | UPDATE user SET Password=PASSWORD() where USER='root'; 11 | FLUSH PRIVILEGES; 12 | quit 13 | service mysqld stop 14 | 5. devstack默认卷容量比较小(10G),安装时可以调整(stack用户下导入该环境变量) 15 | export VOLUME_BACKING_FILE_SIZE=102500M 16 | 6. 安装openstack需要访问pypi网站,超时失败的话 17 | 可以运行./unstack.sh, ./stack.sh解决 18 | 7. 系统重启后,需要运行rejoin.sh,运行前需要重新恢复卷组 19 | losetup -f /opt/stack/data/stack-volumes-backing-file 20 | 8. 安装完成后发现卷容量较小,可以使用如下方法调整 21 | devstack安装默认lvm后端容量为10G。 22 | 后续可以通过以下方式修改: 23 | 1. qemu-img create -f raw 100G 24 | 2. losetup -f 25 | 3. pvcreate 26 | 4. vgextend 27 | 注:vg_name可以通过vgdisplay显示。 28 | 9. 安装时pip显示”No module named pkg resources“错误 29 | $ wget http://python-distribute.org/distribute_setup.py 30 | $ python distribute_setup.py 31 | 详细参考http://stackoverflow.com/questions/7110360/easy-install-and-pip-doesnt-work 32 | 10. 启动虚拟机失败,错误“some rules could not be created for interface vnet0” 33 | 原因: 34 | 关闭防火墙后没有重新启动libvirtd 35 | 解决办法: 36 | 重新启动libvirtd 37 | 11. 控制节点意外掉电后重启,mysql启动失败,同时导致neutron-server无法启动 38 | rm -rf /var/lib/mysql/mysql.sock然后重启节点 39 | 12. 出现错误:failed to create /opt/stack/horizon/openstack_dashboard/local/ 40 | 解决:执行setenforce 0 41 | 13. 关闭devstack的所有screen 42 | 解决:screen -wipe 43 | 14. 查看mysql数据库 44 |

45 |    # mysql -u root -p
46 |    mysql> CREATE DATABASE nova;
47 |    mysql> GRANT ALL PRIVILEGES ON nova.* TO 'nova'@'localhost' \
48 |    IDENTIFIED BY 'NOVA_DBPASS';
49 |    mysql> GRANT ALL PRIVILEGES ON nova.* TO 'nova'@'%' \
50 |    IDENTIFIED BY 'NOVA_DBPASS';
51 | 
52 | 53 | 54 | 55 | -------------------------------------------------------------------------------- /QF_CPUQos.md: -------------------------------------------------------------------------------- 1 | CPU Qos 2 | ----- 3 | 本质上是通过cgroup实现的。因此需要按照cgroup。 4 | 5 | ### CGroup 6 | 1. yum install libcgroup 7 | 2. chkconfig cgconfig on 8 | 3. service cgconfig start 9 | CGroup作为内核默认功能,路径为/sys/fs/cgroup/。 10 | 使用libvirt创建虚拟机后,会产生如下目录: 11 | /sys/fs/cgroup/子系统名/libvirt/qemu/虚拟机domain名/ 12 | 13 | ### Libvirt 14 | 15 | ```xml 16 | 17 | ... 18 | 19 | 2048 20 | 1000000 21 | 1073741824 22 | 1000000 23 | -1 24 | 25 | ... 26 | 27 | ``` 28 | 参数 |说明 | 29 | ----------------|---------------------------| 30 | share|根据互相比值,确定虚拟机之间获取CPU的概率| 31 | period|vcpu强制间隔的时间周期,单位微妙,范围[1000, 1000000],每一个vcpu不能使用超过period时间周期。| 32 | quota|vcpu最大允许带宽,单位微妙,范围[1000, 18446744073709551]。-1表示没有设置值。| 33 | emulator_period|强制间隔的时间周期,单位微妙,范围[1000, 1000000],虚拟机进程(qemu)不能使用超过period时间周期。| 34 | emulator_quota|虚拟机进程(qemu)最大允许带宽,单位微妙,范围[1000, 18446744073709551]。-1表示没有设置值。| 35 | 36 | 查询Qos设置: 37 | 38 | ```shell 39 | # virsh schedinfo winxp 40 | Scheduler : posix 41 | cpu_shares : 2048 42 | vcpu_period : 1000000 43 | vcpu_quota : 1073741824 44 | emulator_period: 1000000 45 | emulator_quota : -1 46 | ``` 47 | 48 | 动态设置: 49 | ```shell 50 | virsh schedinfo --domain domain --set --weight weight --cap cap --current --config --live 51 | ``` 52 | >parameter允许的参数有:cpu_shares、vcpu_period、vcpu_quota、emulator_period、emulator_quota,其意义同上。 53 | --config 下次重启生效,即修改固化的配置数据。不支持使用virsh create创建的非持久化虚拟机。 54 | --live 在线生效,不修改固化的配置数据。如果虚拟机shutdown后数据失效。虚拟机非运行态时,不能设置--live参数。 55 | --current 根据当前虚拟机状态确定实际参数行为:如果虚拟机状态为运行态,则效果同--live;否则效果同--config。 56 | 当--current、--config、--live参数均缺省时,默认参数为--current。 57 | 配置了--current就不能再出现--config或--live参数。 58 | 例如: 59 | virsh schedinfo --set cpu_shares=1024 winxp 60 | 61 | ###参考 62 | 1. vdsm中的Qos 63 | 使用了IBM的MOM。 64 | http://www.linux-kvm.org/wiki/images/8/88/Kvm-forum-2013-oVirt-SLA.pdf 65 | MOM代码:https://github.com/aglitke/mom 66 | -------------------------------------------------------------------------------- /openstack/importdb.sh: -------------------------------------------------------------------------------- 1 | #!/usr/bin/env bash 2 | STACK_TEMPLATE="/etc/template/db" 3 | ROOT_PASSWORD="admin" 4 | HOST_OLD_IP="186.100.30.214" 5 | HOST_NEW_IP="186.100.30.215" 6 | 7 | service mysqld restart 8 | chkconfig mysqld on 9 | mysqladmin -u root password ${ROOT_PASSWORD} 10 | 11 | #create database 12 | mysql -uroot -p$ROOT_PASSWORD -h127.0.0.1 -e "CREATE DATABASE neutron;" 13 | mysql -uroot -p$ROOT_PASSWORD -h127.0.0.1 -e "CREATE DATABASE glance;" 14 | mysql -uroot -p$ROOT_PASSWORD -h127.0.0.1 -e "CREATE DATABASE heat;" 15 | mysql -uroot -p$ROOT_PASSWORD -h127.0.0.1 -e "CREATE DATABASE keystone;" 16 | mysql -uroot -p$ROOT_PASSWORD -h127.0.0.1 -e "CREATE DATABASE cinder;" 17 | mysql -uroot -p$ROOT_PASSWORD -h127.0.0.1 -e "CREATE DATABASE nova;" 18 | 19 | 20 | #import openstak database 21 | mysql -u root -p${ROOT_PASSWORD} mysql < ${STACK_TEMPLATE}/mysql.sql 22 | mysql -u root -p${ROOT_PASSWORD} cinder < ${STACK_TEMPLATE}/cinder.sql 23 | mysql -u root -p${ROOT_PASSWORD} glance < ${STACK_TEMPLATE}/glance.sql 24 | mysql -u root -p${ROOT_PASSWORD} heat < ${STACK_TEMPLATE}/heat.sql 25 | sed -i "s/${HOST_OLD_IP}/${HOST_NEW_IP}/g" ${STACK_TEMPLATE}/keystone.sql 26 | mysql -u root -p${ROOT_PASSWORD} keystone < ${STACK_TEMPLATE}/keystone.sql 27 | mysql -u root -p${ROOT_PASSWORD} neutron < ${STACK_TEMPLATE}/neutron.sql 28 | mysql -u root -p${ROOT_PASSWORD} nova < ${STACK_TEMPLATE}/nova.sql 29 | 30 | #remove_anonymous_users 31 | mysql -uroot -p$ROOT_PASSWORD -h127.0.0.1 -e "DELETE FROM mysql.user WHERE User='';" 32 | #remove_remote_root 33 | mysql -uroot -p$ROOT_PASSWORD -h127.0.0.1 -e "DELETE FROM mysql.user WHERE User='root' AND Host NOT IN ('localhost', '127.0.0.1', '::1');" 34 | #remove_test_database 35 | mysql -uroot -p$ROOT_PASSWORD -h127.0.0.1 -e "DROP DATABASE test;DELETE FROM mysql.db WHERE Db='test' OR Db='test\\_%';" 36 | #reload_privilege_tables 37 | mysql -uroot -p$ROOT_PASSWORD -h127.0.0.1 -e "FLUSH PRIVILEGES;" 38 | 39 | #truncate table compute_nodes in nova 40 | mysql -uroot -p$ROOT_PASSWORD -h127.0.0.1 -e "TRUNCATE table nova.compute_nodes;" 41 | 42 | 43 | service mysqld restart 44 | -------------------------------------------------------------------------------- /OSF_CPUBIND.md: -------------------------------------------------------------------------------- 1 | 验证core绑定策略 2 | ======== 3 | 4 | 主机共有3个CPU,3个node: 5 | CPU1有2个core,4个thread。 6 | CPU2有1个core,2个thread。 7 | CPU3有1个core,2个thread。 8 | 9 | 10 | openstack flavor create --ram 1024 --vcpu 2 --disk 1 isolate 11 | openstack flavor set isolate --property hw:cpu_policy=dedicated --property hw:cpu_thread_policy=isolate 12 | 13 | openstack server create --flavor isolate --image cirros-0.3.4-x86_64-uec isolate 14 | 创建成功。 15 | 16 | openstack server create --flavor isolate --image cirros-0.3.4-x86_64-uec isolate2 17 | 创建成功。 18 | 原因:openstack默认一个numa node。虽然还有两个core,但是不在1个node。openstack因此返回失败。 19 | 20 | openstack flavor create --ram 1024 --vcpu 1 --disk 1 isolate_1u 21 | openstack flavor set isolate_1u --property hw:cpu_policy=dedicated --property hw:cpu_thread_policy=isolate 22 | 23 | openstack server create --flavor isolate_1u --image cirros-0.3.4-x86_64-uec isolate_1u1 24 | 创建成功。 25 | openstack server create --flavor isolate_1u --image cirros-0.3.4-x86_64-uec isolate_1u2 26 | 创建成功。 27 | openstack server create --flavor isolate_1u --image cirros-0.3.4-x86_64-uec isolate_1u3 28 | 创建失败,因为已经没有空余的core了。 29 | 30 | 通过xml也可以看出3个虚拟机使用了0,2,4,6四个pCPUs。 31 | 32 | 验证thread分配策略 33 | ======== 34 | 35 | openstack flavor create --ram 1024 --vcpu 2 --disk 1 prefer 36 | openstack flavor set prefer --property hw:cpu_policy=dedicated --property hw:cpu_thread_policy=prefer 37 | openstack server create --flavor prefer --image cirros-0.3.4-x86_64-uec prefer 38 | 创建失败,因为资源不足。 39 | 40 | 删除虚拟机isolate后,重新创建prefer,创建成功。 41 | 通过xml可以看出使用了0,1两个pCPUs。 42 | openstack的分配策略是按顺序使用未用的pCPUs。 43 | 44 | 这样做的好处,避免thread碎片。 45 | 46 | require的行为 47 | ======== 48 | 49 | openstack flavor create --ram 1024 --vcpu 2 --disk 1 require 50 | openstack flavor set require --property hw:cpu_policy=dedicated --property hw:cpu_thread_policy=require 51 | openstack server create --flavor require --image cirros-0.3.4-x86_64-uec require 52 | openstack server create --flavor require --image cirros-0.3.4-x86_64-uec require2 53 | 54 | 可以创建成功,分别使用0,1和2,3 55 | 56 | openstack server create --flavor require --image cirros-0.3.4-x86_64-uec require3 57 | 创建失败,因为没有资源了。 58 | 59 | 60 | 61 | 62 | 63 | 64 | 65 | 66 | 67 | -------------------------------------------------------------------------------- /QF_trim.md: -------------------------------------------------------------------------------- 1 | ###libvirt/qemu 文件系统trim 2 | 目前virtio驱动无法支持trim,ide/scsi/virtio-scsi驱动可以支持trim。 3 | qemu的trim特性:1.5版支持raw,1.6版支持qcow2。 4 | NTFS本身支持trim命令,EXT4需要在mount时指定参数-o discard,EXT3需要手工执行fstrim。 5 | + libvirt方式启动虚拟机 6 | ide为例: 7 | ```xml 8 | 9 | 10 | 11 | 12 | 13 | ``` 14 | virtio-scsi为例: 15 | ```xml 16 | 17 | 18 | 19 | 20 |
21 | 22 | 23 | 24 | ``` 25 | 26 | + qemu直接启动虚拟机 27 | ```shell 28 | ./qemu-system-x86_64 --enable-kvm -m 2g -smp 2 -drive file=/data/hotplug/hotplug.qcow2,cache=none,if=ide,discard=on,format=qcow2 -drive file=/data/hotplug/vdb.qcow2,cache=none,if=ide,discard=on,format=qcow2 -vnc 186.100.8.138:-1 29 | ``` 30 | 新格式(以virtio-scsi-pci为例): 31 | ```shell 32 | ./qemu-system-x86_64 --enable-kvm -m 2g -smp 2 -drive file=/data/hotplug/hotplug.qcow2,cache=none,if=none,id=hd2,discard=on,format=qcow2 -drive file=/data/hotplug/vdb.qcow2,cache=none,if=none,id=hd,discard=on,format=qcow2 -device virtio-scsi-pci,id=scsi -device scsi-hd,drive=hd2 -device scsi-hd,drive=hd -vnc 186.100.8.138:-1 33 | ``` 34 | 35 | + 确认方法 36 | 虚拟机内部(文件系统挂载需要-o discard参数): 37 | ```shell 38 | mount -o discard /dev/sdb /mnt 39 | ``` 40 | 在guest中/mnt下创建大文件: 41 | ```shell 42 | [root@localhost hotplug]# du -hs vdb.qcow2 43 | 481M vdb.qcow2 44 | ``` 45 | 在guest中/mnt下删除大文件: 46 | ```shell 47 | [root@localhost hotplug]# du -hs vdb.qcow2 48 | 294M vdb.qcow2 49 | ``` 50 | 51 | + Shrink实现原理 52 | 参照http://leiqzhang.com/2013/08/2013-08-07-virtual-disk-unmap-shrink/ 53 | 虚拟机磁盘设备Shrink过程: 54 | >guest fs----->device driver----->qemu block----->host fs---->host device driver----->device 55 | 56 | + 使用场景 57 | 提供空间使用率。 58 | 提高写数据性能。 59 | 60 | + 参考 61 | - 为什么引入trim命令: 62 | http://www.360doc.com/content/11/0723/10/7040275_135349919.shtml 63 | - 为什么引入unmap命令: 64 | 主要为了应对thin provision场景的存储使用效率。 65 | - trim原理 66 | http://dirlt.com/ssd-gc-and-trim.html 67 | 68 | -------------------------------------------------------------------------------- /no_boot_patch_kernel.md: -------------------------------------------------------------------------------- 1 | ### KernelCare 2 | CloudLinux的KernelCare:更新kernel patch而无需重启。(支持CentOS 6, RHEL 6, CloudLinux OS 6 and OpenVZ (64-bit only).) 3 | KernelCare是基于开源代码(Linux kernel mode的)和私有代码组合而成。后续可能开源。 4 | 5 | 另一个更新的工具是Kpatch,目前仍在开发中。 6 | 7 | RHEL有类似的服务(Ksplice services),Oracle也有类似的服务。 8 | ### Kpatch 9 | 开发中,尚不可以用于生产环境。 10 | Kpatch更新的对象以函数为级别。 11 | 12 | Kpatch主要有四个组件。 13 | 1. kpatch-build 14 | 产生hot patch。 通过对比包含patch和不包含patch的kernel差异,产生hotpatch。 15 | 16 | 2. hot patch module 17 | 内核模块文件:包含替换函数和源函数的元数据。 18 | 19 | 3. kpatch core module 20 | 内核模块文件,提供注册新函数的功能。利用内核kernel ftrace subsystem通过钩子将原函数进行重定向。 21 | 22 | 4. kpatch utility 23 | 管理热patch。可以配置在启动时加载哪些patch。这样相同的内核即使重启,仍然包含所打的热patch。 24 | 25 | ### 如何使用kpatch进行热patch 26 | 目前支持Fedora20,RHEL7,Ubuntu14.04,Debian8.0,Debian7.* 27 | 详细使用过程见https://github.com/dynup/kpatch 28 | 29 | 限制: 30 | 1. 某些函数不支持hot patch,如(schedule(), sys_poll(), sys_select(), sys_read(), sys_nanosleep()) 31 | 2. 初始化函数不支持hot patch,如__init 32 | 3. 不支持修改静态分配的数据 33 | 4. 不支持vdso中的函数进行patch 34 | 5. kpatch和ftrace以及kprobes存在不兼容 35 | 6. 改变函数与动态分配数据间的交互的patch可能存在安全性问题。 36 | 37 | ### 不重启更新kernel (RHEL/Centos) 38 |
39 | # uname -r   
40 | 2.6.32-71.29.1.el6.i686  
41 | Ok, we have to patch:
42 | # yum update kernel*
43 | Grab the kexec tools:
44 | # yum install kexec-tools
45 | Now we get last installed kernel version release and put it on a var:
46 | # latestkernel=`ls -t /boot/vmlinuz-* | sed "s/\/boot\/vmlinuz-//g" | head -n1` 
47 | 
48 | # echo $latestkernel 
49 | 2.6.32-220.4.1.el6.i686
50 | Now we need to load the new kernel version in memory:
51 | # kexec -l /boot/vmlinuz-${latestkernel} --initrd=/boot/initramfs-${latestkernel}.img --append="`cat /proc/cmdline`"
52 | Finally, we can issue a reset:
53 | # kexec -e
54 | ..and.. wow, we lost the system! ..Well, not exactly.
55 | The system will “restart without restarting”..something like a fast reboot, without performing BIOS checks (and you know how long can a full system restart last).
56 | 这步terminal console会断掉,即socket被重置了。
57 | 
58 | # uname -r
59 | 2.6.32-220.4.1.el6.i686
60 | 
61 | 62 | 参考: 63 | http://www.zdnet.com/kernelcare-new-no-reboot-linux-patching-system-7000029127/ 64 | http://korovamilky.tumblr.com/post/16460518079/running-new-linux-kernel-without-rebooting 65 | http://rhelblog.redhat.com/2014/02/26/kpatch/ 66 | https://github.com/dynup/kpatch 67 | 68 | 69 | -------------------------------------------------------------------------------- /OSF_trim.md: -------------------------------------------------------------------------------- 1 | 计划 2 | ------ 3 | |内容 | 进度| 4 | ----|----------------------|------| 5 | 0. |openstack能力/bp调查 | 完成| 6 | 1. |qemu/kvm能力验证 | 完成| 7 | 2. |openstack实现原型|| 8 | 3. |BP提交|完成| 9 | 4. |代码提交、review|| 10 | 11 | 准备 12 | ------ 13 | ###特性介绍 14 | qemu在1.5/1.6已经支持了raw和qcow2的[trim特性]。 15 | 本文主要介绍在openstack中的实现。 16 | 17 | ###接口变化 18 | ~~接口名: 19 | v2/​{tenant_id}​/servers/​{server_id}​/os-volume_attachments 20 | 通过参数dict参数volumeAttachment传入是否开启trim。~~ 21 | 22 | ###典型使用方法 23 | 1. 用户通过image metadata添加virtio-scsi controller或者ide设备 24 | >hw_scsi_model=virtio-scsi/ide 25 | 26 | 2. 用户创建虚拟机 27 | 3. 用户通过volume metadata添加discard, bus属性 28 | > discard属性: hw_disk_discard=unmap/ignore 29 | > bus属性:hw_disk_bus=scsi, virtio, uml, xen, ide, usb 30 | 31 | 4. 用户将卷挂载给虚拟机 32 | 33 | ### 代码流程 34 | + image metadata支持[virtio-scsi controller]已经实现,目前在review中。预计i3合入。 35 | + volume metadata支持discard属性(默认不开启)、bus属性(默认不设置)待开发(xml属性生成)。 36 | 37 | ### 如何向用户展现 38 | 1. 支持用户打开discard开关 39 | 2. 触发discard,主要有三种方法 40 | 1. 对NTFS/ext4有自动discard的,用户文件系统参数打开discard属性 41 | 2. 对ext3这种不能自动discard的 42 | 1. 用户手动触发 43 | 2. 用户在guest内通过脚本或者程序实现自动触发 44 | 3. openstack向用户暴露接口,触发guest的trim,需要guest-agent支持 45 | 46 | 47 | ###笔记 48 | + volume attach: 49 | ```xml 50 | curl -i http://186.100.8.214:8774/v2/86196260e1694d0cbb5049cfba3883f8/servers/c62b5277-23cf-4af2-b6ae-15765e9341d1/os-volume_attachments -X GET -H "X-Auth-Project-Id: admin" -H "User-Agent: python-novaclient" -H "Accept: application/json" -H "X-Auth-Token: 2e3c783097fc4f07b2673f520f4d9962" 51 | ``` 52 | + 缺失 53 | 目前openstack底层未进行controller的指定。依靠libvirt自动生成。 54 | 但是特殊场景,由于需要制定controller的model类型,需要特别订制。 55 | 56 | [trim特性]:QF_trim.md 57 | [2]:https://wiki.openstack.org/wiki/BlockDeviceConfig 58 | [virtio-scsi controller]:https://blueprints.launchpad.net/nova/+spec/libvirt-virtio-scsi-driver 59 | 60 | hyperv trim: 61 | http://books.google.com.hk/books?id=JWSPAQAAQBAJ&pg=PT278&lpg=PT278&dq=microsoft+Hyper-V,trim&source=bl&ots=y8dNXk_yET&sig=4ASuCyHMsn2-sNogJZhZfRLAWYk&hl=en&sa=X&ei=9L9bU7esL4noiAeGr4CYBw&ved=0CFMQ6AEwBjgK#v=onepage&q=microsoft%20Hyper-V%2Ctrim&f=false 62 | 63 | http://msdn.microsoft.com/en-us/library/windows/desktop/hh848053%28v=vs.85%29.aspx 64 | 65 | https://workinghardinit.wordpress.com/tag/unmap/ 66 | 67 | http://bradkingsley.com/automatic-trim-and-unmap-with-windows-server-2012-r2/ 68 | 69 | 70 | -------------------------------------------------------------------------------- /qemu_features.md: -------------------------------------------------------------------------------- 1 | 特性 |子特性 |支持 | 2 | :---------------|:--------------|:------| 3 | [内存超分配] |透明页面共享 |是 | 4 | |内存气泡 |是 | 5 | |页面交换 |是 | 6 | |页面压缩 |否 | 7 | [CPU QoS] |上限 |是 | 8 | |预留 |否 | 9 | |份额 |是 | 10 | [内存 QoS] |上限 |是 | 11 | |预留 |是 | 12 | |份额 |否 | 13 | [虚拟机快照] |内存快照 |是 | 14 | |无中断内存快照 | | 15 | [Host] |Logical Processors| | 16 | |Physical Memory| | 17 | |Virtual CPUs per Host| | 18 | VM |Virtual CPUs per VM| | 19 | |Memory per VM | | 20 | |Active VMs per Host| | 21 | 热拔插 |CPU |是* | 22 | |内存 | | 23 | |虚拟硬盘 |是 | 24 | |虚拟光驱 |是 | 25 | |虚拟软驱 | | 26 | |虚拟USB设备 |是 | 27 | |虚拟网卡 |是 | 28 | 虚拟机操作 |创建 |是 | 29 | |启动 |是 | 30 | |安全关闭 |是 | 31 | |强制停止 |是 | 32 | |删除 |是 | 33 | |重启 |是 | 34 | |休眠 |是 | 35 | |唤醒 |是 | 36 | |暂停 |是 | 37 | |恢复 |是 | 38 | |导入 |是 | 39 | |导出 |是 | 40 | |复制 |是 | 41 | 计算资源调度 |动态资源调度(负载均衡)| | 42 | |动态电源管理(节能减排)| | 43 | |虚拟机互斥 | | 44 | |亲和性 | | 45 | |虚拟机组与主机组的关联| | 46 | 安全 |SELinux访问控制的隔离| | 47 | 音频 |回放 |是 | 48 | |录音 |是 | 49 | 虚拟外设 |USB redir |是 | 50 | |PS/2 |是 | 51 | |串口 |是 | 52 | |并口 | | 53 | |光驱 |是 | 54 | |Watchdog | | 55 | |USB1.0 UHCI | | 56 | |USB1.0 OHCI | | 57 | |USB2.0 EHCI | | 58 | |USB3.0 XHCI | | 59 | |TPM | | 60 | 主机设备直通 |USB |是 | 61 | |网卡 |是 | 62 | |光驱 | | 63 | |显卡 | | 64 | |HBA卡 | | 65 | |TPM |是 | 66 | |VMDQ | | 67 | |SR-IOV |是 | 68 | |VFIO | | 69 | 内核级设备模拟 |vhost-scsi | | 70 | |vhost-net | | 71 | |APIC | | 72 | |PIT | | 73 | 虚拟机迁移 |共享存储热迁移 |是 | 74 | |不同版本之间迁移| | 75 | |异构CPU的热迁移 | | 76 | |无共享存储热迁移|是 | 77 | |热迁移压缩 |是 | 78 | |基于RDMA |是 | 79 | |热迁移加密 |是 | 80 | |热迁移限速 |是 | 81 | |迁移时去重 |是 | 82 | |热迁移自动负载降低|是 | 83 | FT(Fault Tolerance)| 单vcpu |NA | 84 | |多vcpu |NA | 85 | |HA |是 | 86 | 虚拟机时钟同步 | | | 87 | 虚拟机故障检测 | 是 | | 88 | Guest [NUMA]| |是 | 89 | Host [NUMA] | |是 | 90 | Virtual SMP |即支持多个VCPU |是 | 91 | [Transparent Huge Page]| |是 | 92 | x2apic | |是 | 93 | msi-x | | | 94 | posted interrupt| |NA | 95 | APIC-v | |NA | 96 | PVEOI | |是 | 97 | 半虚拟化 | |否 | 98 | Inter-VM Share Memory(IVSMEM)| | | 99 | ELI | | | 100 | 101 | [内存超分配]: QF_mem_overcommit.md 102 | [CPU QoS]: QF_CPUQos.md 103 | [内存 QoS]: QF_MEMQos.md 104 | [虚拟机快照]:QF_vm_snapshot.md 105 | [NUMA]:QF_numa.md 106 | [Transparent Huge Page]:QF_hugepage.md 107 | [Host]:QF_host.md 108 | -------------------------------------------------------------------------------- /openstack/devstack.md: -------------------------------------------------------------------------------- 1 | ALL IN ONE: 2 | ---- 3 | devstack通过外网安装openstack。 4 | ```shel 5 | 1. 配置ccproxy外网访问 6 | 不要忘记配置本机proxy例外。 7 | 8 | 2. 拷贝163的fedora repo到/etc/yum.repos.d/ 9 | 10 | 2.1. 使用国内的pypi库 11 | ~/.pip/pip.conf 12 | [global] 13 | index-url = http://pypi.douban.com/simple 14 | 15 | 3. 安装前配置 16 | adduser stack 17 | apt-get install sudo -y || yum install -y sudo 18 | echo "stack ALL=(ALL) NOPASSWD: ALL" >> /etc/sudoers 19 | sudo apt-get install git -y || yum install -y git 20 | git clone https://github.com/openstack-dev/devstack.git 21 | cd devstack 22 | 23 | 24 | 4. local.conf定制 25 | 拷贝local.conf到stack.sh同级目录 26 | 修改local.conf 27 | 28 | 5. 修改localrc,修改git库协议为http 29 | 30 | 6. 安装 31 | cd devstack 32 | chown -R stack:stack devstack 33 | su stack 34 | ./stack.sh 35 | 36 | 7. 关闭防火墙 37 | setenforce 0 38 | service iptables stop 39 | chkconfig iptables off 40 | systemctl stop firewalld.service 41 | (更好的办法是通过firewall-cmd打开端口 42 | #打开horizon使用的http端口 43 | firewall-cmd --add-service=http 44 | #打开novnc端口 45 | firewall-cmd --add-port=6080/tcp 46 | firewall-cmd --add-port=6081/tcp)。 47 | 48 | 8. 服务随主机启动 49 | chkconfig rabbitmq-server on 50 | service rabbitmq-server start 51 | chkconfig httpd on 52 | service httpd start 53 | chkconfig mysqld on 54 | service mysqld start 55 | chkconfig openvswitch on 56 | service openvswitch start 57 | 58 | 9. 重启后处理 59 | 恢复卷组和准备cinder-volume: 60 | losetup -f /opt/stack/data/stack-volumes-backing-file 61 | 删除残留的sock文件: 62 | rm -rf /var/lib/mysql/mysql.sock 63 | 重新启动: 64 | rejoin-stack.sh 65 | 关闭防火墙: 66 | systemctl stop firewalld.service #fedora 67 | setenforce 0 68 | service iptables stop 69 | chkconfig iptables off 70 | ``` 71 | controller命令执行 72 | ---- 73 | 创建keystonerc_admin文件 74 | ```keystonerc_admin 75 | export OS_USERNAME=admin 76 | export OS_TENANT_NAME=admin 77 | export OS_PASSWORD=admin 78 | export OS_AUTH_URL=http://186.100.8.215:35357/v2.0/ 79 | export PS1='[\u@\h \W(keystone_admin)]\$ ' 80 | ``` 81 | 从keystone_admin文件导入环境变量 82 | ```shell 83 | source keystonerc_admin 84 | ``` 85 | 然后就可以执行命令,如nova list 86 | 87 | Q&A 88 | ---- 89 | 1. 90 | 问题:failed to create /opt/stack/horizon/openstack_dashboard/local/ 91 | 解决:执行setenforce 0 92 | 93 | 2. 94 | 问题:清理screen 95 | 解决:screen -wipe 96 | 97 | 3. "No module named MySQLdb" 98 | yum install mariadb-devel.x86_64 99 | 100 | 4. "error MUST be included first" 101 | 删除代码中该行 102 | 103 | 5. fedora镜像下载失败: 104 | 修改stackrc先禁止下载,然后手工下载上传。 105 | 106 | -------------------------------------------------------------------------------- /qemu/qemu_2.0.md: -------------------------------------------------------------------------------- 1 | Qemu 2.0 2 | ---- 3 | 系统模拟 4 | ---- 5 | #### x86 6 | + Q35的HPET中断可以被挂载到GSIs 16~23,和真实的设备一致 7 | + Q35支持CPU hotplug了 8 | + 可以通过指定“-drive if=pflash"或者”-pflash“两次设置两个flash设备 9 | + 内存layout有些许变化。 10 | 为了改善性能,对内存大于3.5GB的PIIX类型的Guest(”-M pc“)拥有3GB低址内存(而非之前的3.5GB); 11 | 对大于2.75GB的Q35类型的Guest(”-M q35")拥有2GB的低址内存(而非之前的2.75GB)。 12 | + 支持Intel MPX寄存器的迁移 13 | + Apple SMC设备现在通过ACPItables暴露。 14 | + PIIX类型的虚拟机,支持bridge后的设备的PCI hotplug(只支持不是通过hotplug添加的bridges。hot-plugged bridge仍然可以使用PCI标准Hot-Plug controller) 15 | + 支持通过“-cpu”下的子参数“hv-time"添加Hyper-V reference time counter。可以提供windows虚拟机的性能,尤其是其中运行了很多浮点、SIMD运算的应用。(需要KVM和内核版本3.14) 16 | + qemupciserial.inf文件允许在windows上安装multiport PCI串行设备。 17 | + QEMU生成的ACPI tables现在可以被OVMF固件使用了。OVMF必须使用SVN r15420。particular hotplug/pvpanic device和其他基于ACPI的特性现在可以在OVMF下运行。 18 | 19 | #### kvm 20 | + x2apic现在默认开启(kvm下)。 21 | 22 | 设备模拟 23 | ---- 24 | #### SCSI 25 | + SCSI层可以卸载WRITE SAME指令到host storage上。目前XFS文件系统,raw设备、iscsi targes支持。 26 | + SCSI磁盘可以提供port WWN和port index信息,和真实的SAS磁盘行为更相似。 27 | 28 | #### USB 29 | + XHCI控制器支持suspend-to-RAM 30 | + 支持微软descriptors,使windows默认使用remote suspend 31 | 32 | #### GUI 33 | + 支持SDL2.0 34 | 35 | #### VNC 36 | + 改善性能。 37 | + 通过monitor设置密码不会再附带生效密码的效果。使用“qemu -vnc ${display},password"生效密码。 38 | 39 | #### monitor 40 | + HMP支持cpu-add指令 41 | + QMP支持object_add/object_del指令 42 | + HMP支持object_add/object_del指令 43 | + 改进了device_add/device_del命令自动完成 44 | + dump-guest-memory将产生kdump压缩格式的文件 45 | 46 | #### Migration 47 | + qcow2格式的迁移进行了大量的bug fix,现在运行更加稳定了。 48 | + 减少迁移中guest停顿 49 | + RDMA迁移使用”rdma:HOST:PORT“激活(过去是”x-rdma:HOST:PORT) 50 | 51 | #### Network 52 | + BSD系统上支持“netmap”新后端 53 | 54 | #### Block device 55 | + 在线快照合并(...-commit)可以用于合并镜像的活跃层到一个快照中。 56 | + 如果必要,在线、离线快照(“commit”)将resize目标image。 57 | + iscsi、Gluster后端支持快照合并 58 | + “query-block-stats"提供统计快照链中所有的后端文件 59 | + virtio-blk试验下支持M:N线程模拟 60 | 如果指定x-dataplane=on,你可以使用”-object iothread“创建io线程以及通过”x-iothread"属性指定线程。 61 | 可以通过“query-iothreads”查询iothread。 62 | 63 | Block devices和工具 64 | ---- 65 | + 网络块设备驱动可以以共享库模块方式产生(“--enable-modules”) 66 | + 对raw设备使用“qemu-img convert",qemu-img将使用host storage的“discard”指令代替写0。 67 | + “qemu-img convert"可以指定”-S 0“进行预分配。 68 | + ”qemu-img convert"可以使用host storage的hints来加速转换。 69 | + "qemu-img convert", "qemu-img create", "qemu-img amend" 支持多个“-o"参数 70 | + libcurl有bit-rotted问题,已经被修复。 71 | + 一个新的”quorum“驱动(支持冗余存储)被引入。 72 | + QEMU可以使用libnfs直接访问NFSv3共享存储。 73 | 74 | 75 | 76 | 77 | 78 | 79 | 80 | 81 | 82 | 83 | 84 | 85 | 86 | 87 | 88 | 89 | 90 | 91 | 92 | 93 | 94 | -------------------------------------------------------------------------------- /OSF_shelve.md: -------------------------------------------------------------------------------- 1 | openstack shelve/unshelve/stop浅析 2 | ---- 3 | stop的虚拟机只是将虚拟机停止,并未在hypervisor释放改虚拟机。虚拟机仍然占用着临时存储资源。 4 | 系统也为虚拟机保留着cpu/memory资源,以确保启动可以成功。 5 | 6 | 当我们需要彻底释放cpu/memory/临时存储资源,我们引入了shelve。 7 | shelve原理是将虚拟机从hypervisor上释放。虚拟机的cpu/memory不再预留。 8 | 对临时存储,我们通过快照将磁盘数据放置在glance上。 9 | 对cinder后端的存储,我们无须这么复杂。 10 | 11 | shelve包含三个操作: 12 | shelve :将虚拟机停止并设置为shelved状态。将临时存储进行快照,并存放在glance上。 13 | 等待shelve-offload操作或者shelve周期到达。 14 | shelve-offload :将shelved的虚拟机从hypervisor上彻底释放。虚拟机状态转变为shelve-offload。 15 | unshelve :重新选择节点启动处于shelve-offload状态的虚拟机。(之后会删除glance上的镜像) 16 | 一个周期性任务: 17 | 坚持处于shelved状态的虚拟机,当shelve周期到达,将虚拟机从hypervisor上释放。 18 | 19 | 存在的缺点: 20 | 1. unshelve可能由于资源不足而失败。 21 | 2. 启动速度比stop的虚拟机启动慢。尤其是临时存储(需要下载镜像)。 22 | 3. 只对系统盘进行快照,因此其他盘数据会丢失(临时存储时)。 23 | 4. 由于快照时,临时存储的差分卷和母卷合并了,因此unshelve后占用的临时存储会增大。(相当于有多份母卷) 24 | 25 | 26 | ``` 27 | [root@localhost devstack(keystone_admin)]# nova list --all-tenants 28 | +--------------------------------------+------+--------+------------+-------------+------------------+ 29 | | ID | Name | Status | Task State | Power State | Networks | 30 | +--------------------------------------+------+--------+------------+-------------+------------------+ 31 | | 3d9570c3-069a-4510-96c2-9a6fb8853484 | 11 | ACTIVE | - | Running | private=10.0.0.3 | 32 | +--------------------------------------+------+--------+------------+-------------+------------------+ 33 | [root@localhost devstack(keystone_admin)]# nova stop 3d9570c3-069a-4510-96c2-9a6fb8853484 34 | [root@localhost devstack(keystone_admin)]# nova list --all-tenants 35 | +--------------------------------------+------+---------+------------+-------------+------------------+ 36 | | ID | Name | Status | Task State | Power State | Networks | 37 | +--------------------------------------+------+---------+------------+-------------+------------------+ 38 | | 3d9570c3-069a-4510-96c2-9a6fb8853484 | 11 | SHUTOFF | - | Shutdown | private=10.0.0.3 | 39 | +--------------------------------------+------+---------+------------+-------------+------------------+ 40 | [root@localhost devstack(keystone_admin)]# virsh list 41 | Id 名称 状态 42 | ---------------------------------------------------- 43 | 44 | [root@localhost devstack(keystone_admin)]# virsh list --all 45 | Id 名称 状态 46 | ---------------------------------------------------- 47 | - instance-0000000a 关闭 48 | 49 | [root@localhost devstack(keystone_admin)]# nova shelve 3d9570c3-069a-4510-96c2-9a6fb8853484 50 | [root@localhost devstack(keystone_admin)]# virsh list --all 51 | Id 名称 状态 52 | ---------------------------------------------------- 53 | ``` 54 | -------------------------------------------------------------------------------- /other/cgroup限制内存.md: -------------------------------------------------------------------------------- 1 | Cgroup限制方法: 2 | mkdir /cgroup/memory/test/ 3 | echo 50M > /cgroup/memory/test/memory.limit_in_bytes 4 | echo 50M > /cgroup/memory/test/memory.memsw.limit_in_bytes 5 | cgexec -g memory:test mongod -port 27017 --bind_ip 127.0.0.1 --dbpath /var/lib/mongo 6 | 7 | 我验证了下,通过cgroup限制后,当内存达到限额,进程会被kill。 8 | [root@centos mongo]# cgexec -g memory:test mongod -port 27017 --bind_ip 127.0.0.1 --dbpath /var/lib/mongo 9 | 2014-07-18T23:20:53.228+0800 [initandlisten] MongoDB starting : pid=2529 port=27017 dbpath=/var/lib/mongo 64-bit host=centos 10 | 2014-07-18T23:20:53.228+0800 [initandlisten] db version v2.6.3 11 | 2014-07-18T23:20:53.228+0800 [initandlisten] git version: 255f67a66f9603c59380b2a389e386910bbb52cb 12 | 2014-07-18T23:20:53.228+0800 [initandlisten] build info: Linux build12.nj1.10gen.cc 2.6.32-431.3.1.el6.x86_64 #1 SMP Fri Jan 3 21:39:27 UTC 2014 x86_64 BOOST_LIB_VERSION=1_49 13 | 2014-07-18T23:20:53.228+0800 [initandlisten] allocator: tcmalloc 14 | 2014-07-18T23:20:53.228+0800 [initandlisten] options: { net: { bindIp: "127.0.0.1", port: 27017 }, storage: { dbPath: "/var/lib/mongo" } } 15 | 2014-07-18T23:20:53.304+0800 [initandlisten] journal dir=/var/lib/mongo/journal 16 | 2014-07-18T23:20:53.304+0800 [initandlisten] recover : no journal files present, no recovery needed 17 | 2014-07-18T23:20:53.374+0800 [initandlisten] waiting for connections on port 27017 18 | 2014-07-18T23:20:57.838+0800 [initandlisten] connection accepted from 127.0.0.1:36712 #1 (1 connection now open) 19 | 2014-07-18T23:21:15.077+0800 [initandlisten] connection accepted from 127.0.0.1:36713 #2 (2 connections now open) 20 | 2014-07-18T23:21:52.342+0800 [conn2] getmore test.my_collection cursorid:34538199491 ntoreturn:0 keyUpdates:0 numYields:39 locks(micros) r:121572 nreturned:95052 reslen:4194299 202ms 21 | 2014-07-18T23:21:53.376+0800 [clientcursormon] mem (MB) res:136 virt:12809 22 | 2014-07-18T23:21:53.376+0800 [clientcursormon] mapped (incl journal view):12508 23 | 2014-07-18T23:21:53.376+0800 [clientcursormon] connections:2 24 | 2014-07-18T23:21:56.790+0800 [conn2] getmore test.my_collection cursorid:34538199491 ntoreturn:0 keyUpdates:0 numYields:88 locks(micros) r:142113 nreturned:95595 reslen:4194301 244ms 25 | Killed 26 | 27 | 数据查询: 28 | [root@centos data]# cat mongotestList.py 29 | import pymongo 30 | import time 31 | 32 | client = pymongo.MongoClient("localhost", 27017) 33 | db = client.test 34 | print db.name 35 | print db.my_collection 36 | 37 | for item in db.my_collection.find(): 38 | print item 39 | 40 | 数据插入: 41 | [root@centos data]# cat mongotest2.py 42 | import pymongo 43 | import time 44 | 45 | client = pymongo.MongoClient("localhost", 27017) 46 | db = client.test 47 | print db.name 48 | print db.my_collection 49 | 50 | while True: 51 | db.my_collection.save({time.ctime(): time.time()}) 52 | -------------------------------------------------------------------------------- /openstack/DR.md: -------------------------------------------------------------------------------- 1 | ### 云环境下的容灾 2 | + 什么是容灾? 3 | 简单的说是对灾难的而应对策略。比如火灾,盗窃,人为损坏,火山,地震,洪水,战争,飓风等自然灾害或者人为灾害。 4 | 5 | + RTO/RPO 6 | RPO(Recovery Point Objective): 指灾难后可能恢复到的时间点。涉及丢失业务数据的多少。 7 | RTO(Recovery Point Time): 指灾难发生后,业务恢复所需的时间。 8 | ![architecture](http://redhatstackblog.files.wordpress.com/2013/11/recovery-point-objective-and-recover-time-objective.png) 9 | 10 | + 容灾的分类 11 | 按RTO分:cold, warm, standby 12 | 按RPO分:同步同步,异步同步,离线同步 13 | 按业务数据同步技术:基于主机复制,基于阵列复制,基于存储网络,基于虚拟机内代理,基于应用本身能力(如数据库复制能力) 14 | 15 | + HA与容灾的区别 16 | HA主要处理单组件的故障,DR则是应对大规模的故障。 17 | 也有一些从网络视角区分两者的,LAN尺度的认为是HA的范畴,WAN尺度的任务是DR的范围。 18 | 从云的角度看,HA是一个云环境内保障业务持续性的机制。DR是多个云环境间保障业务持续性的机制。 19 | 20 | ### AWS容灾方案 21 | AWS的方案从用户场景看有如下几类: 22 | + cold 23 | 是三种方案中费用最低,RTO最长(>1 day)的方案。 24 | 使用S3做数据备份,灾难发生时,重新申请虚拟机,利用备份数据恢复。 25 | 数据备份可以使用普通的http, vpn, aws directconnect等链接,快照/备份技术进行业务数据的同步。 26 | ![cold1](http://cdn.blog.celingest.com/wp-content/uploads/2013/03/AwsBackupRestore1-512x281.png) 27 | ![cold2](http://cdn.blog.celingest.com/wp-content/uploads/2013/03/AwsBackupRestore2-512x380.png) 28 | + pilot light 29 | 相对经济的一种容灾方案,RTO时间(<4hrs)一般。 30 | 使用replicate/mirror方式进行业务数据同步。 31 | 容灾端虚拟机在灾难发生后启动。 32 | ![pilot light1](http://cdn.blog.celingest.com/wp-content/uploads/2013/03/AwsPilotLightOff-512x336.png) 33 | ![pilot light2](http://cdn.blog.celingest.com/wp-content/uploads/2013/03/AwsPilotLightOn-512x326.png) 34 | + standby 35 | 相对较贵的一种容灾方案,RTO时间(<1hrs)最好。 36 | 使用replicate/mirror方式进行业务数据同步。 37 | 容灾端虚拟机一直运行中,但是不提供服务。 38 | 这种方案分两类,一类是容灾端虚拟机与生产端虚拟机等量,切换后所能提供的业务容量相同。另一种是容灾端保持较小的容量,切换后能提供业务能力但是业务容量较小,需要再进行扩展。 39 | ![standby1](http://cdn.blog.celingest.com/wp-content/uploads/2013/03/FullyWorkingLCStandby-Normal-512x326.png) 40 | ![standby2](http://cdn.blog.celingest.com/wp-content/uploads/2013/03/FullyWorkingLCStandbyFaultyLOW-512x326.png) 41 | ![standby3](http://cdn.blog.celingest.com/wp-content/uploads/2013/03/FullyWorkingLCStandbyFaultyFULL-512x326.png) 42 | 43 | ### Openstack容灾 44 | + 整体架构 45 | Openstack的DR整体架构如下图。 46 | 至于是否会是一个新的项目,目前并没有规划。目前主要关注于在nova/cinder/补齐功能,编排主要通过heat实现。 47 | 后续可能成为一个独立项目甚至独立与openstack的项目。 48 | ![openstack_dr_arch](https://wiki.openstack.org/w/images/e/e8/DR.png) 49 | + 功能 50 | fail over(灾难后切换备节点) 51 | fail back(主站点故障恢复后切换会主站点) 52 | test(容灾演练) 53 | + 方案介绍 54 | 目前没有详细的方案。只有一个hight level的设计。 55 | 现在还在gap识别,补齐阶段。 56 | + 现状 57 | 目前主要集中在用例分析、整体框架设计阶段。 58 | 具体的实现主要集中在cinder侧元数据、业务数据同步相关。但是进展不乐观。 59 | 60 | ### 参考 61 | 1. https://wiki.openstack.org/wiki/DisasterRecovery 62 | 2. https://wiki.openstack.org/w/images/4/49/Openstack_disaster_recovery_-_openstack_meetup.pdf 63 | 3. http://redhatstackblog.redhat.com/2013/11/26/disaster-recovery-enablement-in-openstack/ 64 | 4. http://blog.celingest.com/en/2013/03/05/disaster-recovery-in-aws/ 65 | 5. http://blog.celingest.com/en/2013/03/19/disaster-recovery-aws-high-availability-architectures/ 66 | 67 | 68 | 69 | 70 | 71 | -------------------------------------------------------------------------------- /docker部署openstack.md: -------------------------------------------------------------------------------- 1 | 声明: 2 | 本人阅读笔记,翻译类文章仅作意译。如有不对之处,请指出。 3 | 需要更本源的理解,请自行阅读英文。 4 | 5 | 本博客欢迎转发,但请保留原作者信息! 6 | 博客地址:http://blog.csdn.net/halcyonbaby 7 | 新浪微博:寻觅神迹 8 | 9 | 内容系本人学习、研究和总结,如有雷同,实属荣幸! 10 | # 基于docker、kubernetes部署openstack到atomic系统上 11 | openstack的服务定义,是不是看起来很简洁? 12 | beautry 13 | openstack的实际组件构成,是不是看起来很复杂? 14 | real 15 | 所有的openstack服务彼此依赖,带来了服务生命周期管理的复杂性和低效。 16 | 17 | 比如openstack的鉴权服务keystone,在已有环境上部署一个新的keystone是否会对其他服务带来兼容性问题 18 | 是很难判断的。用现在的工具,也是难以进行回退的。 19 | 事实上,并非只有openstack是这样的,很多基础设施平台或者应用平台都有类似的问题。 20 | 21 | ### openstack生命周期管理的方式 22 | 主要分为两类:基于包、基于image 23 | 24 | + 基于包 25 | 通常使用PXE,并搭配puppet、chef、Ansilbe这样的配置工具。基于包的方式是低效的,原因如下: 26 | + 操作系统、物理节点的差异性 27 | + 合布时服务间的冲突(ports,文件系统等) 28 | + 安装速度(大规模部署时,通过网络下载包安装) 29 | 也许有人会提虚拟机+包的方式,但是: 30 | + 虚拟机比较重(内存、CPU、磁盘占用。启动速度) 31 | + 虚拟机缺乏metadata注入手段(或者需要额外的组件和代理完成这个事情) 32 | 33 | + 基于image 34 | 解决了安装速度慢的问题,通常会有仓库存放image,直接下载到物理硬件上。 35 | 但是,由于image很大,基于image的方式,增量更新仍然很缓慢。 36 | 另外,基于iamge的方式并未解决opesntack服务间的复杂性问题。只是将问题提前到构建镜像时。 37 | 38 | 除此之外,运维人员还会希望这个openstack生命周期管理系统,能够跨bare metal、IaaS、甚至PaaS。 39 | 40 | ### Atomic、Docker、Kubernetes带来了什么 41 | 如果有一个openstack服务的生命周期管理方案能带来以下优点: 42 | 43 | + 隔离、轻量、便携、可分离 44 | + 运行态的服务关系易于描述 45 | + 易于运行、易于更新 46 | + 独立于openstack之外管理服务的生命周期 47 | 48 | 这正是docker、atomic、kubernetes组合方案所能提供的。 49 | docker 50 | 51 | Docker提供了对linux容器的抽象,并提供了一种镜像格式。通过这种镜像格式,可以方便的分享并提供镜像间的层次关系。另外docker还提供了docker仓库来分享docker镜像。 52 | 这种方式很重要,因为开发者可以发布便携的容器镜像,维护人员将之部署在不同的平台。 53 | kubernetes 54 | kubernetes是开源的容器集群管理平台。它使用master/minion结构提供给了容器的调度能力。开发者可以使用声明式语法描述容器间关系,并让集群管理进行调度。 55 | atomic 56 | Atomic项目提供给了一个安全、稳定、高性能的容器运行环境。Atomic包含了kubernetes和docker,并运行用户使用新的软件更新机制ostree。 57 | atomic 58 | 将以上三者结合起来的方案就像上图。openstack开发者使用自己熟悉的环境进行开发(linux/vagrant/libvirt),然后向仓库提交服务镜像。运维人员将kubernetes配置导入生命周期管理工具,然后启动pods和services。容器镜像会被下载到本地并部署这些openstack服务。由于服务是隔离的,我们可以在单台机器上最大化密度地部署openstack服务。除此之外还有其他优点,比如回滚、部署、更新的速度等。 59 | 60 | 原文地址: 61 | http://allthingsopen.com/2014/10/22/a-demonstration-of-kolla-docker-and-kubernetes-based-deployment-of-openstack-services-on-atomic/ 62 | 63 | 64 | 65 | 66 | 67 | 68 | 69 | 70 | -------------------------------------------------------------------------------- /qemu/cpu_hot_plug原理.md: -------------------------------------------------------------------------------- 1 | 》coreOS&atomic: 2 | 3 | coreOS: 4 | 5 | 目前最新的stable版支持到docker1.3,kernel3.17 6 | 7 | 近期主要的更新涉及模块更新、安全patch、docker新参数支持等。 8 | 未增加新的特性。 9 | 10 | 目前提供的产品: 11 | coreOS: 12 | 提供了一个裁剪的支持docker的linux系统。 13 | 主要能力: 14 | 裁剪的最小化的系统 15 | A、B系统无痛升级 16 | 支持Docker 17 | 集群管理能力(fleet) 18 | 分布式工具/服务发现(etcd) 19 | coreUpdate服务 20 | 提供了patch更新服务。管理一组服务器。 21 | 22 | Enterprise registry 23 | 提供了dockerhub的docker仓库服务。 24 | https://quay.io/ 25 | 核心功能: 26 | 提供了web管理能力。 27 | 提供基于team的增强权限管理能力。 28 | 提供了完整的操作审计能力。 29 | 30 | 31 | atomic: 32 | 提供了一个基于fedora剪裁的Linux系统。(未来会提供centos版) 33 | 近期未增加新特性。 34 | 核心功能: 35 | 原子的升级回滚能力(基于ostree) 36 | 支持容器(基于docker) 37 | 提供了简单的webui,进行server管理。(基于cockpit) 38 | 提供编排管理能力(基于kubernetes) 39 | 分布式工具/服务发现(etcd) 40 | 41 | 42 | 43 | 》colo FT: 44 | COLO - Coarse Grain Lock Stepping 45 | Coarse Grain Lock Stepping是粗粒度虚拟机锁步实现的FT技术。 46 | 基于xen 的Remus FT进行实现。该技术由intel提出。 47 | 目前在xen4.5开发中追踪,但是4.5release中并未包含该特性。 48 | 49 | Colo的原理: 50 | Colo的两个虚拟机同时运行,client会将指令发送给两个虚拟机。对比虚拟机返回的 51 | 结果是否一致。结果一致,则继续运行;结果不一致则触发checkpoint。 52 | 53 | Colo目前只支持HVM的虚拟机。 54 | 目前存在一些问题,比如稳定性。 55 | 56 | Intel给出了一些与Remus的性能对比资料。 57 | 可以看出来性能与native的虚拟机基本一致。 58 | 在web benchmark上优于remu69%,postgresql benchmark上优于remus46%。 59 | 60 | http://www.docin.com/p-750602866.html 61 | http://wiki.xenproject.org/wiki/COLO_-_Coarse_Grain_Lock_Stepping 62 | http://lists.xenproject.org/archives/html/xen-devel/2014-06/msg02597.html 63 | 64 | 65 | 关联技术: 66 | qemu blockcolo 67 | 提供持续检查点的磁盘复制能力。有Fujitsu提出。 68 | http://wiki.qemu.org/Features/BlockReplication 69 | 70 | 71 | 72 | 》intel migration patch 73 | 74 | 主要改善有三点: 75 | 1. 迁移线程的优先级设置,专用CPU可设置。 76 | 2. 更新迁移时的算法,使用bytes计算downtime(之前使用页) 77 | 3. 压缩cache释放 78 | 79 | 根据intel的测试结果,downtime时间在500ms以内。 80 | patch,基于qemu1.7,未见合入社区: 81 | http://evaluation.s3.amazonaws.com/evals/migration_patches.tar.bz2 82 | 83 | 84 | 》ClickOS 85 | 高性能的虚拟化中间件平台,用于快速模块化处理和分析数据包(每秒数百万的包) 86 | 87 | 优点: 88 | 1)占用空间小(运行时5MB) 89 | 2)启动速度快(30毫秒) 90 | 3)性能好(10Gb/s线速,几乎所有尺寸的PKT,45微秒的延迟) 91 | 灵活性好 92 | 93 | 94 | 用途:可用于NFV场景 95 | 96 | 》 GPU虚拟化:XenGT 97 | XenGT是完全GPU虚拟化的解决方案。 98 | 优点: 99 | 1)性能好(GPU直通加速可达到接近native的性能) 100 | 2)功能完备(运行native图形栈来保证一致的用户视觉体验) 101 | 3)支持共享,可同时加速多个VM 102 | 弥补了直通设备(不能共享)和API转发(功能滞后)的不足。 103 | 104 | 用途:替换现有版本的GPU直通的实现,去掉当前的诸多约束。 105 | 106 | 》 mirage-os 107 | 一种构建安全和模块化的程序框架,可编译成XEN hypervisor下完全独立的单内核unikernel 108 | 优点: 109 | 1)生产系统最小化 110 | 虚拟机本身并不含有通用的操作系统,只是含有应用代码、运行环境和应用必须的OS工具等必备的,VM image文件变得更小,部署变得更快,更加易于维护。运行时可仅占数千字节 111 | 2)安全性好 112 | a. 没有多用户操作环境,没有外壳脚本,也没有庞大的实用工具库,只有让应用程序运行起来刚好的代码,操作环境专门化,减小了外部攻击面。 113 | b. 可构建应用为domU kernel,最大程度地减少上下文切换,同时domU的代码可用安全的语言写(非C语言)。 114 | 115 | 用途:用于构建安全、高性能的网络应用,来访问各种云、嵌入式和移动平台。 116 | -------------------------------------------------------------------------------- /OSF_trottle_migrate_vol.md: -------------------------------------------------------------------------------- 1 | Openstack卷迁移限速 2 | ----- 3 | 为Openstack基于主机copy迁移卷增加限速能力。 4 | 5 | 计划 6 | ------ 7 | |内容 | 进度| 8 | ----|----------------------|------| 9 | 0. |openstack能力/bp调查 | 完成| 10 | 1. |当前实现以及限速方法调查 | 完成| 11 | 2. |openstack实现原型|| 12 | 3. |BP提交|完成| 13 | 4. |代码提交、review|| 14 | 15 | 过程 16 | ------ 17 | ### 迁移命令 18 | ```shell 19 | [root@controller ~(keystone_admin)]# cinder help migrate 20 | usage: cinder migrate [--force-host-copy ] 21 | 22 | Migrate the volume to the new host. 23 | 24 | Positional arguments: 25 | ID of the volume to migrate 26 | Destination host 27 | 28 | Optional arguments: 29 | --force-host-copy 30 | Optional flag to force the use of the generic host- 31 | based migration mechanism, bypassing driver 32 | optimizations (Default=False). 33 | ``` 34 | 支持两种类型的迁移:一种是基于Host的通用迁移方式,一种是基于driver的优化迁移方式。 35 | 第二种方式可以利用存储本身的能力,实现更为高效的迁移。 36 | 通过接口cinder卷的os-migrate_volume接口实现迁移功能。 37 | 38 | ### 迁移处理流程 39 | 40 | > CLI/Web(1)-----rest req--->cinder API(2)-------->volume API(3)----rpc--->scheduler(4)--rpc-->volume manager(5) 41 | 42 | 1. CLI/Web产生卷的os-migrate_volume操作消息。 43 | 2. API层获取rest消息,提取消息内容 44 | 3. 过滤有快照的卷(不支持迁移),检查host有效性(可用,与源host不是一个) 45 | 4. 进行filter过滤确定host适合迁移 46 | 5. 对--force-host-copy为true的情况,使用_migrate_volume_generic函数。 47 | 对--force-host-copy为false的情况,使用cinder driver的migrate_volume接口。 48 | 49 | >_migrate_volume_generic函数处理过程: 50 | 51 | 1. 在remote host上创建volume 52 | 2. copy volume 53 | a. 卷被挂载在正在运行的虚拟机上:利用虚拟机存储迁移功能 54 | b. 卷未被挂载在正在运行的虚拟机上:参考driver的copy_volume_data接口,内部为dd命令拷贝卷(volume_utils.copy_volume) 55 | 56 | ### dd限速手段(利用pv工具) 57 | 可以使用pv工具进行限速。 58 | ```shell 59 | [root@controller ~(keystone_admin)]# dd if=/dev/sda | pv -L 3k |dd of=/home/bigfile 60 | ^C24kB 0:00:08 [3.02kB/s] [ <=> ] 61 | 记录了2+82 的读入 62 | 记录了50+0 的写出 63 | 25600字节(26 kB)已复制,8.3499 秒,3.1 kB/秒 64 | ``` 65 | 66 | ### python中多级管道的例子 67 | ```python 68 | [root@controller pipe]# more testpipe.py 69 | import subprocess 70 | 71 | if __name__=="__main__": 72 | ddpipe = subprocess.Popen( ["-c", "dd if=/dev/vda count=100 bs=512 | pv -L 3k | dd of=/home/bigfile" ], 73 | stdin= subprocess.PIPE, shell=True ) 74 | ddpipe.communicate( "input data\n" ) 75 | ddpipe.wait() 76 | 77 | [root@controller pipe]# more testpipe2.py 78 | import subprocess 79 | 80 | if __name__=="__main__": 81 | child1 = subprocess.Popen(["dd", "if=/dev/vda", "bs=512", "count=100"], stdout=subprocess.PIPE) 82 | child2 = subprocess.Popen(["pv", "-L", "3k"], stdin=child1.stdout, stdout=subprocess.PIPE) 83 | child3 = subprocess.Popen(["dd", "of=/home/bigfile"], stdin=child2.stdout) 84 | out = child3.communicate() 85 | 86 | ``` 87 | 88 | ### 限速值如何传递 89 | 主要有三种方案: 90 | 1. 通过接口传入 91 | 2. 通过volume metadata设置 92 | 3. 通过配置文件设置 93 | 94 | 备注: 95 | 1. 是否有跨存储类型的迁移? 96 | 97 | -------------------------------------------------------------------------------- /OS_tricks.md: -------------------------------------------------------------------------------- 1 | openstack tricks 2 | --- 3 | 4 | ###使用curl发送消息: 5 | + [root@controller ~(keystone_admin)]# nova --debug image-create 6c2504f4-efa9-47ec-b6f4-06a9fde8a00b nova_100_new_01 6 | + 获取token: 7 | ```xml 8 | curl -i http://186.100.8.214:35357/v2.0/tokens -X POST -H "Content-Type: application/json" -H "Accept: application/json" -H "User-Agent: python-novaclient" -d '{"auth": {"tenantName": "admin", "passwordCredentials": {"username": "admin", "password": "admin"}}}' 9 | ``` 10 | + 获取虚拟机信息: 11 | ```xml 12 | curl -i http://186.100.8.214:8774/v2/86196260e1694d0cbb5049cfba3883f8/servers/6c2504f4-efa9-47ec-b6f4-06a9fde8a00b -X GET -H "X-Auth-Project-Id: admin" -H "User-Agent: python-novaclient" -H "Accept: application/json" -H "X-Auth-Token: " 13 | ``` 14 | + 创建image: 15 | ```xml 16 | curl -i http://186.100.8.214:8774/v2/86196260e1694d0cbb5049cfba3883f8/servers/6c2504f4-efa9-47ec-b6f4-06a9fde8a00b/action -X POST -H "X-Auth-Project-Id: admin" -H "User-Agent: python-novaclient" -H "Content-Type: application/json" -H "Accept: application/json" -H "X-Auth-Token: " -d '{"createImage": {"name": "nova_100_new_01", "metadata": {}}}' 17 | ``` 18 | 19 | + json可读显示 20 | ```xml 21 | curl命令 | python -mjson.tool 22 | ``` 23 | 24 | ###查看mysql数据库: 25 | + 登陆: 26 | $ mysql -uroot -p 27 | + 查询数据库: 28 | mysql>show databases; 29 | + 查看某个数据库: 30 | mysql>use database名; 31 | + 查看数据库中的表: 32 | mysql>show tables; 33 | + 查看表中的数据: 34 | mysql>select * from table名; 35 | + 查看表结构: 36 | mysql>desc table名; 37 | 38 | ###pdb调试 39 | 两种方式运行: 40 | + python -m pdb myscript.py 41 | + 代码中添加pdb 42 | ```python 43 | import pdb 44 | pdb.set_trace() 45 | ``` 46 | + openstack 47 | 可以使用上述方法2,添加2行代码。然后手工运行服务。 48 | pdb支持的指令以及指令详细用法可以通过help查看。 49 | 50 | ### pdb调试unit test 51 | 1. 如上增加pdb代码 52 | 2. 运行nosetests 53 | "nosetests volume/test_cinder.py --nocapture" 54 | 备注: 55 | 在unit test中增加打印代码,也要“--nocapture"才能正常打印。 56 | 57 | ### 邮件搜索 58 | http://openstack.markmail.org/ 59 | 60 | ### 单元测试 61 | ```shell 62 | nosetests want_test_file.name 63 | nosetests want_test_file.name:class.method 64 | ``` 65 | 解决proxy后run_tests.py运行失败的问题: 66 | ```shell 67 | pip install --upgrade -r test-requirements.txt 68 | pip install --upgrade -r requirements.txt 69 | 然手运行nosetest进行测试。 70 | ``` 71 | ``` 72 | 现在最新的运行单元测试的方法: 73 | tox -e py27 74 | tox -e pep8 75 | 安装tox时注意,1.7的tox存在bug,因此使用如下命令按照 76 | pip install --upgrade "tox>=1.6,<1.7" 77 | ``` 78 | 79 | ### 代码提交 80 | + 修改加提交代码流程 81 | git checkout -b 分知名(bp名或bug名) origin/master 82 | 修改代码 83 | git commit 84 | git commit --amend 85 | git review 86 | + 第n次修改代码过程 87 | 修改代码 88 | git commit 89 | git reabse -i HEAD~2 合并两次提交(squash新的commit) 90 | git review 91 | 92 | ### tempest 93 | http://www.ibm.com/developerworks/cn/cloud/library/1403_liuyu_openstacktempest/ 94 | 95 | ### 修改openstack所属公司 96 | https://review.openstack.org/#/c/87957/ 97 | 98 | ### os-update_readonly_flag 99 | ```shell 100 | curl -i http://186.100.8.138:8776/v1/60c9922640794828b62f1663682154c8/volumes/da4f85f3-df06-4065-a435-1eed077cb4be/action -X POST -H "X-Auth-Project-Id: admin" -H "User-Agent: python-cinderclient" -H "Content-Type: application/json" -H "Accept: application/json" -H "X-Auth-Token: token" -d '{"os-update_readonly_flag": {"readonly": true}}' 101 | ``` 102 | 103 | -------------------------------------------------------------------------------- /QF_mem_overcommit.md: -------------------------------------------------------------------------------- 1 | 内存超分配 2 | ----- 3 | #####透明页面共享 4 | + KSM 5 | [KSM]是Linux内核提供的一个功能,主要用于合并完全相同的内存页面从而提高内存使用率。 6 | 由于KVM虚拟机是Linux的一个进程,所以可以很方便的使用到该特性。从而提供内存超配的能力。 7 | - 确认KSM是否开启: 8 | ```shell 9 | KSM /boot/config-`uname –r` 10 | ``` 11 | - 内核参数目录:/sys/kernel/mm/ksm 12 | - 默认KSM可以监控2000个页面: 13 | ```shell 14 | cat /sys/kernel/mm/KSM/max_kernel_pages 15 | 2000 16 | ``` 17 | - KSM需要程序使用madvise函数申请内存。确认KVM编译包含了该能力。 18 | ``` c 19 | #ifdef MADV_MERGEABLE 20 | madvise(new_block->host, size, MADV_MERGEABLE); 21 | #endif 22 | ``` 23 | 24 | 25 | + UKSM 26 | UKSM是国人对KSM的改进。主要有透明的全页面扫描(KSM需要使用madvise函数申请的内存才会合并)。改进的扫描采样算法(部分Hash取样)。以及对不同内存区域采用不同的扫描频率等改进方式。 27 | UKSM以内核patch方式存在,需要重新编译内核。 28 | 控制接口在 /sys/kernel/mm/uksm中,参数如下: 29 | 30 | 文件名 |说明 | 31 | ----------------|---------------------------| 32 | run |控制uksmd启动,默认启动。0为关闭| 33 | cpu_governor |通过cat cpu_governor可以看到几种可选的模式和当前激活的模式,比如 [full] medium low quiet,这个说明当前采用的是全速扫描。这个几个扫描级别基本对应了 90%以上,50%,20% 和 < 1%的最大CPU占用控制以及对应的一些其它高级参数的微调。例:echo "medium" > cpu_governor| 34 | max_cpu_percentage|在已经使用了某个具体的cpu使用模式下,你可以进一步精确限制最大的cpu占用百分比。例:(最大为35%的最高CPU占用):echo 35 > max_cpu_percentage| 35 | 36 | 高级控制接口: 37 | 38 | 文件名 |说明 | 39 | ----------------|---------------------------| 40 | cpu_ratios |每个扫描级别的CPU占用率,以万分之一作为单位,或者以最高CPU占用作为参考。例(cat cpu_ratios): 50 75 MAX/4 MAX/1这个说明我当前的四个扫描级别的速度分别是0.5%,0.75%,最大扫描速度(max_cpu_percentage)的1/4和最大扫描速度,大部分时间在没有大量冗余内存的时候,uksmd对CPU的占用在 0.5%左右,top就看不出来了,我自己已经很满意了。| 41 | eval_intervals|四个扫描级别的采样周期大小,以毫秒为单位。如果是0的话,表明不对其采样,扫描完毕为止。这一般用在最高的扫描级别,即我们已经非常确信这里面有很多冗余页面。| 42 | abundant_threshold|一个区域有多少百分数的有效冗余页面,uksmd才会拔高它的扫描级别,缺省是10, 即只有当一个区域被发现超过10%的页面是冗余的时候,我们才会加速它的扫描。| 43 | 44 | 用户只读参数: 45 | 46 | 文件名 |说明 | 47 | ----------------|---------------------------| 48 | |full_scans |采样覆盖全部内存区域的次数。| 49 | |hash_strength| 自适应增量采样算法的当前的强度,值越低,那么当前合并的速度将会越快。| 50 | |pages_scanned |当前已经扫描了多少页面。| 51 | |pages_shared |有多少个不同的物理页面处在被共享的状态。| 52 | |pages_sharing |有多少个虚拟页面指向以上的共享页面,差不多可以等效看作你节省的内存。| 53 | |pages_unshared |有多少个不同的物理页面未处在被共享的状态。| 54 | |sleep_times |uksmd已经休眠了多少次。| 55 | 56 | 57 | #####内存气泡 58 | 内存气泡的原理非常简单,通过在guest中申请内存来进行guest内的释放,供其他虚拟机使用。 59 | + libvirt 60 | 61 | xml文件: 62 | ```xml 63 | 64 | ...... 65 | 66 | ...... 67 | 68 | ``` 69 | 70 | 设置(虚拟机分配内存-气球内存)大小,大小可以带单位,默认单位为k。 71 | ```shell 72 | virsh setmem DOMAIN_NAME SIZE 73 | 例如: 74 | virsh setmem win7 2G 75 | ``` 76 | 77 | 没有查看(虚拟机分配内存-气球内存)大小的virsh命令,但是可以使用: 78 | ```shell 79 | # virsh qemu-monitor-command --hmp win7 'info balloon' 80 | balloon: actual=4096 81 | ``` 82 | 83 | + qemu命令 84 | 85 | ballon设备: 86 | ```xml 87 | -device virtio-balloon-pci,id=DEVICE_ID 88 | ``` 89 | 查看虚拟机实际内存: 90 | ```xml 91 | (qemu) info balloon 92 | ``` 93 | 释放内存(设置气球大小,释放需要一个过程): 94 | ```xml 95 | (qemu) balloon SIZE 96 | ``` 97 | 98 | + 其他 99 | 关于[自动气泡],从多个层次都可以实现。比如hypervisor层或者更上层的管理系统实现。 100 | 101 | #####页面交换 102 | qemu-kvm虚拟机作为系统的进程存在,所使用的内存可以利用系统的swap能力进行换出。 103 | 不需要特别设置。 104 | 105 | #####页面压缩 106 | 未见支持。 107 | 108 | [KSM]:https://access.redhat.com/site/documentation/en-US/Red_Hat_Enterprise_Linux/6/html/Virtualization_Administration_Guide/chap-KSM.html 109 | [自动气泡]:http://lists.nongnu.org/archive/html/qemu-devel/2013-05/msg01295.html 110 | -------------------------------------------------------------------------------- /vmware/vmware_openstack.md: -------------------------------------------------------------------------------- 1 | ### VMware接入Openstack方案分析 2 | 在Openstack中Nova项目中目前有两个VMware相关的Driver(ESXDriver,VCDriver)。 3 | 从名字上可以清楚的看出来,一个是涉及ESX的Driver,一个是涉及VCenter的Driver。 4 | ESXDriver最早是由Citrix贡献的,VCDriver由Vmware提供。 5 | ESXDriver将ESX作为Hypervisor接入Openstack, VCDriver将Vcenter集群做为Hypervisor接入Openstack。 6 | ESXDriver方式导致的Vmware一些集群特性的丢失,VCDriver方式则解决了这些未能,当然也引入了一些新的问题(后续再说)。 7 | VCDriver更多的体现了Vmware与Openstack的互补,一方面是VMware现有的存量很大,而且很多企业应用并非按照云的思想开发;另一方面新的应用多以云的思想开发。两者互补满足用户需求,这也符合当前各厂商对混合云趋势的共识。 8 | 9 | ### ESXDriver 10 | ESXDriver与其他Hypervisor的接入方式略有差别。 11 | 主要有以下缺点: 12 | 与KVM等不同,VM跑在ESXi上,并非nova-compute所在节点。 13 | ESXDriver限制,每个nova-compute服务仅支持一台ESXi主机。 14 | 不支持VCenter上高级特性,比如DRS。 15 | ![ESXDriver](http://openstack-huawei.github.io/images/blog/openstack-vsphere/image007.png) 16 | ![nova_ESX](http://openstack-huawei.github.io/images/blog/openstack-vsphere/image009.png) 17 | ### VCDriver 18 | + 介绍 19 | 本文主要介绍VCDriver方式接入。这种方式将集群作为Hypervisor接入,自然就拥有了HA,DRS,VMotion能力。 20 | 目前每个compute节点只能同时支持一种hypervisor。 21 | Grizzly每个compute服务只能支持一个VCenter集群,Havana版本已经去除了这个限制。 22 | VCDriver中每个cluster都要有一个Datastore进行配置和使用。 23 | 由于cluster作为一个hypervisor整体呈现,也带来了资源跨ESXi节点的问题,具体来说就是作为Hypervisor整体呈现的CPU、内存资源很充足,但是创建虚拟机是发现任何一个节点的资源都不满足虚拟机需要的情况。 24 | + 接入图示 25 | ![VCDriver](http://openstack-huawei.github.io/images/blog/openstack-vsphere/image011.png) 26 | ![VCD_arch](http://varchitectthoughts.files.wordpress.com/2013/06/vsphere-with-nova-arch.jpeg) 27 | + 接入方法 28 | nova.conf文件的配置。(使用VCDriver将c1集群接入) 29 | ```xml 30 | [DEFAULT] 31 | compute_driver = vmwareapi.VMwareVCDriver 32 | [vmware] 33 | host_password = Huawei-123 34 | host_username = Administrator@vsphere.local 35 | host_ip = 186.100.21.221 36 | #datastore_regex = NOT DEFINED 37 | cluster_name = c1 #可以支持配置多个cluster 38 | ``` 39 | 解释: 40 | compute_driver指定所使用的Driver。 41 | host_password/username/ip 用于连接vcenter server。 42 | cluseter_name 指定所管理的Vmware集群,从Havana版开始可以指定多个。 43 | datastore_regex datastore配置格式,指定可以使用的datastore。 44 | 45 | + 镜像的使用 46 | 从上边图示部分可以看出,镜像从Glance上下载到Vmware的datastore上。 47 | 过程是在compute节点上调用glance API下载镜像然后使用VMware的API将镜像写到datastore上。 48 | 这样一个传输过程无疑是耗费compute资源并且低效的。 49 | Cinder中基于镜像创建卷过程与此类似,这里不再赘述。 50 | ```python 51 | #virt/vmwareapi/vmware_images.py 52 | def fetch_image(context, image, instance, **kwargs): 53 | """Download image from the glance image server.""" 54 | LOG.debug(_("Downloading image %s from glance image server") % image, 55 | instance=instance) 56 | (image_service, image_id) = glance.get_remote_image_service(context, image) 57 | metadata = image_service.show(context, image_id) 58 | file_size = int(metadata['size']) 59 | read_iter = image_service.download(context, image_id) 60 | read_file_handle = read_write_util.GlanceFileRead(read_iter) 61 | write_file_handle = read_write_util.VMwareHTTPWriteFile( 62 | kwargs.get("host"), 63 | kwargs.get("data_center_name"), 64 | kwargs.get("datastore_name"), 65 | kwargs.get("cookies"), 66 | kwargs.get("file_path"), 67 | file_size) 68 | start_transfer(context, read_file_handle, file_size, 69 | write_file_handle=write_file_handle) 70 | LOG.debug(_("Downloaded image %s from glance image server") % image, 71 | instance=instance) 72 | ``` 73 | 更加理想的方式,是将datastore作为glance的后端,这些创建虚拟机时就不用如此下载镜像。 74 | 目前社区已经有类似的BP设想。 75 | -------------------------------------------------------------------------------- /devstack/No_module_named_MySQLdb.md: -------------------------------------------------------------------------------- 1 | 现象: 2 |

 3 | 2015-01-13 05:25:41.002 | 11802 CRITICAL keystone [-] ImportError: No module named MySQLdb
 4 | 2015-01-13 05:25:41.002 | 11802 TRACE keystone Traceback (most recent call last):
 5 | 2015-01-13 05:25:41.002 | 11802 TRACE keystone   File "/opt/stack/keystone/bin/keystone-manage", line 44, in 
 6 | 2015-01-13 05:25:41.002 | 11802 TRACE keystone     cli.main(argv=sys.argv, config_files=config_files)
 7 | 2015-01-13 05:25:41.002 | 11802 TRACE keystone   File "/opt/stack/keystone/keystone/cli.py", line 307, in main
 8 | 2015-01-13 05:25:41.002 | 11802 TRACE keystone     CONF.command.cmd_class.main()
 9 | 2015-01-13 05:25:41.002 | 11802 TRACE keystone   File "/opt/stack/keystone/keystone/cli.py", line 74, in main
10 | 2015-01-13 05:25:41.002 | 11802 TRACE keystone     migration_helpers.sync_database_to_version(extension, version)
11 | 2015-01-13 05:25:41.002 | 11802 TRACE keystone   File "/opt/stack/keystone/keystone/common/sql/migration_helpers.py", line 204, in sync_database_to_version
12 | 2015-01-13 05:25:41.002 | 11802 TRACE keystone     _sync_common_repo(version)
13 | 2015-01-13 05:25:41.002 | 11802 TRACE keystone   File "/opt/stack/keystone/keystone/common/sql/migration_helpers.py", line 157, in _sync_common_repo
14 | 2015-01-13 05:25:41.002 | 11802 TRACE keystone     engine = sql.get_engine()
15 | 2015-01-13 05:25:41.002 | 11802 TRACE keystone   File "/opt/stack/keystone/keystone/common/sql/core.py", line 188, in get_engine
16 | 2015-01-13 05:25:41.002 | 11802 TRACE keystone     return _get_engine_facade().get_engine()
17 | 2015-01-13 05:25:41.002 | 11802 TRACE keystone   File "/opt/stack/keystone/keystone/common/sql/core.py", line 176, in _get_engine_facade
18 | 2015-01-13 05:25:41.002 | 11802 TRACE keystone     _engine_facade = db_session.EngineFacade.from_config(CONF)
19 | 2015-01-13 05:25:41.002 | 11802 TRACE keystone   File "/usr/lib/python2.7/site-packages/oslo/db/sqlalchemy/session.py", line 816, in from_config
20 | 2015-01-13 05:25:41.002 | 11802 TRACE keystone     retry_interval=conf.database.retry_interval)
21 | 2015-01-13 05:25:41.002 | 11802 TRACE keystone   File "/usr/lib/python2.7/site-packages/oslo/db/sqlalchemy/session.py", line 732, in __init__
22 | 2015-01-13 05:25:41.002 | 11802 TRACE keystone     **engine_kwargs)
23 | 2015-01-13 05:25:41.002 | 11802 TRACE keystone   File "/usr/lib/python2.7/site-packages/oslo/db/sqlalchemy/session.py", line 391, in create_engine
24 | 2015-01-13 05:25:41.002 | 11802 TRACE keystone     engine = sqlalchemy.create_engine(url, **engine_args)
25 | 2015-01-13 05:25:41.002 | 11802 TRACE keystone   File "/usr/lib64/python2.7/site-packages/sqlalchemy/engine/__init__.py", line 362, in create_engine
26 | 2015-01-13 05:25:41.002 | 11802 TRACE keystone     return strategy.create(*args, **kwargs)
27 | 2015-01-13 05:25:41.002 | 11802 TRACE keystone   File "/usr/lib64/python2.7/site-packages/sqlalchemy/engine/strategies.py", line 74, in create
28 | 2015-01-13 05:25:41.002 | 11802 TRACE keystone     dbapi = dialect_cls.dbapi(**dbapi_args)
29 | 2015-01-13 05:25:41.003 | 11802 TRACE keystone   File "/usr/lib64/python2.7/site-packages/sqlalchemy/connectors/mysqldb.py", line 64, in dbapi
30 | 2015-01-13 05:25:41.003 | 11802 TRACE keystone     return __import__('MySQLdb')
31 | 2015-01-13 05:25:41.003 | 11802 TRACE keystone ImportError: No module named MySQLdb
32 | 2015-01-13 05:25:41.003 | 11802 TRACE keystone
33 | 2015-01-13 05:25:41.038 | + exit_trap
34 | 2015-01-13 05:25:41.038 | + local r=1
35 | 
36 | 37 | 解决办法: 38 |

39 | yum install mariadb-devel.x86_64
40 | pip install MySQL-python
41 | 
42 | -------------------------------------------------------------------------------- /openstack/period_task.md: -------------------------------------------------------------------------------- 1 | openstack周期性任务浅析 2 | ------ 3 | 我想从以下几个方面分析openstack的周期性任务实现。 4 | #### 如何添加一个周期性任务 5 | 在模块的manger.py中增加periodic_task装饰的周期性函数。 6 | 每个调度周期运行一次: 7 | ```python 8 | @periodic_task.periodic_task 9 | def _instance_usage_audit(self, context): 10 | ... 11 | ``` 12 | 指定运行间隔运行: 13 | ```python 14 | @periodic_task.periodic_task( 15 | spacing=CONF.running_deleted_instance_poll_interval) 16 | def _cleanup_running_deleted_instances(self, context): 17 | ... 18 | ``` 19 | #### 周期性任务原理与实现 20 | + decorator中做了什么? 21 | 对周期性任务的参数进行初始配置。 22 | ```python 23 | def periodic_task(*args, **kwargs): 24 | def decorator(f): 25 | # Test for old style invocation 26 | if 'ticks_between_runs' in kwargs: 27 | raise InvalidPeriodicTaskArg(arg='ticks_between_runs') 28 | 29 | # Control if run at all 30 | f._periodic_task = True 31 | f._periodic_external_ok = kwargs.pop('external_process_ok', False) 32 | if f._periodic_external_ok and not CONF.run_external_periodic_tasks: 33 | f._periodic_enabled = False 34 | else: 35 | f._periodic_enabled = kwargs.pop('enabled', True) 36 | 37 | # Control frequency 38 | f._periodic_spacing = kwargs.pop('spacing', 0) 39 | f._periodic_immediate = kwargs.pop('run_immediately', False) 40 | if f._periodic_immediate: 41 | f._periodic_last_run = None 42 | else: 43 | f._periodic_last_run = timeutils.utcnow() 44 | return f 45 | ... 46 | ``` 47 | + 周期性任务如何被管理? 48 | 首先看类的继承关系: 49 | ```python 50 | class ComputeManager(manager.Manager): 51 | ... 52 | 53 | class Manager(base.Base, periodic_task.PeriodicTasks): 54 | ... 55 | 56 | class PeriodicTasks(object): 57 | ... 58 | ``` 59 | 周期性任务类只提供给了一个方法:运行周期性任务。 60 | ```python 61 | class PeriodicTasks(object): 62 | __metaclass__ = _PeriodicTasksMeta 63 | 64 | def run_periodic_tasks(self, context, raise_on_error=False): 65 | ... 66 | for task_name, task in self._periodic_tasks: 67 | #执行所有周期性任务 68 | ... 69 | ``` 70 | 由上我们可以看到,周期性任务类使用了元类_PeriodicTasksMeta。 71 | 在元类中做了什么呢? 72 | 我们可以看到在元类代码中,将所有周期性任务收集到_periodic_tasks列表中。 73 | 我们在上边周期性任务类中可以看到,也使用了该列表进行任务调度。 74 | ```python 75 | #periodic_task.py中元类_PeriodicTasksMeta 76 | ... 77 | for value in cls.__dict__.values(): 78 | if getattr(value, '_periodic_task', False): 79 | task = value 80 | name = task.__name__ 81 | ... 82 | cls._periodic_tasks.append((name, task)) 83 | ... 84 | ``` 85 | + 周期性任务如何被触发调度? 86 | 谁在调用run_periodic_tasks方法? 87 | service创建timer,定时触发周期性任务的调度。 88 | ```python 89 | #nova/service.py 90 | def start(self): 91 | ... 92 | self.tg.add_dynamic_timer(self.periodic_tasks, 93 | initial_delay=initial_delay, 94 | periodic_interval_max= 95 | self.periodic_interval_max) 96 | ... 97 | 98 | def periodic_tasks(self, raise_on_error=False): 99 | """Tasks to be run at a periodic interval.""" 100 | ctxt = context.get_admin_context() 101 | return self.manager.periodic_tasks(ctxt, raise_on_error=raise_on_error) 102 | ``` 103 | manager最终调用周期性任务类中的谁在调用run_periodic_tasks方法。 104 | ```python 105 | #nova/manager.py 106 | def periodic_tasks(self, context, raise_on_error=False): 107 | """Tasks to be run at a periodic interval.""" 108 | return self.run_periodic_tasks(context, raise_on_error=raise_on_error) 109 | ``` 110 | #### 写个例子 111 | ```python 112 | #nova/manager.py 113 | @periodic_task.periodic_task 114 | def _hello_world(self, context): 115 | LOG.debug(_("hello period task")) 116 | ``` 117 | #### 周期性任务的用途 118 | 1. 周期性审计、清理工作 119 | 2. 周期性状态刷新工作 120 | 3. 周期性进行过期处理 121 | 4. 其他 122 | -------------------------------------------------------------------------------- /openstack/test.md: -------------------------------------------------------------------------------- 1 | ### 组件一览 2 | + hacking 3 | 一组flake8插件,用于静态检查。 4 | https://pypi.python.org/pypi/hacking 5 | + coverage 6 | 衡量python代码覆盖率的工具。可以单独执行/API方式或者以nose插件方式运行“nosetests --with-coverage”。 7 | https://nose.readthedocs.org/en/latest/plugins/cover.html 8 | + discover 9 | 测试用例发现。(2.7已经包含在unittest中,2.4需要backport) 主要在run_test.sh下使用。 10 | https://pypi.python.org/pypi/discover/0.4.0 11 | + feedparser 12 | 使用python进行parse RSS订阅内容主要在version API的测试中使用(versionAPI支持atom格式返回信息) 13 | + MySQL-python 14 | mysql接口的python实现 15 | + psycopg2 16 | postgresql接口的python实现 17 | + pylint 18 | 对python进行静态分析、检查的工具 19 | + python-subunit 20 | subunit是测试结果的流协议。python-subunit是它的python实现。 21 | + sphinx 22 | 文档生成工具(基于Restructed格式) 23 | + oslosphinx 24 | openstack对sphinx的扩展 25 | + testrepository 26 | 测试结果的数据库。主要在覆盖率测试时使用。 27 | + ***mock*** 28 | 对所测试的函数的外部依赖函数进行模拟替换。3.3以后已经是python标准库。 29 | mock的实现原理也很简单,一般使用类似mokey patch的方式实现。 30 | + ***mox*** 31 | 基于java的easymock提供的python mock对象框架(基本上已经停止维护) 32 | Mox的执行流程: 33 | * Create mock (in record mode) 34 | * Set up expectations 35 | * Put mock into replay mode 36 | * Run test 37 | * Verify expected interactions with the mock occurred 38 | mox与mock功能类似,都是用来做函数或者类的mock。 39 | 40 | ``` 41 | Mock方法和属性: 42 | >>> # Mock 43 | >>> my_mock = mock.Mock() 44 | >>> my_mock.some_method.return_value = "calculated value" 45 | >>> my_mock.some_attribute = "value" 46 | >>> assertEqual("calculated value", my_mock.some_method()) 47 | >>> assertEqual("value", my_mock.some_attribute) 48 | 49 | >>> # Mox 50 | >>> my_mock = mox.MockAnything() 51 | >>> my_mock.some_method().AndReturn("calculated value") 52 | 'calculated value' 53 | >>> my_mock.some_attribute = "value" 54 | >>> mox.Replay(my_mock) 55 | >>> assertEqual("calculated value", my_mock.some_method()) 56 | >>> assertEqual("value", my_mock.some_attribute) 57 | 58 | 部分mock(对已有对象的某个方法进行mock): 59 | >>> # Mock 60 | >>> SomeObject.some_method = mock.Mock(return_value='value') 61 | >>> assertEqual("value", SomeObject.some_method()) 62 | 63 | >>> # Mox 64 | >>> my_mock = mox.MockObject(SomeObject) 65 | >>> my_mock.some_method().AndReturn("value") 66 | 'value' 67 | >>> mox.Replay(my_mock) 68 | >>> assertEqual("value", my_mock.some_method()) 69 | >>> mox.Verify(my_mock) 70 | 71 | 抛出异常: 72 | >>> # Mock 73 | >>> my_mock = mock.Mock() 74 | >>> my_mock.some_method.side_effect = SomeException("message") 75 | >>> assertRaises(SomeException, my_mock.some_method) 76 | 77 | >>> # Mox 78 | >>> my_mock = mox.MockAnything() 79 | >>> my_mock.some_method().AndRaise(SomeException("message")) 80 | >>> mox.Replay(my_mock) 81 | >>> assertRaises(SomeException, my_mock.some_method) 82 | >>> mox.Verify(my_mock) 83 | 84 | ``` 85 | + ***fixtures*** 86 | 翻译为“夹具”,顾名思义提供了状态重用等的抽象机制。 87 | ``` 88 | ---------------myfixture.py----------------------- 89 | import testtools 90 | import unittest 91 | import fixtures 92 | class NoddyFixture(fixtures.Fixture): 93 | def setUp(self): 94 | super(NoddyFixture, self).setUp() 95 | self.frobnozzle = 42 96 | self.addCleanup(delattr, self, 'frobnozzle') 97 | 98 | 99 | class NoddyTest(testtools.TestCase, fixtures.TestWithFixtures): 100 | def test_example(self): 101 | fixture = self.useFixture(NoddyFixture()) 102 | self.assertEqual(42, fixture.frobnozzle) 103 | 104 | result = unittest.TestResult() 105 | _ = NoddyTest('test_example').run(result) 106 | print (result.wasSuccessful()) 107 | 108 | -----------------运行结果------------------------ 109 | [root@centoo65 data]# python myfixtures.py 110 | True 111 | 112 | -----------常用fixture------------------------- 113 | >>> import fixtures 114 | >>> a = fixtures.TempDir() 115 | >>> a.setUp() 116 | >>> print a.path 117 | /tmp/tmpWB8EmF 118 | >>> quit() 119 | ---------------------------------------------- 120 | 其他参见PolicyFixture 121 | ``` 122 | + ***testtools*** 123 | 对python标准单元测试框架的扩展。为什么使用? 124 | + 更好的断言 比如支持assertThat扩展 125 | + 更详细的debug信息 比如支持addDetails的信息 126 | + 扩展的同时保持兼容性 127 | + python多版本的兼容性 128 | + ***tox*** 129 | 通用的虚拟环境管理和测试命令行工具。 130 | 配置可以看工程下的tox.ini文件。tox.ini可以通过tox-quickstart生成。 131 | 命令执行,如:“tox -e py26", "tox -e pep8" 132 | 执行单元测试的时候,顺便生成单元测试报告,并检查测试覆盖率,并生成覆盖率报告。直接执行tox是不行的,只能进行单元测试,需要给tox增加扩展参数,如下:tox -- --cover-erase -- --with-coverage -- --cover-html 133 | 134 | 135 | ### 类说明 136 | 顶级目录test.py中: 137 | test.TestCase继承于testtools.TestCase。 138 | test.NoDBTestCase继承于test.TestCase。 139 | 140 | test.TestCase中大量使用了fixture对环境进行初始化。(比如DB,Policy等) 141 | ### 实例 142 | 以增加虚拟机多状态查询API为例,需要增加哪些测试项目呢? 143 | 144 | 145 | 146 | -------------------------------------------------------------------------------- /openstack/install_nova_docker.md: -------------------------------------------------------------------------------- 1 | [root@0ff2335e41d6 nova-docker]# python setup.py install 2 | Download error on https://pypi.python.org/simple/pbr/: [Errno 8] _ssl.c:504: EOF occurred in violation of protocol -- Some packages may not be found! 3 | Couldn't find index page for 'pbr' (maybe misspelled?) 4 | Download error on https://pypi.python.org/simple/: [Errno 8] _ssl.c:504: EOF occurred in violation of protocol -- Some packages may not be found! 5 | No local packages or download links found for pbr>=0.5.21,<1.0 6 | Traceback (most recent call last): 7 | File "setup.py", line 22, in 8 | pbr=True) 9 | File "/usr/lib64/python2.7/distutils/core.py", line 112, in setup 10 | _setup_distribution = dist = klass(attrs) 11 | File "/usr/lib/python2.7/site-packages/setuptools/dist.py", line 265, in __init__ 12 | self.fetch_build_eggs(attrs.pop('setup_requires')) 13 | File "/usr/lib/python2.7/site-packages/setuptools/dist.py", line 289, in fetch_build_eggs 14 | parse_requirements(requires), installer=self.fetch_build_egg 15 | File "/usr/lib/python2.7/site-packages/pkg_resources.py", line 618, in resolve 16 | dist = best[req.key] = env.best_match(req, self, installer) 17 | File "/usr/lib/python2.7/site-packages/pkg_resources.py", line 862, in best_match 18 | return self.obtain(req, installer) # try and download/install 19 | File "/usr/lib/python2.7/site-packages/pkg_resources.py", line 874, in obtain 20 | return installer(requirement) 21 | File "/usr/lib/python2.7/site-packages/setuptools/dist.py", line 339, in fetch_build_egg 22 | return cmd.easy_install(req) 23 | File "/usr/lib/python2.7/site-packages/setuptools/command/easy_install.py", line 617, in easy_install 24 | raise DistutilsError(msg) 25 | distutils.errors.DistutilsError: Could not find suitable distribution for Requirement.parse('pbr>=0.5.21,<1.0') 26 | 27 | 28 | 添加ssl key证书,配置pip仓库为国内仓库。 29 | 30 | 31 | [root@A-172 nova-docker-stable-juno]# python /root/nova-docker-stable-juno/setup.py install 32 | ERROR:root:Error parsing 33 | Traceback (most recent call last): 34 | File "/usr/lib/python2.7/site-packages/pbr/core.py", line 104, in pbr 35 | attrs = util.cfg_to_args(path) 36 | File "/usr/lib/python2.7/site-packages/pbr/util.py", line 238, in cfg_to_args 37 | pbr.hooks.setup_hook(config) 38 | File "/usr/lib/python2.7/site-packages/pbr/hooks/__init__.py", line 27, in setup_hook 39 | metadata_config.run() 40 | File "/usr/lib/python2.7/site-packages/pbr/hooks/base.py", line 29, in run 41 | self.hook() 42 | File "/usr/lib/python2.7/site-packages/pbr/hooks/metadata.py", line 28, in hook 43 | self.config['name'], self.config.get('version', None)) 44 | File "/usr/lib/python2.7/site-packages/pbr/packaging.py", line 861, in get_version 45 | version = _get_version_from_git(pre_version) 46 | File "/usr/lib/python2.7/site-packages/pbr/packaging.py", line 802, in _get_version_from_git 47 | git_dir = _get_git_directory() 48 | File "/usr/lib/python2.7/site-packages/pbr/packaging.py", line 215, in _get_git_directory 49 | return _run_shell_command(['git', 'rev-parse', '--git-dir']) 50 | File "/usr/lib/python2.7/site-packages/pbr/packaging.py", line 204, in _run_shell_command 51 | env=newenv) 52 | File "/usr/lib64/python2.7/subprocess.py", line 711, in __init__ 53 | errread, errwrite) 54 | File "/usr/lib64/python2.7/subprocess.py", line 1308, in _execute_child 55 | raise child_exception 56 | OSError: [Errno 2] No such file or directory 57 | error in setup command: Error parsing /root/nova-docker-stable-juno/setup.cfg: OSError: [Errno 2] No such file or directory 58 | 59 | 60 | 升级PBR版本从0.10.0到0.10.7 61 | 62 | 63 | [root@A-172 nova-docker-stable-juno]# pip list |grep pbr 64 | pbr (0.10.7) 65 | [root@A-172 nova-docker-stable-juno]# python setup.py install 66 | ERROR:root:Error parsing 67 | Traceback (most recent call last): 68 | File "/usr/lib/python2.7/site-packages/pbr/core.py", line 104, in pbr 69 | attrs = util.cfg_to_args(path) 70 | File "/usr/lib/python2.7/site-packages/pbr/util.py", line 238, in cfg_to_args 71 | pbr.hooks.setup_hook(config) 72 | File "/usr/lib/python2.7/site-packages/pbr/hooks/__init__.py", line 27, in setup_hook 73 | metadata_config.run() 74 | File "/usr/lib/python2.7/site-packages/pbr/hooks/base.py", line 29, in run 75 | self.hook() 76 | File "/usr/lib/python2.7/site-packages/pbr/hooks/metadata.py", line 28, in hook 77 | self.config['name'], self.config.get('version', None)) 78 | File "/usr/lib/python2.7/site-packages/pbr/packaging.py", line 554, in get_version 79 | raise Exception("Versioning for this project requires either an sdist" 80 | Exception: Versioning for this project requires either an sdist tarball, or access to an upstream git repository. Are you sure that git is installed? 81 | error in setup command: Error parsing /root/nova-docker-stable-juno/setup.cfg: Exception: Versioning for this project requires either an sdist tarball, or access to an upstream git repository. Are you sure that git is installed? 82 | 83 | 安装git. 84 | 使用使用最新版juno代码。 85 | -------------------------------------------------------------------------------- /QF_vm_snapshot.md: -------------------------------------------------------------------------------- 1 | ***组织的不好,待更新*** 2 | 快照分类 3 | ----- 4 | + 磁盘快照 5 | 对磁盘数据进行快照。主要用于虚拟机备份等场合。 6 | + 按快照信息保存为可以可以分为: 7 | + 内置快照 8 | 快照数据和base磁盘数据放在一个qcow2文件中。 9 | + 外置快照 10 | 快照数据单独的qcow2文件存放。 11 | + 按虚拟机状态可以分为: 12 | + 关机态快照 13 | 数据可以保证一致性。 14 | + 运行态快照 15 | 数据无法保证一致性,类似与系统crash后的磁盘数据。使用时可能需要fsck等操作。 16 | + 按磁盘数量可以分为 17 | + 单盘 18 | 单盘快照不涉及原子性。 19 | + 多盘 20 | 涉及原子性。主要分两个方面:1.是所有盘快照点相同 2.所有盘要么都快照成功,要么都快照失败。 21 | 主要依赖于qemu的transaction实现。 22 | 23 | + 内存快照 24 | 对虚拟机的内存/设备信息进行保存。该机制同时用于休眠恢复,迁移等场景。 25 | 主要使用virsh save(qemu migrate to file)实现。 26 | 只能对运行态的虚拟机进行。 27 | 28 | + 检查点快照 29 | 同时保存虚拟机的磁盘快照和内存快照。用于将虚拟机恢复到某个时间点。可以保证数据的一致性。 30 | 31 | 32 | 内置快照 33 | ----- 34 | ### 利用qemu-img 35 | ```shell 36 | qemu-img snapshot -c snapshot01 test.qcow2 //创建 37 | qemu-img snapshot -l test.qcow2 //查看 38 | qemu-img snapshot -a snapshot01 test.qcow2 //revert到快照点 39 | qemu-img snapshot -d snapshot01 test.qcow2 //删除 40 | 41 | ``` 42 | ### 利用Libvirt 43 | ```xml 44 | snapshot.xml 45 | 46 | snapshot01 47 | Snapshot of OS install and updates by boh 48 | 49 | 50 | 51 | 52 | 53 | 54 | virsh snapshot-create controller snapshot.xml //创建快照。快照元信息在/var/lib/libvirt/qemu/snapshot/(destroy后丢失) 55 | virsh snapshot-list controller --tree //树形查看快照。 56 | virsh snapshot-current controller //查看当前快照 57 | virsh snapshot-revert controller snapshot02 //恢复快照 58 | virsh snapshot-delete controller snapshot02 //删除快照 59 | 60 | 功能参数: 61 | --quiesce quiesce guest's file systems 62 | --atomic require atomic operation 63 | 64 | ``` 65 | 66 | 外置快照 67 | ------ 68 | ### 利用qemu-img 69 | + 关机态 70 | 可以利用qcow2的backing_file创建。 71 | ```shell 72 | qemu-img create -f qcow2 -b base.qcow2 snapshot.qcow2 73 | ``` 74 | + 运行态 75 | 可以利用qemu的snapshot_blkdev命令。(为了数据一致性,可以使用guest-fsfreeze-freeze和guest-fsfreeze-thaw进行文件系统的冻结解冻结操作) 76 | 多盘可以利用qemu的transaction实现atomic。 77 | 78 | + 磁盘快照链关系显示 79 | ```shell 80 | [root@localhost data]# qemu-img info --backing-chain snapshot.qcow2 --output=json 81 | [ 82 | { 83 | "virtual-size": 1073741824, 84 | "filename": "snapshot.qcow2", 85 | "cluster-size": 65536, 86 | "format": "qcow2", 87 | "actual-size": 200704, 88 | "backing-filename": "base.qcow2", 89 | "dirty-flag": false 90 | }, 91 | { 92 | "virtual-size": 1073741824, 93 | "filename": "base.qcow2", 94 | "cluster-size": 65536, 95 | "format": "qcow2", 96 | "actual-size": 139264, 97 | "dirty-flag": false 98 | } 99 | ] 100 | ``` 101 | ### 利用libvirt 102 | + 创建 103 | ```shell 104 | virsh snapshot-create-as --domain f17-base snap1 snap1-desc \ 105 | --disk-only --diskspec vda,snapshot=external,file=/export/vmimages/sn1-of-f17-base.qcow2 \ 106 | --atomic 107 | # virsh domblklist f17-base 108 | Target Source 109 | ---------------------------------------------------- 110 | vda /export/vmimages/sn1-of-f17-base.qcow2 111 | ``` 112 | + 删除(快照链缩短) 113 | 外置快照的删除,相对于内置快照稍显复杂。 114 | 主要利用blockcommit或者blockpull来实现。 115 | blockcommit是向base方向合并,blockpull则相反。 116 | ```shell 117 | virsh blockcommit --domain f17 vda --base /export/vmimages/sn2.qcow2 --top /export/vmimages/sn3.qcow2 --wait --verbose 118 | 119 | #只支持pull到最前端 120 | virsh blockpull --domain RootBase --path /var/lib/libvirt/images/active.qcow2 \ 121 | --base /var/lib/libvirt/images/RootBase.qcow2 --wait --verbose 122 | virsh snapshot-delete --domain RootBase Snap-3 --metadata #删除无用的快照 123 | 124 | ``` 125 | ### 其他方法 126 | 利用LVM创建。利用文件系统能力创建。利用存储本身的功能创建。 127 | 128 | 实现原理 129 | -------- 130 | ### qemu 131 | 内置快照:利用qcow2中的L1 table进行实现。 132 | 外置快照:只是在qcow2中的头部记录下backingfile。 133 | 内存快照:通过qemu命令savemvm实现,内部通过qemu_savevm_state函数实现(也是migration的基础设施)。 134 | ```c 135 | void do_savevm(Monitor *mon, const QDict *qdict) 136 | { 137 | BlockDriverState *bs, *bs1; 138 | ... 139 | ret = qemu_savevm_state(f); 140 | ... 141 | ``` 142 | ### libvirt 143 | 144 | 145 | ### 参考 146 | [Atomic Snapshots of Multiple Devices]:http://wiki.qemu.org/Features/SnapshotsMultipleDevices 147 | [Snapshots]:http://wiki.qemu.org/Features/Snapshots 148 | [Libvirt snapshot]:http://wiki.libvirt.org/page/Snapshots 149 | [Fedora virt snapshot]:https://fedoraproject.org/wiki/Features/Virt_Live_Snapshots 150 | [Libvirt live snapshot]:http://kashyapc.com/2012/09/14/externaland-live-snapshots-with-libvirt/ 151 | [kvm快照浅析]:http://itxx.sinaapp.com/blog/content/130 152 | [1]:http://blog.sina.com.cn/s/blog_53ab41fd01013rc0.html 153 | [2]:http://blog.csdn.net/gg296231363/article/details/6899533 154 | [libvirt snapshot讲的最好]:http://libvirt.org/formatsnapshot.html 155 | 156 | ```shell 157 | #libvirt的虚拟机快照实现过程: 158 | optionally - use the guest-agent to tell the guest OS to quiesce I/O 159 | tell qemu to migrate guest memory to file; qemu pauses guest 160 | for each disk: 161 | tell qemu to pause disk image modifications for that disk 162 | libvirt resumes qemu (but I/O is still frozen) 163 | for each disk: 164 | libvirt creates the snapshot 165 | if the snapshot involves updating the backing image used by qemu: 166 | pass qemu the new fd for the disk image 167 | tell qemu to resume disk I/O on that disk 168 | 169 | #虚拟机快照恢复实现过程: 170 | 171 | for each disk: 172 | revert back to disk snapshot point 173 | tell qemu to do incoming migration from file 174 | ``` 175 | -------------------------------------------------------------------------------- /QF_pci_passthrough_hotplug.md: -------------------------------------------------------------------------------- 1 | pci passthrough 2 | ---- 3 | + 概念 4 | - 允许guest排他使用host上的某个PCI设备,就像将该设备物理连接到guest上一样。 5 | + 使用场景 6 | - 提升性能(如直通网卡和显卡) 7 | - 降低延迟(避免数据丢失或丢祯) 8 | - 直接利用bare-metal上设备的驱动 9 | + 用法[1] 10 | 需要CPU支持VT-d。主板也支持该技术。 11 | - 预先配置: 12 | + 打开bios中的VT-d设置。 13 | + 激活kernel中参数配置 14 | ```kernel /vmlinuz-2.6.18-190.el5 ro root=/dev/VolGroup00/LogVol00 rhgb quiet intel_iommu=on``` 15 | - 直通配置方法 16 | + libvirt 17 | ``` 18 | 1. 识别设备 19 | # virsh nodedev-list --tree |grep pci 20 | 2. 获取设备xml 21 | ```# virsh nodedev-dumpxml pci_8086_3a6c``` 22 | 3. detach设备 23 | ```# virsh nodedev-dettach pci_8086_3a6c``` 24 | 4. 修改虚拟机xml文件(将dumpxml查询到的bus,slot,function填入) 25 | 26 | ...... 27 | 28 | 29 |
30 | 31 | 32 | ...... 33 | 34 | 5. 启动虚拟机 35 | ``` 36 | + qemu 37 | ``` 38 | 1. unbind pci设备 39 | modprobe pci_stub 40 | lspci -D -nn查询pci设备(domain,slot,bus,function)和(vendor id, device id ) 41 | 以设备(01:00.0, vendor & device ID 8086:10b9)为例: 42 | echo "8086 10b9" > /sys/bus/pci/drivers/pci-stub/new_id 43 | echo 0000:01:00.0 > /sys/bus/pci/devices/0000:01:00.0/driver/unbind 44 | echo 0000:01:00.0 > /sys/bus/pci/drivers/pci-stub/bind 45 | 2. 启动虚拟机 46 | -device pci-assign,host=01:00.0 47 | ``` 48 | + 如何将直通设备对应 49 | host上直通设备与虚拟机中设备对应关系确定方法。 50 | 可以通过hostdev中增加address(不是source中的address)确定设备在虚拟机中的挂载路径。 51 | 虚拟机种通过lspci查看即可对应起来。 52 | 53 | http://www.linux-kvm.org/page/How_to_assign_devices_with_VT-d_in_KVM 54 | 55 | pci passthrough(VFIO)[2] 56 | ---- 57 | VFIO在kernel3.6/qemu1.4以后支持,目前只支持PCI设备。 58 | VFIO是一套用户态驱动框架,提供两种基本服务: 59 | + 向用户态提供设备访问接口 60 | + 向用户态提供配置IOMMU接口 61 | 62 | VFIO可以用于实现高效的用户态驱动。在虚拟化场景可以用于device passthrough。 63 | 通过用户态配置IOMMU接口,可以将DMA地址空间映射限制在进程虚拟空间中。 64 | 这对高性能驱动和虚拟化场景device passthrough尤其重要。 65 | 66 | 相对于传统方式,VFIO对UEFI支持更好。 67 | VFIO技术实现了用户空间直接访问设备。无须root特权,更安全,功能更多。 68 | http://lwn.net/Articles/509153/ 69 | http://lwn.net/Articles/474088/ 70 | https://www.ibm.com/developerworks/community/blogs/5144904d-5d75-45ed-9d2b-cf1754ee936a/entry/vfio?lang=en 71 | 72 | + 操作方法 73 | + 安装kernel module 74 | sudo modprobe vfio 75 | sudo modprobe vfio-pci 76 | + 设备unbind 77 | ``` 78 | 1. 查看iommu_group及其下所有设备 79 | cd /sys/bus/pci/devices/0000:0d:00.0/ 80 | readlink iommu_group #查看iommu_group名字 81 | ll iommu_group/devices #查看iommu_group下设备 82 | 2. 需要将iommu_group下所有设备unbind并添加到iommu_group中 83 | echo 0000:0d:00.0 > /sys/bus/pci/devices/0000:0d:00.0/driver/unbind 84 | echo 1180 e823 > /sys/bus/pci/drivers/vfio-pci/new_id 85 | ``` 86 | + 启动虚拟机 87 | ``` 88 | -device vfio-pci,host=0000:03:00.0 89 | ``` 90 | 参考http://blog.csdn.net/richardysteven/article/details/9008971 91 | pci hotplug 92 | ---- 93 | + [应用场景] 94 | 1. 可服务性:移除、替换已经故障的硬件。 95 | 2. 能力管理:增加更多的硬件、或者在多个虚拟机之间平衡硬件资源。 96 | 3. 增添资源来在硬件之间迁移虚拟化层。 97 | 4. 虚拟机上虚拟设备的热拔插。 98 | 99 | + 问题 100 | 1. 如何查看vm中的pci设备与host的pic设备的关系? 101 | 2. pci hotplug对flavor的影响?对计费的影响?rebuild/evalute时如何处理丢失? 102 | 103 | + test 104 | 105 | IOMMU 106 | ---- 107 | ![IOMMU](http://c.hiphotos.baidu.com/baike/w%3D268/sign=c02c322ea8d3fd1f3609a53c084f25ce/d31b0ef41bd5ad6e9f63c5ea81cb39dbb6fd3c13.jpg) 108 | IOMMU:input/output memory management unit。 109 | 连接DMA io bus和主存,完成从设备虚拟地址到物理地址的映射。以及提供对故障设备的内存保护的功能。 110 | + 优点 111 | - 由于IOMMU的映射,可以将多个不连续的物理地址映射为大块连续的地址供设备使用,便于简化驱动设计 112 | - 使旧设备(32bit设备)可以使用高位地址。(可以改善内存使用,提高性能) 113 | - 内存保护,避免设备使用不属于它的地址 114 | - 提供硬件中断remapping功能 115 | + 缺点 116 | - 地址转换和管理开销带来的性能降级 117 | - 消耗物理内存 118 | + 虚拟化中的应用 119 | 一般来说,由于内存地址不同,虚拟机中的操作系统无法直接访问host上的设备。 120 | 通过IOMMU,可以将设备地址在虚拟机中和host中映射为相同的支持,供虚拟机使用。这种做法也可以缓解IO delay。 121 | 122 | VMDQ[3] 123 | ---- 124 | Virtual Machine Device Queues[4]。 125 | ![VMDQ](http://windowsitpro.com/content/content/142153/networkoptimizationvmdqsriovsml.jpg) 126 | 根据图示可以看出VMDQ将原来VMM中L2 virtual switch实现的功能通过硬件实现。 127 | VMM只需要进行数据复制即可使用。降低了VMM的开销,提供了吞吐能力。 128 | VMware的NetQueue同样也利用了VMDq技术,实现了两倍以上的吞吐量提升 129 | 130 | SR-IOV则更加彻底,绕过了virtual switch。通过DMA将数据直接给虚拟机使用。性能更高。 131 | 132 | pci SR-IOV 133 | ---- 134 | Single Root I/O Virtualization 135 | SR-IOV解决软件模拟PCI设备效率低,直接将PCI设备直通又有扩展性问题(一个server上可以插的PCI卡数有限)。 136 | 通过硬件方式实现了PCI设备的虚拟化。 137 | #### SR-IOV 中的两种新功能类型是: 138 | 139 | + 物理功能 (Physical Function, PF) 140 | 用于支持 SR-IOV 功能的 PCI 功能,如 SR-IOV 规范中定义。PF 包含 SR-IOV 功能结构,用于管理 SR-IOV 功能。PF 是全功能的 PCIe 功能,可以像其他任何 PCIe 设备一样进行发现、管理和处理。PF 拥有完全配置资源,可以用于配置或控制 PCIe 设备。 141 | 142 | + 虚拟功能 (Virtual Function, VF) 143 | 与物理功能关联的一种功能。VF 是一种轻量级 PCIe 功能,可以与物理功能以及与同一物理功能关联的其他 VF 共享一个或多个物理资源。VF 仅允许拥有用于其自身行为的配置资源。 144 | 145 | #### 优点 146 | - 性能-从虚拟机环境直接访问硬件。 147 | - 成本降低-节省的资本和运营开销包括: 148 | + 节能 149 | + 减少了适配器数量 150 | + 简化了布线 151 | + 减少了交换机端口 152 | 153 | #### 缺点 154 | + 需要硬件支持(CPU,主板,网卡,OS) 155 | + 影响虚拟机迁移功能 156 | 157 | #### 使用(以intel 82576网卡为例) 158 | - bios打开vt-d 159 | - kernel启动参数(仅intel cpu需要)增加”intel_iommu=on" 160 | - 删除igb模块(modprobe -r igb) 161 | - 设置VF个数(modprobe igb max_vfs=2) 162 | - 可以看到有VF设备产生 163 | ```02:10.0 Ethernet controller: Intel Corporation 82576 Virtual Function (rev 01)``` 164 | - 使用VF设备进行PCI直通或者虚拟网卡 165 | 166 | 167 | 168 | [应用场景]:https://lists.linux-foundation.org/pipermail/hotplug_sig/2005-August/001202.html 169 | [1]:http://docs.fedoraproject.org/en-US/Fedora/13/html/Virtualization_Guide/chap-Virtualization-PCI_passthrough.html 170 | [2]:http://www.redhat.com/archives/libvir-list/2013-March/msg00514.html 171 | [3]:http://windowsitpro.com/virtualization/q-are-vmdq-and-sr-iov-performing-same-function 172 | [4]:http://www.intel.cn/content/www/cn/zh/virtualization/vmdq-technology-paper.html 173 | -------------------------------------------------------------------------------- /QF_numa.md: -------------------------------------------------------------------------------- 1 | Numa 2 | ----- 3 | ### 查看主机node情况 4 | + 使用virsh命令查看 5 | ```xml 6 | virsh # capabilities 7 | 8 | 9 | 10 | 8166976 11 | 12 | 13 | ... 14 | 15 | 16 | 17 | 18 | ``` 19 | + 使用numactl命令查看 20 | ```xml 21 | # numactl --hardware 22 | ``` 23 | Guest Numa 24 | ----- 25 | ### 设置guest numa topology 26 | qemu内部安装ACPI规范将node信息,topology信息防止在bios中供guest识别。 27 | guest识别numa topology的意义在于,guest中的OS可以更好的进行进程调度和内存分配。 28 | + libvirt 29 | ```xml 30 | 31 | 32 | 33 | 34 | 35 | 36 | 37 | ``` 38 | + qemu 39 | ```xml 40 | -smp 8,sockets=1,cores=4,threads=1 41 | -numa node,nodeid=0,cpus=0-3,mem=1000 -numa node,nodeid=1,cpus=4-7,mem=1000 42 | ``` 43 | + 确认方法 44 | ```shell 45 | guest中执行: 46 | grep "physical id" /proc/cpuinfo #查看socket 47 | grep "core id" /proc/cpuinfo #查看core 48 | grep "processor" /proc/cpuinfo #查看总cpu数 49 | numactl --hardware #查看numa node 50 | ``` 51 | 52 | 53 | CPU/内存[亲和性]设置 54 | ---- 55 | 进程的处理器亲和性(Processor Affinity),即是CPU的绑定设置,是指将进程绑定到特定的一个或多个CPU上去执行, 56 | 而不允许调度到其他的CPU上。 57 | 58 | 在虚拟化环境中,qemu的vcpu是作为线程存在的,可以对线程进行亲和性设置。 59 | 多数情况下,我们无需设置亲和性。但是某些特殊场合,比如需要确保CPU资源不被其他虚拟机负载影响, 60 | 可以设置CPU的亲和性。 61 | 62 | CPU亲和性由libvirt通过调用sched_setaffinity系统调用实现(如下以cpu热插中的代码为例),不需要在qemu层进行设置。 63 | ```c 64 | src/qemu/qemu_driver.c: 65 | static int qemuDomainHotplugVcpus(virQEMUDriverPtr driver, 66 | ¦ ¦ ¦ ¦ virDomainObjPtr vm, 67 | ¦ ¦ ¦ ¦ unsigned int nvcpus) 68 | { 69 | ... 70 | virProcessSetAffinity(cpupids[i], 71 | ... 72 | } 73 | src/util/virprocess.c: 74 | int virProcessSetAffinity(pid_t pid, virBitmapPtr map) 75 | { 76 | ... 77 | if (sched_setaffinity(pid, masklen, mask) < 0) { 78 | ... 79 | } 80 | ``` 81 | 82 | memory的亲和性也是由libvirt通过调用numa_set_membind函数实现(由libnuma.so提供,该so为numactl的库)。 83 | ```c 84 | int 85 | virNumaSetupMemoryPolicy(virNumaTuneDef numatune, 86 | ¦ ¦ ¦virBitmapPtr nodemask) 87 | { 88 | ... 89 | numa_set_membind(&mask); 90 | ... 91 | ``` 92 | 93 | 备注:可以使用taskset工具手工对线程设置亲和性。 94 | 95 | ### VCPU绑定物理核 96 | ```xml 97 | 4 98 | ``` 99 | 查看CPU绑定情况(其中28863为qemu的进程IP) 100 | ```shell 101 | #grep Cpus_allowed_list /proc/28863/task/*/status 102 | /proc/28863/task/28863/status:Cpus_allowed_list: 1-2 103 | /proc/28863/task/28864/status:Cpus_allowed_list: 1-2 104 | /proc/28863/task/28865/status:Cpus_allowed_list: 1-2 105 | /proc/28863/task/28866/status:Cpus_allowed_list: 1-2 106 | /proc/28863/task/28867/status:Cpus_allowed_list: 1-2 107 | ``` 108 | ### cputune 109 | cputune提供了精细的vcpu绑定设定,可以具体到每个vcpu设置。 110 | 而且提供vcpu能力的标准化,如quota,period,shares,可以用于实现cpu的Qos。 111 | ```xml 112 | 4 113 | 114 | 2048 115 | 1000000 116 | -1 117 | 118 | 119 | 120 | 121 | ``` 122 | ### memtune 123 | ```xml 124 | 125 | 126 | 127 | ``` 128 | 查看内存的设定情况:(其中18104为qemu的pid) 129 | ```shell 130 | #grep Mems_allowed_list /proc/18104/task/*/status 131 | /proc/18104/task/18104/status:Mems_allowed_list: 1 132 | /proc/18104/task/18105/status:Mems_allowed_list: 1 133 | /proc/18104/task/18106/status:Mems_allowed_list: 1 134 | /proc/18104/task/18114/status:Mems_allowed_list: 1 135 | ``` 136 | 137 | ### 动态修改 138 | + numa 139 | 可以使用virsh numatune进行动态修改。 140 | + cpu affinity 141 | 可以使用virsh vcpupin进行修改。 142 | + 设置emulator的cpu affinity 143 | 可以使用virsh emulatorpin进行修改。 144 | 145 | Libvirt/qemu社区关于numa的最新动态 146 | ----- 147 | + [Add support for binding guest numa nodes to host numa nodes] 148 | 社区review中。 149 | 提供了guest memory绑定策略的设置能力。 150 | 避免某些情况下由此导致的性能下降。 (比如PCI passthrough是设备DMA传输的情况?这点还是不太懂) 151 | qemu配置方法范例: 152 | ```shell 153 | -object memory-ram,size=512M,host-nodes=1,policy=membind,id=ram-node0 154 | -numa node,nodeid=0,cpus=0,memdev=ram-node0 155 | -object memory-ram,size=1024M,host-nodes=2-3,policy=interleave,id=ram-node1 156 | -numa node,nodeid=1,cpus=1,memdev=ram-node1 157 | ``` 158 | 159 | 160 | [Add support for binding guest numa nodes to host numa nodes]:https://lists.gnu.org/archive/html/qemu-devel/2013-12/msg00568.html 161 | [亲和性]:http://www.ibm.com/developerworks/cn/linux/l-affinity.html 162 | 163 | numa的一些缺点 164 | ------ 165 | 如果配置不当,可能不但无法获取高性能,反而有可能导致性能恶化。 166 | 167 | 另外numa与透明页共享的冲突,即由于页合并导致的跨node访问。 168 | vmware对此有专门优化,频繁访问的页面,在node上有页面副本,从而避免跨node访问带来的性能恶化。 169 | 170 | Qemu-kvm情况下,目前也有感知NUMA的KSM技术。需要通过内核参数***sysfs /sys/kernel/mm/ksm/merge_nodes***打开。 171 | 默认全页面合并,设置为0,则只有相同node的页面才会合并。 172 | 173 | [专门优化]:https://pubs.vmware.com/vsphere-50/index.jsp#com.vmware.vsphere.resmgmt.doc_50/GUID-6D818472-D683-410F-84C3-0C56C21F4459.html 174 | 175 | Vmware相关 176 | ------ 177 | Vmware支持CPU、内存的绑定,toppology的设置。 178 | 同时支持cpu、内存在node间的迁移。以及自动的平衡、[再平衡]策略。 179 | [再平衡]:https://pubs.vmware.com/vsphere-50/index.jsp#com.vmware.vsphere.resmgmt.doc_50/GUID-BD4A462D-5CDC-4483-968B-1DCF103C4208.html 180 | 181 | ### NUMA调优 182 | [NUMA调优]:https://access.redhat.com/site/documentation/en-US/Red_Hat_Enterprise_Linux/7-Beta/html-single/Virtualization_Tuning_and_Optimization_Guide/index.html 183 | + 使用内核AutoNuma 进行balance 184 | 关闭自动numa 185 | ```shell 186 | # echo NONUMA > /sys/kernel/debug/sched_features 187 | ``` 188 | 查看自动numa 189 | ```shell 190 | # cat /sys/kernel/debug/sched_features 191 | ``` 192 | 打开自动numa 193 | ```shell 194 | # echo 1 > /sys/kernel/mm/autonuma/enabled 195 | ``` 196 | 197 | -------------------------------------------------------------------------------- /openstack/defer_delete.md: -------------------------------------------------------------------------------- 1 | openstack中的延迟删除、软删除、删除保护 2 | ----- 3 | #### glance镜像的延迟删除 4 | + 用法 5 | glance-api.conf中打开延迟删除开关 6 | ``` xml 7 | # Turn on/off delayed delete 8 | delayed_delete = False 9 | 10 | # Delayed delete time in seconds 11 | scrub_time = 43200 12 | ``` 13 | 删除镜像fedora_s2。 14 | ``` 15 | [root@controller ~(keystone_admin)]# glance image-list 16 | +--------------------------------------+-----------+-------------+------------------+-------------+--------+ 17 | | ID | Name | Disk Format | Container Format | Size | Status | 18 | +--------------------------------------+-----------+-------------+------------------+-------------+--------+ 19 | | 42d61acd-1ab3-4a7e-a14e-68ad6ba75215 | centos | iso | bare | 358959104 | active | 20 | | a7f49865-0388-48f1-a547-f6f23066fb4f | centos_wc | raw | bare | 10737418240 | active | 21 | | f01af3f9-58c3-463d-bf66-fb58825466b4 | fedora_s2 | qcow2 | bare | 983629824 | active | 22 | +--------------------------------------+-----------+-------------+------------------+-------------+--------+ 23 | [root@controller ~(keystone_admin)]# glance image-delete fedora_s2 24 | [root@controller ~(keystone_admin)]# glance image-list 25 | +--------------------------------------+-----------+-------------+------------------+-------------+--------+ 26 | | ID | Name | Disk Format | Container Format | Size | Status | 27 | +--------------------------------------+-----------+-------------+------------------+-------------+--------+ 28 | | 42d61acd-1ab3-4a7e-a14e-68ad6ba75215 | centos | iso | bare | 358959104 | active | 29 | | a7f49865-0388-48f1-a547-f6f23066fb4f | centos_wc | raw | bare | 10737418240 | active | 30 | +--------------------------------------+-----------+-------------+------------------+-------------+--------+ 31 | ``` 32 | 查看数据库信息, fedora_s2的状态为pending_delete。 33 | ```shell 34 | +--------------------------------------+-----------+-----------+----------------+-----------+---------------------+---------------------+---------------------+---------+-------------+------------------+----------------------------------+----------------------------------+----------+---------+-----------+ 35 | | id | name | size | status | is_public | created_at | updated_at | deleted_at | deleted | disk_format | container_format | checksum | owner | min_disk | min_ram | protected | 36 | +--------------------------------------+-----------+-----------+----------------+-----------+---------------------+---------------------+---------------------+---------+-------------+------------------+----------------------------------+----------------------------------+----------+---------+-----------+ 37 | | f01af3f9-58c3-463d-bf66-fb58825466b4 | fedora_s2 | 983629824 | pending_delete | 0 | 2014-02-15 15:03:22 | 2014-04-10 17:51:53 | 2014-04-10 17:51:53 | 1 | qcow2 | bare | c5870838c1c85547d5b85084071db21a | 86196260e1694d0cbb5049cfba3883f8 | 20 | 2048 | 0 | 38 | +--------------------------------------+-----------+-----------+----------------+-----------+---------------------+---------------------+---------------------+---------+-------------+------------------+----------------------------------+----------------------------------+----------+---------+-----------+ 39 | 40 | ``` 41 | 42 | 备注:目前image找回功能的接口还在review中,目前仍不可用。 43 | + 实现原理 44 | 实现原理很简单。当打开延迟删除开关后,对image的删除不会立刻触发动作, 45 | 而只是记录的状态为pending_delete和删除时间。 46 | 另外glance有个scrubber的清理服务,会周期性检查pending_delete的image是否到期, 47 | 到期则进行删除动作。 48 | 49 | 50 | #### glance镜像的删除保护 51 | + 用法 52 | 设置镜像保护是个admin操作,操作方法见如下: 53 | ```shell 54 | [root@controller ~(keystone_admin)]# glance image-update --is-protected True centos_wc 55 | +------------------+--------------------------------------+ 56 | | Property | Value | 57 | +------------------+--------------------------------------+ 58 | | checksum | 2f7476ac2fe077979d2f0cda7640d1a8 | 59 | | container_format | bare | 60 | | created_at | 2014-04-03T10:45:19 | 61 | | deleted | False | 62 | | deleted_at | None | 63 | | disk_format | raw | 64 | | id | a7f49865-0388-48f1-a547-f6f23066fb4f | 65 | | is_public | False | 66 | | min_disk | 0 | 67 | | min_ram | 0 | 68 | | name | centos_wc | 69 | | owner | 86196260e1694d0cbb5049cfba3883f8 | 70 | | protected | True | 71 | | size | 10737418240 | 72 | | status | active | 73 | | updated_at | 2014-04-10T19:00:29 | 74 | +------------------+--------------------------------------+ 75 | [root@controller ~(keystone_admin)]# glance image-delete centos_wc 76 | Request returned failure status. 77 | 403 Forbidden 78 | Image is protected 79 | (HTTP 403): Unable to delete image centos_wc 80 | ``` 81 | + 实现原理 82 | 通过image的属性“protected”进行控制。 83 | 删除前检查该属性,未保护则可以删除。保护则不可以删除。 84 | 需要先将属性“protected”修改为“False“才能删除。 85 | 86 | #### nova虚拟机的软删除 87 | + 用法 88 | 通过nova.conf,设置回收已删除虚拟机的间隔。 89 | ```xml 90 | # Interval in seconds for reclaiming deleted instances 91 | # (integer value) 92 | #reclaim_instance_interval=0 93 | ``` 94 | 该值为0,则立刻删除。不为0,则为软删除。 95 | 在该时间到达前,可以通过API将虚拟机找回。 96 | 周期性任务_reclaim_queued_deletes会定期检查,真正删除已经到达时间的虚拟机。 97 | 98 | 相关API: 99 | ``` 100 | # 强制删除(会对虚拟机立刻删除) 101 | POST v2/​{tenant_id}​/servers/​{server_id}​/action 102 | { 103 | "forceDelete": null 104 | } 105 | 106 | # 找回 107 | POST v2/​{tenant_id}​/servers/​{server_id}​/action 108 | { 109 | "restore": null 110 | } 111 | ``` 112 | + 实现原理 113 | 实现原理比较简单,通过虚拟机数据库中的状态进行软删除控制。 114 | 通过定时任务进行虚拟机的删除。 115 | -------------------------------------------------------------------------------- /spf13.sh: -------------------------------------------------------------------------------- 1 | #!/usr/bin/env bash 2 | 3 | # Copyright 2014 Steve Francia 4 | # 5 | # Licensed under the Apache License, Version 2.0 (the "License"); 6 | # you may not use this file except in compliance with the License. 7 | # You may obtain a copy of the License at 8 | # 9 | # http://www.apache.org/licenses/LICENSE-2.0 10 | # 11 | # Unless required by applicable law or agreed to in writing, software 12 | # distributed under the License is distributed on an "AS IS" BASIS, 13 | # WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. 14 | # See the License for the specific language governing permissions and 15 | # limitations under the License. 16 | 17 | ############################ SETUP PARAMETERS 18 | app_name='spf13-vim' 19 | [ -z "$APP_PATH" ] && APP_PATH="$HOME/.spf13-vim-3" 20 | [ -z "$REPO_URI" ] && REPO_URI='https://github.com/spf13/spf13-vim.git' 21 | [ -z "$REPO_BRANCH" ] && REPO_BRANCH='3.0' 22 | debug_mode='0' 23 | fork_maintainer='0' 24 | [ -z "$VUNDLE_URI" ] && VUNDLE_URI="https://github.com/gmarik/vundle.git" 25 | 26 | ############################ BASIC SETUP TOOLS 27 | msg() { 28 | printf '%b\n' "$1" >&2 29 | } 30 | 31 | success() { 32 | if [ "$ret" -eq '0' ]; then 33 | msg "\33[32m[✔]\33[0m ${1}${2}" 34 | fi 35 | } 36 | 37 | error() { 38 | msg "\33[31m[✘]\33[0m ${1}${2}" 39 | exit 1 40 | } 41 | 42 | debug() { 43 | if [ "$debug_mode" -eq '1' ] && [ "$ret" -gt '1' ]; then 44 | msg "An error occurred in function \"${FUNCNAME[$i+1]}\" on line ${BASH_LINENO[$i+1]}, we're sorry for that." 45 | fi 46 | } 47 | 48 | program_exists() { 49 | local ret='0' 50 | command -v $1 >/dev/null 2>&1 || { local ret='1'; } 51 | 52 | # fail on non-zero return value 53 | if [ "$ret" -ne 0 ]; then 54 | return 1 55 | fi 56 | 57 | return 0 58 | } 59 | 60 | program_must_exist() { 61 | program_exists $1 62 | 63 | # throw error on non-zero return value 64 | if [ "$?" -ne 0 ]; then 65 | error "You must have '$1' installed to continue." 66 | fi 67 | } 68 | 69 | variable_set() { 70 | if [ -z "$1" ]; then 71 | error "You must have your HOME environmental variable set to continue." 72 | fi 73 | } 74 | 75 | lnif() { 76 | if [ -e "$1" ]; then 77 | ln -sf "$1" "$2" 78 | fi 79 | ret="$?" 80 | debug 81 | } 82 | 83 | ############################ SETUP FUNCTIONS 84 | 85 | do_backup() { 86 | if [ -e "$1" ] || [ -e "$2" ] || [ -e "$3" ]; then 87 | msg "Attempting to back up your original vim configuration." 88 | today=`date +%Y%m%d_%s` 89 | for i in "$1" "$2" "$3"; do 90 | [ -e "$i" ] && [ ! -L "$i" ] && mv -v "$i" "$i.$today"; 91 | done 92 | ret="$?" 93 | success "Your original vim configuration has been backed up." 94 | debug 95 | fi 96 | } 97 | 98 | sync_repo() { 99 | local repo_path="$1" 100 | local repo_uri="$2" 101 | local repo_branch="$3" 102 | local repo_name="$4" 103 | 104 | msg "Trying to update $repo_name" 105 | 106 | if [ ! -e "$repo_path" ]; then 107 | mkdir -p "$repo_path" 108 | git clone -b "$repo_branch" "$repo_uri" "$repo_path" 109 | ret="$?" 110 | success "Successfully cloned $repo_name." 111 | else 112 | cd "$repo_path" && git pull origin "$repo_branch" 113 | ret="$?" 114 | success "Successfully updated $repo_name" 115 | fi 116 | 117 | debug 118 | } 119 | 120 | create_symlinks() { 121 | local source_path="$1" 122 | local target_path="$2" 123 | 124 | lnif "$source_path/.vimrc" "$target_path/.vimrc" 125 | lnif "$source_path/.vimrc.bundles" "$target_path/.vimrc.bundles" 126 | lnif "$source_path/.vimrc.before" "$target_path/.vimrc.before" 127 | lnif "$source_path/.vim" "$target_path/.vim" 128 | 129 | if program_exists "nvim"; then 130 | lnif "$source_path/.vim" "$target_path/.config/nvim" 131 | lnif "$source_path/.vimrc" "$target_path/.config/nvim/init.vim" 132 | fi 133 | 134 | touch "$target_path/.vimrc.local" 135 | 136 | ret="$?" 137 | success "Setting up vim symlinks." 138 | debug 139 | } 140 | 141 | setup_fork_mode() { 142 | local source_path="$2" 143 | local target_path="$3" 144 | 145 | if [ "$1" -eq '1' ]; then 146 | touch "$target_path/.vimrc.fork" 147 | touch "$target_path/.vimrc.bundles.fork" 148 | touch "$target_path/.vimrc.before.fork" 149 | 150 | lnif "$source_path/.vimrc.fork" "$target_path/.vimrc.fork" 151 | lnif "$source_path/.vimrc.bundles.fork" "$target_path/.vimrc.bundles.fork" 152 | lnif "$source_path/.vimrc.before.fork" "$target_path/.vimrc.before.fork" 153 | 154 | ret="$?" 155 | success "Created fork maintainer files." 156 | debug 157 | fi 158 | } 159 | 160 | setup_vundle() { 161 | local system_shell="$SHELL" 162 | export SHELL='/bin/sh' 163 | 164 | vim \ 165 | -u "$1" \ 166 | "+set nomore" \ 167 | "+BundleInstall!" \ 168 | "+BundleClean" \ 169 | "+qall" 170 | 171 | export SHELL="$system_shell" 172 | 173 | success "Now updating/installing plugins using Vundle" 174 | debug 175 | } 176 | 177 | ############################ MAIN() 178 | variable_set "$HOME" 179 | program_must_exist "vim" 180 | program_must_exist "git" 181 | 182 | do_backup "$HOME/.vim" \ 183 | "$HOME/.vimrc" \ 184 | "$HOME/.gvimrc" 185 | 186 | sync_repo "$APP_PATH" \ 187 | "$REPO_URI" \ 188 | "$REPO_BRANCH" \ 189 | "$app_name" 190 | 191 | create_symlinks "$APP_PATH" \ 192 | "$HOME" 193 | 194 | setup_fork_mode "$fork_maintainer" \ 195 | "$APP_PATH" \ 196 | "$HOME" 197 | 198 | sync_repo "$HOME/.vim/bundle/vundle" \ 199 | "$VUNDLE_URI" \ 200 | "master" \ 201 | "vundle" 202 | 203 | setup_vundle "$APP_PATH/.vimrc.bundles.default" 204 | 205 | msg "\nThanks for installing $app_name." 206 | msg "© `date +%Y` http://vim.spf13.com/" 207 | -------------------------------------------------------------------------------- /QF_pci2.md: -------------------------------------------------------------------------------- 1 | 网卡 2 | From Coswiki 3 | Jump to: navigation, search 4 | 一、准备工作: 5 | 6 | 1、对于Intel CPU需要的准备操作: 7 | 1>主机host的BIOS需要打开Intel VT-d extensions选项。 8 | 2>在kernel中激活Intel VT-d 9 | 在/boot/grub2/grub.cfg文件中的kernel行的最后添加intel_iommu=on参数 10 | 例如: 11 | linux /vmlinuz-3.6.3-1.fc17.x86_64 root=/dev/mapper/vg_fedora-lv_root ro rd.md=0 rd.dm=0 SYSFONT=True rd.lvm.lv=v 12 | g_fedora/lv_swap rd.lvm.lv=vg_fedora/lv_root rd.luks=0 KEYTABLE=us-acentos LANG=en_US.UTF-8 rhgb quiet intel_iommu=on 13 | 2、对于AMD CPU的准备操作: 14 | 只需要在主机host的BIOS需要打开 AMD IOMMU extensions选项。 15 | 16 | 二、使用libvirt配置直通: 17 | 18 | 1、使用virsh nodedev-list命令查看当前host系统中所有的设备: 19 | # virsh nodedev-list --tree 20 | computer 21 | | 22 | +- net_lo_00_00_00_00_00_00 23 | +- net_p51p1_5_90_e2_ba_00_d1_c2 24 | +- net_p51p1_6_90_e2_ba_00_d1_c2 25 | +- net_p51p1_7_90_e2_ba_00_d1_c2 26 | +- net_virbr0_nic_52_54_00_e6_ce_81 27 | +- pci_0000_00_00_0 28 | +- pci_0000_00_01_0 29 | | | 30 | | +- pci_0000_01_00_0 31 | | | | 32 | | | +- net_p49p1_54_89_98_f6_f9_bd 33 | | | 34 | | +- pci_0000_01_00_1 35 | | | 36 | | +- net_p49p2_54_89_98_f6_f9_be 37 | | 38 | +- pci_0000_00_03_0 39 | | | 40 | | +- pci_0000_02_00_0 41 | | | | 42 | | | +- net_p51p1_90_e2_ba_00_d1_c2 43 | | | 44 | | +- pci_0000_02_00_1 45 | | | 46 | | +- net_p51p2_90_e2_ba_00_d1_c3 47 | | 48 | +- pci_0000_00_07_0 49 | | | 50 | | +- pci_0000_03_00_0 51 | | | | 52 | | | +- net_p55p1_90_e2_ba_00_cd_ee 53 | | | 54 | | +- pci_0000_03_00_1 55 | | | 56 | | +- net_p55p2_90_e2_ba_00_cd_ef 57 | ...... 58 | 也可以使用lspci命令进行设备确认: 59 | # lspci 60 | ...... 61 | 01:00.0 Ethernet controller: Broadcom Corporation NetXtreme II BCM5709 Gigabit Ethernet (rev 20) 62 | 01:00.1 Ethernet controller: Broadcom Corporation NetXtreme II BCM5709 Gigabit Ethernet (rev 20) 63 | 02:00.0 Ethernet controller: Intel Corporation 82576 Gigabit Network Connection (rev 01) 64 | 02:00.1 Ethernet controller: Intel Corporation 82576 Gigabit Network Connection (rev 01) 65 | 03:00.0 Ethernet controller: Intel Corporation 82576 Gigabit Network Connection (rev 01) 66 | 03:00.1 Ethernet controller: Intel Corporation 82576 Gigabit Network Connection (rev 01) 67 | ...... 68 | 69 | 2、查看设备详细信息,我们已pci_0000_03_00_0对应的网卡为例: 70 | # virsh nodedev-dumpxml pci_0000_03_00_0 71 | 72 | pci_0000_03_00_0 73 | pci_0000_00_07_0 74 | 75 | igb 76 | 77 | 78 | 0 79 | 3 80 | 0 81 | 0 82 | 82576 Gigabit Network Connection 83 | Intel Corporation 84 | 85 | 86 | 87 | 3、从主机中detach要被直通的PCI设备: 88 | # virsh nodedev-dettach pci_0000_03_00_0 89 | 90 | 4、在虚拟机xml中,添加如下内容,其中domain、bus、slot、function的值为virsh nodedev-dumpxml命令查询结果中的值,但是要将其从十进制转为十六进制: 91 | 92 | ...... 93 | 94 | 95 |
96 | 97 | 98 | ...... 99 | 100 | 101 | 5、启动虚拟机: 102 | # virsh create winxp.xml 103 | 104 | 6、在虚拟机中查看新增的pci设备。 105 | 三、使用libvirt热插拔PCI直通: 106 | 107 | 1、同上第1步 108 | 2、同上第2步 109 | 3、同上第3步 110 | 4、创建xml文件pci.xml。其内容如下,其中domain、bus、slot、function的值为virsh nodedev-dumpxml命令查询结果中的值,但是要将其从十进制转为十六进制: 111 | 112 | 113 |
114 | 115 | 116 | 5、使用virsh attach-device命令动态添加PCI设备: 117 | virsh attach-device 118 | 例如: 119 | virsh attach-device winxp pci.xml 120 | 6、在虚拟机中查看新增的PCI设备。 121 | 7、删除PCI设备: 122 | virsh attach-device 123 | 例如: 124 | virsh detach-device winxp pci.xml 125 | 四、使用qemu配置直通: 126 | 127 | 1、使用lspci命令进行设备确认: 128 | 使用lspci获得bus、slot、function的值(domain:bus:slot.function) 129 | # lspci -D 130 | ...... 131 | 0000:01:00.0 Ethernet controller: Broadcom Corporation NetXtreme II BCM5709 Gigabit Ethernet (rev 20) 132 | 0000:01:00.1 Ethernet controller: Broadcom Corporation NetXtreme II BCM5709 Gigabit Ethernet (rev 20) 133 | 0000:02:00.0 Ethernet controller: Intel Corporation 82576 Gigabit Network Connection (rev 01) 134 | 0000:02:00.1 Ethernet controller: Intel Corporation 82576 Gigabit Network Connection (rev 01) 135 | 0000:03:00.0 Ethernet controller: Intel Corporation 82576 Gigabit Network Connection (rev 01) 136 | 0000:03:00.1 Ethernet controller: Intel Corporation 82576 Gigabit Network Connection (rev 01) 137 | ...... 138 | 使用lspci -n根据(domain:bus:slot.function)获得对应PCI设备的(vendor id:product id) 139 | # lspci -D -n 140 | ...... 141 | 0000:01:00.0 0200: 14e4:1639 (rev 20) 142 | 0000:01:00.1 0200: 14e4:1639 (rev 20) 143 | 0000:02:00.0 0200: 8086:10c9 (rev 01) 144 | 0000:02:00.1 0200: 8086:10c9 (rev 01) 145 | 0000:03:00.0 0200: 8086:10c9 (rev 01) 146 | 0000:03:00.1 0200: 8086:10c9 (rev 01) 147 | ...... 148 | 也可直接使用lspci -nn命令获得PCI设备的(domain:bus:slot.function)和(vendor id:product id) 149 | # lspci -D -nn 150 | ...... 151 | 0000:01:00.0 Ethernet controller [0200]: Broadcom Corporation NetXtreme II BCM5709 Gigabit Ethernet [14e4:1639] (rev 20) 152 | 0000:01:00.1 Ethernet controller [0200]: Broadcom Corporation NetXtreme II BCM5709 Gigabit Ethernet [14e4:1639] (rev 20) 153 | 0000:02:00.0 Ethernet controller [0200]: Intel Corporation 82576 Gigabit Network Connection [8086:10c9] (rev 01) 154 | 0000:02:00.1 Ethernet controller [0200]: Intel Corporation 82576 Gigabit Network Connection [8086:10c9] (rev 01) 155 | 0000:03:00.0 Ethernet controller [0200]: Intel Corporation 82576 Gigabit Network Connection [8086:10c9] (rev 01) 156 | 0000:03:00.1 Ethernet controller [0200]: Intel Corporation 82576 Gigabit Network Connection [8086:10c9] (rev 01) 157 | ...... 158 | 159 | 160 | 2、从主机中detach要被直通的PCI设备: 161 | 以下以0000:03:00.0对应的网卡为例,其vendor id和product id为0x8086和0x10c9 162 | echo "8086 10c9" > /sys/bus/pci/drivers/pci-stub/new_id 163 | echo "0000:03:00.0" > /sys/bus/pci/drivers/igb/unbind 164 | echo "0000:03:00.0" > /sys/bus/pci/drivers/pci-stub/bind 165 | echo "8086 10c9" > /sys/bus/pci/drivers/pci-stub/remove_id 166 | 167 | 3、启动虚拟机: 168 | qemu-kvm -enable-kvm -m 1024 -smp 2 -boot c -drive file=/home/vm/winxp.qcow2,if=none,id=drive0,format=qcow2 -device virtio-blk-pci,scsi=off,drive=drive0,id=disk0 -monitor stdio -vnc 186.100.8.170:1 -device pci-assign,host=0000:03:00.0 169 | 五、使用qemu热插拔PCI直通: 170 | 171 | 1、同上面的第一步 172 | 2、同上面的第二步 173 | 3、启动虚拟机 174 | qemu-kvm -enable-kvm -m 1024 -smp 2 -boot c -drive file=/home/vm/winxp.qcow2,if=none,id=drive0,format=qcow2 -device virtio-blk-pci,scsi=off,drive=drive0,id=disk0 -monitor stdio -vnc 186.100.8.170:1 175 | 4、热插pci直通设备: 176 | device_add pci-assign,host=0000:03:00.0,id=new_pci_device 177 | 5、热拔pci直通设备: 178 | device_del new_pci_device 179 | -------------------------------------------------------------------------------- /OSF_snapshot.md: -------------------------------------------------------------------------------- 1 | Openstack快照 2 | ---- 3 | ###当前能力 4 | + 支持功能 5 | + 卷快照(支持一致性快照) 6 | + 虚拟机快照(支持冷快照和live snapshot with no downtime) 7 | + 卷快照 8 | ```shell 9 | cinder snapshot-create 10 | ``` 11 | 支持通过qemu-ga完成自动一致性操作(fsfreeze) 12 | + 虚拟机快照制作过程 13 | ```shell 14 | nova image-create 15 | ``` 16 | + 虚拟机[live snapshot]过程 17 | (QEMU 1.3+ and libvirt 1.0+ ) 18 | ```shell 19 | guest: 20 | sync #刷脏数据到磁盘 21 | fsfreeze -f #锁定文件系统 22 | host: 23 | nova image-create #创建快照 24 | guest: 25 | fsfreeze -u #解除锁定文件系统 26 | ``` 27 | + 当前限制 28 | openstack的虚拟机快照只快照root盘,不快照内存/CPU状态以及挂载磁盘。 29 | 挂载磁盘需要事先卸载磁盘(数据盘),然后进行快照,然后再挂载磁盘。 30 | 31 | + 虚拟机快照缺点: 32 | + 不支持revert恢复虚拟机到某一个快照点 33 | + 不支持内存快照 34 | + 只对系统盘进行快照 35 | + 没有快照链信息 36 | + 需要用户进行一致性操作 37 | + 不支持含元数据导出 38 | + 不支持含元数据导入 39 | + 只支持虚拟机全量数据快照(与快照的实现方式有关,因为是通过image进行保存的) 40 | + 快照以Image方式保存,而非以cinder卷方式保存 41 | + 过程较长(需要先通过存储快照,然后抽取并上传至glance)。 42 | + 无法充分利用存储本身能力加快快照的创建和使用 43 | 44 | + openstack的历史原因 45 | openstack目前的快照主要用于制作image,类似于vmware保存虚拟机状态的快照一致未提供。 46 | 社区反对的原因主要有: 47 | 1. 这应该是一种虚拟化技术的feature,不是云计算平台的feature 48 | 2. openstack由于底层要支持多种虚拟化的技术,某些虚拟化技术实现这种功能比较困难 49 | 3. 创建的VM state snapshot会面临cpu feature不兼容的问题 50 | 51 | 52 | + nova image-create的流程 53 | 一. 获取token(获取token接口) 54 | 二. 查询虚拟机状态(查询接口) 55 | 三. 创建虚拟机快照 56 | ```shell 57 | curl -i http://186.100.8.214:8774/v2/86196260e1694d0cbb5049cfba3883f8/servers/6c2504f4-efa-47ec-b6f4-06a9fde8a00b/action -X POST -H "X-Auth-Project-Id: admin" -H "User-Agent: python-novaclient" -H "Content-Type: application/json" -H "Accept: application/json" -H "X-Auth-Token: " -d '{"createImage": {"name": "nova_100_new_01", "metadata": {}}}' 58 | ``` 59 | 四. volume backed的虚拟机,使用compute_api.snapshot_volume_backed创建虚拟机快照;volume backed以外类型的虚拟机,调用compute_api.snapshot接口创建快照(最终实现在createImage接口) 60 | + createImage接口(创建虚拟机快照)流程 61 | 本质上利用了qemu block stream的能力(或者叫block pull)。 62 | ```shell 63 | 底层实现: 64 | a. 清理block设备上次的job信息 65 | [root@fedora170 data]# virsh blockjob test /data/test/test.qcow2 --abort 66 | error: Requested operation is not valid: No active operation on device: drive-virtio-disk0 67 | 68 | b. 创建基于block设备backing_file的qcow2文件 69 | [root@fedora170 data]# qemu-img create -f qcow2 -o backing_file=/data/test/test.qcow2,cluster_size=65536,size=20G /data/test/test.qcow2.delta 70 | Formatting '/data/test/test.qcow2.delta', fmt=qcow2 size=21474836480 backing_file='/data/test/test.qcow2' encryption=off cluster_size=65536 lazy_refcounts=off 71 | 72 | c. persist类型的虚拟机,进行undefine 73 | d. 将block数据拷贝到新做的qcow2文件上 74 | [root@fedora170 data]# virsh blockcopy test /data/test/test.qcow2 /data/test/test.qcow2.delta 0 --shallow --reuse-external 75 | Block Copy started 76 | 77 | e. 查询进度,等待block job完成 78 | [root@fedora170 data]# virsh blockjob test /data/test/test.qcow2 --info 79 | Block Copy: [100 %] 80 | 81 | f. 清理block设备上次的job信息 82 | [root@fedora170 data]# virsh blockjob test /data/test/test.qcow2 --abort 83 | 84 | g. persist类型的虚拟机,重新define 85 | h. 抽取整个block的数据到新的qcow2文件中(后续可以上传到glance上) 86 | [root@fedora170 data]# qemu-img convert -f qcow2 -O qcow2 -c /data/test/test.qcow2.delta /data/test/test_snapshot.qcow2 87 | ``` 88 | + compute_api.snapshot_volume_backed流程 89 | 底层利用driver能力进行volume的快照创建。 90 | 快照container的管理方式。 91 | ```xml 92 | $ glance show 64b5516d-f27e-4262-862e-cb6f39d3499b 93 | URI: http://186.100.8.144:9292/v1/images/64b5516d-f27e-4262-862e-cb6f39d3499b 94 | Id: 64b5516d-f27e-4262-862e-cb6f39d3499b 95 | Public: No 96 | Protected: No 97 | Name: volume_snapshot 98 | Status: active 99 | Size: 0 100 | Disk format: 101 | Container format: 102 | Minimum Ram Required (MB): 0 103 | Minimum Disk Required (GB): 0 104 | Owner: 507667477fd840e1a81c1ca7f6f54f69 105 | Property 'block_device_mapping': [{"instance_uuid": "fbcbe31e-b056-480e-8eab-852ee77defac", "virtual_name": null, "no_device": null, "connection_info": "{\"driver_volume_type\": \"iscsi\", \"serial\": \"70269f98-acf2-43e6-9564-91b824dfb5e4\", \"data\": {\"access_mode\": \"rw\", \"target_discovered\": false, \"encrypted\": false, \"qos_spec\": null, \"device_path\": \"/dev/disk/by-path/ip-186.100.8.144:3260-iscsi-iqn.2010-10.org.openstack:volume-70269f98-acf2-43e6-9564-91b824dfb5e4-lun-1\", \"target_iqn\": \"iqn.2010-10.org.openstack:volume-70269f98-acf2-43e6-9564-91b824dfb5e4\", \"target_portal\": \"186.100.8.144:3260\", \"volume_id\": \"70269f98-acf2-43e6-9564-91b824dfb5e4\", \"target_lun\": 1, \"auth_password\": \"LCJyaFWiokcQM6BX4VZk\", \"auth_username\": \"g5Nthj6bxnS7egxHa4Le\", \"auth_method\": \"CHAP\"}}", "created_at": "2014-03-05T08:44:22.000000", "snapshot_id": "8c547b26-8135-44c0-b2d6-718831ca7ee3", "updated_at": "2014-03-05T08:44:34.000000", "device_name": "vda", "deleted": 0, "volume_size": 1, "volume_id": null, "id": 93, "deleted_at": null, "delete_on_termination": false}] 106 | Property 'checksum': d972013792949d0d3ba628fbe8685bce 107 | Property 'min_ram': 512 108 | Property 'disk_format': qcow2 109 | Property 'image_name': cirros 110 | Property 'image_id': ad559bb4-31d5-469f-93b7-0a67546c4a96 111 | Property 'root_device_name': /dev/vda 112 | Property 'container_format': bare 113 | Property 'min_disk': 1 114 | Property 'size': 13147648 115 | Created at: 2014-03-05T08:52:46 116 | Updated at: 2014-03-05T08:52:46 117 | 118 | ``` 119 | 120 | 121 | ### 当前快照导入、导出方法 122 | + 虚拟机快照导出 123 | 1. 使用nova image-create创建虚拟机快照 124 | 2. 通过glance image-download --file filename.img导出虚拟机快照 125 | + 虚拟机快照导入 126 | 1. 通过glance image-create --file导入虚拟机快照 127 | [live snapshot]:http://docs.openstack.org/trunk/openstack-ops/content/snapshots.html 128 | 129 | 130 | ###虚拟机快照当前的BP 131 | - 包含内存、CPU状态等数据的快照。 132 | 该BP目前计划解决该问题(目前代码已经完成,在review中): 133 | https://blueprints.launchpad.net/nova/+spec/live-snapshot-vms 134 | 实现方式: 135 | 通过glance container来存储instance的root盘、内存快照、虚拟机xml信息等。 136 | 不足: 137 | 只提供基于image的虚拟机的live snapshot,而不提供基于volume的卷的live snapshot。 138 | 139 | - 虚拟机所有盘的快照。 140 | 该BP还在draft解决,完全没有开始: 141 | https://blueprints.launchpad.net/nova/+spec/instance-level-snapshots 142 | 143 | ###待完善 144 | + 快照树 145 | 目前虚拟机快照未保存快照链信息,只能知道时间先后顺序,无法知道快照关系。 146 | (因为是全量快照,暂时不需要。) 147 | + 导出包含metadata的image 148 | 便于后续重新导入image 149 | + 增量快照 150 | 虚拟机增量快照(与目前机制相差较大,影响大) 151 | 152 | ###其他 153 | openstack和版本对快照的思路略有不同。openstack因为存在镜像管理,所以虚拟机快照更多的是 154 | 通过镜像方式管理。而版本不存在镜像管理,更多的是通过存储来保存和使用镜像。 155 | 156 | ###BP列表 157 | + 在线虚拟机快照(包含内存、CPU状态) 开发中 Next 158 | https://blueprints.launchpad.net/nova/+spec/live-snapshot-vms 159 | + Live snapshot基础能力 完成 160 | https://blueprints.launchpad.net/nova/+spec/live-snapshots 161 | + libvirt无中断快照 完成 162 | https://blueprints.launchpad.net/nova/+spec/libvirt-live-snapshots 163 | + Qemu辅助卷快照(带内部VSS等?只支持一致性卷快照而非虚拟机) 完成 164 | https://blueprints.launchpad.net/nova/+spec/qemu-assisted-snapshots 165 | https://wiki.openstack.org/wiki/Cinder/GuestAssistedSnapshotting 166 | + Instacne全卷快照: draft阶段 167 | https://blueprints.launchpad.net/nova/+spec/instance-level-snapshots 168 | + Lined clone: draft阶段 169 | https://blueprints.launchpad.net/nova/+spec/linked-snapshot 170 | + 感觉像是利用linked clone快速clone虚拟机 171 | https://blueprints.launchpad.net/nova/+spec/nova-fast-snapshot 172 | + IBM一个哥们儿提的(关注) 173 | https://blueprints.launchpad.net/nova/+spec/driver-specific-snapshot 174 | + 带fsfreeze的快照实现 draft阶段 175 | https://blueprints.launchpad.net/nova/+spec/quiesced-image-snapshots-with-qemu-guest-agent 176 | 177 | + 关联的一个重要BP 178 | https://wiki.openstack.org/wiki/Raksha 179 | 180 | + 社区为什么不愿意加入vm snapshot功能 181 | http://blog.csdn.net/duan101101/article/details/19424479 182 | 183 | ###备注 184 | [1]: http://docs.openstack.org/user-guide/content/cli_manage_images.html#glance-image-list 185 | [2]: http://docs.openstack.org/trunk/openstack-ops/content/snapshots.html 186 | [3]: http://www.sebastien-han.fr/blog/2012/12/10/openstack-perform-consistent-snapshots/ 187 | [4]: http://docs.openstack.org/image-guide/content/ 188 | 189 | [底层原理过程]:http://kashyapc.com/tag/snapshots/ 190 | 191 | -------------------------------------------------------------------------------- /network.md: -------------------------------------------------------------------------------- 1 | 原文地址: https://blogs.oracle.com/ronen/entry/diving_into_openstack_network_architecture 2 | ### 前言 3 | openstack网络功能强大同时也相对更复杂。本系列文章通过Oracle OpenStack Tech 4 | Preview介绍openstack的配置,通过各种场景和例子说明openstack各种不同的网络组件。 5 | 本文的目的在于提供openstack网络架构的全景图并展示各个模块是如何一起协作的。这对openstack的初学者以及希望理解openstack网络原理的人会非常有帮助。 6 | 首先,我们先讲解下一些基础并举例说明。 7 | 8 | 根据最新的icehouse版用户调查,基于open vswitch插件的Neutron在生产环境和POC环境都被广泛使用,所以在这个系列的文章中我们主要分析这种openstack网络的配置。当然,我们知道openstack网络支持很多种配置,尽管neutron+open vswitch是最常用的配置,但是我们从未说它是最好或者最高效的一种方式。Neutron+open vswitch仅仅是一个例子,对任何希望理解openstack网络的人是一个很好的切入点。即使你打算使用其他类型的网络配置比如使用不同的neutron插件或者根本不使用neutron,这篇文章对你理解openstack网络仍是一个很好的开始。 9 | 10 | 我们在例子中使用的配置是Oracle OpenStack Tech Preview所提供的一种配置。安装它非常简单,并且它是一个很好的参考。在这种配置中,我们在所有服务器上使用eth2作为虚拟机的网络,所有虚拟机流量使用这个网卡。Oracle OpenStack Tech Preview使用VLAN进行L2隔离,进而提供租户和网络隔离,下图展示了我们如何进行配置和部署: 11 | ![setup2](https://blogs.oracle.com/ronen/resource/setup2.jpg) 12 | 13 | 第一篇文章会略长,我们将聚焦于openstack网络的一些基本概念。我们将讨论open vswitch、network namespaces、linux bridge、veth pairs等几个组件。注意这里不打算全面介绍这些组件,只是为了理解openstack网络架构。可以通过网络上的其他资源进一步了解这些组件。 14 | 15 | ### Open vSwitch (OVS) 16 | 在Oracle OpenStack Tech Preview中用于连接虚拟机和物理网口(如上例中的eth2),就像上边部署图所示。OVS包含bridages和ports,OVS bridges不同于与linux bridge(使用brctl命令创建)。让我们先看下OVS的结构,使用如下命令: 17 |

 18 | # ovs-vsctl show
 19 | 7ec51567-ab42-49e8-906d-b854309c9edf
 20 |     Bridge br-int
 21 |         Port br-int
 22 |             Interface br-int
 23 |                 type: internal
 24 |         Port "int-br-eth2"
 25 |             Interface "int-br-eth2"
 26 |     Bridge "br-eth2"
 27 |         Port "br-eth2"
 28 |             Interface "br-eth2"
 29 |                 type: internal
 30 |         Port "eth2"
 31 |             Interface "eth2"
 32 |         Port "phy-br-eth2"
 33 |             Interface "phy-br-eth2"
 34 | ovs_version: "1.11.0"
 35 | 
36 | 我们看到标准的部署在compute node上的OVS,拥有两个网桥,每个有若干相关联的port。上边的例子是在一个没有任何虚拟机的计算节点上。我们可以看到eth2连接到个叫br-eth2的网桥上,我们还看到两个叫“int-br-eth2"和”phy-br-eth2“的port,事实上是一个veth pair,作为虚拟网线连接两个bridages。我们会在后边讨论veth paris。 37 | 38 | 当我们创建一个虚拟机,br-int网桥上会创建一个port,这个port最终连接到虚拟机(我们会在后边讨论这个连接)。这里是启动一个虚拟机后的OVS结构: 39 |

 40 | # ovs-vsctl show
 41 | efd98c87-dc62-422d-8f73-a68c2a14e73d
 42 |     Bridge br-int
 43 |         Port "int-br-eth2"
 44 |             Interface "int-br-eth2"
 45 |         Port br-int
 46 |             Interface br-int
 47 |                 type: internal
 48 |         Port "qvocb64ea96-9f"
 49 |             tag: 1
 50 |             Interface "qvocb64ea96-9f"
 51 |     Bridge "br-eth2"
 52 |         Port "phy-br-eth2"
 53 |             Interface "phy-br-eth2"
 54 |         Port "br-eth2"
 55 |             Interface "br-eth2"
 56 |                 type: internal
 57 |         Port "eth2"
 58 |             Interface "eth2"
 59 | ovs_version: "1.11.0"
 60 | 
61 | ”br-int“网桥现在有了一个新的port"qvocb64ea96-9f" 连接VM,并且被标记为vlan1。虚拟机的每个网卡都需要对应在"br-int”网桥上创建一个port。 62 | 63 | OVS中另一个有用的命令是dump-flows,以下为例子: 64 |

 65 | # ovs-ofctl dump-flows br-int
 66 | NXST_FLOW reply (xid=0x4):
 67 | cookie=0x0, duration=735.544s, table=0, n_packets=70, n_bytes=9976,idle_age=17, priority=3,in_port=1,dl_vlan=1000 actions=mod_vlan_vid:1,NORMAL
 68 | cookie=0x0, duration=76679.786s, table=0, n_packets=0, n_bytes=0,idle_age=65534, hard_age=65534, priority=2,in_port=1 actions=drop
 69 | cookie=0x0, duration=76681.36s, table=0, n_packets=68, n_bytes=7950,idle_age=17, hard_age=65534, priority=1 actions=NORMAL
 70 | 
71 | 如上所述,VM相连的port使用了Vlan tag 1。然后虚拟机网络(eth2)上的port使用tag1000。OVS会修改VM和物理网口间所有package的vlan。在openstack中,OVS 72 | agent 控制open vswitch中的flows,用户不需要进行操作。如果你想了解更多的如何控制open vswitch中的流,可以参考http://openvswitch.org中对ovs-ofctl的描述。 73 | 74 | ### Network Namespaces (netns) 75 | 网络namespace是linux上一个很cool的特性,它的用途很多。在openstack网络中被广泛使用。网络namespace是拥有独立的网络配置隔离容器,并且该网络不能被其他名字空间看到。网络名字空间可以被用于封装特殊的网络功能或者在对网络服务隔离的同时完成一个复杂的网络设置。在Oracle OpenStack Tech Preview中我们使用最新的R3企业版内核,该内核提供给了对netns的完整支持。 76 | 77 | 通过如下例子我们展示如何使用netns命令控制网络namespaces。 78 | 定义一个新的namespace: 79 |

 80 | # ip netns add my-ns
 81 | # ip netns list
 82 | my-ns
 83 | 
84 | 我们说过namespace是一个隔离的容器,我们可以在namspace中进行各种操作,比如ifconfig命令。 85 |

 86 | # ip netns exec my-ns ifconfig -a
 87 | lo        Link encap:Local Loopback
 88 |           LOOPBACK  MTU:16436 Metric:1
 89 |           RX packets:0 errors:0 dropped:0 overruns:0 frame:0
 90 |           TX packets:0 errors:0 dropped:0 overruns:0 carrier:0
 91 | collisions:0 txqueuelen:0
 92 |           RX bytes:0 (0.0 b)  TX bytes:0 (0.0 b)
 93 | 
94 | 我们可以在namespace中运行任何命令,比如对debug非常有用的tcddump命令,我们使用ping、ssh、iptables命令。 95 | 连接namespace和外部: 96 | 连接到namespace和namespace直接连接的方式有很多,我们主要聚集在openstack中使用的方法。openstack使用了OVS和网络namespace的组合。OVS定义接口,然后我们将这些接口加入namespace中。 97 |

 98 | # ip netns exec my-ns ifconfig -a
 99 | lo        Link encap:Local Loopback
100 |           LOOPBACK  MTU:65536 Metric:1
101 |           RX packets:0 errors:0 dropped:0 overruns:0 frame:0
102 |           TX packets:0 errors:0 dropped:0 overruns:0 carrier:0
103 | collisions:0 txqueuelen:0
104 |           RX bytes:0 (0.0 b)  TX bytes:0 (0.0 b)
105 | 
106 | my-port   Link encap:Ethernet HWaddr 22:04:45:E2:85:21
107 |           BROADCAST  MTU:1500 Metric:1
108 |           RX packets:0 errors:0 dropped:0 overruns:0 frame:0
109 |           TX packets:0 errors:0 dropped:0 overruns:0 carrier:0
110 | collisions:0 txqueuelen:0
111 |           RX bytes:0 (0.0 b)  TX bytes:0 (0.0 b)
112 | 
113 | 现在我们可以增加更多的ports到OVS bridge,并且连接到其他namespace或者其他设备比如物理网卡。Neutron使用网络namespace来实现网络服务,如DHCP、routing、gateway、firewall、load balance等。下一篇文章我们会讨论更多细节 。 114 | 115 | ### Linux bridge and veth pairs 116 | Linux bridge用于连接OVS port和虚拟机。ports负责连通OVS bridge和linux bridge或者两者与虚拟机。linux bridage主要用于安全组增强。安全组通过iptables实现,iptables只能用于linux bridage而非OVS bridage。 117 | 118 | Veth对在openstack网络中大量使用,也是debug网络问题的很好工具。Veth对是一个简单的虚拟网线,所以一般成对出现。通常Veth对的一端连接到bridge,另一端连接到另一个bridge或者留下在作为一个网口使用。 119 | 120 | 这个例子中,我们将创建一些veth对,把他们连接到bridge上并测试联通性。这个例子用于通常的Linux服务器而非openstack节点: 121 | 创建一个veth对,注意我们定义了两端的名字: 122 |

123 | # ip link add veth0 type veth peer name veth1
124 | 
125 | # ifconfig -a
126 | 
127 | .
128 | 
129 | .
130 | 
131 | veth0     Link encap:Ethernet HWaddr 5E:2C:E6:03:D0:17
132 | 
133 |           BROADCAST MULTICAST  MTU:1500 Metric:1
134 | 
135 |           RX packets:0 errors:0 dropped:0 overruns:0 frame:0
136 | 
137 |           TX packets:0 errors:0 dropped:0 overruns:0 carrier:0
138 | 
139 | collisions:0 txqueuelen:1000
140 | 
141 |           RX bytes:0 (0.0 b)  TX bytes:0 (0.0 b)
142 | 
143 | veth1     Link encap:Ethernet HWaddr E6:B6:E2:6D:42:B8
144 | 
145 |           BROADCAST MULTICAST  MTU:1500 Metric:1
146 | 
147 |           RX packets:0 errors:0 dropped:0 overruns:0 frame:0
148 | 
149 |           TX packets:0 errors:0 dropped:0 overruns:0 carrier:0
150 | 
151 | collisions:0 txqueuelen:1000
152 | 
153 |           RX bytes:0 (0.0 b)  TX bytes:0 (0.0 b)
154 | 
155 | .
156 | 
157 | .
158 | 
159 | 160 | 为了让例子更有意义,我们将创建如下配置: 161 |

162 | veth0 => veth1 =>br-eth3 => eth3 ======> eth2 on another Linux server
163 | 
164 | br-eht3: 一个基本的Linux bridge,连接veth1和eth3 165 | eth3: 一个没有设定IP的物理网口,该网口连接着斯有网络 166 | eth2: 远端Linux服务器上的一个物理网口,连接着私有网络并且被配置了IP(50.50.50.1) 167 | 一旦我们创建了这个配置,我们将通过veth0 ping 50.50.50.1这个远端IP,从而测试网络联通性: 168 |

169 | 
170 | 
171 | # brctl addbr br-eth3
172 | 
173 | # brctl addif br-eth3 eth3
174 | 
175 | # brctl addif br-eth3 veth1
176 | 
177 | # brctl show
178 | 
179 | bridge name     bridge id               STP enabled     interfaces
180 | 
181 | br-eth3         8000.00505682e7f6       no              eth3
182 | 
183 |                                                         veth1
184 | 
185 | # ifconfig veth0 50.50.50.50
186 | 
187 | # ping -I veth0 50.50.50.51
188 | 
189 | PING 50.50.50.51 (50.50.50.51) from 50.50.50.50 veth0: 56(84) bytes of data.
190 | 
191 | 64 bytes from 50.50.50.51: icmp_seq=1 ttl=64 time=0.454 ms
192 | 
193 | 64 bytes from 50.50.50.51: icmp_seq=2 ttl=64 time=0.298 ms
194 | 
195 | 196 | 如果命名不像例子中这么显而易见,导致我们无法支持veth设备的两端,我们可以使用ethtool命令查询。ethtool命令返回index号,通过ip link命令查看对应的设备: 197 |

198 | # ethtool -S veth1
199 | 
200 | NIC statistics:
201 | 
202 | peer_ifindex: 12
203 | 
204 | # ip link
205 | 
206 | .
207 | 
208 | .
209 | 
210 | 12: veth0:  mtu 1500 qdisc pfifo_fast state UP qlen 1000
211 | 
212 | 213 | ### 总结 214 | 文章中,我们快速了解了OVS/网络namespaces/Linux bridges/veth对。这些组件在openstack网络架构中大量使用,理解这些组件有助于我们理解不同的网络场景。下篇文章中,我们会了解虚拟机之间/虚拟机与外部网络之间如何进行通信。 215 | -------------------------------------------------------------------------------- /network3.md: -------------------------------------------------------------------------------- 1 | ### 深入理解openstack网络架构(3)-----路由 2 | 前文中,我们学习了openstack网络使用的几个基本网络组件,并通过一些简单的use case解释网络如何连通的。本文中,我们会通过一个稍微复杂(其实仍然相当基本)的use case(两个网络间路由)探索网络的设置。 路由使用的组件与连通内部网络相同,使用namespace创建一个隔离的container,允许subnet间的网络包中转。 3 | 记住我们在第一篇文章中所说的,这只是使用OVS插件的例子。openstack还有很多插件使用不同的方式,我们提到的只是其中一种。 4 | 5 | ### Use case #4: Routing traffic between two isolated networks 6 | 现实中,我们会创建不同的网络用于不同的目的。我们也会需要把这些网络连接起来。因为两个网络在不同的IP段,我们需要router将他们连接起来。为了分析这种设置,我们创建另一个network(net2)并配置一个20.20.20.0/24的subnet。在创建这个network后,我们启动一个Oracle Linux的虚拟机,并连接到net2。下图是从OpenstackGUI上看到的网络拓扑图: 7 | ![two-networks](https://blogs.oracle.com/ronen/resource/openstack-routing/two-networks.png) 8 | 9 | 进一步探索,我们会在openstack网络节点上看到另一个namespace,这个namespace用于为新创建的网络提供服务。现在我们有两个namespace,每个network一个。 10 |

 11 | # ip netns list
 12 | qdhcp-63b7fcf2-e921-4011-8da9-5fc2444b42dd
 13 | qdhcp-5f833617-6179-4797-b7c0-7d420d84040c
 14 | 
15 | 可以通过nova net-list查看network的ID信息,或者使用UI查看网络信息。 16 |

 17 | # nova net-list
 18 | +--------------------------------------+-------+------+
 19 | | ID                                   | Label | CIDR |
 20 | +--------------------------------------+-------+------+
 21 | | 5f833617-6179-4797-b7c0-7d420d84040c | net1  | None |
 22 | | 63b7fcf2-e921-4011-8da9-5fc2444b42dd | net2  | None |
 23 | +--------------------------------------+-------+------+
 24 | 
25 | 26 | 我们新创建的network,net2有自己的namespace,这个namespace与net1是分离的。在namespace中,我们可以看到两个网络接口,一个local,一个是用于DHCP服务。 27 | 28 |

 29 | # ip netns exec qdhcp-63b7fcf2-e921-4011-8da9-5fc2444b42dd ip addr
 30 | 1: lo:  mtu 65536 qdisc noqueue state UNKNOWN
 31 |     link/loopback 00:00:00:00:00:00 brd 00:00:00:00:00:00
 32 |     inet 127.0.0.1/8 scope host lo
 33 |     inet6 ::1/128 scope host
 34 |        valid_lft forever preferred_lft forever
 35 | 19: tap16630347-45:  mtu 1500 qdisc noqueue state UNKNOWN
 36 |     link/ether fa:16:3e:bd:94:42 brd ff:ff:ff:ff:ff:ff
 37 |     inet 20.20.20.3/24 brd 20.20.20.255 scope global tap16630347-45
 38 |     inet6 fe80::f816:3eff:febd:9442/64 scope link
 39 |        valid_lft forever preferred_lft forever
 40 | 
41 | 42 | net1和net2两个network没有被联通,我们需要创建一个router,通过router将两个network联通。Openstack Neutron向用户提供了创建router并将两个或多个network连接的能力。router其实只是一个额外的namespace。 43 | 使用Neutron创建router可以通过GUI或者命令行操作: 44 |

 45 | # neutron router-create my-router
 46 | Created a new router:
 47 | +-----------------------+--------------------------------------+
 48 | | Field                 | Value                                |
 49 | +-----------------------+--------------------------------------+
 50 | | admin_state_up        | True                                 |
 51 | | external_gateway_info |                                      |
 52 | | id                    | fce64ebe-47f0-4846-b3af-9cf764f1ff11 |
 53 | | name                  | my-router                            |
 54 | | status                | ACTIVE                               |
 55 | | tenant_id             | 9796e5145ee546508939cd49ad59d51f     |
 56 | +-----------------------+--------------------------------------+
 57 | 
58 | 现在我们将两个netwrok通过router连接: 59 | 60 | 查看subnet的ID: 61 |

 62 | # neutron subnet-list
 63 | +--------------------------------------+------+---------------+------------------------------------------------+
 64 | | id                                   | name | cidr          | allocation_pools                               |
 65 | +--------------------------------------+------+---------------+------------------------------------------------+
 66 | | 2d7a0a58-0674-439a-ad23-d6471aaae9bc |      | 10.10.10.0/24 | {"start": "10.10.10.2", "end": "10.10.10.254"} |
 67 | | 4a176b4e-a9b2-4bd8-a2e3-2dbe1aeaf890 |      | 20.20.20.0/24 | {"start": "20.20.20.2", "end": "20.20.20.254"} |
 68 | +--------------------------------------+------+---------------+------------------------------------------------+
 69 | 
70 | 将subnet 10.10.10.0/24添加到router: 71 |

 72 | # neutron router-interface-add fce64ebe-47f0-4846-b3af-9cf764f1ff11 subnet=2d7a0a58-0674-439a-ad23-d6471aaae9bc
 73 | Added interface 0b7b0b40-f952-41dd-ad74-2c15a063243a to router fce64ebe-47f0-4846-b3af-9cf764f1ff11.
 74 | 
75 | 将subnet 20.20.20.0/24添加到router: 76 | 77 |

 78 | # neutron router-interface-add fce64ebe-47f0-4846-b3af-9cf764f1ff11 subnet=4a176b4e-a9b2-4bd8-a2e3-2dbe1aeaf890
 79 | Added interface dc290da0-0aa4-4d96-9085-1f894cf5b160 to router fce64ebe-47f0-4846-b3af-9cf764f1ff11.
 80 | 
81 | 82 | 此时,我们在查看网络拓扑会发现两个网络被router打通: 83 | ![networks-routed](https://blogs.oracle.com/ronen/resource/openstack-routing/networks-routed.png) 84 | 85 | 我们还可以发现两个网络接口连接到router,作为各自subnet的gateway。 86 | 87 | 我们可以看到为router创建的namespace。 88 |

 89 | # ip netns list
 90 | qrouter-fce64ebe-47f0-4846-b3af-9cf764f1ff11
 91 | qdhcp-63b7fcf2-e921-4011-8da9-5fc2444b42dd
 92 | qdhcp-5f833617-6179-4797-b7c0-7d420d84040c
 93 | 
94 | 我们进入namespace内部可以看到: 95 | 96 |

 97 | # ip netns exec qrouter-fce64ebe-47f0-4846-b3af-9cf764f1ff11 ip addr
 98 | 1: lo:  mtu 65536 qdisc noqueue state UNKNOWN
 99 |     link/loopback 00:00:00:00:00:00 brd 00:00:00:00:00:00
100 |     inet 127.0.0.1/8 scope host lo
101 |     inet6 ::1/128 scope host
102 |        valid_lft forever preferred_lft forever
103 | 20: qr-0b7b0b40-f9:  mtu 1500 qdisc noqueue state UNKNOWN
104 |     link/ether fa:16:3e:82:47:a6 brd ff:ff:ff:ff:ff:ff
105 |     inet 10.10.10.1/24 brd 10.10.10.255 scope global qr-0b7b0b40-f9
106 |     inet6 fe80::f816:3eff:fe82:47a6/64 scope link
107 |        valid_lft forever preferred_lft forever
108 | 21: qr-dc290da0-0a:  mtu 1500 qdisc noqueue state UNKNOWN
109 |     link/ether fa:16:3e:c7:7c:9c brd ff:ff:ff:ff:ff:ff
110 |     inet 20.20.20.1/24 brd 20.20.20.255 scope global qr-dc290da0-0a
111 |     inet6 fe80::f816:3eff:fec7:7c9c/64 scope link
112 |        valid_lft forever preferred_lft forever
113 | 
114 | 我们看到两个网络接口,“qr-dc290da0-0a“ 和 “qr-0b7b0b40-f9。这两个网络接口连接到OVS上,使用两个network/subnet的gateway IP。 115 | 116 |

117 | # ovs-vsctl show
118 | 8a069c7c-ea05-4375-93e2-b9fc9e4b3ca1
119 |     Bridge "br-eth2"
120 |         Port "br-eth2"
121 |             Interface "br-eth2"
122 |                 type: internal
123 |         Port "eth2"
124 |             Interface "eth2"
125 |         Port "phy-br-eth2"
126 |             Interface "phy-br-eth2"
127 |     Bridge br-ex
128 |         Port br-ex
129 |             Interface br-ex
130 |                 type: internal
131 |     Bridge br-int
132 |         Port "int-br-eth2"
133 |             Interface "int-br-eth2"
134 |         Port "qr-dc290da0-0a"
135 |             tag: 2
136 |             Interface "qr-dc290da0-0a"
137 |                 type: internal
138 |         Port "tap26c9b807-7c"
139 |             tag: 1
140 |             Interface "tap26c9b807-7c"
141 |                 type: internal
142 |         Port br-int
143 |             Interface br-int
144 |                 type: internal
145 |         Port "tap16630347-45"
146 |             tag: 2
147 |             Interface "tap16630347-45"
148 |                 type: internal
149 |         Port "qr-0b7b0b40-f9"
150 |             tag: 1
151 |             Interface "qr-0b7b0b40-f9"
152 |                 type: internal
153 |     ovs_version: "1.11.0"
154 | 
155 | 156 | 我们可以看到,这些接口连接到”br-int",并打上了所在network对应的VLAN标签。这里我们可以通过gateway地址(20.20.20.1)成功的ping通router namespace: 157 | 158 | ![ping-router](https://blogs.oracle.com/ronen/resource/openstack-routing/ping-router.png) 159 | 160 | 我们还可以看到IP地址为20.20.20.2可以ping通IP地址为10.10.10.2的虚拟机: 161 | 162 | ![ping-vm-to-vm](https://blogs.oracle.com/ronen/resource/openstack-routing/ping-vm-to-vm.png) 163 | 164 | 两个subnet通过namespace中的网络接口互相连通。在namespace中,Neutron将系统参数net.ipv4.ip_forward设置为1。 165 | 命令查看如下: 166 | 167 |

168 | # ip netns exec qrouter-fce64ebe-47f0-4846-b3af-9cf764f1ff11 sysctl net.ipv4.ip_forward
169 | net.ipv4.ip_forward = 1
170 | 
171 | 我们可以看到namespace中的系统参数net.ipv4.ip_forward被设置,这种设置不会对namespace外产生影响。 172 | 173 | ### 总结 174 | 创建router时,Neutron会创建一个叫qrouter-的namespace。subnets通过OVS的br-int网桥上的网络接口接入router。 175 | 网络接口被设置了正确的VLAN,从而可以连入它们对应的network。例子中,网络接口qr-0b7b0b40-f9的IP被设置为10.10.10.1,VLAN标签为1,它可以连接到“net1”。通过在namespace中设置系统参数net.ipv4.ip_forward为1,从而允许路由生效。 176 | 177 | 本文介绍了如何使用network namespace创建一个router。下一篇文章中,我们会探索浮动IP如何使用iptables工作。这也许更复杂但是依然使用这些基本的网络组件。 178 | -------------------------------------------------------------------------------- /trim.md: -------------------------------------------------------------------------------- 1 | diff --git a/nova/tests/virt/libvirt/test_config.py b/nova/tests/virt/libvirt/test_config.py 2 | index e0363ed..0fef2da 100644 3 | --- a/nova/tests/virt/libvirt/test_config.py 4 | +++ b/nova/tests/virt/libvirt/test_config.py 5 | @@ -463,6 +463,44 @@ class LibvirtConfigGuestDiskTest(LibvirtConfigBaseTest): 6 | self.assertEqual(obj.source_type, 'file') 7 | self.assertEqual(obj.serial, '7a97c4a3-6f59-41d4-bf47-191d7f97f8e9') 8 | 9 | + def test_config_file_discard(self): 10 | + obj = config.LibvirtConfigGuestDisk() 11 | + obj.driver_name = "qemu" 12 | + obj.driver_format = "qcow2" 13 | + obj.driver_cache = "none" 14 | + obj.driver_discard = "unmap" 15 | + obj.source_type = "file" 16 | + obj.source_path = "/tmp/hello.qcow2" 17 | + obj.target_dev = "/dev/hda" 18 | + obj.target_bus = "ide" 19 | + obj.serial = "7a97c4a3-6f59-41d4-bf47-191d7f97f8e9" 20 | + 21 | + xml = obj.to_xml() 22 | + self.assertXmlEqual(xml, """ 23 | + 24 | + 25 | + 26 | + 27 | + 7a97c4a3-6f59-41d4-bf47-191d7f97f8e9 28 | + """) 29 | + 30 | + def test_config_file_discard_parse(self): 31 | + xml = """ 32 | + 33 | + 34 | + 35 | + 36 | + 7a97c4a3-6f59-41d4-bf47-191d7f97f8e9 37 | + """ 38 | + xmldoc = etree.fromstring(xml) 39 | + 40 | + obj = config.LibvirtConfigGuestDisk() 41 | + obj.parse_dom(xmldoc) 42 | + 43 | + self.assertEqual(obj.driver_discard, 'unmap') 44 | + 45 | + pass 46 | + 47 | def test_config_block(self): 48 | obj = config.LibvirtConfigGuestDisk() 49 | obj.source_type = "block" 50 | diff --git a/nova/tests/virt/libvirt/test_utils.py b/nova/tests/virt/libvirt/test_utils.py 51 | index 827b2cf..68dc495 100644 52 | --- a/nova/tests/virt/libvirt/test_utils.py 53 | +++ b/nova/tests/virt/libvirt/test_utils.py 54 | @@ -47,6 +47,11 @@ blah BLAH: bb 55 | disk_type = libvirt_utils.get_disk_type(path) 56 | self.assertEqual(disk_type, 'raw') 57 | 58 | + def test_get_hw_disk_discard(self): 59 | + self.assertEqual('unmap', libvirt_utils.get_hw_disk_discard("unmap")) 60 | + self.assertEqual('ignore', libvirt_utils.get_hw_disk_discard("ignore")) 61 | + self.assertIsNone(libvirt_utils.get_hw_disk_discard("fake")) 62 | + 63 | def test_list_rbd_volumes(self): 64 | conf = '/etc/ceph/fake_ceph.conf' 65 | pool = 'fake_pool' 66 | @@ -339,3 +344,5 @@ ID TAG VM SIZE DATE VM CLOCK 67 | self.assertEqual(67108864, image_info.virtual_size) 68 | self.assertEqual(98304, image_info.disk_size) 69 | self.assertEqual(3, len(image_info.snapshots)) 70 | + 71 | + 72 | diff --git a/nova/virt/libvirt/config.py b/nova/virt/libvirt/config.py 73 | index 7ff03ff..0e3e54f 100644 74 | --- a/nova/virt/libvirt/config.py 75 | +++ b/nova/virt/libvirt/config.py 76 | @@ -481,6 +481,7 @@ class LibvirtConfigGuestDisk(LibvirtConfigGuestDevice): 77 | self.driver_name = None 78 | self.driver_format = None 79 | self.driver_cache = None 80 | + self.driver_discard = None 81 | self.source_path = None 82 | self.source_protocol = None 83 | self.source_name = None 84 | @@ -511,7 +512,8 @@ class LibvirtConfigGuestDisk(LibvirtConfigGuestDevice): 85 | dev.set("device", self.source_device) 86 | if (self.driver_name is not None or 87 | self.driver_format is not None or 88 | - self.driver_cache is not None): 89 | + self.driver_cache is not None or 90 | + self.driver_discard is not None): 91 | drv = etree.Element("driver") 92 | if self.driver_name is not None: 93 | drv.set("name", self.driver_name) 94 | @@ -519,6 +521,8 @@ class LibvirtConfigGuestDisk(LibvirtConfigGuestDevice): 95 | drv.set("type", self.driver_format) 96 | if self.driver_cache is not None: 97 | drv.set("cache", self.driver_cache) 98 | + if self.driver_discard is not None: 99 | + drv.set("discard", self.driver_discard) 100 | dev.append(drv) 101 | 102 | if self.source_type == "file": 103 | @@ -613,6 +617,7 @@ class LibvirtConfigGuestDisk(LibvirtConfigGuestDevice): 104 | self.driver_name = c.get('name') 105 | self.driver_format = c.get('type') 106 | self.driver_cache = c.get('cache') 107 | + self.driver_discard = c.get('discard') 108 | elif c.tag == 'source': 109 | if self.source_type == 'file': 110 | self.source_path = c.get('file') 111 | diff --git a/nova/virt/libvirt/imagebackend.py b/nova/virt/libvirt/imagebackend.py 112 | index 4caf9e0..3e16b98 100644 113 | --- a/nova/virt/libvirt/imagebackend.py 114 | +++ b/nova/virt/libvirt/imagebackend.py 115 | @@ -70,6 +70,11 @@ __imagebackend_opts = [ 116 | cfg.StrOpt('images_rbd_ceph_conf', 117 | default='', # default determined by librados 118 | help='Path to the ceph configuration file to use'), 119 | + cfg.StrOpt('hw_disk_discard', 120 | + default=None, 121 | + help='Discard option for nova managed disks (valid options ' 122 | + 'are: ignore, unmap). Need Libvirt(1.0.6) Qemu1.5 ' 123 | + '(raw format) Qemu1.6(qcow2 format'), 124 | ] 125 | 126 | CONF = cfg.CONF 127 | @@ -80,6 +85,8 @@ CONF.import_opt('preallocate_images', 'nova.virt.driver') 128 | LOG = logging.getLogger(__name__) 129 | 130 | 131 | + 132 | + 133 | @six.add_metaclass(abc.ABCMeta) 134 | class Image(object): 135 | 136 | @@ -92,6 +99,8 @@ class Image(object): 137 | """ 138 | self.source_type = source_type 139 | self.driver_format = driver_format 140 | + self.discard_mode = libvirt_utils.get_hw_disk_discard( 141 | + CONF.libvirt.hw_disk_discard) 142 | self.is_block_dev = is_block_dev 143 | self.preallocate = False 144 | 145 | @@ -134,6 +143,7 @@ class Image(object): 146 | info.target_bus = disk_bus 147 | info.target_dev = disk_dev 148 | info.driver_cache = cache_mode 149 | + info.driver_discard = self.discard_mode 150 | info.driver_format = self.driver_format 151 | driver_name = libvirt_utils.pick_disk_driver_name(hypervisor_version, 152 | self.is_block_dev) 153 | @@ -549,6 +559,8 @@ class Rbd(Image): 154 | ' images_rbd_pool' 155 | ' flag to use rbd images.')) 156 | self.pool = CONF.libvirt.images_rbd_pool 157 | + self.discard_mode = libvirt_utils.get_hw_disk_discard( 158 | + CONF.libvirt.hw_disk_discard) 159 | self.ceph_conf = ascii_str(CONF.libvirt.images_rbd_ceph_conf) 160 | self.rbd_user = ascii_str(CONF.libvirt.rbd_user) 161 | self.rbd = kwargs.get('rbd', rbd) 162 | @@ -622,6 +634,7 @@ class Rbd(Image): 163 | info.device_type = device_type 164 | info.driver_format = 'raw' 165 | info.driver_cache = cache_mode 166 | + info.driver_discard = self.discard_mode 167 | info.target_bus = disk_bus 168 | info.target_dev = disk_dev 169 | info.source_type = 'network' 170 | diff --git a/nova/virt/libvirt/utils.py b/nova/virt/libvirt/utils.py 171 | index af0cd40..02a5cba 100644 172 | --- a/nova/virt/libvirt/utils.py 173 | +++ b/nova/virt/libvirt/utils.py 174 | @@ -28,6 +28,7 @@ from oslo.config import cfg 175 | from nova.i18n import _ 176 | from nova.i18n import _LI 177 | from nova.i18n import _LW 178 | +from nova.i18n import _LE 179 | from nova.openstack.common import log as logging 180 | from nova.openstack.common import processutils 181 | from nova import utils 182 | @@ -535,3 +536,13 @@ def is_mounted(mount_path, source=None): 183 | if exc.errno == errno.ENOENT: 184 | LOG.info(_LI("findmnt tool is not installed")) 185 | return False 186 | + 187 | + 188 | +def get_hw_disk_discard(hw_disk_discard): 189 | + """Check valid and get hw_disk_discard value from Conf. 190 | + """ 191 | + if hw_disk_discard not in ('unmap', 'ignore'): 192 | + LOG.error(_LE("ignoring unrecognized hw_disk_discard='%s' value"), 193 | + hw_disk_discard) 194 | + return None 195 | + return hw_disk_discard 196 | -------------------------------------------------------------------------------- /openstack/nfvi-realtime.md: -------------------------------------------------------------------------------- 1 | ### openstack特性之虚拟机实时性 2 | 虚拟机实时性特性是openstack M版本引入的。
3 | 虚拟机实时性特性,旨在改善提供低延迟的CPU调度能力。
4 | 5 | 实时性虚拟机主要用于跑需要对CPU执行延迟要求苛刻的负载。典型的如NFV场景的应用,也可以用于金融市场高频交易等场合。
6 | 7 | ### 原理 8 | 目前主要有以下手段改善实时性: 9 | + CPU pinning
10 | 防止虚拟机之间互相“steal time”,从而影响CPU调度延迟。
11 | + 主机资源
12 | 解决kernel task占用CPU,导致的CPU调度延迟。
13 | + QEMU Emulator thread pin
14 | 解决QEMU Emulator线程占用CPU,导致的CPU调度延迟。
15 | + Guest VCPU调度策略
16 | 给guest vCPUs配置合适的调度策略,解决调度导致的CPU延迟。
17 | + 使用大页
18 | 确保Guest内存不会被swap到host上。
19 | + 防止QEMU内存swap
20 | 配置QEMU内存不被swap,避免内存swap导致的延迟。
21 | 22 | ### 使用注意 23 | 实时性是存在代价的。为了在最坏情况下,满足对CPU延迟的苛刻要求,整个系统的吞吐能力都要做妥协。
24 | 因此,无条件使用实时性,并不合理。只有在业务负载真的需要时,才开启这个选项。
25 | 很多情况下,仅仅使用CPU pinning就可以满足业务的对实时性的 要求。
26 | 27 | 根据社区的测试效果: 28 | + baremetal + dedicated cpu + non-realtime scheduler
29 | worst case latency:150微秒,mean latency:2微秒
30 | + KVM + dedicated cpu + realtime scheduler
31 | worst case latency:14微秒, mean latency:<10微秒
32 |     33 | ### 使用方法 34 | 为了达到最优的效果,需要配合使用之前的numa亲和特性、dedicated cpu pinning特性、huge page特性。
35 | 由于开启实时是有代价的,一般来说,需要通过host aggregate将支持实时和不支持实时的computes host分开。
36 | 37 | + flavor中增加“hw:cpu_realtime=yes|no"开启实时策略 38 | + 前提是配置了”hw:cpu_policy"为"dedicated"。 39 | + kvm主要做了配置:1. QEMU和guest RAM lock 2. 所有的vCPUs使用固定的实时调度策略。 40 | + flavor中增加hw:cpu_realtime_mask=^0-1参数控制emulator使用的cpu 41 | + 这个必须配置的。 42 | + 将某些vCPUs分配给emulator使用,且使用非实时调度策略。其他的vCPU会使用实时调度策略。(默认虚拟机会使用所有vCPU给emulator用)。 43 | + 更进一步的在主机上固定一些pCPU供emulator使用,在P版本才完成(没仔细看,不确定做了什么事)[URL](https://blueprints.launchpad.net/nova/+spec/libvirt-emulator-threads-policy)。 44 | 45 | ### 例子 46 | 47 | ```shell 48 | # 如果不配置cpu绑定会出现以下错误。 49 | [stack@localhost devstack]$ openstack server create --flavor realtime --image cirros-0.3.4-x86_64-uec realtime 50 | Cannot set realtime policy in a non dedicated cpu pinning policy (HTTP 400) (Request-ID: req-95b9c93c-cbac-4f1b-bf37-4942afa53860) 51 | 52 | # 如果不配置配置cpu mask会出现以下错误 53 | [stack@localhost devstack]$ openstack server create --flavor realtime --image cirros-0.3.4-x86_64-uec realtime 54 | Realtime policy needs vCPU(s) mask configured with at least 1 RT vCPU and 1 ordinary vCPU. See hw:cpu_realtime_mask or hw_cpu_realtime_mask (HTTP 400) (Request-ID: req-0f09c25a-9f56-4baf-9519-71d5b3abae29) 55 | 56 | openstack flavor create --ram 1024 --vcpu 4 --disk 1 realtime4 57 | openstack flavor set --property hw:cpu_realtime=yes realtime4 58 | openstack flavor set --property hw:cpu_policy=dedicated realtime4 59 | openstack flavor set --property hw:cpu_realtime_mask=^0-1 realtime4 60 | openstack server create --flavor realtime4 --image cirros-0.3.4-x86_64-uec realtime4 61 | 62 | 63 | [stack@localhost devstack]$ sudo virsh list 64 | Id Name State 65 | ---------------------------------------------------- 66 | 3 instance-00000003 running 67 | 68 | [stack@localhost devstack]$ sudo virsh show 3 69 | error: unknown command: 'show' 70 | [stack@localhost devstack]$ sudo virsh dumpxml 3 71 | 72 | instance-00000003 73 | bcd4164b-f0da-4f70-8864-6514ff5c1c54 74 | 75 | 76 | 77 | realtime4 78 | 2017-05-05 09:14:48 79 | 80 | 1024 81 | 1 82 | 0 83 | 0 84 | 4 85 | 86 | 87 | admin 88 | admin 89 | 90 | 91 | 92 | 93 | 1048576 94 | 1048576 95 | 96 | 97 | 98 | 99 | 4 100 | 101 | 4096 102 | 103 | 104 | 105 | 106 | 107 | 108 | 109 | 110 | 111 | 112 | 113 | 114 | /machine 115 | 116 | 117 | 118 | OpenStack Foundation 119 | OpenStack Nova 120 | 15.0.4 121 | 187ec700-6ff3-4e83-87b2-9559c4406874 122 | bcd4164b-f0da-4f70-8864-6514ff5c1c54 123 | Virtual Machine 124 | 125 | 126 | 127 | hvm 128 | /opt/stack/data/nova/instances/bcd4164b-f0da-4f70-8864-6514ff5c1c54/kernel 129 | /opt/stack/data/nova/instances/bcd4164b-f0da-4f70-8864-6514ff5c1c54/ramdisk 130 | root=/dev/vda console=tty0 console=ttyS0 131 | 132 | 133 | 134 | 135 | 136 | 137 | 138 | 139 | 140 | 141 | 142 | 143 | 144 | 145 | 146 | 147 | 148 | 149 | destroy 150 | restart 151 | destroy 152 | 153 | /usr/bin/qemu-kvm 154 | 155 | 156 | 157 | 158 | 159 | 160 | 161 | 162 | 163 | 164 |
165 | 166 | 167 | 168 |
169 | 170 | 171 | 172 | 173 | 174 | 175 | 176 | 177 | 178 | 179 |
180 | 181 | 182 | 183 | 184 | 185 | 186 | 187 | 188 | 189 | 190 | 191 | 192 | 193 | 194 | 195 | 196 | 197 | 198 | 199 | 200 | 201 | 202 |