Αυτόματη αλλαγή μεγέθους οθόνης σε qemu

Ένα από τα πλέον σπαστικά προβλήματα με το qemu είναι η προσαρμογή του μεγέθους της οθόνης. Συχνά αντί για αλλαγή του μεγέθους της οθόνης της εικονικής μηχανής κάνει κλιμάκωση κάτι που κάνει τη χρήση του ποντικιού προβληματική ή αδύνατη.

Ο λόγος που λέω συχνά στην παραπάνω πρόταση είναι γιατί εξαρτάτε από το πως το τρέχεις, τι οδηγούς χρησιμοποιείς για το qemu και τι πρόγραμμα χρησιμοποιείς για να δεις το γραφικό περιβάλλον. Μιας και συχνότερα οι εικονικές μηχανές δε χρησιμοποιούνται με κάποιο γραφικό περιβάλλον οι σχετικές πληροφορίες είναι δύσκολο να βρεθούν. Ελπίζω τα παρακάτω να βοηθήσουν. Πρακτικά είναι καλύτερο να κάνουμε χρήση του qemu μέσω του quickemu ή του gnome-boxes.

Ιδανικά θα ήθελα από μια εικονική μηχανή να έχει μια καλή επικοινωνία με την κάρτα γραφικών και να μην υπάρχει ορατή διαφορά στην απόδοση, να έχω μοίρασμα του προχείρου με τις άλλες μηχανές, να μπορώ να κάνω drop ένα αρχείο πάνω στο παράθυρο της μηχανής και να γίνετε μεταφορά του αρχείου, αλλά και να μοιράζομαι ένα φάκελο με όλες τις εικονικές μηχανές γρήγορα και χωρίς χρήση του δικτύου και να έχω αυτόματη αλλαγή μεγέθους της επιφάνειας εργασίας όταν αλλάζει μέγεθος το παράθυρο, είτε αντίθετα να αλλάζει η κλιμάκωση της οθόνης.

Και μπορώ να τα έχω όλα τα παραπάνω. Δυστυχώς δεν βρήκα ακόμα τον τρόπο να τα έχω όλλα μαζί.

Αν θέλω για παράδειγμα να παίξω παιγνίδι θέλω να κάνω χρήση του virgl που μεταφέρει τις κλήσεις του GL που κάνει η εικονική μηχανή στην κάρτα γραφικών. Θα χρησιμοποιήσω το ίδιο το qemu σαν παράθυρο για να δω την εικονική μηχανή. Αν θέλω να έχω μοίρασμα και drag and drop θα χρησιμοποιήσω το spice και κάποιο πρόγραμμά spice viewer. Και υπάρχουν και πολλές άλλες επιλογές.

Προσωπικά χρησιμοποιω το quickemu που θα κάνει το σωστό και με ένα --display spice μπορώ να αλλάξω μεταξύ των παραπάνω.

Πολύ καλή λύση και τρέχω έτσι κάποια bussenlabs μέσα απο ένα Mint με εξαιρετική αποδοση, αλλά δυστυχώς το busenlabs δεν κάνει αλλαγή μεγέθους της επιφάνειας εργασίας. Ας το λύσουμε αυτό.

#!/bin/bash

# Create udev rule
# - path to new udev rule: /etc/udev/rules.d/50-x-resize.rules
# - udev rule content: 
# ACTION=="change", KERNEL=="card[0-9]*", SUBSYSTEM=="drm", RUN+="/home/atitd/atitd/x-resize" 

echo "Handle resize begin" | systemd-cat -t qemu -p info

export USER=atitd
export DISPLAY=:0
export XAUTHORITY="/home/${USER}/.Xauthority"

width=$(xwininfo -root | grep Width | cut -d: -f 2 | sed 's/ //g')
height=$(xwininfo -root | grep Height cd | cut -d: -f 2 | sed 's/ //g')
monitor=$(xrandr | awk '/connected/{print $1; exit; }')
old_res="${width}x${height}"

#sleep 1
xrandr --output ${monitor} --auto --scale 1
width=$(xwininfo -root | grep Width | cut -d: -f 2 | sed 's/ //g')
height=$(xwininfo -root | grep Height | cut -d: -f 2 | sed 's/ //g')
new_res="${width}x${height}"

sleep 1 
xrandr --output $monitor  --auto --scale 1

echo "Resize ${monitor} from ${old_res} to ${new_res}" | systemd-cat -t qemu -p info
nitrogen --restore &
/home/atitd/atitd/configs/vm/kpie --single /home/atitd/atitd/configs/vm/kpie.conf | systemd-cat -t qemu -p info
notify-send -t 1 "${new_res}"

echo "Handle resize done" | systemd-cat -t qemu -p info

Τι κάνει το παραπάνω; Για αρχή υπάρχει το αρχείο /etc/udev/rules.d/50-x-resize.rules που θα καλέσει το /home/atitd/atitd/x-resize αν εντοπίσει κάποια αλλαγή (change) στο υποσύστημα drm (direct render manager) της εικονικής μηχανής. Θα πρέπει να επανεκινήσουμε την εικονική μηχανή.

Στην πράξη έχω βρεί άνα πρόβλημα που δεν μπορώ να βρω την αιτία. Το παραπάνω δεν λειτουργεί παρά μόνο αν περάσουν κάποια λεπτά απο την στιγμή που θα ξεκινήσει η μηχανή.

Ωραία τρέχει το αρχείο, αλλά θα τρέξει σαν χρήστης συστήματος. Το γραφικό περιβάλλον τρέχει σαν χρήστης atitd. Υπάρχουν δυο τρόποι να ξεπεράσει κανείς την “ασφάλεια” των Χ11. O απλούστερος τρόπος είναι με τη χρήση του XAUTHORITY. Με τα 3 export είμαι σαν χρήστης λαμπρά.

Στην συνέχεια τρέχω την xrandr για να αλλάξω την ανάλυση, το nitrogen για να μεγαλώσω η μικρύνω το wallpaper, το kpie (ένα κλώνο του devilspie) για να αλλάξει την θέση κάποιων παραθύρων. Προσαρμόστε το στις ανάγκες σας.

Κλείνω με τον τρόπο που ξεκινώ την εικονική μηχανή αυτό που κάνω είναι να τις αλλάζω το εικονίδιο ώστε να τις ξεχωρίζω

#!/bin/bash
VM="${1:-hydrogen}"

ORIGIN=$(dirname $(readlink -f $0))
cd $ORIGIN

"$ORIGIN/quickemu" --vm "$VM.conf"

sleep 2
icon="${HOME}/atitd/shared/icons/vm-${VM}.png"
pid=$(cat "$VM/$VM.pid")
xdotool search --pid $pid | xargs -I{} ~/atitd/shared/sbin/xseticon -id {} $icon

Τα προγράμματά xseticon και kpie θα πρέπει να τα βρείτε στο github και να τα στήσετε χειροκίνητα.

3 «Μου αρέσει»

Μαγικά…linux.
Ευχαριστούμε @Asfodelus !!!