openstack with ceph

前言

openstack是个很不错的东西,结合ceph之后,openstack就如同插上了翅膀,更加强大了。

 

ceph的好处:

  1. 有了ceph这个共享存储,guest的热迁移就方便多了
  2. ceph提供的块儿存储支持snap和clone,是的创建虚机和快照都不用copy磁盘,使得创建虚机可以秒级完成,而且非常节省存储

我遇到的问题:

  1. 在我将openstack和ceph结合起来之后,创建虚机依然很慢,并没有达到创建虚机不复制磁盘的效果

解决办法:

  1. 调试虚拟创建过程,发现如果要利用上rbd的snap和clone的特性,需要在image上有location属性;然而,我创建的image并没有该属性,openstack image命令行没有location相关选项,dashboard上创建镜像也没有该属性,只有glance命令行允许指定或单独添加该属性,却又报location invisible的错误;临时解决办法:直接修改代码,在代码中添加:
  2. 关于glance设置location失败的问题,根据关键字去glance代码中查看代码,发现当配置文件中的show_multiple_locations = false时,是不允许操作location的:

    然后,去glance-api的机器上grep show_multiple_locations ,并修改为True,重启glance-api 服务;然后再尝试location-add,提示url已存在,其实,该信息本来是存在的,只是显示与否的问题,现在不需要做任何操作,已经可以从image的信息中看到url了,如下:

    参考配置文件 /etc/glance/glance-api.conf 得知,show_multiple_locations = True使得image的地址直接暴露给了client,client就可以直接操作image了,可能存在一定的安全问题;当我们认为这不是问题的时候,我们就可以修改该配置,现在,我正是想利用rbd的一些特性,就需要将给选项设置为True;

  3. 至此,纠结已经的问题正式告一段落

总结:

  1. 按照手册安装openstack没有太大意义,能发现问题并解决问题才能进步;在解决该问题的过程中,尝试了python的单步调试(效果很差)、从代码上了解了虚拟机创建的过程,也了解了一些glance的代码,受益匪浅

rbd nbd

rbd vs rbd-nbd

两者功能一样,效果也没啥差别,只是实现方式有所不同; 前者使用内核的rbd模块访问ceph存储,当ceph较新(内核较旧)时,可能会有一些image的feature内核不支持,就不能map;后者使用librbd来访问ceph存储,基本不会存在feature不支持的情况,但是需要nbd内核模块(关于nbd内核模块的担心似乎也多余,nbd早就进入内核了,就算没有加载,rbd-nbd也会帮你加载的)。

同一个rbd image可以同时在一台服务器上map多次;但是只能mount一次,因为多次挂载后设备的uuid是同一个,文件系统不允许同时挂载两个相同uuid的设备的

同一个rbd image可以同时挂载到多个服务器上; (rbd的 –shared  –image-shared 选项可以控制是否允许重复挂载)

–shared 允许给镜像加锁,避免写坏,实现特定条件下的共享

–image-shared 允许定义是否可以共享

 

也就是说,ceph的image是可以作为共享存储使用的(但是最好别这么做,没有任何机制保证并发写不会出问题)。

注意:

  1. 即使在两个不同的mnt名字空间,也不能同时分别mount同一个设备,依然有uuid冲突的问题
  2. 即使分别在不同的mnt名字空间执行rbd map,设备的uuid也都是一样的
  3. 即使在不同的服务器上执行rbd map,设备的uuid也都是一样的

 

创建新的名字空间

功能: 创建新的名字空间,并使得进程处于sleep状态,可以随时nsenter进来

测试 mnt 时发现,似乎并没有实现mount的隔离; 测试方法:

./new-namespace -m &

然后使用nsenter,分别在名字空间内外查看 /proc/self/mountinfo 的内容,发现如何操作,内外都是一致的。

注意: 需要和pid名字空间一起使用

 

参考: https://www.toptal.com/linux/separation-anxiety-isolating-your-system-with-linux-namespaces

centos7 之vnc黑色桌面

有时候,我们为了安全,禁用root账号登录,需要root的话,在普通账号登录后再sudo;也有时候,我们期望vnc桌面的时候使用的是root账号,于是,我们在普通账号sudo(或sudo -s )后启动vncserver,于是问题来了,我们vnc看到的桌面是黑色的,而且里面的窗口是没有菜单的

解决办法:

  1. 要么直接root登录后启动vncserver
  2. 要么普通账号登录时,su后启动vncserver

windows virtio

 

kvm上安装windows虚拟机时,如果起初配置的磁盘就是virtio驱动的,则安装时会发现不到磁盘,需要使用virt-win.iso 来安装驱动; 如果起初使用的是IDE,则可以顺利安装windows,如果安装后才发现IDE其实没有virtio 高效,于是直接修改为virtio,则windows就会启动不了;解决办法:

先不要讲IDE修改为virtio,而是先挂一个virtio的磁盘,然后会在windows的设备管理器中发现缺少驱动,使用virtio-win.iso 安装驱动即可;然后删掉多余的virtio磁盘,并且将系统盘修改为virtio即可

参考: http://blog.chinaunix.net/uid-20776139-id-3481065.html

 

kvm 之mem balloon

对于kvm虚拟机,由于宿主机和guest之间的独立性很大,当guest把很多内存用于系统cache的话,宿主机也没有办法识别这部分内存,也没有办法建议guest让出一部分内存。

kvm有个内存气球的概念,原以为可以在不改变guest已定义的内存大小的情况下可以让guest让出一部分非关键性的内存占用,而实际上balloon却是在修改(变大和变小)guest的总内存大小,而且在减小guest内存大小的时候,也是武断地减少内存大小,一点儿不考虑guest的感受,不惜杀死进程来满足宿主机的请求,下面是逐步balloon的过程:

  1. 先让出free部分
  2. free不够再让出cache部分(并非所有的buff/cache都是完全让出的)
  3. 实在还不够,杀进程

参考资料:

https://www.linux-kvm.org/page/Projects/auto-ballooning  这里有提到选项automatic=true

http://www.openstack.cn/?p=4540

docker 之 exec失败的问题

环境:

 

现象:

乍一看, /proc/self/exe 文件找不见?

一般来讲,文件找不见并不奇怪,怪就怪在是 /proc/self/exe 找不见就不太应该了;

因为docker exec 最终是由libcontainerd进程来出来的,strace跟进发现,是chdir到 /root/data1/docker/devicemapper/mnt/4723e8178992b32b7284aa48c1c62f4011a6b785aca0c54e18d7ce5cc23b22dc/rootfs 时,找不到目标目录导致的,于是我就迅速地看了一下,该目录确实不存在,但是对于正常的能够exec的容器来讲,相应的rootfs目录也是不存在的

思考中。。。

docker玩的就是名字空间和cgroup,所以不能不想到这些;libcontainerd也有自己的(mnt)名字空间,我们进入libcontainerd进程的文件系统就可以查看到上面目录的存在了,而且,正常的容器存在相应的目录,异常的容器不存在相应的目录;

通过mount命令可以发现mount的规律,从容器的config.json (/var/run/docker/libcontainerd/c6176f37c4b67b03d4187edef6d1131cd44ab80bd0f0c20b24a7a20056967652/config.json) 中查看到对应的mount的位置,通过nsenter进入libcontainerd的mnt名字空间手动mount上去就好了,如下:

 

写个脚本自动修复之:

 

 

那么该mount点是如何丢掉的呢?重启dockerd能否自动修复该问题呢?(应该重启一下容器就行)稍后再研究