-
-
Save nailarch/7521a136c676958f25cfc59bc8dc028c to your computer and use it in GitHub Desktop.
Linux - KVM + QEMU installer from sources :)
This file contains bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
#!/bin/bash | |
# | |
# For latest version please check https://github.com/doomedraven/Tools/blob/master/Virtualization/kvm-qemu.sh | |
# | |
# https://www.doomedraven.com/2016/05/kvm.html | |
# Use Ubuntu 18.04 LTS | |
# 14.12.2018 - QEMU 3.1, libvirt-2.10 | |
# 10.11.2018 - Virt-manager 2, libivrt-4.9, fixes | |
# 11.09.2018 - code improvement | |
# 09.09.2018 - ACPI fixes - huge thanks to @2sec4u and @seifreed for your patience and your time/help :P | |
# 05.09.2018 - libivrt 4.7 and virtlogd | |
# 19.08.2018 - Intel HAXM notes | |
# 14.08.2018 - QEMU 3 support tested on ubuntu 18.04 | |
# 03.08.2018 - More anti-anti by Tim Shelton (redsand) @ HAWK (hawk.io) and @http_error_418 | |
# 28.02.2018 - Support for qemu 2.12 | |
# https://github.com/dylanaraps/pure-bash-bible | |
# https://www.shellcheck.net/ | |
# ACPI tables related | |
# https://wiki.archlinux.org/index.php/DSDT | |
# Dump on linux | |
# acpidump > acpidump.out | |
# Dump on Windows | |
# https://acpica.org/downloads/binary-tools | |
# acpixtract -a acpi/4/acpi.dump | |
# acpixtract -a acpidump.out | |
# iasl -d DSDT.dat | |
# Decompile: iasl -d dsdt.dat | |
# Recompile: iasl -tc dsdt.dsl | |
# strs[0] = "KVMKVMKVM\0\0\0"; /* KVM */ | |
# strs[1] = "Microsoft Hv"; /* Microsoft Hyper-V or Windows Virtual PC */ | |
# strs[2] = "VMwareVMware"; /* VMware */ | |
# strs[3] = "XenVMMXenVMM"; /* Xen */ | |
# strs[4] = "prl hyperv "; /* Parallels */ | |
# strs[5] = "VBoxVBoxVBox"; /* VirtualBox */ | |
#https://www.qemu.org/download/#source or https://download.qemu.org/ | |
qemu_version=3.1.0 | |
# libvirt - https://libvirt.org/sources/ | |
libvirt_version=4.10.0 | |
# virt-manager - https://github.com/virt-manager/virt-manager/releases | |
virt_manager_version=2.0.0 | |
# autofilled | |
OS="" | |
username="" | |
function usage() { | |
cat << EndOfHelp | |
Usage: $0 <func_name> <args> | |
Commands - are case insensitive: | |
All - <username_optional> - Execs QEMU/SeaBios/KVM, username is optional | |
QEMU - Install QEMU from source | |
SeaBios - Install SeaBios and repalce QEMU bios file | |
KVM - this will install intel-HAXM if you on Mac | |
HAXM - Mac Hardware Accelerated Execution Manager | |
Clone - <VM_NAME> <path_to_hdd> <start_from_number> <#vm_to_create> <path_where_to_store> <network_range_base> | |
* Example Win7x64 /VMs/Win7x64.qcow2 0 5 /var/lib/libvirt/images/ 192.168.1 | |
https://wiki.qemu.org/Documentation/CreateSnapshot | |
Libvirt <username_optional> - install libvirt, username is optional | |
Replace_qemu - only fix antivms in QEMU source | |
Replace_seabios <path> - only fix antivms in SeaBios source | |
Issues - will give you error - solution list | |
noip - Install No-ip deamon and enable on boot | |
EndOfHelp | |
} | |
function _check_brew() { | |
if [ ! -f /usr/local/bin/brew ]; then | |
/usr/bin/ruby -e "$(curl -fsSL https://raw.githubusercontent.com/Homebrew/install/master/install)" | |
fi | |
} | |
function install_haxm_mac() { | |
_check_brew | |
brew cask install intel-haxm | |
brew tap jeffreywildman/homebrew-virt-manager | |
brew cask install xquartz | |
brew install virt-manager virt-viewer | |
if [ "$SHELL" = "/bin/zsh" ] || [ "$SHELL" = "/usr/bin/zsh" ] ; then | |
echo "export LIBVIRT_DEFAULT_URI=qemu:///system" >> "$HOME/.zsh" | |
else | |
echo "export LIBVIRT_DEFAULT_URI=qemu:///system" >> "$HOME/.bashrc" | |
fi | |
} | |
function install_libvirt() { | |
#dpkg —purge libivrt-4.7.0 | |
# http://ask.xmodulo.com/compile-virt-manager-debian-ubuntu.html | |
#rm -r /usr/local/lib/python2.7/dist-packages/libvirt* | |
#apt-get install python-libvirt libgtk-3-dev libvirt-glib-1.0 gir1.2-gtk-vnc-2.0 libosinfo-1.0 python-ipaddr python-libxml2 python-requests qemu-kvm- qemu-system-common- qemu-system-x86- qemu-utils- seabios- ipxe-qemu- ipxe-qemu-256k-compat-efi-roms- | |
cd /tmp || return | |
if [ -f libvirt-$libvirt_version.tar.xz ]; then | |
rm -r libvirt-$libvirt_version | |
else | |
wget https://libvirt.org/sources/libvirt-$libvirt_version.tar.xz | |
fi | |
tar xf libvirt-$libvirt_version.tar.xz | |
cd libvirt-$libvirt_version || return | |
if [ "$OS" = "Linux" ]; then | |
apt-get install unzip numad glib-2.0 libglib2.0-dev libsdl1.2-dev lvm2 python-pip python-libxml2 python3-libxml2 ebtables libosinfo-1.0-dev libnl-3-dev libnl-route-3-dev libyajl-dev xsltproc libapparmor-dev libdevmapper-dev libpciaccess-dev apparmor-utils -y 2>/dev/null | |
pip install ipaddr | |
# --prefix=/usr --localstatedir=/var --sysconfdir=/etc | |
./autogen.sh --system --with-qemu=yes --with-dtrace --with-numad --with-storage-rbd --disable-nls --with-openvz=no --with-vmware=no --with-phyp=no --with-xenapi=no --with-libxl=no --with-vbox=no --with-lxc=no --with-vz=no --with-esx=no --with-hyperv=no --with-yajl=yes --with-secdriver-apparmor=yes --with-apparmor-profiles --with-apparmor-profiles | |
make -j"$(getconf _NPROCESSORS_ONLN)" | |
checkinstall -D --pkgname=libvirt-$libvirt_version --default | |
#make -j"$(getconf _NPROCESSORS_ONLN)" install | |
elif [ "$OS" = "Darwin" ]; then | |
./autogen.sh --system --prefix=/usr/local/ --localstatedir=/var --sysconfdir=/etc --with-qemu=yes --with-dtrace --disable-nls --with-openvz=no --with-vmware=no --with-phyp=no --with-xenapi=no --with-libxl=no --with-vbox=no --with-lxc=no --with-vz=no --with-esx=no --with-hyperv=no --with-wireshark-dissector=no --with-yajl=yes | |
fi | |
# https://wiki.archlinux.org/index.php/Libvirt#Using_polkit | |
if [ -f /etc/libvirt/libvirtd.conf ]; then | |
path="/etc/libvirt/libvirtd.conf" | |
elif [ -f /usr/local/etc/libvirt/libvirtd.conf ]; then | |
path="/usr/local/etc/libvirt/libvirtd.conf" | |
fi | |
sed -i 's/#unix_sock_group/unix_sock_group/g' $path | |
sed -i 's/#unix_sock_ro_perms = "0777"/unix_sock_ro_perms = "0770"/g' $path | |
sed -i 's/#unix_sock_rw_perms = "0770"/unix_sock_rw_perms = "0770"/g' $path | |
sed -i 's/#auth_unix_ro = "none"/auth_unix_ro = "none"/g' $path | |
sed -i 's/#auth_unix_rw = "none"/auth_unix_rw = "none"/g' $path | |
# https://gitlab.com/apparmor/apparmor/wikis/Libvirt | |
echo "[+] Setting AppArmor for libvirt/kvm/qemu" | |
sed -i 's/#security_driver = "selinux"/security_driver = "apparmor"/g' /etc/libvirt/qemu.conf | |
aa-complain /usr/sbin/libvirtd | |
cd /tmp || return | |
if [ ! -f v$libvirt_version.zip ]; then | |
wget https://github.com/libvirt/libvirt-python/archive/v$libvirt_version.zip | |
fi | |
unzip v$libvirt_version.zip | |
cd libvirt-python* || return | |
python3 setup.py build | |
python3 setup.py install | |
if [ "$OS" = "Linux" ]; then | |
# https://github.com/libvirt/libvirt/commit/e94979e901517af9fdde358d7b7c92cc055dd50c | |
groupname="" | |
if grep -q -E '^libvirtd:' /etc/group; then | |
groupname="libvirtd" | |
elif grep -q -E '^libvirt:' /etc/group; then | |
groupname="libvirt" | |
else | |
# create group if missed | |
groupname="libvirt" | |
groupadd libvirt | |
fi | |
usermod -G $groupname -a "$(whoami)" | |
if "$username"; then | |
usermod -G $groupname -a "$username" | |
fi | |
echo "[+] You should logout and login " | |
fi | |
} | |
function install_kvm_linux_apt() { | |
#sed -i 's/# deb-src/deb-src/g' /etc/apt/sources.list | |
apt-get update 2>/dev/null | |
apt-get install build-essential python-pip python-pip3 gcc pkg-config cpu-checker intltool -y 2>/dev/null | |
apt-get install gtk-update-icon-cache -y 2>/dev/null | |
# WSL support | |
apt-get install gcc make gnutls-bin -y | |
# remove old | |
apt-get purge libvirt0 libvirt-bin -y | |
install_libvirt | |
systemctl enable libvirtd.service | |
systemctl restart libvirtd.service | |
systemctl enable virtlogd.socket | |
systemctl restart virtlogd.socket | |
# from build-dep | |
apt install libgirepository1.0-dev gtk-doc-tools python-pip python3-pip gir1.2-govirt-1.0 libgovirt-dev \ | |
libgovirt-common libgovirt2 gir1.2-rest-0.7 unzip intltool augeas-doc ifupdown wodim cdrkit-doc indicator-application \ | |
augeas-tools radvd auditd systemtap nfs-common zfsutils pm-utils python-openssl-doc python-socks python-ntlm samba ovmf \ | |
debootstrap sharutils-doc ssh-askpass gnome-keyring python-requests python-six python-urllib3 python2.7 python2.7-minimal \ | |
sharutils spice-client-glib-usb-acl-helper ubuntu-mono x11-common python-cryptography python-dbus python-enum34 python-gi \ | |
python-gi-cairo python-idna python-ipaddr python-ipaddress python-libxml2 python3-libxml2 python-minimal python-openssl python-pkg-resources \ | |
libxml2-utils libxrandr2 libxrender1 libxshmfence1 libxtst6 libxv1 libyajl2 msr-tools osinfo-db python python-asn1crypto \ | |
python-cairo python-certifi python-cffi-backend python-chardet libxcb-present0 libxcb-render0 libxcb-shm0 libxcb-sync1 \ | |
libxcb-xfixes0 libxcomposite1 libxcursor1 libxdamage1 libxen-4.9 libxenstore3.0 libxfixes3 libxft2 libxi6 libxinerama1 \ | |
libxkbcommon0 libusbredirhost1 libusbredirparser1 libv4l-0 libv4lconvert0 libvisual-0.4-0 libvorbis0a libvorbisenc2 libvpx5 \ | |
libvte-2.91-0 libvte-2.91-common libwavpack1 libwayland-client0 libwayland-cursor0 libwayland-egl1-mesa libwayland-server0 \ | |
libx11-xcb1 libxcb-dri2-0 libxcb-dri3-0 libsoup-gnome2.4-1 libsoup2.4-1 libspeex1 libspice-client-glib-2.0-8 \ | |
libspice-client-gtk-3.0-5 libspice-server1 libtag1v5 libtag1v5-vanilla libthai-data libthai0 libtheora0 libtiff5 \ | |
libtwolame0 libpython2.7 libpython2.7-minimal libpython2.7-stdlib librados2 libraw1394-11 librbd1 librdmacm1 librest-0.7-0 \ | |
librsvg2-2 librsvg2-common libsamplerate0 libsdl1.2debian libshout3 libsndfile1 libpango-1.0-0 libpangocairo-1.0-0 \ | |
libpangoft2-1.0-0 libpangoxft-1.0-0 libpciaccess0 libphodav-2.0-0 libphodav-2.0-common libpixman-1-0 libproxy1v5 \ | |
libpulse-mainloop-glib0 libpulse0 libpython-stdlib libgstreamer1.0-0 libgtk-3-0 libgtk-3-bin libgtk-3-common libgtk-vnc-2.0-0 \ | |
libgudev-1.0-0 libgvnc-1.0-0 libharfbuzz0b libibverbs1 libiec61883-0 libindicator3-7 libiscsi7 libjack-jackd2-0 libjbig0 \ | |
libjpeg-turbo8 libjpeg8 libjson-glib-1.0-0 libjson-glib-1.0-common liblcms2-2 libmp3lame0 libmpg123-0 libnetcf1 libnl-route-3-200 \ | |
libnspr4 libnss3 libogg0 libopus0 liborc-0.4-0 libosinfo-1.0-0 libcairo-gobject2 libcairo2 libcdparanoia0 libcolord2 libcroco3 \ | |
libcups2 libdatrie1 libdbusmenu-glib4 libdbusmenu-gtk3-4 libdconf1 libdv4 libegl-mesa0 libegl1 libepoxy0 libfdt1 libflac8 \ | |
libfontconfig1 libgbm1 libgdk-pixbuf2.0-0 libgdk-pixbuf2.0-bin libgdk-pixbuf2.0-common libglapi-mesa libglvnd0 libgraphite2-3 \ | |
libgstreamer-plugins-base1.0-0 libgstreamer-plugins-good1.0-0 gtk-update-icon-cache hicolor-icon-theme humanity-icon-theme \ | |
ibverbs-providers libaa1 libaio1 libappindicator3-1 libasound2 libasound2-data libasyncns0 libatk-bridge2.0-0 libatk1.0-0 \ | |
libatk1.0-data libatspi2.0-0 libaugeas0 libavahi-client3 libavahi-common-data libavahi-common3 libavc1394-0 libbluetooth3 \ | |
libbrlapi0.6 libcaca0 libcacard0 gir1.2-atk-1.0 gir1.2-freedesktop gir1.2-gdkpixbuf-2.0 gir1.2-gtk-3.0 gir1.2-gtk-vnc-2.0 \ | |
gir1.2-libosinfo-1.0 gir1.2-pango-1.0 gir1.2-spiceclientglib-2.0 gir1.2-spiceclientgtk-3.0 gir1.2-vte-2.91 glib-networking \ | |
glib-networking-common glib-networking-services gsettings-desktop-schemas gstreamer1.0-plugins-base gstreamer1.0-plugins-good \ | |
gstreamer1.0-x adwaita-icon-theme at-spi2-core augeas-lenses bridge-utils cpu-checker dconf-gsettings-backend dconf-service \ | |
fontconfig fontconfig-config fonts-dejavu-core genisoimage gir1.2-appindicator3-0.1 gir1.2-secret-1 -y 2>/dev/null | |
# should be installed first | |
pip install pycairo | |
pip3 install pycairo | |
pip3 install PyGObject -U | |
pip install PyGObject -U | |
cd /tmp || return | |
if wget https://libvirt.org/sources/glib/libvirt-glib-1.0.0.tar.gz; then | |
tar xf libvirt-glib-1.0.0.tar.gz | |
cd libvirt-glib-1.0.0 | |
aclocal && libtoolize --force | |
automake --add-missing | |
./configure | |
make -j"$(getconf _NPROCESSORS_ONLN)" | |
checkinstall --pkgname=libvirt-glib-1.0-0 --default | |
wget http://launchpadlibrarian.net/297448356/gir1.2-libvirt-glib-1.0_1.0.0-1_amd64.deb | |
dpkg -i gir1.2-libvirt-glib-1.0_1.0.0-1_amd64.deb | |
#apt-get install gir1.2-libvirt-glib-1.0 -y | |
/sbin/ldconfig | |
fi | |
if [ ! -f "virt-manager" ]; then | |
#git clone -b v1.5-maint https://github.com/virt-manager/virt-manager.git | |
git clone https://github.com/virt-manager/virt-manager.git | |
fi | |
cd "virt-manager" || return | |
apt-get install gobject-introspection intltool pkg-config python-lxml python3-libxml2 libxml2-dev libxslt-dev python-dev gir1.2-gtk-vnc-2.0 gir1.2-spiceclientgtk-3.0 libgtk-3-dev -y | |
# py3 | |
python3 setup.py build | |
python3 setup.py install | |
if [ "$SHELL" = "/bin/zsh" ] || [ "$SHELL" = "/usr/bin/zsh" ] ; then | |
echo "export LIBVIRT_DEFAULT_URI=qemu:///system" >> "$HOME/.zsh" | |
else | |
echo "export LIBVIRT_DEFAULT_URI=qemu:///system" >> "$HOME/.bashrc" | |
fi | |
#reboot me here | |
kvm-ok | |
} | |
function replace_qemu_clues_public() { | |
echo '[+] Patching QEMU clues' | |
if ! sed -i 's/QEMU HARDDISK/<WOOT> HARDDISK/g' qemu*/hw/ide/core.c; then | |
echo 'QEMU HARDDISK was not replaced in core.c'; fail=1 | |
fi | |
if ! sed -i 's/QEMU HARDDISK/<WOOT> HARDDISK/g' qemu*/hw/scsi/scsi-disk.c; then | |
echo 'QEMU HARDDISK was not replaced in scsi-disk.c'; fail=1 | |
fi | |
if ! sed -i 's/QEMU DVD-ROM/<WOOT> DVD-ROM/g' qemu*/hw/ide/core.c; then | |
echo 'QEMU DVD-ROM was not replaced in core.c'; fail=1 | |
fi | |
if ! sed -i 's/QEMU DVD-ROM/<WOOT> DVD-ROM/g' qemu*/hw/ide/atapi.c; then | |
echo 'QEMU DVD-ROM was not replaced in atapi.c'; fail=1 | |
fi | |
if ! sed -i 's/s->vendor = g_strdup("QEMU");/s->vendor = g_strdup("<WOOT>");/g' qemu*/hw/scsi/scsi-disk.c; then | |
echo 'Vendor string was not replaced in scsi-disk.c'; fail=1 | |
fi | |
if ! sed -i 's/QEMU CD-ROM/<WOOT> CD-ROM/g' qemu*/hw/scsi/scsi-disk.c; then | |
echo 'QEMU CD-ROM was not patched in scsi-disk.c'; fail=1 | |
fi | |
if ! sed -i 's/padstr8(buf + 8, 8, "QEMU");/padstr8(buf + 8, 8, "<WOOT>");/g' qemu*/hw/ide/atapi.c; then | |
echo 'padstr was not replaced in atapi.c'; fail=1 | |
fi | |
if ! sed -i 's/QEMU MICRODRIVE/<WOOT> MICRODRIVE/g' qemu*/hw/ide/core.c; then | |
echo 'QEMU MICRODRIVE was not replaced in core.c'; fail=1 | |
fi | |
if ! sed -i 's/KVMKVMKVM\\0\\0\\0/GenuineIntel/g' qemu*/target/i386/kvm.c; then | |
echo 'KVMKVMKVM was not replaced in kvm.c'; fail=1 | |
fi | |
# by @http_error_418 | |
#if sed -i 's/Microsoft Hv/GenuineIntel/g' qemu*/target/i386/kvm.c; then | |
# echo 'Microsoft Hv was not replaced in target/i386/kvm.c'; fail=1 | |
#fi | |
if ! sed -i 's/"bochs"/"hawks"/g' qemu*/block/bochs.c; then | |
echo 'BOCHS was not replaced in block/bochs.c'; fail=1 | |
fi | |
# by Tim Shelton (redsand) @ HAWK (hawk.io) | |
if ! sed -i 's/"BOCHS "/"ALASKA"/g' qemu*/include/hw/acpi/aml-build.h; then | |
echo 'bochs was not replaced in include/hw/acpi/aml-build.h'; fail=1 | |
fi | |
# by Tim Shelton (redsand) @ HAWK (hawk.io) | |
if ! sed -i 's/Bochs Pseudo/Intel RealTime/g' qemu*/roms/ipxe/src/drivers/net/pnic.c; then | |
echo 'Bochs Pseudo was not replaced in roms/ipxe/src/drivers/net/pnic.c'; fail=1 | |
fi | |
# by Tim Shelton (redsand) @ HAWK (hawk.io) | |
#if ! sed -i 's/Bochs\/Plex86/<WOOT>\/FIRM64/g' qemu*/roms/vgabios/vbe.c; then | |
# echo 'BOCHS was not replaced in roms/vgabios/vbe.c'; fail=1 | |
#fi | |
} | |
function replace_seabios_clues_public() { | |
echo "[+] Generating SeaBios Kconfig" | |
echo "[+] Fixing SeaBios antivms" | |
if ! sed -i 's/Bochs/<WOOT>/g' src/config.h; then | |
echo 'Bochs was not replaced in src/config.h'; fail=1 | |
fi | |
if ! sed -i 's/BOCHSCPU/<WOOT>/g' src/config.h; then | |
echo 'BOCHSCPU was not replaced in src/config.h'; fail=1 | |
fi | |
if ! sed -i 's/"BOCHS "/"<WOOT>"/g' src/config.h; then | |
echo 'BOCHS was not replaced in src/config.h'; fail=1 | |
fi | |
if ! sed -i 's/BXPC/<WOOT>/g' src/config.h; then | |
echo 'BXPC was not replaced in src/config.h'; fail=1 | |
fi | |
if ! sed -i 's/QEMU0001/<WOOT>/g' src/fw/ssdt-misc.dsl; then | |
echo 'QEMU0001 was not replaced in src/fw/ssdt-misc.dsl'; fail=1 | |
fi | |
if ! sed -i 's/QEMU\/Bochs/<WOOT>\/<WOOT>/g' vgasrc/Kconfig; then | |
echo 'QEMU\/Bochs was not replaced in vgasrc/Kconfig'; fail=1 | |
fi | |
if ! sed -i 's/qemu /<WOOT> /g' vgasrc/Kconfig; then | |
echo 'qemu was not replaced in vgasrc/Kconfig'; fail=1 | |
fi | |
FILES=( | |
src/hw/blockcmd.c | |
src/fw/paravirt.c | |
) | |
for file in "${FILES[@]}"; do | |
if ! sed -i 's/"QEMU/"<WOOT>/g' "$file"; then | |
echo "QEMU was not replaced in $file"; fail=1 | |
fi | |
done | |
if ! sed -i 's/"QEMU"/"<WOOT>"/g' src/hw/blockcmd.c; then | |
echo '"QEMU" was not replaced in src/hw/blockcmd.c'; fail=1 | |
fi | |
FILES=( | |
"src/fw/acpi-dsdt.dsl" | |
"src/fw/q35-acpi-dsdt.dsl" | |
) | |
for file in "${FILES[@]}"; do | |
if ! sed -i 's/"BXPC"/<WOOT>"/g' "$file"; then | |
echo "BXPC was not replaced in $file"; fail=1 | |
fi | |
if ! sed -i 's/"BXDSDT"/"<WOOT>"/g' "$file"; then | |
echo "BXDSDT was not replaced in $file"; fail=1 | |
fi | |
done | |
if ! sed -i 's/"BXPC"/"<WOOT>"/g' "src/fw/ssdt-pcihp.dsl"; then | |
echo 'BXPC was not replaced in src/fw/ssdt-pcihp.dsl'; fail=1 | |
fi | |
if ! sed -i 's/"BXDSDT"/"<WOOT>"/g' "src/fw/ssdt-pcihp.dsl"; then | |
echo 'BXDSDT was not replaced in src/fw/ssdt-pcihp.dsl'; fail=1 | |
fi | |
if ! sed -i 's/"BXPC"/"<WOOT>"/g' "src/fw/ssdt-proc.dsl"; then | |
echo 'BXPC was not replaced in "src/fw/ssdt-proc.dsl"'; fail=1 | |
fi | |
if ! sed -i 's/"BXSSDT"/"<WOOT>"/g' "src/fw/ssdt-proc.dsl"; then | |
echo 'BXSSDT was not replaced in src/fw/ssdt-proc.dsl'; fail=1 | |
fi | |
if ! sed -i 's/"BXPC"/"<WOOT>"/g' "src/fw/ssdt-misc.dsl"; then | |
echo 'BXPC was not replaced in src/fw/ssdt-misc.dsl'; fail=1 | |
fi | |
if ! sed -i 's/"BXSSDTSU"/"<WOOT>"/g' "src/fw/ssdt-misc.dsl"; then | |
echo 'BXDSDT was not replaced in src/fw/ssdt-misc.dsl'; fail=1 | |
fi | |
if ! sed -i 's/"BXSSDTSUSP"/"<WOOT>"/g' src/fw/ssdt-misc.dsl; then | |
echo 'BXSSDTSUSP was not replaced in src/fw/ssdt-misc.dsl'; fail=1 | |
fi | |
if ! sed -i 's/"BXSSDT"/"<WOOT>"/g' src/fw/ssdt-proc.dsl; then | |
echo 'BXSSDT was not replaced in src/fw/ssdt-proc.dsl'; fail=1 | |
fi | |
if ! sed -i 's/"BXSSDTPCIHP"/"<WOOT>"/g' src/fw/ssdt-pcihp.dsl; then | |
echo 'BXPC was not replaced in src/fw/ssdt-pcihp.dsl'; fail=1 | |
fi | |
FILES=( | |
src/fw/q35-acpi-dsdt.dsl | |
src/fw/acpi-dsdt.dsl | |
src/fw/ssdt-misc.dsl | |
src/fw/ssdt-proc.dsl | |
src/fw/ssdt-pcihp.dsl | |
src/config.h | |
) | |
for file in "${FILES[@]}"; do | |
if ! sed -i 's/"BXPC"/"A M I"/g' "$file"; then | |
echo "BXPC was not replaced in $file"; fail=1 | |
fi | |
done | |
} | |
function qemu_func() { | |
cd /tmp || return | |
echo '[+] Cleaning QEMU old install if exists' | |
rm -r /usr/share/qemu >/dev/null 2>&1 | |
dpkg -r ubuntu-vm-builder python-vm-builder >/dev/null 2>&1 | |
dpkg -l |grep qemu |cut -d " " -f 3|xargs dpkg --purge --force-all >/dev/null 2>&1 | |
echo '[+] Downloading QEMU source code' | |
if [ ! -f qemu-$qemu_version.tar.xz ]; then | |
wget "https://download.qemu.org/qemu-$qemu_version.tar.xz" | |
fi | |
if [ ! -f qemu-$qemu_version.tar.xz ]; then | |
echo "[-] Download qemu-$qemu_version failed" | |
exit | |
fi | |
if ! $(tar xf "qemu-$qemu_version.tar.xz") ; then | |
echo "[-] Failed to extract, check if download was correct" | |
exit 1 | |
fi | |
fail=0 | |
if [ "$OS" = "Linux" ]; then | |
add-apt-repository universe | |
apt-get update | |
apt-get install checkinstall openbios-* libssh2-1-dev vde2 liblzo2-dev libghc-gtk3-dev libsnappy-dev libbz2-dev libxml2-dev google-perftools libgoogle-perftools-dev libvde-dev -y 2>/dev/null | |
apt-get install debhelper ibusb-1.0-0-dev libxen-dev uuid-dev xfslibs-dev libjpeg-dev libusbredirparser-dev device-tree-compiler texinfo libbluetooth-dev libbrlapi-dev libcap-ng-dev libcurl4-gnutls-dev libfdt-dev gnutls-dev libiscsi-dev libncurses5-dev libnuma-dev libcacard-dev librados-dev librbd-dev libsasl2-dev libseccomp-dev libspice-server-dev \ | |
libaio-dev libcap-dev libattr1-dev libpixman-1-dev libgtk2.0-bin libxml2-utils systemtap-sdt-dev -y 2>/dev/null | |
elif [ "$OS" = "Darwin" ]; then | |
_check_brew | |
brew install pkg-config libtool jpeg gnutls glib ncurses pixman libpng vde gtk+3 libssh2 libssh2 libvirt snappy libcapn gperftools glib -y | |
fi | |
# WOOT | |
# some checks may be depricated, but keeping them for compatibility with old versions | |
if [ $? -eq 0 ]; then | |
if declare -f -F "replace_qemu_clues"; then | |
replace_qemu_clues | |
else | |
replace_qemu_clues_public | |
fi | |
if [ $fail -eq 0 ]; then | |
echo '[+] Starting compile it' | |
cd qemu-$qemu_version || return | |
# add in future --enable-netmap https://sgros-students.blogspot.com/2016/05/installing-and-testing-netmap.html | |
# remove --target-list=i386-softmmu,x86_64-softmmu,i386-linux-user,x86_64-linux-user if you want all targets | |
if [ "$OS" = "Linux" ]; then | |
./configure --prefix=/usr --libexecdir=/usr/lib/qemu --localstatedir=/var --bindir=/usr/bin/ --enable-gnutls --enable-docs --enable-gtk --enable-vnc --enable-vnc-sasl --enable-vnc-png --enable-vnc-jpeg --enable-curl --enable-kvm --enable-linux-aio --enable-cap-ng --enable-vhost-net --enable-vhost-crypto --enable-spice --enable-usb-redir --enable-lzo --enable-snappy --enable-bzip2 --enable-coroutine-pool --enable-libssh2 --enable-libxml2 --enable-tcmalloc --enable-replication --enable-tools --enable-capstone | |
elif [ "$OS" = "Darwin" ]; then | |
# --enable-vhost-net --enable-vhost-crypto | |
./configure --prefix=/usr --libexecdir=/usr/lib/qemu --localstatedir=/var --bindir=/usr/bin/ --enable-gnutls --enable-docs --enable-vnc --enable-vnc-sasl --enable-vnc-png --enable-vnc-jpeg --enable-curl --enable-hax --enable-usb-redir --enable-lzo --enable-snappy --enable-bzip2 --enable-coroutine-pool --enable-libxml2 --enable-tcmalloc --enable-replication --enable-tools --enable-capstone | |
fi | |
if [ $? -eq 0 ]; then | |
echo '[+] Starting Install it' | |
#dpkg -i qemu*.deb | |
if [ -f /usr/share/qemu/qemu_logo_no_text.svg ]; then | |
rm /usr/share/qemu/qemu_logo_no_text.svg | |
fi | |
make -j"$(getconf _NPROCESSORS_ONLN)" | |
if [ "$OS" = "Linux" ]; then | |
checkinstall -D --pkgname=qemu-$qemu_version --nodoc --showinstall=no --default | |
elif [ "$OS" = "Darwin" ]; then | |
make -j"$(getconf _NPROCESSORS_ONLN)" install | |
fi | |
# hack for libvirt/virt-manager | |
if [ ! -f /usr/bin/qemu-system-x86_64-spice ]; then | |
ln -s /usr/bin/qemu-system-x86_64 /usr/bin/qemu-system-x86_64-spice | |
fi | |
if [ ! -f /usr/bin/kvm-spice ]; then | |
ln -s /usr/bin/qemu-system-x86_64 /usr/bin/kvm-spice | |
fi | |
if [ ! -f /usr/bin/kvm ]; then | |
ln -s /usr/bin/qemu-system-x86_64 /usr/bin/kvm | |
fi | |
if [ $? -eq 0 ]; then | |
echo '[+] Patched, compiled and installed' | |
else | |
echo '[-] Install failed' | |
fi | |
groupadd tss | |
useradd -g tss tss | |
else | |
echo '[-] Compilling failed' | |
fi | |
else | |
echo '[-] Check previous output' | |
exit | |
fi | |
else | |
echo '[-] Download QEMU source was not possible' | |
fi | |
if [ "$OS" = "linux" ]; then | |
dpkg --get-selections | grep "qemu" | xargs apt-mark hold | |
dpkg --get-selections | grep "libvirt" | xargs apt-mark hold | |
# apt-mark unhold qemu | |
fi | |
} | |
function seabios_func() { | |
cd /tmp || return | |
fail=0 | |
echo '[+] Installing SeaBios dependencies' | |
apt-get install git iasl -y | |
if [ -d seabios ]; then | |
rm -r seabios | |
fi | |
if git clone https://github.com/coreboot/seabios.git; then | |
cd seabios || return | |
if declare -f -F "replace_seabios_clues"; then | |
replace_seabios_clues | |
else | |
replace_seabios_clues_public | |
fi | |
# make help | |
# make menuconfig -> BIOS tables -> disable Include default ACPI DSDT | |
# get rid of this hack | |
make -j "$(getconf _NPROCESSORS_ONLN)" 2>/dev/null | |
sed -i 's/CONFIG_ACPI_DSDT=y/CONFIG_ACPI_DSDT=n/g' .config | |
sed -i 's/CONFIG_XEN=y/CONFIG_XEN=n/g' .config | |
if make -j "$(getconf _NPROCESSORS_ONLN)"; then | |
echo '[+] Replacing old bios.bin to new out/bios.bin' | |
bios=0 | |
FILES=( | |
"/usr/share/qemu/bios.bin" | |
"/usr/share/qemu/bios-256k.bin" | |
) | |
for file in "${FILES[@]}"; do | |
cp -vf out/bios.bin "$file" | |
bios=1 | |
done | |
if [ $bios -eq 1 ]; then | |
echo '[+] Patched bios.bin placed correctly' | |
else | |
echo '[-] Bios patching failed' | |
fi | |
else | |
echo '[-] Bios compilation failed' | |
fi | |
cd - || return | |
else | |
echo '[-] Check if git installed or network connection is OK' | |
fi | |
} | |
function issues(){ | |
cat << EndOfHelp | |
### Links: | |
* https://access.redhat.com/documentation/en-us/red_hat_enterprise_linux/7/html/virtualization_deployment_and_administration_guide/sect-troubleshooting-common_libvirt_errors_and_troubleshooting | |
### Errors and Solutions | |
* Error: | |
required by /usr/lib/libvirt/storage-file/libvirt_storage_file_fs.so | |
* Solution: | |
systemctl daemon-reload | |
systemctl restart libvirtd libvirt-guests.service | |
* Error: | |
/libvirt.so.0: version LIBVIRT_PRIVATE_x.x.0' not found (required by /usr/sbin/libvirtd) | |
* Solutions: | |
1. apt-get purge libvirt0 libvirt-bin | |
2. ldd /usr/sbin/libvirtd | |
3. ls -lah /usr/lib/libvirt* | |
* Make sure what all symlinks pointing to last version | |
* Error: | |
libvirt: Polkit error : authentication unavailable: no polkit agent available to authenticate action 'org.libvirt.unix.manage' | |
* Solutions: | |
1. | |
sed -i 's/#unix_sock_group/unix_sock_group/g' /etc/libvirt/libvirtd.conf | |
sed -i 's/#unix_sock_ro_perms = "0777"/unix_sock_ro_perms = "0770"/g' /etc/libvirt/libvirtd.conf | |
sed -i 's/#unix_sock_rw_perms = "0770"/unix_sock_rw_perms = "0770"/g' /etc/libvirt/libvirtd.conf | |
sed -i 's/#auth_unix_ro = "none"/auth_unix_ro = "none"/g' /etc/libvirt/libvirtd.conf | |
sed -i 's/#auth_unix_rw = "none"/auth_unix_rw = "none"/g' /etc/libvirt/libvirtd.conf | |
2. Add ssh key to $HOME/.ssh/authorized_keys | |
virt-manager -c "qemu+ssh://user@host/system?socket=/var/run/libvirt/libvirt-sock" | |
* Slow HDD/Snapshot taking performance? | |
Modify | |
<driver name='qemu' type='qcow2'/> | |
To | |
<driver name='qemu' type='qcow2' cache='none' io='native'/> | |
* Error: | |
error : virPidFileAcquirePath:422 : Failed to acquire pid file '/var/run/libvirtd.pid': Resource temporarily unavailable | |
* Solution | |
ps aux | grep libvirtd | |
* Error: | |
Failed to connect socket to '/var/run/libvirt/libvirt-sock': Permission denied | |
* Solution: | |
* usermod -G libvirt -a username | |
* log out and log in | |
# Fixes from http://ask.xmodulo.com/compile-virt-manager-debian-ubuntu.html | |
1. ImportError: No module named libvirt | |
$ apt-get install python-libvirt | |
2. ImportError: No module named libxml2 | |
$ apt-get install python-libxml2 python3-libxml2 | |
3. ImportError: No module named requests | |
$ apt-get install python-requests | |
4. Error launching details: Namespace GtkVnc not available | |
$ apt-get install gir1.2-gtk-vnc-2.0 | |
5. Error launching details: Namespace SpiceClientGtk not available | |
$ apt-get install gir1.2-spice-client-gtk-3.0 | |
6. ValueError: Namespace LibvirtGLib not available | |
$ apt-get install libvirt-glib-1.0 | |
7. ValueError: Namespace Libosinfo not available | |
$ apt-get install libosinfo-1.0 | |
8. ImportError: No module named ipaddr | |
$ apt-get install python-ipaddr | |
9. Namespace Gtk not available: Could not open display: localhost:10.0 | |
$ apt-get install libgtk-3-dev | |
10. ImportError: cannot import name Vte | |
$ apt-get install gir1.2-vte-2.90 | |
EndOfHelp | |
} | |
function cloning() { | |
if [ $# -lt 5 ]; then | |
echo '[-] You must provide <VM_NAME> <path_to_hdd> <start_from_number> <#vm_to_create> <path_where_to_store> <network_base>' | |
exit 1 | |
fi | |
for i in $(seq "$3" "$4"); do | |
worked=1 | |
# bad macaddress can be generated | |
while [ $worked -eq 1 ]; do | |
macaddr=$(hexdump -n 6 -ve '1/1 "%.2x "' /dev/random | awk -v a="2,6,a,e" -v r="$RANDOM" 'BEGIN{srand(r);}NR==1{split(a,b,",");r=int(rand()*4+1);printf "%s%s:%s:%s:%s:%s:%s\n",substr($1,0,1),b[r],$2,$3,$4,$5,$6}') 2>/dev/null | |
#virt-clone --print-xml -n $1_$i -o $1 -m "$macaddr" | |
if [ ! -f "${5}/${1}_${i}.qcow2" ]; then | |
qemu-img create -f qcow2 -b "$2" "$5/$1_$i.qcow2" | |
fi | |
if virt-clone --print-xml -n "$1_$i" -o "$1" -m "$macaddr" 2>/dev/null|sed "s|<driver name=\"qemu\" type=\"qcow2\"/>|<driver name=\"qemu\" type=\"qcow2\" cache=\"none\" io=\"native\"/>\\n <source file=\"${5}/${1}_${i}.qcow2\"/>|" > "$5/$1_$i.xml"; then | |
sed -i "s|<domain type='kvm'>|<domain type='kvm' xmlns:qemu='http://libvirt.org/schemas/domain/qemu/1.0'>" "$5/$1_$i.xml" | |
virsh define "$5/$1_$i.xml" | |
worked=0 | |
fi | |
done | |
echo "<host mac='$macaddr' name='$1_$i' ip='$6.$(($i+1))'/>" | |
done | |
echo "[+] Enjoy" | |
} | |
# Doesn't work ${$1,,} | |
COMMAND=$(echo "$1"|tr "[A-Z]" "[a-z]") | |
case $COMMAND in | |
'-h') | |
usage | |
exit 0;; | |
'issues') | |
issues | |
exit 0;; | |
esac | |
#if ([ "$COMMAND" = "all" ] || [ "$COMMAND" = "libvirt" ]) && [ $# -eq 2 ]; then | |
# if [ id -u "$2" ]; then | |
# username="$2" | |
# else | |
# echo "[-] username $2 doesn't exist" | |
# exit 1 | |
# fi | |
#fi | |
#check if start with root | |
if [ "$EUID" -ne 0 ]; then | |
echo 'This script must be run as root' | |
exit 1 | |
fi | |
OS="$(uname -s)" | |
#add-apt-repository universe | |
#apt-get update && apt-get upgrade | |
#make | |
case "$COMMAND" in | |
'all') | |
apt-get install language-pack-UTF-8 | |
qemu_func | |
seabios_func | |
if [ "$OS" = "Linux" ]; then | |
install_kvm_linux_apt | |
# check if all features enabled | |
virt-host-validate | |
systemctl daemon-reload | |
systemctl restart libvirtd libvirt-guests.service | |
elif [ "$OS" = "Darwin" ]; then | |
install_haxm_mac | |
fi | |
;; | |
'qemu') | |
qemu_func;; | |
'seabios') | |
seabios_func;; | |
'kvm') | |
install_kvm_linux_apt;; | |
'haxm') | |
install_haxm_mac;; | |
'replace_qemu') | |
if declare -f -F "replace_qemu_clues"; then | |
replace_qemu_clues | |
else | |
replace_qemu_clues_public | |
fi | |
;; | |
'libvirt') | |
install_libvirt;; | |
'clone') | |
cloning "$2" "$3" "$4" "$5" "$6" "$7";; | |
'noip') | |
if [ "$OS" = "Linux" ]; then | |
cd /tmp | |
wget http://www.no-ip.com/client/linux/noip-duc-linux.tar.gz | |
tar xf noip-duc-linux.tar.gz | |
rm noip-duc-linux.tar.gz | |
cd "noip-*" | |
make install | |
crontab -l | { cat; echo "@reboot sleep 10 && /usr/local/bin/noip2 -c /usr/local/etc/no-ip2.conf"; } | crontab - | |
elif [ "$OS" = "Darwin" ]; then | |
_check_brew | |
brew cask install no-ip-duc | |
fi | |
;; | |
'replace_seabios') | |
if [ ! -d "$2" ]; then | |
echo "[-] Pass the path to SeaBios folder" | |
exit 1 | |
fi | |
cd "$2" || exit 1 | |
if declare -f -F "replace_seabios_clues"; then | |
replace_seabios_clues | |
else | |
replace_seabios_clues_public | |
fi | |
cd - || exit 0 | |
;; | |
*) | |
usage;; | |
esac |
Sign up for free
to join this conversation on GitHub.
Already have an account?
Sign in to comment