Spielereien mit KVM (Kernelbased Virtual Machine)

Update vom 11.08.2026: Das VM-Skript habe ich inzwischen überarbeitet: s. #65


Vorab:

Da die Skripte die Laufwerke direkt einbinden, funktionieren sie nur, wenn zur Gruppe "disk" gehört - Vorsicht: Man sollte wissen was das bedeutet!

Ansonsten die VM besser mit sudo qemu-system-x86_64 -run-with user=$USER […] starten ($USER ist eine Variable und muss nicht geändert werden)starten: Die Rootrechte braucht es, um die Laufwerke einzubinden, aber dann wechselt es sofort (also noch bevor es die VM bootet) auf normale Benutzerrechte. - Das erste Skript muss man für die Passwortabfrage dann aber auch per Terminal starten. - Außer man packt auch "/usr/bin/qemu-system-x86_64" in /etc/sudoers: s. u.

Wichtig: Keine der Partitionen auf diesen Laufwerken darf beim Host eingehängt sein: Kokurierende Zugriffe (Host+Gast) können schnell das Dateisystem zerstören!

Zusätzlich habe ich "%disk ALL=(ALL:ALL) NOPASSWD:/usr/bin/umount" zu /etc/sudoers hinzugefügt, damit "sudo umount -at vfat,exfat,ntfs3" ohne Passwortabfrage funktioniert. - Wobei mir gerade das ntfs3 auffällt: Wessen System noch ntfs-3g nutzt, muss das entsprechend anpassen.

Die benötigten Windows-VirtIO-Treiber bekommt man bei fedorapeople/virtio-win/latest/

Das ISO bindet man einfach mit "-cdrom (ISO-Datei)" ein.


Ich habe die letzten Tage mit meinem VM-WinXP experimentiert, um beim Videoschnitt mit VideoReDo (Streamcopy, kein Recoding) damit auch die RAM-Disk des Host mit bestmöglicher Geschwindigkeit nutzen zu können: "Gemeinsame Ordner" lassen sich bei KVM zwar über Samba realisieren, die sind aber lahm.

Meine Idee war deshalb, für die RAM-Disk ein Festplatten-Image mit ntfs-16k Cluster zu erstellen (damit ist ntfs am effizientesten) und dass dann einfach vom Skripte, mit dem ich das VM-XP starte, vorher in die RAM-Disk zu kopieren. - Und anschließend, damit ich die dorhin geschnittene Aufnahmen mit dem Host weiterbearbeiten zu können, als Loopdevice zu mounten. - Dieses Festplatten-Image habe ich als komprimiertes .qcow2 angehängt.

Damit möchte ich der SSD unnötige Schreibzugriffe ersparen, außerdem hat es mich interessiert das zu realisieren: Eine weitere kleine Spielerei mit KVM - passend zum Thread-Titel. ;)

Die RAM-Disks habe ich in /etc/fstab so erstellt:
Code:
# <file system>                  <mount point> <type> <options>          <dump> <pass>
memory                                    /tmp  tmpfs nosuid,size=90%         0 0
memory                                    /tmph tmpfs huge=always,size=90%    0 0

/tmp habe ich schon lange im RAM. Auch aus Sicherheitgründen, da ich meine Home-Partition per LUKS verschlüselt habe und nicht wollte, dass etwas in /tmp auf der unverschlüsselten Systempartition gespeichert wird: Wenn ich damals (noch unter LinuxMint) z. B. die Text-Datei mit meinen Passwörten aus einem verschlüsselte 7z geöffnet habe, hat fileroller es in /tmp entpackt, um es mit dem Editor öffnen zu können!

/tmph ist durch "huge=always" bei sehr großen Dateien deutlich schneller (für sehr kleine aber ungeeignet, da es wie ein Dateisystem mit 4 MiB großen Clustern dabei einen riesengroßen "Verschnitt" hat).

Und 90% (standard: 50%), weil ich mit 32 GiB RAM selbst dann noch 3 GiB RAM frei habe, wenn die RAM-Disk voll ist. - Beide addieren sich zwar zum 180% (zu viel würde ausgelagert, wäre also nicht allzu schlimm), aber in /tmp kommt eigntlich nur Futzelkam, das nicht weiter ins Gewicht fällt. - Die 90% sind dort nur zur Sicherheit, falls ich doch mal so viel brauche. - /tmph lasse ich dann natürlich leer.


Geschwindigkeitsvergleich:
(mit bs=512K sind beide RAM-Disks am schnellsten - bei Datenträgern (egal ob HDD, SSD oder USB-Sticks) ist übrigens bs=64M am schnellsten)

/tmp:
Code:
$ sync;dd if=/dev/zero of=nichts.bin bs=512K count=32768;sync;time rm nichts.bin
32768+0 Datensätze ein
32768+0 Datensätze aus
17179869184 Byte (17 GB, 16 GiB) kopiert, 21,5451 s, 797 MB/s

real    0m4,893s
user    0m0,000s
sys    0m4,774s

/tmph:
Code:
$ sync;dd if=/dev/zero of=nichts.bin bs=512K count=32768;sync;time rm nichts.bin
32768+0 Datensätze ein
32768+0 Datensätze aus
17179869184 Byte (17 GB, 16 GiB) kopiert, 10,4983 s, 1,6 GB/s

real    0m0,193s
user    0m0,001s
sys    0m0,189s
Doppelt so schnell erstellt und fünfundzwanzigmal schneller gelöscht! :)

Das langsame löschen der nicht mehr benötigten Zwischendateien hat mich immer wieder genervt: Löschen und weg - so muss das sein! ;)


Ich nutze dafür immer noch Windows XP (Home SP3 ohne weitere Aktualisierungen), da das noch schlank und effizient war, während aktuelle Windowsen (10+11 tun sich da nichts) beim Videoschnitt im direkten Vergleich nicht mal mehr halb so schnell sind!

Das Image (Windows inkl. aller dort noch benötigter Software):
Code:
$ qemu-img info WinXP.qcow2
image: WinXP.qcow2
file format: qcow2
virtual size: 1 GiB (1073348608 bytes)
disk size: 303 MiB
Format specific information:
    compat: 1.1
    compression type: zstd

Die Datenträgerbelegung:

VM-WinXP.png


Normalerweise nutze ich Windows nur noch um ntfs per chkdsk prüfen und ggfs. reparieren zu können (dazu hatte ich hier im Thread früher schon genug geschrieben und letztens ein Video veröffentlich), brauche also keine RAM-Disk.
(dass es in "Downloads" ist, hat sich von früher so ergeben und diesmal habe ich schon genug zu bedenken, um auch noch darauf zu achten, das wie bisher aus allen Pfaden zu entfernen)

Dann starte ich es mit diesem Skript (per Win+V):
Code:
#!/bin/bash
cd ~/Downloads/Images/VM-XP/
sudo umount -at vfat,exfat,ntfs3
cl="qemu-system-x86_64 -nodefaults -enable-kvm -cpu host -smp cores=2 -m 2G -vga none -device qxl-vga -display sdl,gl=on,window-close=off -device piix3-usb-uhci -device usb-tablet -audio sdl,model=ac97 \
-drive file=WinXP.qcow2,if=virtio,aio=io_uring,snapshot=on"
for lw in $(fdisk -lo Device,Type|grep FAT|cut -b 1-8|sort -u)
 do df -t{vfat,exfat,ntfs3} $lw"1" || cl=$cl" -drive file="$lw",if=virtio,aio=io_uring,format=raw"
done
sleep 1            # um umount etwas Zeit zu geben
$cl 2> /dev/null    # die in "$cl" zusammengesetzte Befehlszeile wird ausgeführt
espeak-ng -a50 "Check!"
Zuerst werden alle vfat,exfat,ntfs-Dateisysteme ausgehängt, da konkurrierende Zugriffe (Host und VM gleichzeitig) nicht "gut" ist. Sie werden aber nicht gesperrt, so dass man, während die VM läuft, selbst darauf achten muss, dass man sie nicht wieder einhängt! - Deshalb sind mit Datensicherungen SEHR wichtig! - gebranntes Kind… ;)


Wenn ich es doch mit der RAM-Disk brauche, starte ich es (per Win+Umschalt+V, was aber wegen der anschließenden Passwortabfrage übers Terminal laufen muss - s. u.):
Code:
#!/bin/bash
cd ~/Downloads/Images/VM-XP/
if [ ! -f /tmph/ramdisk.raw  ];then qemu-img convert -q ramdisk.qcow2 /tmph/ramdisk.raw;fi
sudo umount -at vfat,exfat,ntfs3
cl="qemu-system-x86_64 -nodefaults -enable-kvm -cpu host -smp cores=2 -m 2G -vga none -device qxl-vga -display sdl,gl=on,window-close=off -device piix3-usb-uhci -device usb-tablet -audio sdl,model=ac97 \
-drive file=WinXP.qcow2,if=virtio,aio=io_uring,snapshot=on \
-drive file=/tmph/ramdisk.raw,if=virtio,cache=none,aio=native,format=raw"
for lw in $(fdisk -lo Device,Type|grep FAT|cut -b 1-8|sort -u)
 do df -t{vfat,exfat,ntfs3} $lw"1" 2> /dev/null || cl=$cl" -drive file="$lw",if=virtio,aio=io_uring,format=raw"
done
sleep 1            # um umount etwas Zeit zu geben
$cl 2> /dev/null    # die in "$cl" zusammengesetzte Befehlszeile wird ausgeführt

espeak-ng -vde -a50 "Bitte Passwort" &
cd /tmph/
mkdir -p ramdisk && sudo mount -tntfs3 -oloop,offset=16k,noatime ramdisk.raw ramdisk/ && \
echo -ne "\nEnter für unmount";read;sudo umount ramdisk
rmdir ramdisk && rm ramdisk.raw

Da es .qcow2 schön handlich ist und sich beliebig kopieren und sichern lässt, habe ich es in dem Format auf der Platte, aber da RAW deutlich schneller ist, lasse ich es in dem Format in die RAM-Disk konvertierten: Das braucht nur einen Sekundenbruchtei und da es "sparse" erstellt wird, belegt es leer fast nichts:
Code:
$ time qemu-img convert -q ramdisk.qcow2 /tmph/ramdisk.raw

real    0m0,132s
user    0m0,159s
sys    0m0,138s

$ qemu-img info /tmph/ramdisk.raw
image: /tmph/ramdisk.raw
file format: raw
virtual size: 32 GiB (34359738368 bytes)
disk size: 64.2 MiB
Würde ich das RAW kopieren, würden dagegen die vollen 32 GiB geschrieben.

Nachdem das VM-XP kommt die Passwortabfrage, um ramdisk.raw als Loopdevice zu mounten, wie oben beschrieben.
Die Tastaturverknüpfung startet es mit dieser Befehlszeile (ich nutze Xfce):
Code:
xfce4-terminal -T VM-Win -I video-x-generic --geometry 100x10 -e Downloads/Images/VM-XP/vmwinr.sh
Wieder muss man selbst darauf achten, dass man nicht eher dort Enter drückt, als das man das aus dem ramdisk.raw nicht mehr braucht, da sie dann gelöscht wird.


Da beide Skripte alle angeschlossenen vfat,exfat,ntfs-Dateisysteme automatisch einhängen, habe ich mir auch zwei Skripte geschrieben, mit denen ich im Terminal das VM-XP nur mit bestimmten Laufwerke starten kann.

Da ich beim Win-Image "snapshot=on" nutze (Schreibzugriffe werden dann im RAM gecachet, aber nicht wirklich umgesetzt), schon damit sich Windows nicht immer weiter zumüllt, kann man es problemlos mehrfach parallel starten, um mit mehreren Windows-Instanzen verschiedene Laufwerke nutzen zu können: Braucht man (zumindest ich) fast nie, aber wenn doch mal, ist es schön dass man es kann. :)

Das "win"-Skript (im Pfad in ~/.local/bin/) ohne RAM-Disk (z. B. "win b c" nutzt es mit /dev/sdb und /dev/sdc)
Code:
#!/bin/bash
cd ~/Downloads/Images/VM-XP/
cl="qemu-system-x86_64 -nodefaults -enable-kvm -cpu host -smp cores=2 -m 2G -vga none -device qxl-vga -display sdl,gl=on,window-close=off -device piix3-usb-uhci -device usb-tablet -audio sdl,model=ac97 \
-drive file=WinXP.qcow2,if=virtio,aio=io_uring,snapshot=on"
while [ $# -gt 0 ]
 do cl=$cl" -drive file=/dev/sd$1,if=virtio,cache=none,aio=native,format=raw"
 umount -q /dev/sd$1* 2> /dev/null
shift;done
sleep 1            # um umount etwas Zeit zu geben
$cl 2> /dev/null    # die in "$cl" zusammengesetzte Befehlszeile wird ausgeführt

Und mit der RAM-Disk das "winr"-Skript:
Code:
#!/bin/bash
cd ~/Downloads/Images/VM-XP/
if [ ! -f /tmph/ramdisk.raw  ];then qemu-img convert -q ramdisk.qcow2 /tmph/ramdisk.raw;fi
cl="qemu-system-x86_64 -nodefaults -enable-kvm -cpu host -smp cores=2 -m 2G -vga none -device qxl-vga -display sdl,gl=on,window-close=off -device piix3-usb-uhci -device usb-tablet -audio sdl,model=ac97 \
-drive file=WinXP.qcow2,if=virtio,aio=io_uring,snapshot=on \
-drive file=/tmph/ramdisk.raw,if=virtio,cache=none,aio=native,format=raw"
while [ $# -gt 0 ]
 do cl=$cl" -drive file=/dev/sd$1,if=virtio,cache=none,aio=native,format=raw"
 umount -q /dev/sd$1* 2> /dev/null
shift;done
sleep 1            # um umount etwas Zeit zu geben
$cl 2> /dev/null    # die in "$cl" zusammengesetzte Befehlszeile wird ausgeführt
espeak-ng -vde -a50 "Bitte Passwort" &
cd /tmph/
mkdir -p ramdisk && sudo mount -tntfs3 -oloop,offset=16k,noatime ramdisk.raw ramdisk/ && \
echo -ne "\nEnter für unmount";read;sudo umount ramdisk
rmdir ramdisk && rm ramdisk.raw


In "echt" habe ich bei den Skripten übrigens aufeinander abgestimmte Leerzeilen eingefügt, um sie bei Änderungen direkt miteinander vergleichen zu können (z. B. bei Mousepad (leider nicht bei Xed) kann man mit Strg+Bild rauf/runter zwischen den Tabs wechseln):

VM-WinXP.gif

Update:

Die Skripte, die automatisch die für Windows nutzbaren Laufwerke einbinden und die, mit denen ich die Laufwerke gezielt wählen kann, unterscheiden sich in der Cachenutzung:

Die ersten beiden nutzen "aio=io_uring" (mit dem Stardard-Cache-Mode "writeback"), das ich bei den anderen beiden durch "cache=none,aio=native" ersetzt habe, weil ich mir Vorteile davon versprach.

Nur die RAM-Disk hat immer "cache=none,aio=native", da es ja Quatsch wäre, eine RAM-Disk im RAM zu cachen. ;)

Neulich hatte ich mal alle sinnvollen Kombinationen getestet (Beschreibungen der möglichen Cache-Modie habe ich angehängt), indem ich ein Livesystem gebootet und dann in einem RAW-Image in /tmph (s. o.) installiert habe, da hatten sich diese beiden Kombinationen in Verbindung mit "io_uring" und "native" als jeweils die schnellsten gezeigt, wobei "io_uring" insgesamt etwas schneller war.

Das habe ich jetzt mit einer Ninja-Warrior-Aufnahme (SD) von gestern bzgl. Windows-Gast und Videoschnitt getestet:

Ziel war immmer die RAM-Disk und die Host-CPU hatte ich auf "performance" gesetzt, damit Taktwechsel nichts verfälschen konnten: Alle 8 Kerne liefen mit 4 GHz (AMD FS-8380 mit deaktiviertem TurboCore), während die VM nur 2 Kerne genutzt hat, die nicht mal voll genutzt wurden.

Da ich zwei Sat-Receiver habe, die ich diesmal beide identisch programmiert hatte, gibt es zwei Quellen:

1. "Corsair" ist ein 64 GB USB-Stick an einem Xoro 8500, der 140 MB/s liefern kann und mit FAT32-64k formatiert ist, da Aufnahmen damit am besten funktionieren.

2. "LiteOn" ist eine 120 GB SSD an einem Xoro 8590, die über USB mit etwas über 400 MB/s ausgelesen werden kann und mit NTFS-64k formatiert ist, damit ich sie trimmen kann.

In dieser Reihenfolge habe ich auch es getestet:

Mit "aio=io_uring":

VM-WinXP-VRD_1.png
VM-WinXP-VRD_2.png

Erreichte Geschwindigkeit in MiB/s:

VM-WinXP-VRD_3.png

Mit "cache=none,aio=native":

VM-WinXP-VRD_4.png
VM-WinXP-VRD_5.png

Erreichte Geschwindigkeit in MiB/s:

VM-WinXP-VRD_6.png

Also nicht nur, dass das insgesamt langsamer ist, sondern wenn es von der SSD kommt, ist es damit sogar langsamer als vom Stick!

Das war reproduzierbar: Ich habe immer 1. und 2. getestet und dann nochmal 1. und 2., um Ausreißer zu vermeiden: Er variierte höchstens um eine Sekunde. - Die Shots sind vom jeweils zweiten Durchlauf.

Um zu sehen, ob das vielleicht sogar bei der RAM-Disk einen Vorteil hat, habe ich auch die auf "aio=io_uring" gesetzt (Stick und SSD sowieso), aber dadurch wurde es nicht mal eine Sekunde schneller.

Deshalb hier nur der Screenshot von SSD, dafür komplett:

VM-WinXP-VRD_7.png

Die Fehler haben übrigens nichts zu sagen. Die gibt es gelegentlich und wahren in diesem Fall offenbar kurze Störungen beim Empfang, da bei beiden Sat-Receivern identisch. - Ist dagegen der Datenträger zu langsam, werden es sehr viel mehr.

Mein Fazit:

"aio=io_uring" ist offenbar unter allen Umständen die bessere Wahl.

"cache=none,aio=native" wird zwar auf div. Seiten immer mal wieder empfohlen, aber die haben es offenbar nie wirklich verglichen.
("aio=native" funktioniert nur mit "cache=none" oder "cache=directsync", aber damit es ist nochmal deutlich langsamer)

Wobei ich NVMe-Laufwerke dabei ausklammern muss: Da mein PC nicht mal eine Anschlussmöglichkeit dafür hat, kann ich das nicht testen.

Btw:

Bei ziemlich genau 3h Sendedauer (ab 30s bis 3h 30s - sicherheitshalber hatte ich 10m länger aufnehmen lassen), blieben netto 2:09h übrig (oben habe ich der Einfachheit halber immer die vollen 3:10h kopieren lassen - wobei alles außer der Videospur und der MP2-Tonspur entfernt wird):

VM-WinXP-VRD.png

Entfernt hatte ich immer "das sehen sie gleich" (ich mag keine Spoiler), das Gewinnspiel und die "Verbraucherinformationen".
 

Anhänge

Zuletzt bearbeitet:
  • Gefällt mir
Reaktionen: Crisser67
Ich habe gestern einen Vergleich der Cache-Modie zum vorherigen Beitrag hinzugefügt und ihn eben noch etwas überarbeitet. Damit sollte er jetzt abgeschlossen sein:

Windows im BIOS-Modus​

Das gleiche funktioniert auch mit anderen Windows-Versionen, wobei man bei Windows 11 die bekannten "Tricks" braucht, oder es z. B. per Ventoy-Stick installiert: Den kann man auch direkt als Laufwerk einbinden und dann davon booten.

Bei Windows 9x/ME muss man beachten, dass keine Multicore-CPUs unterstützt werden und es sich bei mehr als 512 MiB RAM schon beim booten mit einem BSOD bedankt. - Zu noch älteren Windows-Versionen kann ich nichts sagen. Dafür ist vielleicht sogar DOSbox eine bessere Wahl, aber damit kenne ich mich nicht aus.

Für Windows mit UEFI werde ich später diesen Beitrag recyceln, damit ich beides zusammen habe. - Sogar auf einer neuen Seite: Optimal! :)



Bei LMDE (und vermutlich auch jedem anderen Debian- oder Ubuntu-Derivat) reicht es "qemu-system-x86" zu installieren (per Anwendungsverwaltung, Sysnaptic, oder apt) und alles als benötigte als Abhängigkeit mit installiert zu bekommen.

Bei Arch-Derivaten muss mal das UEFI-BIOS separat mit installieren: sudo pacman -Sy qemu-desktop edk2-ovmf

Sorry, bei dem besch* Wetter habe ich zu mehr keine Lust.
 
Zuletzt bearbeitet:
  • Gefällt mir
Reaktionen: Crisser67
Caramon2 schrieb:
Um hier zu zeigen, wie man openSUSE neben Windows installiert, habe ich mir eine Standard-Installation im UEFI-Modus von Windows 11 erstellt:

[IMG]https://www.computerbase.de/forum/attachments/vm-win11_1-png.1619433/[/IMG]

[IMG]https://www.computerbase.de/forum/attachments/vm-win11_2-png.1619434/[/IMG]
(.fd ist der UEFI-Flash-Speicher)
Damit ich das für beliebige Distributionen nutzen kann, habe ich mir angelesen, wie man ein diff-Image erstellt (also das originale Windows-Image unverändert bleibt) und dazu ein Skript geschrieben, dass das diff-Image in einer zRAM-Disk erstellt: Da ich nur die Installation dokumentieren will, kommt es anschließend gleich wieder weg.
Um das zu demonstrieren, habe ich eben den Beginn einer LMDE 7 Installation aufgezeichnet (näheres dazu hier): s. Anhang

Die zweite Dateiverwaltung öffne ich, um zu zeigen, dass nur die Diff-Daten (links) verändert wird, während das originale Win11-qcow2 (rechts) unverändert auf dem 11.05. bleibt. So kann ich immer vom selben Stand ausgehen.

Das Bootmenü nach der Installation:

LMDE-neben-Windows.png
 

Anhänge

  • LMDE-neben-Windows.mp4
    2,3 MB
  • Gefällt mir
Reaktionen: Crisser67
Das war interessant:

Da ein 100 GB Laufwerk für die "parallel zu Win11 installieren"-Tests (s. Video am vorherigen Beitrag) realitätsfremd war, habe ich es jetzt mit qemu-img resize Windows11.qcow2 $((10**12)) auf praktikablere 1 TB vergrößert.

Dann habe ich LMDE 7 mit dem Laufwerksimage in der VM gebootet, mit GParted einfach die Wiederherstellungspartition ans Ende geschoben und die Windows-Partition auf den vollen Bereich vergrößert. Als nächstes dann noch beide Partitionen eingehängt und mit sudo fstrim -va getrimmt, damit die leeren Bereiche wirklich leer sind und nachdem ich die VM runter gefahren habe, das Laufwerksimage neu komprimiert.

Fazit:

Obwohl ich die Laufwerksgröße von 100 GB auf 1000 GB verzehnfacht habe, ist das Image (bei ansonsten unverändertem Inhalt) jetzt sogar ca. 11 MiB kleiner. - Das fällt bei den 4,8 GiB zwar nicht auf, fand ich aber trotzdem erstaunlich.

Überrascht hat mich, dass das bei solchen Sachen sehr empfindlich gewordene Windows *) immer noch bootet und nicht mal Fehler anzeigt:

Win1-1TB.png

*) XP kann man z. B. einfach per Linux-Dateimanager auf eine andere NTFS-Partition kopieren, boot.ini anpassen: läuft
 
  • Gefällt mir
Reaktionen: Crisser67
Wichtig: Die Hinweise und Warnungen in #61 beachten!

Hinweis: Da Wine seit Version 11 wow64 standardmäßig nutzt (s. hier), habe ich es jetzt in mein Produktivsystem integriert (ich wollte ein reines 64-bit-System, deshalb hatte ich für Wine vorher eine extra Artix-Installation) und alles bzgl. Windows in ~/.windows/ gepackt. Da macht auch das VM-WinXP mehr Sinn, als vorher im Download-Ordner.

Auch sonst hat sich beim VM-WinXP-Skript manches geändert. Insbes. da es seit dem Kernel 7.1 einen besseren ntfs-Treiber als ntfs3 gibt (s. hier), lasse ich jetzt beides berücksichtigen:
Bash:
#!/bin/bash
cd ~/.windows/VM-WinXP/
sudo umount -at vfat,exfat,ntfs,ntfs3 || exit

if [ ! -f /tmph/ntfs-disk.raw  ]
 then qemu-img convert -q ntfs-disk.qcow2 /tmph/ntfs-disk.raw
fi

cl="qemu-system-x86_64 -nodefaults -enable-kvm -cpu host -smp cores=2 -m 1G -vga none\
 -device qxl-vga,xres=1280,yres=800,vgamem_mb=4 -display sdl,gl=on,window-close=off\
 -device piix3-usb-uhci -device usb-tablet -audio sdl,model=ac97\
 -drive file=WinXP.qcow2,if=virtio,aio=io_uring,snapshot=on\
 -drive file=/tmph/ntfs-disk.raw,if=virtio,cache=none,aio=native,format=raw"

for lw in $(fdisk -lo Device,Type|grep FAT|cut -b 1-8|sort -u)
 do df -t{vfat,exfat,ntfs,ntfs3} $lw"1" 2> /dev/null || cl=$cl" -drive file="$lw",if=virtio,aio=io_uring,format=raw"
done

sleep 1             # um umount etwas Zeit zu geben
$cl 2> /dev/null    # die in "$cl" zusammengesetzte Befehlszeile wird ausgeführt

cp -au ntfs-disk*.sh /tmph/ && espeak-ng -a50 "Check!"

ntfs-disk-mount.sh (wegen der Passwortabfrage im Terminal ausführen lassen):
Bash:
#!/bin/bash

espeak-ng -vde -a50 "Bitte Passwort" & echo "Win-RAMdisk mounten:"

mkdir -p ntfs-disk && sudo mount -tntfs3 -oloop,offset=16k,noatime,discard ntfs-disk.raw ntfs-disk/ || espeak-ng "Fail!"

ntfs-disk-unmount.sh:
Bash:
#!/bin/bash

espeak-ng -vde -a50 "Bitte Passwort" & echo "Win-RAMdisk mounten:"

mkdir -p ntfs-disk && sudo mount -tntfs3 -oloop,offset=16k,noatime,discard ntfs-disk.raw ntfs-disk/ || espeak-ng "Fail!"

Anmerkungen
  • Ich nutze es aus den beschriebenen Gründen mit Windows XP, aber man kann es natürlich mit beliebigen Gast-OS nutzen.
  • Falls die VM mit UEFI sein muss, hatte ich das schon mal für Windows 11 beschrieben (s. hier)
  • Auch kann man man die ntfs-disk.qcow2 (inzwischen auf 256 GiB vergrößert - s. Anhang) nicht nur im RAM nutzen, sondern wenn mal größeres zusammenkommt, packe ich sie stattdessen auf die SSD (deshalb die Vergrößerung).
  • Vorher hatte ich dafür eine extra NTFS-Partition, die ansonsten vollkommen nutzlos für mich war. Die kann ich mir jetzt sparen.
  • Da die erstellt ntfs-disk.raw sparse und trimmbar ist, belegt sie nur den Platz, der tatsächlich belegt ist, so dass man sie sich auch dauerhaft einrichten kann.
  • Das gleiche funktioniert natürlich mit jedem anderen Dateisystem, falls dafür Bedarf besteht.

Ich gehe also nicht davon aus, dass hier noch viele Windows XP nutzen wollen, sondern obiges ist hauptsächlich als Vorlage gedacht, die sich beliebig anpassen lässt.

Sozusagen als Inspiration und Hilfe zur Selbsthilfe. :)
 

Anhänge

Zuletzt bearbeitet:
Uridium schrieb:
Ist chkdsk/WinXP nicht etwas alt?
Da das Windows 11 chkdsk den kompletten Ordner mit dem Original-Titel "Start Trek: Picard" vermutlich samt aller enthalten 30 Folgen entfernen würde (kam neulich auf Tele 5: an drei aufeinander folgenden Tagen, jeweils eine komplette Staffel am Stück), habe ich das mit ein paar Testdateien durchgespielt: Ja, anschließend ist alles "weg" = unter kryptischen Namen im versteckten Ordner "found.000", den man unter Windows nicht öffnen kann:

found.png

Deshalb habe ich mich per Opera-KI + "tiefer nachdenken" darüber informiert:


Windows XP (bzw. der NT-Kernel, auf dem es basiert) wurde in einer Zeit entwickelt, als Microsoft noch das sogenannte "POSIX-Subsystem" tief ins Betriebssystem integrieren musste, um bestimmte Regierungsaufträge in den USA zu bekommen. In der POSIX-Welt (die auch die Grundlage für Linux ist) sind Zeichen wie der Doppelpunkt : oder das Fragezeichen ? in Dateinamen völlig legal. Das alte chkdsk von Windows XP wusste das.


Lt. Wikipedia unterstützt NTFS alle Zeichen außer '\0' (NUL) und '/'

NTFS mit Windows XP zu prüfen/reparieren, ist in meinem Fall also genau richtig. :)


Die Historie:

- Windows NT bis Windows 2000: Hatten ein echtes, natives POSIX-Subsystem tief im NT-Kernel integriert.

- Windows XP / Server 2003: Das native Subsystem wurde durch die "Windows Services for UNIX" (SFU / Interix) ersetzt. Auch ohne explizite Installation wusste der Kernel und das XP-chkdsk noch genau, wie man mit Dateinamen umgeht, die im sogenannten POSIX-Namespace der MFT (Master File Table) abgelegt sind.

- Windows Vista & Windows 7: Das Ganze wurde in "Subsystem for UNIX-based Applications" (SUA) umbenannt.

- Windows 8: SUA wurde offiziell als "veraltet" (deprecated) deklariert.

- Seit Windows 8.1 (und somit auch in Windows 11) geht das System extrem aggressiv vor: Das moderne chkdsk duldet keine "Abweichungen" mehr, die früher für POSIX-Kompatibilität durchgewunken wurden. Trifft Windows 11 heute auf einen Ordner mit einem Doppelpunkt im Namen (selbst wenn er sauber im POSIX-Namespace der MFT liegt), behandelt chkdsk ihn nicht mehr als legitime Ausnahme, sondern als schweren "Win32-Namensfehler".


Also wie so oft: neuer != besser ;)

Nachtrag

Ich habe mich weiter mit dem Thema beschäftigt und herausgefunden wie schlecht die Windows-Standardeinstellungen u. U. wirklich sind.

Hier habe ich es zusammenfassen lassen und gezeigt, wie man es vermeiden kann:
Andreas:
Wenn man eine Windows 11 Standardinstallation (schnell booten aktiviert) herunterfährt, hinterlässt es NTFS mit LFS 2.0 und "dirty". - Was passiert, wenn man beim nächsten einschalten als erstes ein parallel installiertes Windows 7 bootet (das man z. B. für alte Hardware braucht und natürlich nur noch offline nutzt)? - Normalerweise repariert Windows ja schon beim booten als "dirty" gekennzeichnete Partitionen, aber Windows 7 kennt noch kein LFS 2.0

Opera KI:
Wenn Sie ein parallel installiertes Windows 7 booten, während Windows 11 im Schnellstart-Modus (Fast Startup) heruntergefahren wurde, kommt es mit sehr hoher Wahrscheinlichkeit zu massivem Datenverlust oder einer Zerstörung der Windows 11-Installation (sodass Windows 11 nicht mehr bootet).

Hier ist der technische Ablauf, was in diesem Moment genau passiert:

1. Der "Dirty"-Status von Windows 11

Der Schnellstart von Windows 11 ist eigentlich ein abgemeldeter Ruhezustand (Hibernation). Das Betriebssystem wird nicht komplett beendet, und das NTFS-Dateisystem wird nicht sauber ausgehängt (unmounted). Es bleibt absichtlich in einem geöffneten Zustand ("dirty" bzw. "in use"), in dem noch Transaktionen im NTFS-Journal (LFS 2.0) ausstehen, damit der Kernel beim nächsten Start nahtlos dort weitermachen kann.

2. Windows 7 bootet und startet Chkdsk

Wenn nun Windows 7 startet, prüft es die vorhandenen Partitionen. Es stellt fest, dass die Windows 11-Partition das "Dirty-Bit" gesetzt hat und nicht ordnungsgemäß heruntergefahren wurde. Daraufhin triggert Windows 7 automatisch die Datenträgerüberprüfung ( autochk / chkdsk ) vor dem eigentlichen Desktop-Start, um das Dateisystem zu reparieren.

3. Der LFS-Konflikt (LFS 2.0 vs. LFS 1.1)

Das ist der Moment, in dem die Katastrophe passiert: Windows 8, 10 und 11 verwenden die NTFS Logfile Structure (LFS) Version 2.0. Windows 7 kennt diese Version jedoch nicht; es arbeitet mit LFS 1.1. Das Windows 7-Reparaturprogramm versteht die modernen LFS 2.0-Metadaten nicht. Es interpretiert diese neueren Strukturen schlichtweg als massiv korrupte LFS 1.1-Strukturen.

4. Die Zerstörung

Windows 7 versucht nun das Dateisystem nach seinen alten LFS 1.1-Regeln zu reparieren. Dabei löscht oder überschreibt es die LFS 2.0-Logfiles, schneidet möglicherweise Dateien ab (Truncation) und beschädigt dabei die MFT (Master File Table) der Windows 11-Partition.

Die Folgen:

Die Integrität der Windows 11-Partition wird zerschossen.

Wenn Sie das nächste Mal versuchen, Windows 11 zu starten, wird der Resume-Vorgang aus der hiberfil.sys scheitern, da das Dateisystem unter ihm wegverändert wurde.
Windows 11 stürzt meistens direkt beim Booten mit einem Bluescreen ab (z. B. INACCESSIBLE_BOOT_DEVICE , NTFS_FILE_SYSTEM oder UNMOUNTABLE_BOOT_VOLUME ) und landet in einer Reparaturschleife, die es oft selbst nicht mehr beheben kann.

Wie Sie dieses Desaster verhindern:

Um ein Dual-Boot-System mit Windows 7 und Windows 11 sicher zu betreiben, müssen Sie zwingend den Schnellstart in Windows 11 deaktivieren:

Öffnen Sie als Administrator die Eingabeaufforderung (CMD) in Windows 11 und geben Sie powercfg /h off ein. Das deaktiviert den Ruhezustand und den Schnellstart komplett. Windows 11 fährt danach wirklich herunter und hängt das LFS 2.0 Dateisystem sauber aus.

Andreas:
Ich führe als erstes nach einer Windows-Installation als Administrator folgendes aus:

-----
powercfg /h off
chkntfs /t:0
reagentc /disable
-----

Außerdem importiere ich diese .reg Datei:

-----
[HKEY_LOCAL_MACHINE\SYSTEM\CurrentControlSet\Control\TimeZoneInformation]
"RealTimeIsUniversal" = dword:00000001

[HKEY_CURRENT_USER\Control Panel\Desktop]
"FontSmoothing" = "2"
"FontSmoothingType" = dword:00000002
"FontSmoothingGamma" = dword:00000578
"FontSmoothingOrientation" = dword:00000001
-----

Opera KI:
Das ist ein gezieltes Setup, das ganz offensichtlich darauf ausgelegt ist, Windows automatische Eigenheiten abzugewöhnen und es für Multi-Boot-Systeme vorzubereiten.

Hier ist eine Analyse, was dieses Skript bewirkt, inklusive ein paar Hinweisen zu den Vor- und Nachteilen:

1. Die Kommandozeilen-Befehle

powercfg /h off
Wie im vorherigen Beispiel besprochen, deaktiviert dies den Ruhezustand ( hiberfil.sys wird gelöscht) und schaltet damit den Schnellstart (Fast Startup) ab.
Nutzen: Verhindert genau das von Ihnen angesprochene "Dirty LFS 2.0"-Problem. Andere Betriebssysteme können nun gefahrlos auf die NTFS-Partitionen zugreifen.

chkntfs /t:0
Dies setzt den Countdown für die Datenträgerüberprüfung ( autochk / chkdsk ) beim Booten von den standardmäßigen 8 Sekunden auf 0 Sekunden.
Nutzen: Startet das System schneller durch, falls das "Dirty-Bit" gesetzt ist.

reagentc /disable
Deaktiviert WinRE (Windows Recovery Environment).
Nutzen: Verhindert, dass Windows beim Booten in die oft nervige automatische Reparaturumgebung startet, wenn mal ein Bootvorgang scheitert. Es blockiert auch die Erstellung neuer, redundanter Wiederherstellungspartitionen bei großen Windows-Updates.
Nachteil: Sie haben keinen Zugriff mehr auf den "Abgesicherten Modus" über das grafische Bootmenü und keine integrierten Werkzeuge zur Systemstartreparatur. Sie können stattdessen einen bootfähigen Windows-USB-Stick verwenden.

2. Die Registry-Einträge

"RealTimeIsUniversal" = dword:00000001
Standardmäßig geht Windows davon aus, dass die Hardware-Uhr (BIOS/UEFI) auf lokaler Zeit steht. Linux und macOS hingegen erwarten, dass die Hardware-Uhr auf UTC (Weltzeit) läuft.
Nutzen: Wenn Sie (neben Windows 7) auch ein Linux-System installiert haben, verhindert dieser Schlüssel, dass die Betriebssysteme bei jedem Wechsel die Uhrzeit gegenseitig verstellen.
Hinweis: Wenn Sie nur mit Windows 7 Dual-Boot nutzen, ist dieser Eintrag nicht zwingend nötig (da Windows 7 ebenfalls lokale Zeit erwartet), schadet aber nicht, solange er auch im Windows 7-System in die Registry eingetragen wird.

"FontSmoothing" = "2" : Schaltet die Schriftglättung generell ein.

"FontSmoothingType" = 2 : Setzt den Typ explizit auf ClearType (Subpixel-Rendering) statt auf Standard-Graustufen-Glättung.

"FontSmoothingGamma" = 00000578 : Der Hex-Wert 578 entspricht dezimal 1400. Das ist der Kontrast-/Gammawert (Standard ist oft 1000 bis 2200). Ein Wert von 1400 macht die Schrift etwas kräftiger/dunkler.

"FontSmoothingOrientation" = 1 : Definiert die Pixelstruktur als RGB (Standard für 99% aller LCD-Monitore; 2 wäre BGR).

Fazit: Das ist ein sehr "sauberes" Post-Installations-Skript. Es macht Windows berechenbarer, verhindert das Kaputt-Reparieren durch andere OS im Dual-Boot und räumt nervige Automatismen aus dem Weg.

Andreas:
Ohne die Umstellung auf UTC arbeiten mehrere parallele Windows-Installationen bei der Zeitumstellung aber gegeneinander: Jede verstellt die lokale Uhrzeit, so dass sie dann erst recht falsch ist. Ähnlich ist es, wenn eine Sicherung von vor der letzen Zeitumstellung wiederhergestellt wird.

Opera KI:
Das ist ein berechtigter Punkt! Gerade wenn man mit mehreren Windows-Installationen oder Backups arbeitet, kann die Uhrzeit im BIOS/UEFI schnell zu einer Fehlerquelle werden, da Windows standardmäßig eben die lokale Zeit erwartet und diese beim Booten "korrigiert".

Die von Ihnen bereits genutzte Einstellung RealTimeIsUniversal ist in solchen Szenarien der effizienteste Weg, um dieses Hin- und Her-Springen zu unterbinden, da sie das Betriebssystem dazu zwingt, die Hardware-Uhr als neutrale Instanz (UTC) zu behandeln.

Nachnachtrag

Damit neu formatierte Laufwerke nicht als neue Laufwerke eingebunden werden, übernehme ich bei Linux-Dateisystemen sowieso die vorherige UUID.

Ich habe jetzt herausgefunden, wie man das auch bei Windows-Dateisystemen macht. (insbesondere NTFS, wo man das nicht schon bei der Formatierung übergeben kann)

Beispiele:

NTFS (mit 16k Cluster am besten für SSDs):
Bash:
n=Surefire;sn=7E55953F6595C26B;lw=/dev/sdX

# Backup:
sudo dd if=$lw of=$n.mbr count=1 && sudo chown $UID:$UID $n.mbr

# Restore:
sudo dd if=$n.mbr of=$lw oflag=direct;sleep 1;sudo mkntfs -QIL $n -c16384 $lw"1" &&\
 sudo ntfslabel --new-serial=$sn $lw"1" && udisksctl mount -b /dev/disk/by-label/$n &&\
 mkdir -v /run/media/$USER/$n/{1DVB,2Serien,3Filme,Musik,Recycler} && cp -av 8590* /run/media/$USER/$n/ && \
sudo fstrim -v /run/media/$USER/$n/;sudo umount /run/media/$USER/$n/

FAT (mit 64k Cluster am besten für USB-Sticks):
Bash:
n=Corsair;sn=25A86BC7;lw=/dev/sdX

# Backup:
sudo dd if=$lw of=$n.mbr count=1 && sudo chown $UID:$UID $n.mbr

# Restore:
sudo dd if=$n.mbr of=$lw oflag=direct;sleep 1;sudo mkdosfs -n$n -i$sn -s128 $lw"1" &&\
 sleep 1;udisksctl mount -b /dev/disk/by-label/$n &&\
 mkdir -v /run/media/$USER/$n/{AliDvrS2,PvrRecord} && cp -av 85* /run/media/$USER/$n/ && \
sudo umount /run/media/$USER/$n/

Da der der ältere Satreceiver (Xoro 8500) offenbar überhaupt keinen Datenträger-Cache nutzt (nehme ich aus HDD mit NTFS auf, rattert es die ganze Zeit wie verrückt), liefert der die aussagekräftigsten Ergebnisse.

Der Ablauf ist bei beiden gleich:
  1. partitionieren (durch schreiben des ursprünglichen MBRs: damit auch die Laufwerks-ID identisch bleibt)
  2. formatieren
  3. Seriennummer zuweisen
  4. einhängen
  5. Verzeichnisse erstellen
  6. Dateien kopieren
  7. aushängen
 
Zuletzt bearbeitet:
  • Gefällt mir
Reaktionen: Sensei21, HerrAbisZ und Tanzmusikus
Zurück
Oben