Differences

This shows you the differences between two versions of the page.

Link to this comparison view

Both sides previous revision Previous revision
Next revision
Previous revision
docs:guide-user:virtualization:qemu_host [2018/06/04 12:30] – [Init script] more details on fixme sebastiandocs:guide-user:virtualization:qemu_host [2022/05/30 09:04] (current) – [Download installer files] use https sebastian
Line 1: Line 1:
-====== Running QEMU guests on OpenWrt ======+====== OpenWrt as QEMU/KVM host server ======
  
 ===== Introduction ===== ===== Introduction =====
-It's possible to use OpenWrt as a QEMU host and run guests on it. If you want to run OpenWrt as a QEMU guest, see [[docs:guide-user:virtualization:qemu|OpenWrt in QEMU]]. +It's possible to use OpenWrt as a QEMU host and run guests on it. If you want to run OpenWrt as a QEMU guest itself, see [[docs:guide-user:virtualization:qemu|OpenWrt in QEMU]].
- +
-OpenWrt provides QEMU packages for ARM and x86 platforms. This article focuses on the x86 target, the networking is done via [[https://wiki.qemu.org/Features/HelperNetworking|qemu-bridge-helper]]+
  
 +OpenWrt provides QEMU packages for ARM and x86 platforms. This article focuses on the x86 target, the networking is done via [[https://wiki.qemu.org/Features/HelperNetworking|qemu-bridge-helper]].
 ===== Installing QEMU ===== ===== Installing QEMU =====
 You need the following packages on your device: [[packages:pkgdata:kmod-tun|kmod-tun]], [[packages:pkgdata:qemu-bridge-helper|qemu-bridge-helper]]. Depending on the guest architecture, install [[packages:pkgdata:qemu-x86_64-softmmu|qemu-x86_64-softmmu]] or [[packages:pkgdata:qemu-arm-softmmu|qemu-arm-softmmu]]. If your hardware supports it, also install [[packages:pkgdata:kmod-kvm-amd|kmod-kvm-amd]] or [[packages:pkgdata:kmod-kvm-intel|kmod-kvm-intel]] for better performance. You need the following packages on your device: [[packages:pkgdata:kmod-tun|kmod-tun]], [[packages:pkgdata:qemu-bridge-helper|qemu-bridge-helper]]. Depending on the guest architecture, install [[packages:pkgdata:qemu-x86_64-softmmu|qemu-x86_64-softmmu]] or [[packages:pkgdata:qemu-arm-softmmu|qemu-arm-softmmu]]. If your hardware supports it, also install [[packages:pkgdata:kmod-kvm-amd|kmod-kvm-amd]] or [[packages:pkgdata:kmod-kvm-intel|kmod-kvm-intel]] for better performance.
Line 43: Line 42:
 ==== Download installer files ==== ==== Download installer files ====
 <code bash> <code bash>
-wget http://ftp.debian.org/debian/dists/stable/main/installer-amd64/current/images/netboot/debian-installer/amd64/linux +wget https://ftp.debian.org/debian/dists/stable/main/installer-amd64/current/images/netboot/debian-installer/amd64/linux 
-wget http://ftp.debian.org/debian/dists/stable/main/installer-amd64/current/images/netboot/debian-installer/amd64/initrd.gz+wget https://ftp.debian.org/debian/dists/stable/main/installer-amd64/current/images/netboot/debian-installer/amd64/initrd.gz
 </code> </code>
 Both files can be savely removed after finishing the installation. Both files can be savely removed after finishing the installation.
Line 77: Line 76:
 To automatically start the VM at boot and shut it down cleanly using [[https://wiki.qemu.org/Documentation/QMP|QMP]], create an [[docs:techref:initscripts|init script]] like the one below. To automatically start the VM at boot and shut it down cleanly using [[https://wiki.qemu.org/Documentation/QMP|QMP]], create an [[docs:techref:initscripts|init script]] like the one below.
 <WRAP center round important 60%> <WRAP center round important 60%>
-Be careful with copying the heredoc part. This code block is left unindented on purpose to avoid problems with whitespaces. If you want, you can indent the lines with tabs and use ''%%<<-%%'' instead of ''%%<<%%'', but since tabs are printed as whitespaces in dokuwiki code blocks, this example is used without indentation. You can read more about here documents in the [[http://tldp.org/LDP/abs/html/here-docs.html|advanced bash-scripting guide]]+Be careful with copying the heredoc part. This code block is left unindented on purpose to avoid problems with whitespaces. If you want, you can indent the lines with tabs and use ''%%<<-%%QMP'' instead of ''%%<<%%QMP'', but since tabs are printed as whitespaces in dokuwiki code blocks, this example is used without indentation. You can read more about here documents in the [[http://tldp.org/LDP/abs/html/here-docs.html|advanced bash-scripting guide]]
 </WRAP> </WRAP>
  
Line 85: Line 84:
 START=99 START=99
 STOP=1 STOP=1
 +
 +qemu_pidfile="/var/run/qemu.pid"
  
 start() { start() {
 qemu-system-x86_64 -enable-kvm -cpu host -smp 2 -m 2G \ qemu-system-x86_64 -enable-kvm -cpu host -smp 2 -m 2G \
-    -drive file=/dev/sda,cache=none,if=virtio,format=raw \ + -drive file=/dev/sda,cache=none,if=virtio,format=raw \ 
-    -device virtio-net-pci,mac=E2:F2:6A:01:9D:C9,netdev=br0 \ + -device virtio-net-pci,mac=E2:F2:6A:01:9D:C9,netdev=br0 \ 
-    -netdev bridge,br=br-lan,id=br0 \ + -netdev bridge,br=br-lan,id=br0 \ 
-    -qmp tcp:127.0.0.1:4444,server,nowait \ + -qmp tcp:127.0.0.1:4444,server,nowait \ 
-    -daemonize &> /var/log/qemu.log+ -daemonize &> /var/log/qemu.log 
 + 
 +/usr/bin/pgrep qemu-system-x86_64 > $qemu_pidfile 
 +echo "QEMU: Started VM with PID $(cat $qemu_pidfile)."
 } }
  
 stop() { stop() {
 +echo "QEMU: Sending 'system_powerdown' to VM with PID $(cat $qemu_pidfile)."
 nc localhost 4444 <<QMP  nc localhost 4444 <<QMP 
-{ "execute": "qmp_capabilities"+{ "execute": "qmp_capabilities" }  
-{ "execute": "system_powerdown" }+{ "execute": "system_powerdown"
 QMP QMP
  
-sleep 10s+if [ -e $qemu_pidfile ]; then 
 + if [ -e /proc/$(cat $qemu_pidfile) ]; then 
 + echo "QEMU: Waiting for VM shutdown." 
 + while [ -e /proc/$(cat $qemu_pidfile) ]; do sleep 1s; done 
 + echo "QEMU: VM Process $(cat $qemu_pidfile) finished." 
 + else 
 + echo "QEMU: Error: No VM with PID $(cat $qemu_pidfile) running." 
 + fi 
 + 
 + rm -f $qemu_pidfile 
 +else 
 + echo "QEMU: Error: $qemu_pidfile doesn't exist." 
 +fi
 } }
 </code> </code>
-FIXME This script currently uses a fixed time of 10 seconds to wait for the VM shutdown. Provide a better way to wait for the QEMU process to finish, using the pid(file). 
  
 Test the the script by running ''/etc/init.d/qemu start'' and look for errors in ''/var/log/qemu.log''. Test the the script by running ''/etc/init.d/qemu start'' and look for errors in ''/var/log/qemu.log''.
 If the script works as desired, enable it for every boot: ''/etc/init.d/qemu enable'' If the script works as desired, enable it for every boot: ''/etc/init.d/qemu enable''
 +
 +FIXME This script needs to be ported to [[:docs:guide-developer:procd-init-scripts|procd]]. Problem: [[:docs:guide-developer:procd-init-scripts#stopping_services|stop_service() is called after procd killed the service]], but we must run it beforehand to let the VM shut down.
  • Last modified: 2018/06/04 12:30
  • by sebastian