도커 아래 qemu2.6

도커 아래 qemu2.6

우분투 16을 기반으로 qemu2.5가 포함된 도커 컨테이너를 만들었습니다. libvirt를 실행하려고 하면 다음 오류가 발생합니다.

root@1116a7e45f20:/# /etc/init.d/libvirt-bin start
 * Starting libvirt management daemon libvirtd
/usr/sbin/libvirtd: error while loading shared libraries: libvirt-admin.so.0: cannot open shared object file: Permission denied
Waiting for /var/run/libvirt/libvirt-sock - recheck in 2 sec
Waiting for /var/run/libvirt/libvirt-sock - recheck in 2 sec
Waiting for /var/run/libvirt/libvirt-sock - recheck in 2 sec
Waiting for /var/run/libvirt/libvirt-sock - recheck in 2 sec
Waiting for /var/run/libvirt/libvirt-sock - recheck in 2 sec
Giving up waiting for /var/run/libvirt/libvirt-sock.

--privileged 플래그를 사용하여 docker 컨테이너를 실행 중입니다. docker 컨테이너 내부에서는 apparmor의 libvirt에 대한 새 규칙을 추가할 수 없습니다. 예를 들면 다음과 같습니다.

root@1116a7e45f20:/# aa-complain /etc/apparmor.d/usr.sbin.libvirtd
Setting /etc/apparmor.d/usr.sbin.libvirtd to complain mode.

ERROR: Cache read/write disabled: interface file missing. (Kernel needs AppArmor 2.4 compatibility patch.)
Warning: unable to find a suitable fs in /proc/mounts, is it mounted?
Use --subdomainfs to override.

추적 출력이 있습니다.

lose(4)                                = 0
read(3, "1\n", 128)                     = 2
--- SIGCHLD {si_signo=SIGCHLD, si_code=CLD_EXITED, si_pid=514, si_uid=0, si_status=0, si_utime=0, si_stime=0} ---
rt_sigreturn({mask=[]})                 = 2
read(3, "", 128)                        = 0
close(3)                                = 0
wait4(-1, [{WIFEXITED(s) && WEXITSTATUS(s) == 0}], 0, NULL) = 514
stat("/var/run/libvirt/libvirt-sock", 0x7ffed1f87c90) = -1 ENOENT (No such file or directory)
write(1, "Waiting for /var/run/libvirt/lib"..., 61Waiting for /var/run/libvirt/libvirt-sock - recheck in 2 sec
) = 61
clone(child_stack=0, flags=CLONE_CHILD_CLEARTID|CLONE_CHILD_SETTID|SIGCHLD, child_tidptr=0x7fe834b3e9d0) = 515
wait4(-1, [{WIFEXITED(s) && WEXITSTATUS(s) == 0}], 0, NULL) = 515
--- SIGCHLD {si_signo=SIGCHLD, si_code=CLD_EXITED, si_pid=515, si_uid=0, si_status=0, si_utime=0, si_stime=0} ---
rt_sigreturn({mask=[]})                 = 515
pipe([3, 4])                            = 0
clone(child_stack=0, flags=CLONE_CHILD_CLEARTID|CLONE_CHILD_SETTID|SIGCHLD, child_tidptr=0x7fe834b3e9d0) = 516
close(4)                                = 0
read(3, "0\n", 128)                     = 2
read(3, "", 128)                        = 0
--- SIGCHLD {si_signo=SIGCHLD, si_code=CLD_EXITED, si_pid=516, si_uid=0, si_status=1, si_utime=0, si_stime=0} ---
rt_sigreturn({mask=[]})                 = 0
close(3)                                = 0
wait4(-1, [{WIFEXITED(s) && WEXITSTATUS(s) == 1}], 0, NULL) = 516
write(1, "Giving up waiting for /var/run/l"..., 53Giving up waiting for /var/run/libvirt/libvirt-sock.
) = 53
exit_group(1)                           = ?
+++ exited with 1 +++

하나의 라이브러리만 해당 경로를 표시하지 않습니다.

root@1116a7e45f20:/# ldd /usr/sbin/libvirtd
        linux-vdso.so.1 =>  (0x00007ffd58fa2000)

이 컨테이너에 문제가 있나요? 이 오류의 근본 원인이 무엇인지 알려주세요.

답변1

이 오류의 근본 원인은 HOST의 의류입니다. 따라서 호스트 시스템에서 docker를 비활성화하거나 허용해야 합니다. 이 오류는 사라집니다.

또한 모든 커널 매개변수는 호스트 시스템에서 게스트 시스템으로 전달됩니다. 따라서 미리 /dev/kvm에 세 번째 사용자(666)를 사용할 수 있도록 허용해야 합니다.

관련 정보