#!/bin/sh /etc/rc.common USE_PROCD=1 START=99 STOP=1 UNITNAME="kvm-pihole" PIDFILE="/var/run/$UNITNAME.pid" CPUS="1" MEM="500M" DISKIMAGE="/storage/vms/$UNITNAME.img" DISKFORMAT="qcow2" NETBRIDGE="br-lan" # generate a random locally administered mac address, x2:xx:xx:xx:xx:xx, x6:xx:xx:xx:xx:xx, xA:xx:xx:xx:xx:xx, xE:xx:xx:xx:xx:xx NETMAC="xx:xx:xx:xx:xx:xx" QMPSOCKET="/var/run/$UNITNAME-qmp.sock" SEXPECTSOCKET="/var/run/$UNITNAME-sexpect.sock" SERIALSOCKET="/var/run/$UNITNAME-serial.sock" # Note: access vm serial with 'socat STDIO,cfmakeraw,escape=0x1d UNIX:' # to install the first time, add these options: #-vnc :0 \ #-cdrom /storage/vms/ubuntu-24.04.1-live-server-amd64.iso \ start_service() { procd_open_instance procd_set_param command qemu-system-x86_64 \ -enable-kvm \ -display none \ -cpu host \ -machine type=q35,accel=kvm \ -smp "$CPUS" \ -m "$MEM" \ -boot c \ -drive file="$DISKIMAGE",cache=none,if=virtio,format="$DISKFORMAT" \ -netdev bridge,br="$NETBRIDGE",id=lan \ -device virtio-net-pci,mac="$NETMAC",netdev=lan \ -object rng-random,id=rng0,filename=/dev/urandom \ -device virtio-rng-pci,rng=rng0 \ -qmp unix:$QMPSOCKET,server,nowait \ -serial unix:$SERIALSOCKET,server,nowait #procd_set_param respawn ${respawn_threshold:-3600} ${respawn_timeout:-5} ${respawn_retry:-5} #procd_set_param netdev dev procd_set_param stdout 0 procd_set_param stderr 0 procd_set_param user root procd_set_param pidfile $PIDFILE procd_set_param term_timeout 60 procd_close_instance } stop_service() { # try to gracefully shut down VM before procd kills qemu cmd="sexpect -sock $SEXPECTSOCKET" $cmd spawn -timeout 5 -autowait socat - unix-connect:$QMPSOCKET $cmd expect 'QMP' $cmd send -enter '{ "execute": "qmp_capabilities" }' $cmd expect 'return' $cmd send -enter '{ "execute": "system_powerdown" }' $cmd expect 'SHUTDOWN' $cmd wait }