-
-
Save darkhypervisor/0ca11d02d91be64350fbc747afe153b5 to your computer and use it in GitHub Desktop.
Linux - KVM + QEMU installer from sources :)
This file contains hidden or 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 | |
| # https://www.doomedraven.com/2016/05/kvm.html | |
| # 19.08.2018 - Intel HAXM support + MacOSX support | |
| # 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 | |
| # 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.0.0 | |
| # libvirt - https://libvirt.org/sources/ | |
| libvirt_version=4.6.0 | |
| # virt-manager - https://github.com/virt-manager/virt-manager/releases | |
| virt_manager_version="1.5.0" | |
| # autofilled | |
| OS="" | |
| function usage() { | |
| echo 'Usage: $0 <func_name>' | |
| echo | |
| echo 'Commands:' | |
| echo ' All' | |
| echo ' QEMU' | |
| echo ' SeaBios' | |
| echo ' KVM - this will install intel-HAXM if you on Mac' | |
| echo ' HAXM - Mac Hardware Accelerated Execution Manager' | |
| echo ' replace - only fix antivms in qemu source' | |
| exit | |
| } | |
| 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 | |
| pip install libvirt-python | |
| } | |
| function install_kvm_linux_apt() { | |
| sed -i "" 's/# deb-src/deb-src/g' /etc/apt/sources.list | |
| sudo apt-get update | |
| sudo apt-get install build-essential numad python-pip gcc pkg-config cpu-checker glib-2.0 libglib2.0-dev libsdl1.2-dev libaio-dev libcap-dev libattr1-dev libpixman-1-dev gtk-update-icon-cache libgtk2.0-bin # latest for ubuntu 16 | |
| sudo apt-get build-dep qemu binfmt-support | |
| sudo apt-get install lvm2 python-vm-builder ubuntu-vm-builder bridge-utils | |
| sudo 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 | |
| wget https://libvirt.org/sources/libvirt-$libvirt_version.tar.xz | |
| tar xvf libvirt-$libvirt_version.tar.xz | |
| cd libvirt-$libvirt_version | |
| sudo apt-get build-dep libvirt | |
| ./autogen.sh --system | |
| ./configure --prefix=/usr --localstatedir=/var --sysconfdir=/etc --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 | |
| make -j4 | |
| make install | |
| # https://wiki.archlinux.org/index.php/Libvirt#Using_polkit | |
| #/etc/libvirt/libvirtd.conf | |
| #unix_sock_group = "libvirt" | |
| #unix_sock_ro_perms = "0777" # set to 0770 to deny non-group libvirt users | |
| #unix_sock_rw_perms = "0770" | |
| #auth_unix_ro = "none" | |
| #auth_unix_rw = "none" | |
| #sed -i "" 's/#unix_sock_group = "libvirt"/unix_sock_group = "libvirtd"/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_r2 = "none"/auth_unix_ro = "none"/g' /etc/libvirt/libvirtd.conf | |
| # https://github.com/libvirt/libvirt/commit/e94979e901517af9fdde358d7b7c92cc055dd50c | |
| usermod -G libvirtd -a cuckoo | |
| usermod -G libvirtd -a `whoami` | |
| systemctl stop libvirtd.service | |
| systemctl enable libvirtd.service | |
| systemctl start libvirtd.service | |
| pip install libvirt-python | |
| wget https://github.com/virt-manager/virt-manager/archive/v$virt_manager_version.zip | |
| unzip v$virt_manager_version | |
| cd virt-manager-$virt_manager_version | |
| sudo apt-get build-dep virt-manager | |
| ./setup.py install | |
| echo "export LIBVIRT_DEFAULT_URI=qemu:///system" > $HOME/.bashrc | |
| #reboot me here | |
| sudo kvm-ok | |
| } | |
| function replace_qemu_clues() { | |
| echo '[+] Patching QEMU clues' | |
| sed -i 's/QEMU HARDDISK/<WOOT> HARDDISK/g' qemu*/hw/ide/core.c | |
| if [ $? -ne 0 ]; then | |
| echo 'QEMU HARDDISK was not replaced in core.c' | |
| fail=1 | |
| fi | |
| sed -i 's/QEMU HARDDISK/<WOOT> HARDDISK/g' qemu*/hw/scsi/scsi-disk.c | |
| if [ $? -ne 0 ]; then | |
| echo 'QEMU HARDDISK was not replaced in scsi-disk.c' | |
| fail=1 | |
| fi | |
| sed -i 's/QEMU DVD-ROM/<WOOT> DVD-ROM/g' qemu*/hw/ide/core.c | |
| if [ $? -ne 0 ]; then | |
| echo 'QEMU DVD-ROM was not replaced in core.c' | |
| fail=1 | |
| fi | |
| sed -i 's/QEMU DVD-ROM/<WOOT> DVD-ROM/g' qemu*/hw/ide/atapi.c | |
| if [ $? -ne 0 ]; then | |
| echo 'QEMU DVD-ROM was not replaced in atapi.c' | |
| fail=1 | |
| fi | |
| sed -i 's/s->vendor = g_strdup("QEMU");/s->vendor = g_strdup("<WOOT>");/g' qemu*/hw/scsi/scsi-disk.c | |
| if [ $? -ne 0 ]; then | |
| echo 'Vendor string was not replaced in scsi-disk.c' | |
| fail=1 | |
| fi | |
| sed -i 's/QEMU CD-ROM/<WOOT> CD-ROM/g' qemu*/hw/scsi/scsi-disk.c | |
| if [ $? -ne 0 ]; then | |
| echo 'QEMU CD-ROM was not patched in scsi-disk.c' | |
| fail=1 | |
| fi | |
| sed -i 's/padstr8(buf + 8, 8, "QEMU");/padstr8(buf + 8, 8, "<WOOT>");/g' qemu*/hw/ide/atapi.c | |
| if [ $? -ne 0 ]; then | |
| echo 'padstr was not replaced in atapi.c' | |
| fail=1 | |
| fi | |
| sed -i 's/QEMU MICRODRIVE/<WOOT> MICRODRIVE/g' qemu*/hw/ide/core.c | |
| if [ $? -ne 0 ]; then | |
| echo 'QEMU MICRODRIVE was not replaced in core.c' | |
| fail=1 | |
| fi | |
| sed -i 's/KVMKVMKVM\\0\\0\\0/GenuineIntel/g' qemu*/target/i386/kvm.c | |
| if [ $? -ne 0 ]; then | |
| echo 'KVMKVMKVM was not replaced in kvm.c' | |
| fail=1 | |
| fi | |
| # by @http_error_418 | |
| sed -i 's/Microsoft Hv/GenuineIntel/g' qemu*/target/i386/kvm.c | |
| if [ $? -ne 0 ]; then | |
| echo 'Microsoft Hv was not replaced in target/i386/kvm.c' | |
| fail=1 | |
| fi | |
| sed -i 's/"bochs"/"<WOOT>"/g'qemu*/block/bochs.c | |
| if [ $? -ne 0 ]; then | |
| echo 'BOCHS was not replaced in block/bochs.c' | |
| fail=1 | |
| fi | |
| # by Tim Shelton (redsand) @ HAWK (hawk.io) | |
| sed -i 's/"BOCHS "/"<WOOT> "/g' qemu*/include/hw/acpi/aml-build.h | |
| if [ $? -ne 0 ]; then | |
| echo 'bochs was not replaced in include/hw/acpi/aml-build.h' | |
| fail=1 | |
| fi | |
| # by Tim Shelton (redsand) @ HAWK (hawk.io) | |
| sed -i 's/Bochs Pseudo/Intel RealTime/g'qemu*/roms/ipxe/src/drivers/net/pnic.c | |
| if [ $? -ne 0 ]; 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) | |
| sed -i 's/Bochs\/Plex86/<WOOT>\/<WOOT>/g' qemu*/roms/vgabios/vbe.c | |
| if [ $? -ne 0 ]; then | |
| echo 'BOCHS was not replaced in roms/vgabios/vbe.c' | |
| fail=1 | |
| fi | |
| } | |
| function qemu_func() { | |
| echo '[+] Downloading QEMU source code' | |
| if [ ! -f qemu-$qemu_version.tar.xz ]; then | |
| wget https://download.qemu.org/qemu-$qemu_version.tar.xz | |
| fi | |
| tar xvJf qemu-$qemu_version.tar.xz | |
| fail=0 | |
| # qemu deps | |
| # Adding user libvirt-qemu to group libvirt-qemu | |
| if [ $OS = "Linux" ]; then | |
| sudo 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 | |
| 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 | |
| fi | |
| # WOOT | |
| # some checks may be depricated, but keeping them for compatibility with old versions | |
| if [ $? -eq 0 ]; then | |
| replace_qemu_clues | |
| if [ $fail -eq 0 ]; then | |
| echo '[+] Starting compile it' | |
| cd qemu-$qemu_version | |
| # --enable-malloc-trim since we use tcmalloc | |
| # add in future --enable-netmap https://sgros-students.blogspot.com/2016/05/installing-and-testing-netmap.html | |
| # --target-list=i386-softmmu,x86_64-softmmu,i386-linux-user,x86_64-linux-user | |
| 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 -j4 | |
| if [ $OS = "Linux"]; then | |
| checkinstall -D --pkgname=$qemu_version | |
| elif [ $OS = "Darwin" ]; then | |
| make 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 [ $? -eq 0 ]; then | |
| echo '[+] Patched, compiled and installed' | |
| else | |
| echo '[-] Install failed' | |
| fi | |
| 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 sudo apt-mark hold | |
| #sudo apt-mark unhold qemu | |
| fi | |
| } | |
| function seabios_func { | |
| fail=0 | |
| echo '[+] Installign SeaBios dependencies' | |
| apt-get install git iasl | |
| git clone https://github.com/coreboot/seabios.git | |
| if [ $? -eq 0 ]; then | |
| cd seabios | |
| sed -i "" 's/Bochs/<WOOT>/g' src/config.h | |
| if [ $? -ne 0 ]; then | |
| echo 'Bochs was not replaced in src/config.h' | |
| fail=1 | |
| fi | |
| sed -i "" 's/BOCHSCPU/<WOOT>CPU/g' src/config.h | |
| if [ $? -ne 0 ]; then | |
| echo 'BOCHSCPU was not replaced in src/config.h' | |
| fail=1 | |
| fi | |
| sed -i "" 's/BOCHS/<WOOT>/g' src/config.h | |
| if [ $? -ne 0 ]; then | |
| echo 'BOCHS was not replaced in src/config.h' | |
| fail=1 | |
| fi | |
| sed -i "" 's/BXPC/<WOOT>/g' src/config.h | |
| if [ $? -ne 0 ]; then | |
| echo 'BXPC was not replaced in src/config.h' | |
| fail=1 | |
| fi | |
| sed -i "" 's/QEMU0001/<WOOT>0001/g' src/fw/ssdt-misc.dsl | |
| if [ $? -ne 0 ]; then | |
| echo 'QEMU0001 was not replaced in src/fw/ssdt-misc.dsl' | |
| fail=1 | |
| fi | |
| sed -i "" 's/QEMU\/Bochs/<WOOT>\/<WOOT>s/g' vgasrc/Kconfig | |
| if [ $? -ne 0 ]; then | |
| echo 'QEMU\/Bochs was not replaced in vgasrc/Kconfig' | |
| fail=1 | |
| fi | |
| sed -i "" 's/qemu /<WOOT> /g' vgasrc/Kconfig | |
| if [ $? -ne 0 ]; 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 | |
| sed -i "" 's/"QEMU/"<WOOT>/g' $file; | |
| if [ $? -ne 0 ]; then | |
| echo 'QEMU was not replaced in $file' | |
| fail=1 | |
| fi | |
| done | |
| sed -i "" 's/"QEMU"/"<WOOT>"/g' src/hw/blockcmd.c | |
| if [ $? -ne 0 ]; then | |
| echo '"QEMU" was not replaced in src/hw/blockcmd.c' | |
| fail=1 | |
| fi | |
| if [ $fail -eq 0 ]; then | |
| make -j4 | |
| if [ $? -eq 0 ]; then | |
| echo '[+] Compiled SeaBios, bios file located in -> out/bios.bin' | |
| echo '[+] Replacing old bios.bin to new one, with backup' | |
| bios=0 | |
| echo '[+] Original bios.bin file backuped and replaced' | |
| if [ -f /usr/share/seabios/bios.bin ]; then | |
| cp /usr/share/seabios/bios.bin /usr/share/seabios/bios.bin_back | |
| cp out/bios.bin /usr/share/seabios/bios.bin | |
| bios=1 | |
| fi | |
| if [ -f /usr/share/qemu/bios.bin ]; then | |
| cp /usr/share/qemu/bios.bin /usr/share/qemu/bios.bin_back | |
| cp out/bios.bin /usr/share/qemu/bios.bin | |
| bios=1 | |
| fi | |
| if [ $bios -eq 1 ]; then | |
| echo '[+] Patched bios.bin placed correctly' | |
| else | |
| echo '[-] Bios patching failed' | |
| fi | |
| else | |
| echo '[-] Bios compilation failed' | |
| fi | |
| else | |
| echo '[-] check previous errors' | |
| fi | |
| else | |
| echo '[-] Check if git installed or network connection is OK' | |
| fi | |
| } | |
| COMMAND=$1 | |
| if [ $# -eq 0 ]; then | |
| usage | |
| fi | |
| if [ COMMAND = '-h' ]; then | |
| usage | |
| 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)" | |
| if [ "$1" = 'All' ]; then | |
| qemu_func | |
| seabios_func | |
| if [ $OS = "Linux" ]; then | |
| install_kvm_linux_apt | |
| elif [ $OS = "Darwin"]; then | |
| install_haxm_mac | |
| fi | |
| fi | |
| if [ COMMAND = 'QEMU' ]; then | |
| qemu_func | |
| fi | |
| if [ COMMAND = 'SeaBios' ]; then | |
| seabios_func | |
| fi | |
| if [ COMMAND = 'KVM' ]; then | |
| install_kvm_linux_apt | |
| fi | |
| if [ COMMAND = 'HAXM' ]; then | |
| install_haxm_mac | |
| fi | |
| if [ COMMAND = "replace" ]; then | |
| replace_qemu_clues | |
| fi |
Sign up for free
to join this conversation on GitHub.
Already have an account?
Sign in to comment