From 804224d2daae00961f3bb9e36e89e1d67bdaa9c3 Mon Sep 17 00:00:00 2001 From: duffyduck Date: Fri, 31 Jul 2026 20:29:19 +0200 Subject: [PATCH] Transfer-Laufwerke: NTFS raus, Partitionstyp explizit auf msftdata NTFS wird nicht mehr angeboten und nirgends mehr erwaehnt - exFAT deckt den Windows-Fall ab, ohne dass etwas nachinstalliert werden muss, das 'fuse' und damit pve-cluster gefaehrdet. In snapfs.py bleibt ntfs stehen: dort geht es ums Lesen von Windows-Gast-Snapshots, eine ganz andere Sache. parted legt nur noch die Partition an, ohne Dateisystem-Hinweis. Dabei ist aufgefallen, dass genau dieser Hinweis vorher die Typ-Kennung gesetzt hatte: ohne ihn vergibt parted 0FC63DAF-... ("Linux filesystem"), und Windows haengt so eine Partition nicht ein. Die Kennung wird jetzt ausdruecklich gesetzt: parted ... mkpart primary 1MiB 100% set 1 msftdata on -> EBD0A0A2-B9E5-4433-87C0-68B6B72699C7 (Microsoft basic data) Nur darauf vergibt Windows von selbst einen Laufwerksbuchstaben. Das alte --exchange kennt jetzt ebenfalls exfat statt ntfs. Co-Authored-By: Claude Opus 5 (1M context) --- README.md | 2 +- install.sh | 17 ----------------- pvesnap/recovery.py | 2 +- pvesnap/transfer.py | 40 +++++++++++++++------------------------- 4 files changed, 17 insertions(+), 44 deletions(-) diff --git a/README.md b/README.md index 561f1f0..170e870 100644 --- a/README.md +++ b/README.md @@ -873,7 +873,7 @@ Karte erst zuschalten, wenn klar ist, dass die Luft rein ist. | `--resume` / `--no-resume` | Arbeitsspeicher laden bzw. bewusst kalt starten | | `--exchange ` | Austauschplatte, z. B. `20G` (Container: `ja` genügt) | | `--exchange-storage ` | Storage dafür (Vorgabe: wie die erste Platte) | -| `--exchange-fs ` | `ext4` (Vorgabe), `ext3`, `xfs`, `vfat`, `ntfs` | +| `--exchange-fs ` | `ext4` (Vorgabe), `ext3`, `xfs`, `vfat`, `exfat` | | `--exchange-dir ` | nur Container: dieses Host-Verzeichnis durchreichen | | `--memory `, `--cores ` | abweichende Ausstattung (nicht mit `--resume`) | | `--name ` | Name der neuen Maschine | diff --git a/install.sh b/install.sh index 6603bf4..8e358ad 100755 --- a/install.sh +++ b/install.sh @@ -145,23 +145,6 @@ if [ "$DEPS" -eq 1 ]; then fi fi - # NTFS bewusst NICHT automatisch: apt entfernt dafuer 'fuse', und daran - # haengen pve-cluster (/etc/pve) und ceph-fuse. Auf einem laufenden Node - # ist das kein Schritt, den ein Installer ungefragt gehen darf. - if ! have_tool mkfs.ntfs; then - cat <<'EOF' - -Hinweis: NTFS-Transfer-Laufwerke lassen sich hier nicht anlegen, es fehlt -mkfs.ntfs aus dem Paket ntfs-3g. Die Installation wuerde 'fuse' entfernen, -an dem pve-cluster (/etc/pve) und ceph-fuse haengen - deshalb macht dieses -Skript das nicht von selbst. - - Fuer Windows-Gaeste ist exFAT die einfachere Wahl (bereits eingerichtet). - Wer wirklich NTFS braucht: apt install ntfs-3g - vorher Cluster pruefen. - -Lesen kann der Host NTFS ohnehin, ueber den ntfs3-Treiber im Kernel. -EOF - fi fi # --- Programm --------------------------------------------------------- diff --git a/pvesnap/recovery.py b/pvesnap/recovery.py index 6217e3f..ca6e67f 100644 --- a/pvesnap/recovery.py +++ b/pvesnap/recovery.py @@ -74,7 +74,7 @@ MKFS = { "ext3": ["mkfs.ext3", "-q", "-m", "0", "-L", EXCHANGE_LABEL], "xfs": ["mkfs.xfs", "-q", "-L", EXCHANGE_LABEL], "vfat": ["mkfs.vfat", "-n", EXCHANGE_LABEL], - "ntfs": ["mkfs.ntfs", "-Q", "-F", "-L", EXCHANGE_LABEL], + "exfat": ["mkfs.exfat", "-L", EXCHANGE_LABEL], } README = """Austauschlaufwerk von pvesnap-recovery diff --git a/pvesnap/transfer.py b/pvesnap/transfer.py index 0a95216..8c47e48 100644 --- a/pvesnap/transfer.py +++ b/pvesnap/transfer.py @@ -49,50 +49,35 @@ CONF_ROOT = "/etc/pve/nodes" NAME_PATTERN = re.compile(r"^[a-z0-9][a-z0-9_-]{0,30}$") -# Was sich womit anlegen laesst. Lesen kann der Kernel mehr, als er anlegen -# kann - exfat und ntfs3 sind eingebaut, die Formatierer aber Extrapakete. +# Was sich womit anlegen laesst. Die Partitionstabelle macht in jedem Fall +# parted, das Dateisystem der jeweilige Formatierer. FILESYSTEMS = { "ext4": { "mkfs": ["mkfs.ext4", "-q", "-m", "0", "-L"], - "parted": "ext4", - "fuer": "Linux-Gaeste", + "fuer": "nur Linux, behaelt Rechte und Besitzer", "paket": "e2fsprogs", }, "xfs": { "mkfs": ["mkfs.xfs", "-q", "-L"], - "parted": "xfs", - "fuer": "Linux-Gaeste", + "fuer": "nur Linux", "paket": "xfsprogs", }, "exfat": { "mkfs": ["mkfs.exfat", "-L"], - "parted": "ntfs", - "fuer": "Windows und Linux - fuer Windows die erste Wahl", + "fuer": "Windows und Linux, keine Groessengrenze je Datei", "paket": "exfatprogs", "hinweis": "apt install exfatprogs (281 KB, entfernt nichts)", }, - "ntfs": { - "mkfs": ["mkfs.ntfs", "-Q", "-F", "-L"], - "parted": "ntfs", - "fuer": "Windows", - "paket": "ntfs-3g", - # Bewusst als Warnung: apt will dafuer 'fuse' entfernen, und daran - # haengen ceph-fuse und pve-cluster - also /etc/pve. - "hinweis": ("apt install ntfs-3g - ACHTUNG: entfernt dabei 'fuse', an dem " - "pve-cluster (/etc/pve) und ceph-fuse haengen. Nur mit Bedacht " - "und nicht im laufenden Betrieb. Meist ist exfat die bessere Wahl."), - }, "vfat": { "mkfs": ["mkfs.vfat", "-n"], - "parted": "fat32", - "fuer": "alles, aber nur Dateien bis 4 GB", + "fuer": "ueberall lesbar, aber nur Dateien bis 4 GB", "paket": "dosfstools", }, } # Wie lang die Datentraegerbezeichnung sein darf. exFAT und FAT lassen nur # 11 Zeichen zu - laenger, und mkfs bricht ab. -LABEL_MAX = {"vfat": 11, "exfat": 11, "xfs": 12, "ext4": 16, "ntfs": 32} +LABEL_MAX = {"vfat": 11, "exfat": 11, "xfs": 12, "ext4": 16} # exFAT als Vorgabe: Windows und Linux koennen beide damit umgehen, und anders # als FAT32 gibt es keine 4-GB-Grenze je Datei. Fehlt der Formatierer, faellt @@ -171,7 +156,7 @@ def have(command): def available_filesystems(): """[(name, verfuegbar, beschreibung)] - was sich hier anlegen laesst.""" result = [] - for name in ("ext4", "exfat", "ntfs", "xfs", "vfat"): + for name in ("exfat", "ext4", "xfs", "vfat"): spec = FILESYSTEMS[name] result.append((name, have(spec["mkfs"][0]), spec)) return result @@ -439,9 +424,14 @@ def create(name, size=DEFAULT_SIZE, fs=None, note="", partitioned=True, note=note, created=int(time.time()), partitioned=partitioned) try: if partitioned: - step("Partitionstabelle anlegen (GPT, eine Partition)") + # Die Typ-Kennung "msftdata" (Microsoft basic data) ist der + # entscheidende Teil: nur darauf vergibt Windows von selbst einen + # Laufwerksbuchstaben. Ohne sie vergibt parted "Linux filesystem", + # und Windows zeigt die Partition zwar an, haengt sie aber nicht ein. + step("Partitionstabelle anlegen (GPT, eine Partition, msftdata)") run(["parted", "-s", image, "mklabel", "gpt", - "mkpart", "primary", spec["parted"], "1MiB", "100%"]) + "mkpart", "primary", "1MiB", "100%", + "set", "1", "msftdata", "on"]) with _loop(image, partitioned) as device: step("Formatieren mit %s, Bezeichnung %s" % (fs, label)) run(spec["mkfs"] + [label, device], timeout=1800)