LINUX.ORG.RU

Воскресил qemu-manage

 ,


5

4

qemu-manage - это ncurses интерфейс к qemu.

Исходники доступны по адресу https://bitbucket.org/PascalRD/qemu-manage. Ebuild file присутствует :)
Из нововведений:

* Больше не требует рута. (см файл setup_qemu_nonroot)
* Гостя можно устанавливать с ISO и образа диска.
* Перерисовка окон при изменении геометрии (главного и списка виртуалок).
* Добавлена возможность указывать кастомный файл с BIOS.
* Системные пути теперь добавляются по табу.
* Улучшен механизм сбора списка USB-устройств.
* Реструктуирован конфигурационный файл.

★★★

Ответ на: комментарий от pascal

Сделал так:

$ cmake -ggdb ../
$ make
$ gdb ./qemu-manage
...
(gdb) run
...
(gdb) backtrace                                                                                                     │
#0  0xb7fddb61 in __kernel_vsyscall ()                                                                              │
#1  0xb7b7b687 in __GI_raise (sig=sig@entry=6) at ../nptl/sysdeps/unix/sysv/linux/raise.c:56                        │
#2  0xb7b7eab3 in __GI_abort () at abort.c:89                                                                       │
#3  0xb7d6ed6f in __gnu_cxx::__verbose_terminate_handler() () from /usr/lib/i386-linux-gnu/libstdc++.so.6           │
#4  0xb7d6c924 in ?? () from /usr/lib/i386-linux-gnu/libstdc++.so.6                                                 │
#5  0xb7d6c99d in std::terminate() () from /usr/lib/i386-linux-gnu/libstdc++.so.6                                   │
#6  0xb7d6cc51 in __cxa_throw () from /usr/lib/i386-linux-gnu/libstdc++.so.6                                        │
#7  0xb7d92d26 in std::__throw_logic_error(char const*) () from /usr/lib/i386-linux-gnu/libstdc++.so.6              │
#8  0xb7dce476 in char* std::string::_S_construct<char const*>(char const*, char const*, std::allocator<char> const&, std::forward_iterator_tag) () from /usr/lib/i386-linux-gnu/libstdc++.so.6                                          │
#9  0xb7dce9f8 in std::basic_string<char, std::char_traits<char>, std::allocator<char> >::basic_string(char const*, std::allocator<char> const&) () from /usr/lib/i386-linux-gnu/libstdc++.so.6                                          │
#10 0x08196e53 in QManager::QemuDb::SelectQuery(std::string const&) ()                                              │
#11 0x08184ae0 in main ()                                                                                           │
(gdb)            

superuser ★★★★★
()
Последнее исправление: superuser (всего исправлений: 1)
Ответ на: комментарий от superuser

В CMakeLists.txt можно добавить например сюда:
set_property(TARGET ${PROJECT_NAME} APPEND_STRING PROPERTY COMPILE_FLAGS
"-ggdb -Wall -Wextra -pedantic -isystem ...

pascal ★★★
() автор топика
Ответ на: комментарий от pascal

«Manage guests»

terminate called after throwing an instance of 'std::logic_error'  │
│                                          │                            │                                           what():  basic_string::_S_construct null not valid                       │                                           │
│                                          │                            │                                           │
Program received signal SIGABRT, Aborted.  │                            │                                           │
0xb7fddb61 in __kernel_vsyscall ()         └────────────────────────────┘                                           │
(gdb) backtrace                                                                                                     │
#0  0xb7fddb61 in __kernel_vsyscall ()                                                                              │
#1  0xb7b7b687 in __GI_raise (sig=sig@entry=6) at ../nptl/sysdeps/unix/sysv/linux/raise.c:56                        │
#2  0xb7b7eab3 in __GI_abort () at abort.c:89                                                                       │
#3  0xb7d6ed6f in __gnu_cxx::__verbose_terminate_handler() () from /usr/lib/i386-linux-gnu/libstdc++.so.6           │
#4  0xb7d6c924 in ?? () from /usr/lib/i386-linux-gnu/libstdc++.so.6                                                 │
#5  0xb7d6c99d in std::terminate() () from /usr/lib/i386-linux-gnu/libstdc++.so.6                                   │
#6  0xb7d6cc51 in __cxa_throw () from /usr/lib/i386-linux-gnu/libstdc++.so.6                                        │
#7  0xb7d92d26 in std::__throw_logic_error(char const*) () from /usr/lib/i386-linux-gnu/libstdc++.so.6              │
#8  0xb7dce476 in char* std::string::_S_construct<char const*>(char const*, char const*, std::allocator<char> const&, std::forward_iterator_tag) () from /usr/lib/i386-linux-gnu/libstdc++.so.6                                          │
#9  0xb7dce9f8 in std::basic_string<char, std::char_traits<char>, std::allocator<char> >::basic_string(char const*, std::allocator<char> const&) () from /usr/lib/i386-linux-gnu/libstdc++.so.6                                          │
#10 0x08196e53 in QManager::QemuDb::SelectQuery (this=0x8297c78, query="select name from vms order by name asc")    │
    at /home/barin/build/QemuManage/qemu-manage/src/qemudb.cpp:74                                                   │
#11 0x08184ae0 in main () at /home/barin/build/QemuManage/qemu-manage/src/qemu_manage.cpp:132                       │
(gdb)                                                        

superuser ★★★★★
()
Ответ на: комментарий от superuser

«Install guest»

terminate called after throwing an instance of 'std::logic_error'                                                                                                  │
│                   what():  basic_string::_S_construct null not valid                                              │
│                                                                                                                   │
Program received signal SIGABRT, Aborted.                                                                           │
0xb7fddb61 in __kernel_vsyscall ()                                                                                  │
(gdb) backtrace                                                                                                     │
#0  0xb7fddb61 in __kernel_vsyscall ()                                                                              │
#1  0xb7b7b687 in __GI_raise (sig=sig@entry=6) at ../nptl/sysdeps/unix/sysv/linux/raise.c:56                        │
#2  0xb7b7eab3 in __GI_abort () at abort.c:89                                                                       │
#3  0xb7d6ed6f in __gnu_cxx::__verbose_terminate_handler() () from /usr/lib/i386-linux-gnu/libstdc++.so.6           │
#4  0xb7d6c924 in ?? () from /usr/lib/i386-linux-gnu/libstdc++.so.6                                                 │
#5  0xb7d6c99d in std::terminate() () from /usr/lib/i386-linux-gnu/libstdc++.so.6                                   │
#6  0xb7d6cc51 in __cxa_throw () from /usr/lib/i386-linux-gnu/libstdc++.so.6                                        │
#7  0xb7d92d26 in std::__throw_logic_error(char const*) () from /usr/lib/i386-linux-gnu/libstdc++.so.6              │
#8  0xb7dce476 in char* std::string::_S_construct<char const*>(char const*, char const*, std::allocator<char> const&, std::forward_iterator_tag) () from /usr/lib/i386-linux-gnu/libstdc++.so.6                                          │
#9  0xb7dce9f8 in std::basic_string<char, std::char_traits<char>, std::allocator<char> >::basic_string(char const*, std::allocator<char> const&) () from /usr/lib/i386-linux-gnu/libstdc++.so.6                                          │
#10 0x08196e53 in QManager::QemuDb::SelectQuery (this=0x82a0d40, query="select vnc from lastval")                   │
    at /home/barin/build/QemuManage/qemu-manage/src/qemudb.cpp:74                                                   │
#11 0x081cb714 in QManager::AddVmWindow::Get_data_from_db (this=0x8297c78)                                          │
    at /home/barin/build/QemuManage/qemu-manage/src/add_vm_window.cpp:154                                           │
#12 0x081ccca3 in QManager::AddVmWindow::Print (this=0x8297c78)                                                     │
    at /home/barin/build/QemuManage/qemu-manage/src/add_vm_window.cpp:272                                           │
#13 0x08186721 in main () at /home/barin/build/QemuManage/qemu-manage/src/qemu_manage.cpp:402                       │
(gdb)  

superuser ★★★★★
()
Ответ на: комментарий от pascal
$ sqlite3 ~/.qemu_manage.db 
SQLite version 3.8.2 2013-12-06 14:53:30
Enter ".help" for instructions
Enter SQL statements terminated with a ";"
sqlite> select name from vms order by name asc;
Error: no such table: vms
sqlite> 
superuser ★★★★★
()
Ответ на: комментарий от superuser

Просто удалите файл с базой, она битая по каким-то причинам, пусть программа ее пересоздаст. Оно у Вас почему-то дохнет на исключении при выборке из базы.

pascal ★★★
() автор топика
Ответ на: комментарий от pascal
$ gcc --version
gcc (Ubuntu 4.9.4-2ubuntu1~14.04.1) 4.9.4
Copyright (C) 2015 Free Software Foundation, Inc.
This is free software; see the source for copying conditions.  There is NO
warranty; not even for MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.
superuser ★★★★★
()
Ответ на: комментарий от pascal

Программа при старте не создаёт файл базы данных похоже вообще. Его создало $ sqlite3 ~/.qemu_manage.db И создало соответственно пустым - без таблиц и прочего.

superuser ★★★★★
()
Последнее исправление: superuser (всего исправлений: 2)
Ответ на: комментарий от superuser

Во всем виноват const_cast :D, скоро поправлю.

std::string t_db = config.db;

if (access(dirname(const_cast<char *>(t_db.c_str())), W_OK) != 0)

На gcc-5-* порча t_db не приводит к порче config.db. На gcc-4.9-* приводит.

pascal ★★★
() автор топика
Последнее исправление: pascal (всего исправлений: 4)
Ответ на: комментарий от pascal

В общем это оптимизация COW для std::string веселит, сделаю explicit copy для старых GCC.

pascal ★★★
() автор топика
Ответ на: комментарий от pascal

Подтверждаю - работает. Но есть вопросы:

  1. Зачем конфиги гостей хранить в базе sqlite? По феншую-бы - в некоторой директории отдельный текстовый конфиг-файл для каждого гостя. И удобней c конфигами работать было-бы и т.д.
  2. Почему не работает сеть? Приходится вручную в бридж добавлять и т.д. Я правда не особо в этом разбираюсь, может есть простой способ иметь интернет в госте?

    И весит бинарник многовато - 3.1 Мб .

superuser ★★★★★
()
Последнее исправление: superuser (всего исправлений: 1)
Ответ на: комментарий от superuser

бинарник надо стрипнуть.
du -h /usr/bin/qemu-manage
1.4M /usr/bin/qemu-manage

Чтобы заработал интернет в госте, достаточно настроить маскарадинг и включить ip форвардинг.

sqlite довольно удобен для задач программы, вручную что-либо править нет смысла, иначе зачем нужна эта программа впринципе?

pascal ★★★
() автор топика
Последнее исправление: pascal (всего исправлений: 1)

Еще баги:
«Install guest»
Поле Name - при наличии тире не даёт перейти в следующее поле.
Поле Disk [1-2]Gb - больше 2 ввести не даёт.

superuser ★★★★★
()
Ответ на: комментарий от pascal

достаточно настроить маскарадинг и включить ip форвардинг

пользуясь случаем не подскажешь как сделать? DHCP у меня на роутере.
Хост:

$ ifconfig -a
X16042_eth0 Link encap:Ethernet  HWaddr f2:0f:a3:13:4a:9e  
          BROADCAST MULTICAST  MTU:1500  Metric:1
          RX packets:0 errors:0 dropped:0 overruns:0 frame:0
          TX packets:0 errors:0 dropped:0 overruns:0 carrier:0
          collisions:0 txqueuelen:1000 
          RX bytes:0 (0.0 B)  TX bytes:0 (0.0 B)

eth0      Link encap:Ethernet  HWaddr 00:15:58:a3:bf:5f  
          inet addr:192.168.0.10  Bcast:192.168.0.255  Mask:255.255.255.0
          inet6 addr: fe80::215:58ff:fea3:bf5f/64 Scope:Link
          UP BROADCAST RUNNING MULTICAST  MTU:1500  Metric:1
          RX packets:23497 errors:0 dropped:0 overruns:0 frame:0
          TX packets:18153 errors:0 dropped:0 overruns:0 carrier:0
          collisions:0 txqueuelen:1000 
          RX bytes:15363696 (15.3 MB)  TX bytes:3342728 (3.3 MB)

lo        Link encap:Локальная петля (Loopback)  
          inet addr:127.0.0.1  Mask:255.0.0.0
          inet6 addr: ::1/128 Scope:Host
          UP LOOPBACK RUNNING  MTU:65536  Metric:1
          RX packets:36681 errors:0 dropped:0 overruns:0 frame:0
          TX packets:36681 errors:0 dropped:0 overruns:0 carrier:0
          collisions:0 txqueuelen:1 
          RX bytes:129764210 (129.7 MB)  TX bytes:129764210 (129.7 MB)

sit0      Link encap:IPv6-in-IPv4  
          NOARP  MTU:1480  Metric:1
          RX packets:0 errors:0 dropped:0 overruns:0 frame:0
          TX packets:0 errors:0 dropped:0 overruns:0 carrier:0
          collisions:0 txqueuelen:1 
          RX bytes:0 (0.0 B)  TX bytes:0 (0.0 B)

virbr0    Link encap:Ethernet  HWaddr c2:b1:d7:6d:02:c2  
          inet addr:192.168.122.1  Bcast:192.168.122.255  Mask:255.255.255.0
          UP BROADCAST MULTICAST  MTU:1500  Metric:1
          RX packets:0 errors:0 dropped:0 overruns:0 frame:0
          TX packets:0 errors:0 dropped:0 overruns:0 carrier:0
          collisions:0 txqueuelen:1000 
          RX bytes:0 (0.0 B)  TX bytes:0 (0.0 B)
Клиент X16042:
 
$ ifconfig -a
ens3      Link encap:Ethernet  HWaddr de:ad:be:ef:00:05  
          UP BROADCAST RUNNING MULTICAST  MTU:1500  Metric:1
          RX packets:0 errors:0 dropped:0 overruns:0 frame:0
          TX packets:228 errors:0 dropped:0 overruns:0 carrier:0
          collisions:0 txqueuelen:1000 
          RX bytes:0 (0.0 B)  TX bytes:36928 (36.9 KB)

lo        Link encap:Local Loopback  
          inet addr:127.0.0.1  Mask:255.0.0.0
          inet6 addr: ::1/128 Scope:Host
          UP LOOPBACK RUNNING  MTU:65536  Metric:1
          RX packets:3972 errors:0 dropped:0 overruns:0 frame:0
          TX packets:3972 errors:0 dropped:0 overruns:0 carrier:0
          collisions:0 txqueuelen:1 
          RX bytes:298824 (298.8 KB)  TX bytes:298824 (298.8 KB)
Получаю интернет в вируалке выполнив на хосте:
# brctl addif virbr0 X16042_eth0
# ifconfig X16042_eth0 0.0.0.0 promisc up

superuser ★★★★★
()
Ответ на: комментарий от superuser

0xde -> 110111[10]

locally administrated, unicast. Все внорме.

pascal ★★★
() автор топика
Последнее исправление: pascal (всего исправлений: 1)
Ответ на: комментарий от superuser

Решение без мостов.

На хосте:

ip a a 10.10.0.1/30 dev X16042_eth0
ip l set dev X16042_eth0 up
iptables -t nat -A POSTROUTING -s 10.10.0.2/32 -o eth0 -j MASQUERADE
echo 1 > /proc/sys/net/ipv4/ip_forward

На клиенте:

echo 'nameserver 208.67.222.222' > /etc/resolv.conf
ip a a 10.10.0.2/30 dev ens3
ip l set dev ens3 up
ip r a default via 10.10.0.1

Возможно в будущем упрощу настройку сети в самой программе.

pascal ★★★
() автор топика
Последнее исправление: pascal (всего исправлений: 1)
Ответ на: комментарий от pascal

Возможно в будущем упрощу настройку сети в самой программе.

Сделай хотя-бы опцию -net user (yes/no), вроде-бы достаточно, чтобы сразу иметь интернет в госте.

superuser ★★★★★
()
Ответ на: комментарий от pascal

Ещё. Вот смотрю строку, что выдаёт программа:

cat /tmp/qemu_last_cmd.log
( /usr/bin/qemu-system-i386 -boot d -cdrom /home/user/ISO/xubuntu-16.04.2-desktop-i386.iso -hda /home/user/qemu_vm/test123/test123_a.img -m 1024 -enable-kvm -net nic,macaddr=de:ad:be:ef:00:04,model=rtl8139 -net tap,ifname=test123_eth0,script=no,downscript=no -vnc 127.0.0.1:3 -pidfile /home/user/qemu_vm/test123/qemu.pid > /dev/null 2>&1; rm -f /home/user/qemu_vm/test123/qemu.pid )&
имя tap-интерфейса (ifname) зря указываешь, macaddr - тоже. Оставь их лучше пустыми, QEMU сам создаст нужные. А вот при конфигурации вручную (по клавише i), там сделай например по F2 - сгенерировать имена их уникальными и т.д.

superuser ★★★★★
()
Последнее исправление: superuser (всего исправлений: 2)

Ещё. Почему обязательно создаётся диск? Можно сделать так, что если указать размер 0, то диск не будет создаваться?

superuser ★★★★★
()
Ответ на: комментарий от superuser

Будет отдельное окно Add guest.
Там диск не надо будет создавать.

//имя tap-интерфейса (ifname) зря указываешь, macaddr - тоже.

Мне кажется так удобнее, а что с этой фичей есть какие-либо проблемы?

pascal ★★★
() автор топика
Ответ на: комментарий от superuser

Тогда все сломается :). Но я могу на старте впилить проверку на дубли и отследить эту ситуацию, спасибо за идею.

pascal ★★★
() автор топика
Ответ на: комментарий от RazrFalcon

Куча проектов на gitlab.com(включая например procps - один из основных консольных компонентов на не-embedded Linux-системах) и bitbucket(лень искать что-то большое и значительное) смотрят на тех, кто не признает альтернативный хостинг для DVCS(!) с недоумением

Я не пытаюсь принизить значение гитхаба как платформы для «социального кодинга». Но утверждать что это ЕДИНСТВЕННАЯ платформа - сильно кривить душой.

Pinkbyte ★★★★★
()
Последнее исправление: Pinkbyte (всего исправлений: 1)
Ответ на: комментарий от Pinkbyte

Я не встречал ни одного проекта, который бы хостился на gitlab.

На битбакете парочку знаю.

99% - github.

Тем не менее, мне кажется, что на gitlab количество репозиторий не доходит даже до 1% github'a.

RazrFalcon ★★★★★
()
Ответ на: комментарий от RazrFalcon

Я не встречал ни одного проекта, который бы хостился на gitlab.

«Если вы чего-то не знаете, то это не значит, что этого нет в природе» (c)

Pinkbyte ★★★★★
()
Ответ на: комментарий от Pinkbyte

Если я ищу либу, для любого языка, с вероятностью 99.9% она будет на гитхабе.

Со статистикой не поспоришь.

RazrFalcon ★★★★★
()
Ответ на: комментарий от Pinkbyte

«Если вы чего-то не знаете, то это не значит, что этого нет в природе» (c)

Ерунда, ты можешь читать это и не бояться что этого нет в природе. И чем больше ты будешь глядеть на ЛОР, тем больше ты будешь не бояться этого в природе.

anonymous
()
Ответ на: комментарий от anonymous

Между тем qemu-manage был переименован в nEMU, изменилась лицензия на BSD-2, и вообще весь проект переписывается на С :D

pascal ★★★
() автор топика
Ответ на: комментарий от superuser

Перенос программы на С ещё не завершен, пока надо собираться с тага 0.4.0

pascal ★★★
() автор топика
Последнее исправление: pascal (всего исправлений: 1)
Вы не можете добавлять комментарии в эту тему. Тема перемещена в архив.