Snapshot-Explorer: Dateien zurueckholen, im Terminal und im Browser
Snapshots anzulegen half bisher nur halb - an die Daten darin kam man nur
ueber einen Rollback. Dafuer jetzt zwei Werkzeuge auf gemeinsamer Basis.
snapfs.py bindet einen Snapshot schreibgeschuetzt ein und liefert einen
gewoehnlichen Pfad; die Oberflaechen wissen dadurch nichts ueber Storages:
rbd (Ceph) rbd map pool/image@snap, bei nicht unterstuetzten
Image-Features faellt es auf rbd-nbd zurueck
zfspool Container ueber .zfs/snapshot, VMs ueber einen Klon
lvmthin/lvm die Snapshot-LV snap_<volume>_<snapname> aktivieren
dir/nfs/cifs qemu-nbd --load-snapshot (nur qcow2)
Gemountet wird mit ro,noload bzw. ro,norecovery,nouuid - Snapshots
laufender Gaeste haben fast immer ein unsauberes Journal. Alles Angelegte
steht in /run/pvesnap/explorer.json und laesst sich nach einem Absturz mit
"--cleanup" wieder abraeumen.
pvesnap-explorer: zwei Fenster wie im Midnight Commander, links der
Snapshot, rechts der lokale Rechner. Markieren, F5, Fortschrittsbalken,
ESC bricht ab, vorhandene Dateien werden abgefragt. In den Snapshot hinein
kann nicht kopiert werden. Geraetedateien und Sockets werden
uebersprungen, symbolische Verweise bleiben Verweise.
pvesnap-web: derselbe Inhalt im Browser, auch vom anderen Rechner.
Einzelne Dateien direkt, Verzeichnisse und Mehrfachauswahl als ZIP, das im
Strom erzeugt wird - ohne Zwischendatei auf der Platte. Zugang nur mit dem
beim Start ausgegebenen Schluessel; Pfade ausserhalb des Snapshots werden
abgewiesen; es wird ausschliesslich gelesen.
Nebenbei: die curses-Bausteine sind aus tui.py nach curses_util.py
gewandert, damit Editor und Explorer sie teilen.
Co-Authored-By: Claude Opus 5 (1M context) <noreply@anthropic.com>
This commit is contained in:
co-authored by
Claude Opus 5
parent
1be13ad294
commit
f37a942fea
@@ -12,6 +12,11 @@ löscht. Alles wird über **eine INI-Datei** gesteuert, die sich auch bequem in
|
||||
* Läuft cluster-weit (alle Nodes) über `pvesh`
|
||||
* Nur Python-Standardbibliothek — keine zusätzlichen Pakete nötig
|
||||
|
||||
Dazu zwei Werkzeuge, um wieder **an die Daten im Snapshot** zu kommen:
|
||||
|
||||
* `pvesnap-explorer` — zwei Fenster im Terminal wie im Midnight Commander
|
||||
* `pvesnap-web` — im Browser durchsehen und herunterladen, auch vom anderen Rechner
|
||||
|
||||
---
|
||||
|
||||
## Installation
|
||||
@@ -28,7 +33,9 @@ Das Skript legt an:
|
||||
| Pfad | Inhalt |
|
||||
|---|---|
|
||||
| `/usr/lib/pvesnap/` | Programmcode |
|
||||
| `/usr/local/bin/pvesnap` | Startbefehl |
|
||||
| `/usr/local/bin/pvesnap` | Dienst und Konfiguration |
|
||||
| `/usr/local/bin/pvesnap-explorer` | Zwei-Fenster-Explorer |
|
||||
| `/usr/local/bin/pvesnap-web` | Web-Oberfläche |
|
||||
| `/etc/pvesnap/pvesnap.conf` | Konfiguration (wird bei Updates **nicht** überschrieben) |
|
||||
| `/var/lib/pvesnap/state.json` | merkt sich die letzten Läufe |
|
||||
| `/etc/systemd/system/pvesnap.service` | systemd-Unit |
|
||||
@@ -320,20 +327,121 @@ oder ein abgebrochener Task, der die Sperre nicht freigegeben hat.
|
||||
|
||||
---
|
||||
|
||||
## Dateien aus einem Snapshot holen
|
||||
|
||||
Ein Snapshot ist kein Verzeichnis. Damit man hineinschauen kann, wird er
|
||||
**schreibgeschützt** als Blockgerät eingebunden und gemountet — je nach Storage
|
||||
unterschiedlich:
|
||||
|
||||
| Storage | Weg hinein |
|
||||
|---|---|
|
||||
| `rbd` (Ceph) | `rbd map pool/image@snap`, bei nicht unterstützten Image-Features `rbd-nbd` |
|
||||
| `zfspool` | Container direkt über `.zfs/snapshot/…`, VMs über einen temporären Klon |
|
||||
| `lvmthin`, `lvm` | die Snapshot-LV `snap_<volume>_<snapname>` aktivieren |
|
||||
| `dir`, `nfs`, `cifs` | `qemu-nbd --load-snapshot` (nur qcow2) |
|
||||
|
||||
Danach werden Partitionen erkannt und mit `ro,noload` bzw. `ro,norecovery,nouuid`
|
||||
gemountet — Snapshots laufender Gäste haben fast immer ein unsauberes Journal,
|
||||
ohne diese Optionen würde der Kernel hineinschreiben wollen.
|
||||
|
||||
Aufgeräumt wird beim Beenden automatisch. Bleibt nach einem Absturz etwas
|
||||
hängen:
|
||||
|
||||
```bash
|
||||
pvesnap-explorer --cleanup
|
||||
```
|
||||
|
||||
### `pvesnap-explorer` — zwei Fenster im Terminal
|
||||
|
||||
```bash
|
||||
pvesnap-explorer # Gast und Snapshot auswählen
|
||||
pvesnap-explorer 802 # Snapshot von VM 802 auswählen
|
||||
pvesnap-explorer 802 <snapname> # direkt öffnen
|
||||
pvesnap-explorer --path /mnt/x # beliebiges Verzeichnis (zum Ausprobieren)
|
||||
```
|
||||
|
||||
Links der Snapshot, rechts der lokale Rechner:
|
||||
|
||||
| Taste | |
|
||||
|---|---|
|
||||
| `Tab` | Fenster wechseln |
|
||||
| `Pfeiltasten`, `Enter` | bewegen, Verzeichnis öffnen oder Datei ansehen |
|
||||
| `Backspace` | ein Verzeichnis hoch |
|
||||
| `Leertaste` | markieren; `*` umkehren, `a` alle, `u` keine |
|
||||
| `F5` / `c` | Markiertes ins andere Fenster kopieren |
|
||||
| `F3` / `v` | Datei ansehen (Text oder Hex) |
|
||||
| `F7` / `n` | neues Verzeichnis (nur lokal) |
|
||||
| `F6` / `g` | Verzeichnis direkt eingeben |
|
||||
| `F2` / `m` | anderes Dateisystem des Snapshots wählen |
|
||||
| `F10` / `q` | beenden |
|
||||
|
||||
Kopiert wird immer vom aktiven ins andere Fenster — in den Snapshot hinein geht
|
||||
nichts, er ist schreibgeschützt. Beim Kopieren gibt es einen Fortschrittsbalken,
|
||||
`ESC` bricht ab; vorhandene Dateien werden abgefragt (`ja` / `nein` / `alle` /
|
||||
`keine`). Gerätedateien und Sockets werden übersprungen, symbolische Verweise
|
||||
bleiben Verweise.
|
||||
|
||||
### `pvesnap-web` — im Browser herunterladen
|
||||
|
||||
```bash
|
||||
pvesnap-web # Gast und Snapshot im Browser wählen
|
||||
pvesnap-web 802 <snapname> # diesen Snapshot gleich öffnen
|
||||
pvesnap-web --port 8080 --bind 10.0.0.5
|
||||
```
|
||||
|
||||
Beim Start wird eine Adresse mit Zugangsschlüssel ausgegeben:
|
||||
|
||||
```
|
||||
http://192.168.1.50:8823/?token=zGo-1RW7eYyf_YCPvTIOLtOp
|
||||
```
|
||||
|
||||
Diese Adresse an einem anderen Rechner im Browser öffnen. Dort lässt sich der
|
||||
Snapshot durchklicken; **einzelne Dateien** werden direkt heruntergeladen,
|
||||
**Verzeichnisse und Mehrfachauswahl** als ZIP (im Strom erzeugt, es wird nichts
|
||||
zwischengespeichert).
|
||||
|
||||
Zur Sicherheit:
|
||||
|
||||
* Ohne den Zugangsschlüssel gibt es nichts zu sehen (er wandert nach dem ersten
|
||||
Aufruf in ein Cookie). `--no-token` schaltet das ab — nur in einem Netz
|
||||
benutzen, dem du vertraust.
|
||||
* Es wird ausschließlich **gelesen**. Die Oberfläche kann nichts ändern oder
|
||||
löschen.
|
||||
* Pfade außerhalb des eingebundenen Snapshots werden abgewiesen — über die
|
||||
Adresszeile kommt man nicht an den Rest des Hosts.
|
||||
* Die Verbindung ist unverschlüsseltes HTTP. Über unsichere Netze besser einen
|
||||
SSH-Tunnel legen:
|
||||
`ssh -L 8823:localhost:8823 root@pve` und dann `pvesnap-web --bind 127.0.0.1`.
|
||||
|
||||
Beendet wird mit `Strg-C`; der Snapshot wird dabei wieder ausgehängt.
|
||||
|
||||
---
|
||||
|
||||
## Aufbau
|
||||
|
||||
```
|
||||
pvesnap/
|
||||
config.py INI lesen und schreiben, Gruppen- und Globaleinstellungen
|
||||
schedule.py Berechnung des nächsten Termins
|
||||
naming.py Namensschema und Beschreibungs-Vorlagen
|
||||
proxmox.py pvesh-Anbindung (Inventar, Snapshots anlegen/löschen)
|
||||
engine.py Auswahl der Gäste, Anlegen, Aufräumen
|
||||
daemon.py Hauptschleife, Signale, Sperren
|
||||
state.py merkt sich die letzten Läufe
|
||||
tui.py ncurses-Editor
|
||||
cli.py Kommandozeile
|
||||
config.py INI lesen und schreiben, Gruppen- und Globaleinstellungen
|
||||
schedule.py Berechnung des nächsten Termins
|
||||
naming.py Namensschema und Beschreibungs-Vorlagen
|
||||
proxmox.py pvesh-Anbindung (Inventar, Snapshots anlegen/löschen)
|
||||
engine.py Auswahl der Gäste, Anlegen, Aufräumen
|
||||
daemon.py Hauptschleife, Signale, Sperren
|
||||
state.py merkt sich die letzten Läufe
|
||||
preflight.py prüft die Umgebung (root, /etc/pve beschreibbar, /root)
|
||||
cli.py Kommandozeile
|
||||
curses_util.py gemeinsame curses-Bausteine
|
||||
tui.py ncurses-Konfigurationseditor
|
||||
snapfs.py Snapshots einbinden und mounten (rbd/zfs/lvm/qcow2)
|
||||
explorer.py Zwei-Fenster-Explorer im Terminal
|
||||
web/ Web-Oberfläche zum Herunterladen
|
||||
server.py HTTP-Server, ZIP im Strom, Zugangsschlüssel
|
||||
assets.py Stylesheet und HTML-Gerüst
|
||||
config/pvesnap.conf.example
|
||||
systemd/pvesnap.service
|
||||
install.sh uninstall.sh
|
||||
```
|
||||
|
||||
Der Dienst (`pvesnap`) und die beiden Explorer teilen sich `proxmox.py`;
|
||||
`snapfs.py` liefert beiden Oberflächen einen ganz gewöhnlichen Pfad, sodass
|
||||
Explorer und Web-Oberfläche nichts über Ceph, ZFS oder LVM wissen müssen.
|
||||
|
||||
Reference in New Issue
Block a user