Ένα από τα πλέον σπαστικά προβλήματα με το 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 και να τα στήσετε χειροκίνητα.