今天帮别人清空日志,结果清完后平台起不起来了
查看日志,是检查libvirt版本那一步出问题,其中用了查看命令:libvirtd --version
自己检查,返回错误:libvirtd: initialization failed
上网找了一下,试了下,找到一个ok的,说是字符编码出错。解决步骤如下:
1,打开/etc/profile
export LC_ALL=POSIX #加入这一行保存,这里好像要root权限
保存退出
2,然后source /etc/profile
3,sudo /etc/init.d/libvirt-bin restart
完成,用“libvirtd --version”查看,返回:libvirtd (libvirt) 0.9.13
成功了。将平台重启,然后可以运行了
>>>>>20130624
今天又出现这个问题,然而上面的方法不适用。我连/etc/init.d/libvirt-bin都找不到。
通过百度,查到"libvirt-bin是一个符号链接/etc/init.d/libvirt-bin -> /lib/init/upstart-job,后者是一个shell脚本。"
(地址:http://www.linuxidc.com/Linux/2012-07/65515.htm)
我检查到我的/lib/init/upstart-job文件还是存在,所以直接建了个链接文件:
$cd /etc/init.d/
$sudo ln -s /lib/init/upstart-job libvirtd-bin
然后重启服务
$sudo /etc/init.d/libvirtd-bin restart
结果还是不行,依旧提示:libvirtd: initialization failed
看来不只是文件丢失问题
后来问的同事,他研究过一段时间,终于知道了原因。
原来我是在服务器上的各种测试,然而服务器是英文环境的ubuntu,我的本机是中文环境的。我一般测试都是用过本机ssh到服务器,然后进行的测试。
然而,从中文环境的本机ssh到英文环境的服务器,会导致服务器测试时的环境变量改变,因此运行命令libvirtd --version会提示错误。
果然我同事的电脑上ssh到服务器,命令无问题,正常返回信息。
因为要测试,所以找了暂时的解决办法:1,将本机修改为英文环境;2;找个英文环境的ubuntu镜像,由镜像创建的虚拟机中ssh到服务器。
两个其实原理一样的。我正好有个镜像,所以用了2方法。
**************************
由于测试需要开关机操作,以上两个方法都略显麻烦,因此,找了个适合开关机的办法:
将启动libvirt的命令,写入自启动中。
每次机器启动,因为是本身启动libvirt,所以没有问题。
**************************
#########################################################
查到资料以前碰到过,还有其它的libvirt出错总结,也在这里贴一下:
ibvirt 错误FAQ
【Q】: error: "Error: libcrypto required."
【A】: apt-get install libssl-dev
【Q】: error lxcControllerRun:686 : Cannot unshare mount namespace: Function not implemented
【A】:
【Q】: "start vm1" in virsh, error: Failed to add veth0 device to virbr0: No such device
【A】:
【Q】: "net-start" defualt in virsh error: Cannot find 'dnsmasq' in path: No such file or directory
【A】:
【Q】: "start suse" in virsh error : lxcSetupInterfaces:1108 : Failed to add veth0 device to virbr0: No such device
/usr/local/sbin/brctl addbr virbr0
【Q】:hack 的时候出现编译错误:../src/.libs/libvirt_driver_lxc.a(libvirt_driver_lxc_la-lxc_driver.o): In function `lxcSetSchedulerParameters':
lxc/lxc_driver.c:2326: undefined reference to `virCgroupSetCpuSet'
【A】: libvirt在这个地方的处理非常奇怪,需要去src/底下,在对应的*.syms添加相应的接口声明
【Q】: hack添加新接口会出现:libvirt.c:1648: warning: no previous prototype for 'virNodeGetStats' [-Wmissing-prototypes]
【A】: 在include/libvirt底下, libvirt.h是根据libvirt.h.in生成的,所以,扩展新的接口时,不要忘记往.in里面添加
【Q】: Result status 0, stdout: '' stderr: 'INFO in start_domain, domain suse existed
【A】: 配置文件中指定的模板文件存在问题
【Q】:在mount的时候可能会出现:
mount -o loop /data/domains/lxc5.img /data/domains/lxc5
mount: could not find any free loop device
【A】:这是因为max_loop默认只有8,太小
【Q】:umount: /data/domains/vm4: device is busy
【A】:手工杀死:/usr/libexec/libvirt_lxc --name lxc1 --console 13 --background --veth veth8
类似的文件会导致这个虚拟机引导的init进程和init引导出的其他进程还在系统中。所以,必须kill掉这些进程才行
【Q】: 启动vm或者停止vm的时候,会导致客户端的ssh卡死。
【A】: 虚拟机的init启动新的sshd出现的
【Q】: 虚拟机中的/dev/ptx/ptmx 无法删除
【A】:
mount |grep lxc5
fuser -mu suse1/
lsof -w suse1
【Q】: mount -o loop /** /** 提示失败
【A】: max_loop 默认最大值为8,需要增加这个默认值的大小
【Q】: 设置cgroup的内存参数的时候可能是失败,报错:
【A】:这是由于memory.memsw.limit_in_bytes, memory.limit_in_bytes大小有关联。memory.limit_in_bytes不能大于memory.memsw.limit_in_bytes, memory.memsw.limit_in_bytes不能小于memory.limit_in_bytes。所以,在设置新内存值的时候需要注意设置的顺序。比较新值跟老值之间的关系
【Q】:启动libvirtd报错: initialization failed
【A】:字符编码出错 export LC_ALL=POSIX
【Q】:启动虚拟机,日志不断报错:
13:24:10.986: 28595: error : lxcFdForward:309 : read of fd 7 failed: Input/output error
cpu占有100%, 而且,list 的状态是处于运行中。
【A】
【Q】:在虚拟机中创建设备出错
mknod loop0 b 7 0
mknod: `loop0': Operation not permitted
【A】:需要设置cgroup中设备的值: echo a *:* rw > devices.allow
资料原文地址:http://www.cnblogs.com/zhangzhang/archive/2013/03/04/2943263.html