通过virsh创建基于lvm的pool
参考:
示例:
1 2 3 4 5 6 7 8 9 10 |
#virsh virsh # pool-define-as kvm-pool logical - - /dev/sda6 kvm-pool /dev/kvm-pool 定义池 kvm-pool virsh # pool-build kvm-pool --overwrite 构建池 kvm-pool virsh # pool-start kvm-pool 池 kvm-pool 已启动 |
将一个img 磁盘文件导入kvm-pool (结果总是失败)
- 创建一个volume:
1virsh vol-create-as kvm-pool ceph-3 50g --format raw - 导入img文件:
1virsh vol-upload --pool kvm-pool ceph-3 ./centos7.3.img
总是提示: 无法关闭卷ceph-3; 然后将无法从ceph-3启动虚拟机 - 使用新的volume启动虚拟机
成功的做法
- 定义一个ceph-3.xml
12345678910<volume type='block'><name>ceph-3</name><source><device path='/dev/sda6'></device></source><target><path>/dev/kvm-pool/ceph-3</path></target></volume>
- 将centos7.3.img 放到 /var/lib/libvirt/images 下面,然后:
1virsh vol-create-from --pool kvm-pool --file ceph-3.xml --vol centos7.3.img --inputpool default
openstack之迁移与热迁移
在配置openstack的热迁移时遇到了几个问题,这里记录一下。
- 迁移和热迁移的区别
不太注意的情况下,发现迁移也挺快的,其实区别太大了- 迁移是先停掉虚拟机,再启动虚拟机
- 热迁移基本是无感知的,虚拟机中的进程是不会死掉的
- openstack中,热迁移可以选择目标地址,迁移不能选择目标地址
- 迁移不需要libvirtd listen12506端口,热迁移需要
- 热迁移注意事项
- 要确保该落地的都落地了
- 虚拟机所在环境要高度一致
- 都使用正确配置了的共享存储
- qemu-kvm版本要一致
- 热迁移失败的故障排查
- 由于使用的qemu-kvm是官方的源,后来安装的qemu-kvm版本高了一些,所以热迁移总是失败,nova的日志中没有看到错误信息,结果却是在dashboard的httpd的错误日志中发现了问题所在,于是将所有qemu-kvm升级到最新版本
- 由于对热迁移没有研究过,基本小白一个,再次热迁移失败后,从目标机器nova的日志中看到错误信息,大致意思为libvirt连接源计算节点的12506端口失败,然而源计算节点并没有listen 12506端口,解决办法: http://yansu.org/2013/03/25/open-tcp-port-of-libvirt.html
libcgroup相关命令
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 |
# rpm -ql libcgroup-tools ... /usr/bin/cgclassify /usr/bin/cgcreate /usr/bin/cgdelete /usr/bin/cgexec /usr/bin/cgget /usr/bin/cgset /usr/bin/cgsnapshot /usr/bin/lscgroup /usr/bin/lssubsys /usr/lib/systemd/system/cgconfig.service /usr/lib/systemd/system/cgred.service /usr/sbin/cgclear /usr/sbin/cgconfigparser /usr/sbin/cgrulesengd ... |
1 2 3 4 5 6 7 8 9 10 |
# lscgroup memory:/ memory:/ memory:/machine.slice memory:/machine.slice/machine-qemu\x2d14\x2dinstance\x2d00000012.scope memory:/machine.slice/machine-qemu\x2d16\x2dinstance\x2d00000014.scope memory:/machine.slice/machine-qemu\x2d9\x2dinstance\x2d00000009.scope memory:/machine.slice/machine-qemu\x2d6\x2dinstance\x2d00000008.scope memory:/machine.slice/machine-qemu\x2d15\x2dinstance\x2d00000013.scope memory:/system.slice memory:/user.slice |
lscgroup: 列出各cgroup及其挂载点; qemu 也是通过cgroup进行资源限制的
cgsnapshot 可以列出当前各cgroup子系统的配置信息
lssubsys 列出各子系统及其挂载点
1 2 3 4 5 6 7 8 9 10 11 |
# lssubsys -M cpuset /sys/fs/cgroup/cpuset cpu,cpuacct /sys/fs/cgroup/cpu,cpuacct blkio /sys/fs/cgroup/blkio memory /sys/fs/cgroup/memory devices /sys/fs/cgroup/devices freezer /sys/fs/cgroup/freezer net_cls,net_prio /sys/fs/cgroup/net_cls,net_prio perf_event /sys/fs/cgroup/perf_event hugetlb /sys/fs/cgroup/hugetlb pids /sys/fs/cgroup/pids |
OpenStack Hacker养成指南 « OpenStack中国社区
openstack ceph 集成
遇到的问题:
ceph 版本: 12.2.0
glance-api 机器上的 librados2 版本太老(0.94),导致connect ceph cluster超时
升级glance-api 机器上的 librados2 为12.2.0 后,问题解决, 注意: 升级后重启glance-api
Oslo – OpenStack
openstack 安装记录
遇到过的问题:
- 配置文件贴错位置了
- 网络配置中漏掉了compute节点相关配置
- compute 节点qemu-kvm 版本低了一点
- mysql连接数被用完
- 配置了max_connections 也不管用,因为ulimit给限制了,修改ulimit后就可以了
解决思路:
- 根据id查日志 /var/log/
疑问:
- 创建机器的时候为什么指定的是网络的id,而不是子网的id?
- 在myservice network中,多个子网的情况下,因为无法指定子网id,如何确定机器是要放在哪个子网的?
- 可以明确指定ip地址来主动选择子网
- vxlan 端口号曾经是8472,后来修改为了4789,但是linux内核还在使用8472
其他:
- 路由器总是在控制节点上面的吗?
- 对于myservice网络,跨网段总是要求网关的,网关的压力势必会比较大,如何解决?
- provider 网络不存在该问题
原理:
- 浮动IP
- 浮动IP体现为路由器的网关接口的子接口
- provider网络默认是snat为true的,所以myservice网络默认是可以访问公网的,需要的话,可以将snat设置为false
- 浮动IP和绑定的vm之间的关系通过iptables规则实现,默认添加snat和dnat;需要的话:
- 可以只设置snat,则只允许出而不允许入;
- 也可以只设置dnat,只允许入不允许出
- 还可以让多个vm共享一个出口IP
- 这些都可以ip netns到相关路由器的名字空间中查看,注意:
- ip netns是通过/var/run/netns 中发现ns的,并非所有的netns都必须在这里注册的(docker 创建的netns就不放在这里)
- lsns 可以发现所有的ns,lsns是从/proc/$pid 中扫出来的
- 路由器
- 进入路由器所在网络名字空间中就可以查看路由器相关信息
php 之 stream编程
比较:
1 |
php -r 'echo file_get_contents("http://baidu.com/");' |
和
1 |
php -r '$fp=fopen("http://baidu.com/","r");while(!feof($fp)){echo fread($fp, 2048);};fclose($fp);' |
- 前者更加简单,后者显然复杂了一些
- 如果下载很大的文件,前者需要更多的内存,后者不需要
- PHP的stream wrapper的概念使得php的stream编程简单了许多
- 这两种方式都丢弃了http响应头信息,而对于请求头来讲,都可以通过context参数来设置
php curl sftp
首先, 验证php的curl模块是否支持sftp,验证方法:
1 |
ldd curl.so |grep ssh |
有结果就是支持,否则就是不支持
curl 实现http文件上传的逻辑大致如下:
1 2 3 4 5 6 7 8 9 10 11 |
<?php $url = "http://phpor.net/upload.php"; $s = curl_init(); curl_setopt($s,CURLOPT_RETURNTRANSFER,true); curl_setopt($s,CURLOPT_URL,$url); curl_setopt($s, CURLOPT_POST, true); $file = new CURLFile('text.txt'); curl_setopt($s, CURLOPT_POSTFIELDS, array("file" => $file)); echo curl_exec($s); echo curl_error($s); |
curl 实现sftp文件上传的方式是否可以如法炮制?
原以为修改下url地址(如: sftp://username:password@phpor.net/test.txt ) 就可以搞定,实际不然:(毕竟POSTFILDS 的内容就不太好解释),正确的姿势如下:
1 2 3 4 5 6 7 8 9 10 11 |
<?php $url = "sftp://username:password@phpor.net/"; $s = curl_init(); curl_setopt($s,CURLOPT_RETURNTRANSFER,true); curl_setopt($s,CURLOPT_URL,$url."/upload/text.txt"); curl_setopt($s, CURLOPT_UPLOAD, true); # 或者:curl_setopt($s, CURLOPT_PUT, true); curl_setopt($s, CURLOPT_INFILE, fopen("text.txt", "r")); echo curl_exec($s); echo curl_error($s); |
注意:
- 其中的 curl_setopt($s, CURLOPT_UPLOAD, true); 或 curl_setopt($s, CURLOPT_PUT, true); 是要有的,且: 换做curl_setopt($s, CURLOPT_PUT, true); 是不行的
- CURLOPT_INFILE 是一个文件流,不能是文件名
有时候,ssh2模块使用起来更加方便,但是真的没有的时候,curl也不算太复杂;另外,ssh2 附带注册了一个stream wrapper, 当安装了ssh2模块时,你甚至可以 fopen(“sftp://….”)