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) <noreply@anthropic.com>
This commit is contained in:
duffyduck
2026-07-31 20:29:19 +02:00
co-authored by Claude Opus 5
parent 46ffc54059
commit 804224d2da
4 changed files with 17 additions and 44 deletions
+1 -1
View File
@@ -873,7 +873,7 @@ Karte erst zuschalten, wenn klar ist, dass die Luft rein ist.
| `--resume` / `--no-resume` | Arbeitsspeicher laden bzw. bewusst kalt starten | | `--resume` / `--no-resume` | Arbeitsspeicher laden bzw. bewusst kalt starten |
| `--exchange <größe>` | Austauschplatte, z. B. `20G` (Container: `ja` genügt) | | `--exchange <größe>` | Austauschplatte, z. B. `20G` (Container: `ja` genügt) |
| `--exchange-storage <name>` | Storage dafür (Vorgabe: wie die erste Platte) | | `--exchange-storage <name>` | Storage dafür (Vorgabe: wie die erste Platte) |
| `--exchange-fs <fs>` | `ext4` (Vorgabe), `ext3`, `xfs`, `vfat`, `ntfs` | | `--exchange-fs <fs>` | `ext4` (Vorgabe), `ext3`, `xfs`, `vfat`, `exfat` |
| `--exchange-dir <pfad>` | nur Container: dieses Host-Verzeichnis durchreichen | | `--exchange-dir <pfad>` | nur Container: dieses Host-Verzeichnis durchreichen |
| `--memory <MB>`, `--cores <n>` | abweichende Ausstattung (nicht mit `--resume`) | | `--memory <MB>`, `--cores <n>` | abweichende Ausstattung (nicht mit `--resume`) |
| `--name <name>` | Name der neuen Maschine | | `--name <name>` | Name der neuen Maschine |
-17
View File
@@ -145,23 +145,6 @@ if [ "$DEPS" -eq 1 ]; then
fi fi
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 fi
# --- Programm --------------------------------------------------------- # --- Programm ---------------------------------------------------------
+1 -1
View File
@@ -74,7 +74,7 @@ MKFS = {
"ext3": ["mkfs.ext3", "-q", "-m", "0", "-L", EXCHANGE_LABEL], "ext3": ["mkfs.ext3", "-q", "-m", "0", "-L", EXCHANGE_LABEL],
"xfs": ["mkfs.xfs", "-q", "-L", EXCHANGE_LABEL], "xfs": ["mkfs.xfs", "-q", "-L", EXCHANGE_LABEL],
"vfat": ["mkfs.vfat", "-n", 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 README = """Austauschlaufwerk von pvesnap-recovery
+15 -25
View File
@@ -49,50 +49,35 @@ CONF_ROOT = "/etc/pve/nodes"
NAME_PATTERN = re.compile(r"^[a-z0-9][a-z0-9_-]{0,30}$") 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 # Was sich womit anlegen laesst. Die Partitionstabelle macht in jedem Fall
# kann - exfat und ntfs3 sind eingebaut, die Formatierer aber Extrapakete. # parted, das Dateisystem der jeweilige Formatierer.
FILESYSTEMS = { FILESYSTEMS = {
"ext4": { "ext4": {
"mkfs": ["mkfs.ext4", "-q", "-m", "0", "-L"], "mkfs": ["mkfs.ext4", "-q", "-m", "0", "-L"],
"parted": "ext4", "fuer": "nur Linux, behaelt Rechte und Besitzer",
"fuer": "Linux-Gaeste",
"paket": "e2fsprogs", "paket": "e2fsprogs",
}, },
"xfs": { "xfs": {
"mkfs": ["mkfs.xfs", "-q", "-L"], "mkfs": ["mkfs.xfs", "-q", "-L"],
"parted": "xfs", "fuer": "nur Linux",
"fuer": "Linux-Gaeste",
"paket": "xfsprogs", "paket": "xfsprogs",
}, },
"exfat": { "exfat": {
"mkfs": ["mkfs.exfat", "-L"], "mkfs": ["mkfs.exfat", "-L"],
"parted": "ntfs", "fuer": "Windows und Linux, keine Groessengrenze je Datei",
"fuer": "Windows und Linux - fuer Windows die erste Wahl",
"paket": "exfatprogs", "paket": "exfatprogs",
"hinweis": "apt install exfatprogs (281 KB, entfernt nichts)", "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": { "vfat": {
"mkfs": ["mkfs.vfat", "-n"], "mkfs": ["mkfs.vfat", "-n"],
"parted": "fat32", "fuer": "ueberall lesbar, aber nur Dateien bis 4 GB",
"fuer": "alles, aber nur Dateien bis 4 GB",
"paket": "dosfstools", "paket": "dosfstools",
}, },
} }
# Wie lang die Datentraegerbezeichnung sein darf. exFAT und FAT lassen nur # Wie lang die Datentraegerbezeichnung sein darf. exFAT und FAT lassen nur
# 11 Zeichen zu - laenger, und mkfs bricht ab. # 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 # 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 # als FAT32 gibt es keine 4-GB-Grenze je Datei. Fehlt der Formatierer, faellt
@@ -171,7 +156,7 @@ def have(command):
def available_filesystems(): def available_filesystems():
"""[(name, verfuegbar, beschreibung)] - was sich hier anlegen laesst.""" """[(name, verfuegbar, beschreibung)] - was sich hier anlegen laesst."""
result = [] result = []
for name in ("ext4", "exfat", "ntfs", "xfs", "vfat"): for name in ("exfat", "ext4", "xfs", "vfat"):
spec = FILESYSTEMS[name] spec = FILESYSTEMS[name]
result.append((name, have(spec["mkfs"][0]), spec)) result.append((name, have(spec["mkfs"][0]), spec))
return result 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) note=note, created=int(time.time()), partitioned=partitioned)
try: try:
if partitioned: 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", 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: with _loop(image, partitioned) as device:
step("Formatieren mit %s, Bezeichnung %s" % (fs, label)) step("Formatieren mit %s, Bezeichnung %s" % (fs, label))
run(spec["mkfs"] + [label, device], timeout=1800) run(spec["mkfs"] + [label, device], timeout=1800)