Всем привет!
С помощью libvirt можно создать виртуальную машину из под обычного пользователя с использованием qemu:///session с доступом к bridge сети (как если бы создавали ВМ с qemu:///system).
Для этого libvirt использует qemu-bidge-helper
По многочисленным инструкциям настройка этого дела сводится к тому, что нужно создать файл /etc/qemu/bridge.conf с указанием доступа к bridge интерфейсу. В Ubuntu по умолчанию он называется virbr0, и содержимое файла /etc/qemu/bridge.conf должно выглядеть так: allow virbr0
Второй нюанс - выставить бит SUID файлу /usr/lib/qemu/qemu-bridge-helper: sudo chmod 4755 /usr/lib/qemu/qemu-bridge-helper
После этого виртуалке можно указывать режим сети bridge и машина должна быть доступна в этой сети.
Я запускаю установку на Ubuntu 18.04 следующим образом:
virt-install --disk none --boot kernel=kernel,initrd=initrd.lz --name test --connect qemu:///session --network bridge=virbr0 --ram 1024
Но процесс падает с ошибкой:
ERROR internal error: /usr/lib/qemu/qemu-bridge-helper --br=virbr0 --fd=25: failed to communicate with bridge helper: Transport endpoint is not connected
stderr=failed to write fd to unix socket: Socket operation on non-socket
При варианте запуска с qemu:///system или из под sudo с qemu:///session, виртуалка создается успешно, но эти варианты не интересны.
Если запускать отдельно команду /usr/lib/qemu/qemu-bridge-helper --br=virbr0 --fd=25 , то выдается ошибка:
$ /usr/lib/qemu/qemu-bridge-helper --br=virbr0 --fd=25
failed to write fd to unix socket: Bad file descriptor
Если запускать qemu-bridge-helper из под strace, то будет такой вывод:
$ strace /usr/lib/qemu/qemu-bridge-helper --br=virbr0 --fd=25
execve("/usr/lib/qemu/qemu-bridge-helper", ["/usr/lib/qemu/qemu-bridge-helper", "--br=virbr0", "--fd=25"], 0x7ffde87b6b30 /* 68 vars */) = 0
access("/etc/suid-debug", F_OK) = -1 ENOENT (No such file or directory)
brk(NULL) = 0x555818691000
fcntl(0, F_GETFD) = 0
fcntl(1, F_GETFD) = 0
fcntl(2, F_GETFD) = 0
access("/etc/suid-debug", F_OK) = -1 ENOENT (No such file or directory)
access("/etc/ld.so.nohwcap", F_OK) = -1 ENOENT (No such file or directory)
access("/etc/ld.so.preload", R_OK) = -1 ENOENT (No such file or directory)
openat(AT_FDCWD, "/etc/ld.so.cache", O_RDONLY|O_CLOEXEC) = 3
fstat(3, {st_mode=S_IFREG|0644, st_size=138525, ...}) = 0
mmap(NULL, 138525, PROT_READ, MAP_PRIVATE, 3, 0) = 0x7f2740f27000
close(3) = 0
access("/etc/ld.so.nohwcap", F_OK) = -1 ENOENT (No such file or directory)
openat(AT_FDCWD, "/usr/lib/x86_64-linux-gnu/libglib-2.0.so.0", O_RDONLY|O_CLOEXEC) = 3
read(3, "\177ELF\2\1\1\0\0\0\0\0\0\0\0\0\3\0>\0\1\0\0\0\300\257\1\0\0\0\0\0"..., 832) = 832
fstat(3, {st_mode=S_IFREG|0644, st_size=1133872, ...}) = 0
mmap(NULL, 8192, PROT_READ|PROT_WRITE, MAP_PRIVATE|MAP_ANONYMOUS, -1, 0) = 0x7f2740f25000
mmap(NULL, 3232136, PROT_READ|PROT_EXEC, MAP_PRIVATE|MAP_DENYWRITE, 3, 0) = 0x7f2740a0c000
mprotect(0x7f2740b1f000, 2097152, PROT_NONE) = 0
mmap(0x7f2740d1f000, 8192, PROT_READ|PROT_WRITE, MAP_PRIVATE|MAP_FIXED|MAP_DENYWRITE, 3, 0x113000) = 0x7f2740d1f000
mmap(0x7f2740d21000, 392, PROT_READ|PROT_WRITE, MAP_PRIVATE|MAP_FIXED|MAP_ANONYMOUS, -1, 0) = 0x7f2740d21000
close(3) = 0
access("/etc/ld.so.nohwcap", F_OK) = -1 ENOENT (No such file or directory)
openat(AT_FDCWD, "/lib/x86_64-linux-gnu/libcap-ng.so.0", O_RDONLY|O_CLOEXEC) = 3
read(3, "\177ELF\2\1\1\0\0\0\0\0\0\0\0\0\3\0>\0\1\0\0\0\240\23\0\0\0\0\0\0"..., 832) = 832
fstat(3, {st_mode=S_IFREG|0644, st_size=18712, ...}) = 0
mmap(NULL, 2113848, PROT_READ|PROT_EXEC, MAP_PRIVATE|MAP_DENYWRITE, 3, 0) = 0x7f2740807000
mprotect(0x7f274080b000, 2093056, PROT_NONE) = 0
mmap(0x7f2740a0a000, 8192, PROT_READ|PROT_WRITE, MAP_PRIVATE|MAP_FIXED|MAP_DENYWRITE, 3, 0x3000) = 0x7f2740a0a000
close(3) = 0
access("/etc/ld.so.nohwcap", F_OK) = -1 ENOENT (No such file or directory)
openat(AT_FDCWD, "/lib/x86_64-linux-gnu/libpthread.so.0", O_RDONLY|O_CLOEXEC) = 3
read(3, "\177ELF\2\1\1\0\0\0\0\0\0\0\0\0\3\0>\0\1\0\0\0000b\0\0\0\0\0\0"..., 832) = 832
fstat(3, {st_mode=S_IFREG|0755, st_size=144976, ...}) = 0
mmap(NULL, 2221184, PROT_READ|PROT_EXEC, MAP_PRIVATE|MAP_DENYWRITE, 3, 0) = 0x7f27405e8000
mprotect(0x7f2740602000, 2093056, PROT_NONE) = 0
mmap(0x7f2740801000, 8192, PROT_READ|PROT_WRITE, MAP_PRIVATE|MAP_FIXED|MAP_DENYWRITE, 3, 0x19000) = 0x7f2740801000
mmap(0x7f2740803000, 13440, PROT_READ|PROT_WRITE, MAP_PRIVATE|MAP_FIXED|MAP_ANONYMOUS, -1, 0) = 0x7f2740803000
close(3) = 0
access("/etc/ld.so.nohwcap", F_OK) = -1 ENOENT (No such file or directory)
openat(AT_FDCWD, "/lib/x86_64-linux-gnu/libc.so.6", O_RDONLY|O_CLOEXEC) = 3
read(3, "\177ELF\2\1\1\3\0\0\0\0\0\0\0\0\3\0>\0\1\0\0\0\260\34\2\0\0\0\0\0"..., 832) = 832
fstat(3, {st_mode=S_IFREG|0755, st_size=2030544, ...}) = 0
mmap(NULL, 4131552, PROT_READ|PROT_EXEC, MAP_PRIVATE|MAP_DENYWRITE, 3, 0) = 0x7f27401f7000
mprotect(0x7f27403de000, 2097152, PROT_NONE) = 0
mmap(0x7f27405de000, 24576, PROT_READ|PROT_WRITE, MAP_PRIVATE|MAP_FIXED|MAP_DENYWRITE, 3, 0x1e7000) = 0x7f27405de000
mmap(0x7f27405e4000, 15072, PROT_READ|PROT_WRITE, MAP_PRIVATE|MAP_FIXED|MAP_ANONYMOUS, -1, 0) = 0x7f27405e4000
close(3) = 0
access("/etc/ld.so.nohwcap", F_OK) = -1 ENOENT (No such file or directory)
openat(AT_FDCWD, "/lib/x86_64-linux-gnu/libpcre.so.3", O_RDONLY|O_CLOEXEC) = 3
read(3, "\177ELF\2\1\1\0\0\0\0\0\0\0\0\0\3\0>\0\1\0\0\0 \25\0\0\0\0\0\0"..., 832) = 832
fstat(3, {st_mode=S_IFREG|0644, st_size=464824, ...}) = 0
mmap(NULL, 2560264, PROT_READ|PROT_EXEC, MAP_PRIVATE|MAP_DENYWRITE, 3, 0) = 0x7f273ff85000
mprotect(0x7f273fff5000, 2097152, PROT_NONE) = 0
mmap(0x7f27401f5000, 8192, PROT_READ|PROT_WRITE, MAP_PRIVATE|MAP_FIXED|MAP_DENYWRITE, 3, 0x70000) = 0x7f27401f5000
close(3) = 0
mmap(NULL, 8192, PROT_READ|PROT_WRITE, MAP_PRIVATE|MAP_ANONYMOUS, -1, 0) = 0x7f2740f23000
arch_prctl(ARCH_SET_FS, 0x7f2740f23fc0) = 0
mprotect(0x7f27405de000, 16384, PROT_READ) = 0
mprotect(0x7f2740801000, 4096, PROT_READ) = 0
mprotect(0x7f27401f5000, 4096, PROT_READ) = 0
mprotect(0x7f2740a0a000, 4096, PROT_READ) = 0
mprotect(0x7f2740d1f000, 4096, PROT_READ) = 0
mprotect(0x555817490000, 4096, PROT_READ) = 0
mprotect(0x7f2740f49000, 4096, PROT_READ) = 0
munmap(0x7f2740f27000, 138525) = 0
set_tid_address(0x7f2740f24290) = 9555
set_robust_list(0x7f2740f242a0, 24) = 0
rt_sigaction(SIGRTMIN, {sa_handler=0x7f27405edcb0, sa_mask=[], sa_flags=SA_RESTORER|SA_SIGINFO, sa_restorer=0x7f27405fa890}, NULL, 8) = 0
rt_sigaction(SIGRT_1, {sa_handler=0x7f27405edd50, sa_mask=[], sa_flags=SA_RESTORER|SA_RESTART|SA_SIGINFO, sa_restorer=0x7f27405fa890}, NULL, 8) = 0
rt_sigprocmask(SIG_UNBLOCK, [RTMIN RT_1], NULL, 8) = 0
prlimit64(0, RLIMIT_STACK, NULL, {rlim_cur=8192*1024, rlim_max=RLIM64_INFINITY}) = 0
brk(NULL) = 0x555818691000
brk(0x5558186b2000) = 0x5558186b2000
geteuid() = 1000
openat(AT_FDCWD, "/etc/qemu/bridge.conf", O_RDONLY) = 3
fstat(3, {st_mode=S_IFREG|0664, st_size=42, ...}) = 0
read(3, "allow virbr0\ninclude /etc/qemu/a"..., 4096) = 42
openat(AT_FDCWD, "/etc/qemu/asdef.conf", O_RDONLY) = 4
fstat(4, {st_mode=S_IFREG|0640, st_size=10, ...}) = 0
read(4, "allow all\n", 4096) = 10
read(4, "", 4096) = 0
close(4) = 0
read(3, "", 4096) = 0
close(3) = 0
socket(AF_INET, SOCK_STREAM, IPPROTO_IP) = 3
openat(AT_FDCWD, "/dev/net/tun", O_RDWR) = 4
ioctl(4, TUNSETIFF, 0x7ffee6743dd0) = -1 EPERM (Operation not permitted)
write(2, "failed to create tun device: Ope"..., 53failed to create tun device: Operation not permitted
) = 53
close(4) = 0
close(3) = 0
exit_group(1) = ?
+++ exited with 1 +++
Какая-то ошибка обращения к /dev/net/tun
Если выполняю команду cat /dev/net/tun, то получаю ошибку
$ cat /dev/net/tun
cat: /dev/net/tun: Дескриптор файла в плохом состоянии
При этом на прошлом LTS выпуске Ubuntu 16.04 всё проходит успешно и таких ошибок не наблюдается, нужно только создать симлинк /usr/libexec/qemu-bridge-helper на /usr/lib/qemu/qemu-bridge-helper
Ни кто с таким не сталкивался? Или может кому-то удавалось на Ubuntu 18.04 заставить виртуалку с qemu:///session работать с bridge сетью?