add basic script to setup libvirt hooks
parent
af903c8df3
commit
32c4ce3404
@ -1,20 +0,0 @@
|
||||
name: Close inactive issues
|
||||
on:
|
||||
schedule:
|
||||
- cron: "30 1 * * *"
|
||||
|
||||
jobs:
|
||||
close-issues:
|
||||
runs-on: ubuntu-latest
|
||||
permissions:
|
||||
issues: write
|
||||
pull-requests: write
|
||||
steps:
|
||||
- uses: actions/stale@v8
|
||||
with:
|
||||
days-before-issue-stale: -1
|
||||
days-before-issue-close: 30
|
||||
close-issue-message: "Closed due to inactivity."
|
||||
days-before-pr-stale: -1
|
||||
days-before-pr-close: -1
|
||||
repo-token: ${{ secrets.GITHUB_TOKEN }}
|
@ -0,0 +1,151 @@
|
||||
#!/bin/sh
|
||||
|
||||
INIT_SYSTEM="runit" # systemd, openrc, runit
|
||||
GPU="nvidia" # nvidia, amd
|
||||
DISPLAY_MANAGER="yes" # yes, no
|
||||
WINDOW_MANAGER="niri" # required if not using display manager
|
||||
START_WINDOW_MANAGER="dbus-run-session niri --session" # not sure if this works
|
||||
GPU_PCI="pci_0000_01_00_0"
|
||||
GPU_AUDIO_PCI="pci_0000_01_00_1"
|
||||
VM_NAME="win10" # name of VM set during creation
|
||||
|
||||
mkdir -pv tmp
|
||||
|
||||
sudo_cmd="sudo"
|
||||
if command -v doas >/dev/null; then
|
||||
sudo_cmd="doas"
|
||||
fi
|
||||
|
||||
start_service() {
|
||||
case $INIT_SYSTEM in
|
||||
"systemd") echo "systemctl start $1";;
|
||||
"openrc") echo "rc-service $1 start";;
|
||||
"runit") echo "sv up $1";;
|
||||
esac
|
||||
}
|
||||
|
||||
stop_service() {
|
||||
case $INIT_SYSTEM in
|
||||
"systemd") echo "systemctl stop $1";;
|
||||
"openrc") echo "openrc $1 stop";;
|
||||
"runit") echo "sv down $1";;
|
||||
esac
|
||||
}
|
||||
|
||||
cat > ./tmp/qemu_hook<< "EOF"
|
||||
#!/bin/bash
|
||||
|
||||
GUEST_NAME="$1"
|
||||
HOOK_NAME="$2"
|
||||
STATE_NAME="$3"
|
||||
MISC="${@:4}"
|
||||
|
||||
BASEDIR="$(dirname $0)"
|
||||
|
||||
HOOKPATH="$BASEDIR/qemu.d/$GUEST_NAME/$HOOK_NAME/$STATE_NAME"
|
||||
set -e # If a script exits with an error, we should as well.
|
||||
|
||||
if [ -f "$HOOKPATH" ]; then
|
||||
eval \""$HOOKPATH"\" "$@"
|
||||
elif [ -d "$HOOKPATH" ]; then
|
||||
while read file; do
|
||||
eval \""$file"\" "$@"
|
||||
done <<< "$(find -L "$HOOKPATH" -maxdepth 1 -type f -executable -print;)"
|
||||
fi
|
||||
EOF
|
||||
|
||||
if [ "$DISPLAY_MANAGER" = "yes" ]; then
|
||||
# TODO: use service provided by package if display-manager is not valid service
|
||||
dm_start=$(start_service "display-manager")
|
||||
dm_stop=$(stop_service "display-manager")
|
||||
|
||||
if [ "$INIT_SYSTEM" = "systemd" ]; then
|
||||
plasma_stop="systemctl --user -M $USER@ stop plasma"
|
||||
fi
|
||||
else
|
||||
dm_stop="pkill -x $WINDOW_MANAGER"
|
||||
dm_start="su -l $USER -c $START_WINDOW_MANAGER"
|
||||
fi
|
||||
|
||||
if [ "$GPU" = "amd" ]; then
|
||||
gpu_modules="amdgpu"
|
||||
elif [ "$GPU" = "nvidia" ]; then
|
||||
gpu_modules="nvidia_drm nvidia_modeset nvidia_uvm nvidia"
|
||||
fi
|
||||
|
||||
cat > ./tmp/libvirt_hook_start.sh<< EOF
|
||||
#!/bin/bash
|
||||
set -x
|
||||
|
||||
$dm_stop
|
||||
$plasma_stop
|
||||
|
||||
# Unbind VTconsoles
|
||||
echo 0 > /sys/class/vtconsole/vtcon0/bind
|
||||
echo 0 > /sys/class/vtconsole/vtcon1/bind
|
||||
|
||||
# Unbind EFI Framebuffer
|
||||
echo efi-framebuffer.0 > /sys/bus/platform/drivers/efi-framebuffer/unbind
|
||||
|
||||
modprobe -r $gpu_modules
|
||||
|
||||
virsh nodedev-detach $GPU_PCI
|
||||
virsh nodedev-detach $GPU_AUDIO_PCI
|
||||
|
||||
modprobe vfio-pci
|
||||
EOF
|
||||
|
||||
cat > ./tmp/libvirt_hook_stop.sh<< EOF
|
||||
#!/bin/bash
|
||||
set -x
|
||||
|
||||
# Attach GPU devices to host
|
||||
virsh nodedev-reattach $GPU_PCI
|
||||
virsh nodedev-reattach $GPU_AUDIO_PCI
|
||||
|
||||
# Unload vfio module
|
||||
modprobe -r vfio-pci
|
||||
|
||||
# Rebind framebuffer to host
|
||||
echo "efi-framebuffer.0" > /sys/bus/platform/drivers/efi-framebuffer/bind
|
||||
|
||||
# Load NVIDIA kernel modules
|
||||
$(for module in $gpu_modules; do
|
||||
echo "modprobe $module"
|
||||
done)
|
||||
|
||||
# Bind VTconsoles
|
||||
echo 1 > /sys/class/vtconsole/vtcon0/bind
|
||||
echo 1 > /sys/class/vtconsole/vtcon1/bind
|
||||
|
||||
$dm_start
|
||||
EOF
|
||||
|
||||
get_yes_no_input() {
|
||||
while true; do
|
||||
echo -n "$1 (yes/no): "
|
||||
read yn
|
||||
case $yn in
|
||||
[Yy]* ) return 0;;
|
||||
[Nn]* ) return 1;;
|
||||
* ) echo "Please answer yes or no.";;
|
||||
esac
|
||||
done
|
||||
}
|
||||
|
||||
chmod +x -v tmp/qemu_hook
|
||||
chmod +x -v tmp/libvirt_hook_start.sh
|
||||
chmod +x -v tmp/libvirt_hook_stop.sh
|
||||
|
||||
if get_yes_no_input "Want me to copy hooks files?"; then
|
||||
$sudo_cmd mkdir -pv /etc/libvirt/hooks
|
||||
$sudo_cmd mkdir -pv /etc/libvirt/hooks/qemu.d/$VM_NAME/prepare/begin
|
||||
$sudo_cmd mkdir -pv /etc/libvirt/hooks/qemu.d/$VM_NAME/release/end
|
||||
|
||||
$sudo_cmd cp -v --preserve ./tmp/qemu_hook /etc/libvirt/hooks/qemu
|
||||
$sudo_cmd cp -v --preserve ./tmp/libvirt_hook_start.sh /etc/libvirt/hooks/qemu.d/$VM_NAME/prepare/begin/start.sh
|
||||
$sudo_cmd cp -v --preserve ./tmp/libvirt_hook_stop.sh /etc/libvirt/hooks/qemu.d/$VM_NAME/release/end/stop.sh
|
||||
echo "\033[1;32m✓ DONE \033[0m"
|
||||
else
|
||||
echo "\033[1;32m✓ You can manually copy hooks from tmp directory.\033[0m"
|
||||
fi
|
Loading…
Reference in New Issue