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能否自动修复该问题呢?(应该重启一下容器就行)稍后再研究

mac brew HOMEBREW_NO_GITHUB_API

brew install spinx-build 的时候可能会遇到如下错误:

修改 /usr/local/Library/Homebrew/utils.rb 的代码,打印url看看:

莫非访问不了api.github.com  ?

看起来是有返回值的,而且是合法的json,继续看 /System/Library/Frameworks/Ruby.framework/Versions/2.0/usr/lib/ruby/2.0.0/open-uri.rb 的代码,发现很可能是httpcode的问题:

发现http code为 422 , 而/System/Library/Frameworks/Ruby.framework/Versions/2.0/usr/lib/ruby/2.0.0/open-uri.rb 遇到 422 是走异常逻辑的,如果能简单修改代码使其认为是正常似乎是可以的; 但是mac 不让修改/System/Library/Frameworks/Ruby.framework/Versions/2.0/usr/lib/ruby/2.0.0/open-uri.rb , root账号也不行

回头看 /usr/local/Library/Homebrew/utils.rb ,发现如下逻辑:

export HOMEBREW_NO_GITHUB_API=1

问题解决

 

其实 spinx-build 是在生成man page的时候用到的,某些情况下,大可不必非要去生成man page