27 Σεπτεμβρίου 2026 / Lefteris Iliadis / SomniusX

Windows VM για Omarchy
27 Σεπτεμβρίου 2026
Το Omarchy έχει ενσωματωμένο Windows VM: με omarchy-windows-vm install στήνεις Windows 11 που τρέχουν σε container και τα ανοίγεις με RDP. Το Windows VM για Omarchy είναι το plugin μου που του δίνει θέση στην μπάρα: ένα μικρό λογότυπο των Windows και ένα panel για όλα τα υπόλοιπα — σύνδεση, επανεκκίνηση, τερματισμό και ζωντανά στοιχεία. Τρέχουσα έκδοση 1.1.2, άδεια MIT.

Το panel ανοίγει: για περίπου ένα δευτερόλεπτο ένα μήνυμα αναμονής, και μετά τα ζωντανά στοιχεία με τα γραφήματά τους.
Τι κάνει
- Κατάσταση στην μπάρα. Το λογότυπο είναι φωτεινό όσο τρέχουν τα Windows, θαμπό όταν είναι σταματημένα, και πάλλεται όσο ξεκινούν ή κλείνουν. Στο hover: π.χ. Windows running · up 7h 20m · RDP open.
- Δεν κοστίζει τίποτα όσο δεν κοιτάς. Με κλειστό panel, το plugin ελέγχει μόνο αν τρέχουν τα Windows: μία μικρή διεργασία κάθε 5 δευτερόλεπτα. Καμία παρακολούθηση πόρων, καμία κλήση στο Docker, κανένας έλεγχος παραθύρων στο παρασκήνιο.
- Ζωντανά στοιχεία, όταν τα ζητήσεις. Ανοίγεις το panel και βλέπεις CPU (σε σχέση με τους vCPUs του VM και με το μηχάνημά σου), μνήμη που κρατά στον host, I/O δίσκου, πόσο έχει γεμίσει το image του δίσκου, δίκτυο πάνω/κάτω, χρόνο λειτουργίας και το ID του container (με ένα κλικ στο πρόχειρο). CPU και δίκτυο έχουν ζωντανά γραφήματα. Τα πρώτα νούμερα έρχονται σε περίπου ένα δευτερόλεπτο, και με το κλείσιμο του panel πετιούνται.
- Σύνδεση χωρίς κωδικό. Όταν τα Windows τρέχουν, το Connect ανοίγει παράθυρο RDP κατευθείαν στη συνεδρία σου, με τα διαπιστευτήρια που αποθήκευσε το Omarchy. Ο κωδικός περνά από file descriptor, ώστε να μη φαίνεται ποτέ στη λίστα διεργασιών. Το κλείσιμο αυτού του παραθύρου δεν σταματά ποτέ τα Windows.
- RDP που ξανασυνδέεται μόνο του. Αν η σύνδεση μέσω Docker πέσει, το παράθυρο ξανασυνδέεται αντί να εξαφανιστεί — και για παράθυρα από το Connect και για παράθυρα από Start ή Restart.
- Κράτα τα Windows ανοιχτά (προαιρετικό). Εξ ορισμού, όταν κλείνει το παράθυρο RDP τερματίζονται και τα Windows, όπως στον launcher του Omarchy. Με την επιλογή ενεργή, κλείνει μόνο το παράθυρο· εφαρμογές, συνεδρίες SSH και εργασίες στο παρασκήνιο συνεχίζουν.
- Επανεκκίνηση και τερματισμός με δικλίδα ασφαλείας. Θέλουν δεύτερο κλικ, κλείνουν πρώτα τα παράθυρα RDP και δεν ζητούν δεύτερη φορά κωδικό.
- Άλλοι δρόμοι: η Console (η οθόνη του VM στον browser, χρήσιμη όσο εκκινεί), ο κοινόχρηστος φάκελος Shared (
~/Windows), προαιρετικό κουμπί Terminal (π.χ.ssh winvm) και το Docker, που ανοίγει το lazydocker αν είναι εγκατεστημένο. - Τα σφάλματα φαίνονται αμέσως. Ένα αίτημα κωδικού που απορρίφθηκε, διαπιστευτήρια που λείπουν ή μια συνεδρία που είναι ήδη ανοιχτή εμφανίζονται στο panel αμέσως, όχι μετά από αναμονή.
- Αρχείο καταγραφής για κάθε εκκίνηση και σύνδεση, με τα μηνύματα του FreeRDP, ώστε να φαίνεται γιατί τελείωσε μια συνεδρία.
Οθόνες

Με τη σειρά: τα ζωντανά στοιχεία · όσο φορτώνουν (περίπου ένα δευτερόλεπτο) · οι ρυθμίσεις με την υπενθύμιση για τη RAM · η ενσωματωμένη βοήθεια.
Στην μπάρα και στο panel
- Αριστερό κλικ: ανοίγει το panel.
- Δεξί κλικ: πηγαίνει στην επιφάνεια εργασίας των Windows — εστιάζει το παράθυρο RDP, συνδέεται ή ξεκινά τα Windows.
- Hover: κατάσταση, χρόνος λειτουργίας και αν το παράθυρο RDP είναι ανοιχτό.
Στο panel, το κύριο κουμπί ακολουθεί την κατάσταση — Show Windows desktop, Connect (RDP) ή Start Windows — και ακολουθούν Restart, Shut down, Console, Shared, Terminal (μόνο αν το έχεις ορίσει), Docker (μόνο αν υπάρχει το lazydocker), Logs, και οι ενότητες Settings και Help, που ανοίγουν και κλείνουν. Ο τερματισμός από το μενού Έναρξη των Windows δουλεύει κι αυτός.
Η Console ζητά σύνδεση: το Omarchy εγκαθιστά το VM με την επιλογή PROTECT του Dockur, που βάζει κωδικό στην κονσόλα ιστού ακόμη κι αν είναι προσβάσιμη μόνο από τον υπολογιστή σου. Μπαίνεις με το όνομα χρήστη και τον κωδικό των Windows που όρισες στην εγκατάσταση.
«Keep Windows running»: το αντάλλαγμα
Ο launcher του Omarchy θεωρεί ότι ένα κλειστό παράθυρο RDP σημαίνει «τελείωσα» και σβήνει τα Windows. Με την επιλογή ενεργή, κλείνει μόνο το παράθυρο, και με το Connect επιστρέφεις στην ίδια συνεδρία, με τις εφαρμογές σου όπως τις άφησες.
Το τίμημα: το VM κρατά τη RAM που του έδωσες στην εγκατάσταση (το RAM_SIZE) μέχρι να πατήσεις Shut down ή να το κλείσεις από τα Windows. Όσο η επιλογή είναι ενεργή, το panel το θυμίζει με το ακριβές ποσό. Η ρύθμιση ισχύει από την επόμενη εκκίνηση.
Εγκατάσταση
omarchy plugin add https://github.com/Somnius/Windows-VM-for-Omarchy.git --enable
Αν το έχεις ήδη: omarchy plugin update lef.windows-vm.
Απαιτήσεις: Omarchy με εγκατεστημένο το Windows VM (omarchy-windows-vm install) και Docker με cgroup v2 (η προεπιλογή στο Arch). Χρησιμοποιεί μόνο εργαλεία που φέρνει ήδη το Omarchy: omarchy-windows-vm, xfreerdp3, hyprctl, jq, uwsm-app, xdg-terminal-exec και wl-copy. Η κατάσταση και τα στοιχεία δεν χρειάζονται κανένα ιδιαίτερο δικαίωμα· η εκκίνηση και ο τερματισμός περνούν από την εντολή του Omarchy, που ζητά κωδικό αν ο χρήστης σου δεν είναι στην ομάδα docker.
Από τη γραμμή εντολών
Κάθε ενέργεια του panel είναι και εντολή, οπότε δένεται εύκολα σε συντόμευση του Hyprland:
omarchy-shell lef.windows-vm show # επιφάνεια εργασίας, ή σύνδεση/εκκίνηση
omarchy-shell lef.windows-vm restart
omarchy-shell lef.windows-vm stop
omarchy-shell lef.windows-vm status # κατάσταση σε JSON· ζωντανά στοιχεία μόνο με ανοιχτό panel ("statsLive")
omarchy-shell lef.windows-vm toggle # άνοιγμα/κλείσιμο του panel
Πως δουλεύει
Το VM του Omarchy, από κάτω
Το omarchy-windows-vm τρέχει τα Windows 11 στο container dockurr/windows: QEMU με επιτάχυνση KVM μέσα σε privileged Docker container, με RAM, πυρήνες και δίσκο που ορίζεις στην εγκατάσταση. Εκθέτει μόνο στο 127.0.0.1 τη θύρα 8006 (κονσόλα ιστού) και την 3389 (RDP), και ο launcher συνδέεται με FreeRDP (xfreerdp3) σε παράθυρο με τίτλο Windows VM - Omarchy. Ο φάκελος ~/Windows μοιράζεται με τα Windows ως \\host.lan\Data.
Στοιχεία χωρίς δικαιώματα και χωρίς Docker
Όλα τα νούμερα έρχονται από το bin/Sample.sh, που τυπώνει μία γραμμή JSON με ακατέργαστους μετρητές και δεν αγγίζει ποτέ το socket του Docker. Βρίσκει το VM ψάχνοντας στο cgroup κάθε Docker container (με systemd ή cgroupfs) τη διεργασία του QEMU με όνομα windows — έτσι την ονομάζει το dockurr/windows. Με κλειστό panel τρέχει ως Sample.sh --state και διαβάζει μόνο αν τρέχει το QEMU και από πότε. Με ανοιχτό panel τρέχει κάθε 2 δευτερόλεπτα, από τη στιγμή που ανοίγει, και το plugin βγάζει ρυθμούς από τη διαφορά δύο δειγμάτων — έτσι ένα χαμένο δείγμα κοστίζει μία ανανέωση, όχι λάθος νούμερο.
| Στοιχείο | Από πού |
|---|---|
| Τρέχει | cgroup Docker container με διεργασία qemu-system-* που λέγεται windows |
| CPU | cpu.stat του cgroup, σε σχέση με τους vCPUs του guest (-smp του QEMU) και με τον host |
| Μνήμη | memory.current του cgroup, σε σχέση με τη RAM του μηχανήματος |
| I/O δίσκου | io.stat του cgroup, μόνο η πιο φορτωμένη συσκευή (ώστε ένας κρυπτογραφημένος δίσκος να μη μετριέται δύο φορές) |
| Image | τα δεσμευμένα blocks του sparse ~/.windows/data.img |
| Δίκτυο | το eth0 μέσα στο network namespace του VM |
| Χρόνος λειτουργίας | η ώρα εκκίνησης της διεργασίας του QEMU (πεδίο 22 του /proc/<pid>/stat) |
| Εκκινεί | το Docker δείχνει το container σε λειτουργία πριν υπάρξει το QEMU |
Η μόνη κλήση στο Docker — docker inspect για την κατάσταση «εκκινεί» — γίνεται μόνο με ανοιχτό panel ή ενέργεια σε εξέλιξη, και μόνο όταν δεν υπάρχει ακόμη διεργασία του VM. Και το παράθυρο RDP αναζητείται μόνο όταν χρειάζεται: ανοιχτό panel, hover, κλικ ή ενέργεια σε εξέλιξη. Η μνήμη που δείχνει είναι ό,τι παίρνει το VM από το μηχάνημά σου, όχι ό,τι δείχνει η Διαχείριση Εργασιών των Windows: τα Windows δεσμεύουν τη RAM τους στην εκκίνηση.
Σύνδεση χωρίς κωδικό
Το bin/Connect.sh ανοίγει παράθυρο RDP όταν τα Windows τρέχουν ήδη, χωρίς να περάσει από το omarchy-windows-vm launch, που θα ξανάτρεχε το privileged στήσιμο — και ίσως θα ζητούσε κωδικό — μόνο για μια επανασύνδεση. Διαβάζει τα διαπιστευτήρια που αποθήκευσε ο installer του Omarchy, χρησιμοποιεί τις ίδιες επιλογές με τον launcher, και δίνει τα ορίσματα στο FreeRDP από file descriptor, ώστε ο κωδικός να μη βρεθεί ποτέ σε γραμμή εντολών. Αρνείται να συνδεθεί αν μια άλλη συνεδρία συνδέεται ή ξανασυνδέεται — τα Windows δέχονται μόνο μία, και οι δύο θα έδιωχναν η μία την άλλη — και δεν δοκιμάζει ποτέ τον γνωστό προεπιλεγμένο κωδικό του image.
Αυτόματη επανασύνδεση με ένα shim
Η σύνδεση RDP περνά από το port forwarding του Docker. Όταν σπάσει, το FreeRDP γράφει Network disconnect! και, χωρίς αυτόματη επανασύνδεση, το παράθυρο κλείνει παρότι τα Windows είναι μια χαρά. Το plugin προσθέτει το /auto-reconnect του FreeRDP (έως 5 προσπάθειες): το Connect ξεκινά το FreeRDP κατευθείαν με αυτό, ενώ για Start και Restart ο launcher του Omarchy τρέχει με τον φάκελο bin/shim του plugin πρώτο στο PATH. Επειδή ο launcher καλεί το xfreerdp3 με το όνομά του, βρίσκει ένα μικρό wrapper που προσθέτει τις επιλογές και δίνει τα πάντα στο /usr/bin/xfreerdp3 από file descriptor — έτσι ούτε το /p: του launcher μένει αναγνώσιμο στο /proc/<pid>/cmdline. Τυλίγεται μόνο ο client RDP χωρίς δικαιώματα· ο launcher και ό,τι τρέχει ως root μένουν ανέγγιχτα, και κανένα αρχείο συστήματος δεν αλλάζει. Ένας φρουρός εμποδίζει το shim να καλέσει τον εαυτό του σε βρόχο.
Ενέργειες που αντέχουν επανεκκίνηση του shell
Εκκίνηση, επανεκκίνηση και τερματισμός τρέχουν μέσω του Launch.sh (που καλεί τον launcher του Omarchy) ή του bin/Connect.sh, detached μέσω uwsm-app, ώστε ένα ανοιχτό παράθυρο RDP να μην κλείνει αν ξαναφορτωθεί το shell. Ο τερματισμός και η επανεκκίνηση κλείνουν πρώτα τα παράθυρα RDP· αν ένας launcher περιμένει ακόμη το παράθυρό του, σταματά εκείνος το VM και το plugin τον περιμένει, αντί να σταματήσει το VM κάτω από τα πόδια του. Τα scripts γράφουν τις αποτυχίες στο $XDG_RUNTIME_DIR/windows-vm/status.json, ώστε το panel να δείχνει τον λόγο αμέσως· ό,τι συμβαίνει μέσα στο FreeRDP (π.χ. απόρριψη κωδικού από τα Windows) είναι στο αρχείο καταγραφής, και το panel σταματά να περιμένει μετά από 45 δευτερόλεπτα.
Ένα bug του Omarchy, παρακαμπτόμενο με ασφάλεια
Ο launcher του Omarchy απαιτεί ο ~/Windows να έχει δικαιώματα 700, αλλά ο Samba του Dockur βάζει το setgid bit, που το chmod 0700 διατηρεί — και ο launcher αρνείται να ξεκινήσει (omacom/omarchy#10256). Πριν από κάθε εκκίνηση, το Launch.sh καθαρίζει μόνο αυτό το bit, μόνο στον δικό σου φάκελο: αν δεν είναι συμβολικός σύνδεσμος και σου ανήκει.
Αρχεία καταγραφής, ρυθμίσεις και όρια
Κάθε εκκίνηση, επανεκκίνηση, τερματισμός και σύνδεση γράφει ένα αρχείο στο ~/.local/state/windows-vm/logs/ (ακολουθεί το $XDG_STATE_HOME), σε φάκελο με δικαιώματα 700· κρατιούνται τα 30 πιο πρόσφατα, και το FreeRDP τρέχει με WLOG_LEVEL=INFO ώστε να καταγράφεται γιατί τελείωσε μια συνεδρία.
Οι ρυθμίσεις είναι στο ~/.config/omarchy/windows-vm/config.json: hideWhenStopped, keepAlive και terminalCommand (η μόνη χωρίς διακόπτη στο panel — π.χ. "ssh winvm" για κουμπί Terminal). Άγνωστα κλειδιά διατηρούνται, και ένα χαλασμένο config.json δεν αντικαθίσταται ποτέ. Το plugin δεν τροποποιεί ποτέ τη ρύθμιση Docker του VM, δεν χρειάζεται root, και η αφαίρεσή του δεν αγγίζει το VM ή τον δίσκο του.
Δοκιμές
Η λογική — ανάγνωση των δειγμάτων, ρυθμοί από διαφορές μετρητών, μορφοποίηση, εύρεση του παραθύρου, πότε ολοκληρώνεται μια ενέργεια — είναι σε καθαρό JavaScript module χωρίς εξαρτήσεις από το Quickshell, ώστε το qmltestrunner του Qt 6 να το ελέγχει offscreen με δέκα ομάδες δοκιμών. Το tests/run.sh ελέγχει επίσης τα shell scripts.
Ευχαριστίες
Η 1.1.0 χτίζει πάνω σε ιδέες και κώδικα από το omarchy-winvm του Jon Spinks (άδεια MIT): τη δειγματοληψία πόρων χωρίς δικαιώματα, την απευθείας επανασύνδεση με τα αποθηκευμένα διαπιστευτήρια, τις μπάρες των πόρων και την παράδοση του τερματισμού σε launcher που περιμένει. Τα κομμάτια που προσαρμόστηκαν αναφέρονται στο NOTICE του αποθετηρίου μαζί με την αρχική άδεια, και κάθε τέτοιο αρχείο το γράφει στην κεφαλίδα του.
Πηγές και ημερομηνία
Πρώτη έκδοση και καταχώριση στο Omarchy plugin marketplace: 2026-09-27. Έκδοση 1.1.0: την ίδια μέρα. Εκδόσεις 1.1.1 και 1.1.2 (tooltip στο hover για το Omarchy 4.0.4, προετοιμασία για το Qt 6.12): 2026-10-09.
- Omarchy Marketplace
- Το αποθετήριό μου στο GitHub
- README με όλες τις λεπτομέρειες
- Οι αλλαγές ανά έκδοση (CHANGELOG)
Αφαίρεση: omarchy plugin remove lef.windows-vm (προαιρετικά και rm -rf ~/.config/omarchy/windows-vm ~/.local/state/windows-vm για ρυθμίσεις και αρχεία καταγραφής). Άδεια: MIT.