spacetrace
DE
Download

Was sich geändert hat

Jede Version, die neueste zuerst. Derselbe Text steckt in den Apps: Was hier steht, sagt Ihnen die App nach dem Update.

EntwicklungsmeilensteinAls Entwicklungsmeilenstein markierte Versionen wurden nie getaggt und haben keine herunterladbaren Dateien. Sie stehen hier, weil die Arbeit stattgefunden hat, nicht weil Sie sie installieren könnten.

Desktop-App

0.9.0

Downloads und Prüfsummen

Hinzugefügt

  • Die Karte lässt sich jetzt als Kissen zeichnen, im von SequoiaView und WinDirStat bekannten Stil: Jedes Rechteck wird wie eine Wölbung beleuchtet und jeder Ordner wie eine größere Wölbung unter seinem Inhalt, sodass Zusammengehöriges als eine Form lesbar wird, ohne Linien nachzufahren. Die Farben bedeuten weiterhin Art oder Alter; über ein Rechteck hinweg ändert sich nur das Licht. Wählen Sie Flach oder Kissen neben Karte und Ringe. Die Wahl wird gespeichert, und die Karte bleibt flach, bis Sie sie treffen.

Geändert

  • Unter Linux zählen Scans von btrfs und XFS Blöcke, die sich mehrere Dateien teilen, jetzt nur einmal - so, wie die Festplatte sie speichert: Reflink-Kopien (cp --reflink, bei coreutils 9 der Standard) und btrfs-Snapshots werden nicht mehr pro Name berechnet. Drei Reflink-Kopien einer 100-MB-Datei zeigten bisher 300 MB auf der Festplatte und zeigen jetzt 100 MB, genau wie df. Die Summen auf diesen Dateisystemen sinken daher, und ein Vergleich mit einem Snapshot einer früheren Version zeigt einen Rückgang, der auf der Festplatte nie stattgefunden hat. Komprimierte btrfs-Dateien behalten ihre unkomprimierte Größe, weil das Messen ihrer echten Belegung root erfordert.

Leistung

  • Scans unter macOS sind 15-33% schneller und belegen ein Drittel weniger Speicher. Copy-on-Write-Klone wurden bisher in einem eigenen Schritt nach dem Durchlauf gesucht, wobei jede Kandidatendatei einzeln geöffnet wurde - der Zähler „Klon-Kandidaten geprüft“ am Ende eines Scans. APFS nennt die Klonfamilie bereits in der Verzeichnisauflistung, die der Durchlauf ohnehin liest, also entfällt dieser Schritt. Gemessen: 415.503 Einträge 485 auf 412 ms, 1.064.452 Einträge 2133 auf 1431 ms, Speicherhöchstwert beim größeren 299 auf 200 MiB. Auch Klone unter 64 KiB werden jetzt nur einmal gezählt, sodass ein Ordner mit vielen kleinen Klonen auf der Festplatte etwas weniger zeigt - näher an dem, was die Festplatte wirklich belegt. Scans laufen mit 6 statt 8 Threads, was nach dem schneller gewordenen Durchlauf neu gemessen schneller war.
  • Das Speichern eines Scans im Verlauf dauert etwa 17 % kürzer: Die Prüfsumme wird beim Schreiben der Zeilen berechnet, nicht in einem zweiten Durchlauf.
  • Scans unter Linux sind 6 bis 14 % schneller: Ordner werden in großen Blöcken gelesen und jeder Eintrag relativ zu seinem Ordner abgefragt. Auf XFS mit per Reflink geteilten Dateien machen mehr Threads einen Scan nicht mehr langsamer: 100.000 solcher Dateien brauchten 200 ms statt 855 ms.
  • Unter Linux werden drehende Platten erkannt und mit einem Thread gescannt, die Einträge jedes Ordners in der Reihenfolge, in der sie auf der Platte liegen: Ein kalter Scan einer simulierten drehenden Platte dauerte 0,9 s statt 11,5 s.
  • Unter Windows liest ein Scan eines ganzen NTFS-Volumes, wenn die App als Administrator läuft, die Master File Table des Volumes, statt jede Datei zu öffnen, mit demselben Ergebnis. Jeder andere Scan läuft wie bisher.

Behoben

  • Unter macOS wird der Platz einer APFS-Klonfamilie jetzt bei jedem Scan derselben Datei angerechnet: der am wenigsten tief liegenden, bei Gleichstand der mit dem ersten Pfad. Bisher bekam ihn die Kopie, die ein Scan-Thread zuerst erreichte; die Summe stimmte, aber wenn die Klone in verschiedenen Ordnern lagen, wanderten die Bytes zwischen ihnen von Scan zu Scan, ohne dass sich auf der Festplatte etwas änderte, und der Vergleich zweier Snapshots einer unveränderten Festplatte zeigte einen Ordner wachsen und einen anderen schrumpfen. Ein Vergleich mit einem älteren Snapshot kann ein letztes Mal eine solche Verschiebung zeigen.
  • Das Einfärben der Karte nach Alter zeigte bei einem Snapshot, der aus der Datenbank oder von einem Agent geöffnet wurde, keine Alter, und sein Altersprofil meldete in jedem Band 0 B; nur ein frischer Scan hatte sie. Ein Snapshot wird jetzt genauso eingefärbt und profiliert wie der Scan, aus dem er gespeichert wurde.
  • Auf der Karte lagen die Beschriftungen eines Ordners und seines ersten Unterordners übereinander: Beide landeten in derselben Ecke, nur einen Pixel versetzt, sodass ein dist/ mit einem großen cache/ darin als „dist/ache/“ zu lesen war. Eine Beschriftung, die eine andere verdecken würde, rückt jetzt innerhalb ihrer eigenen Kachel darunter und entfällt, wenn dort kein Platz mehr ist; zwei Beschriftungen überlappen sich nicht mehr.

0.8.0

Downloads und Prüfsummen

Hinzugefügt

  • Ein laufender Scan wird jetzt beim Füllen gezeigt: dieselbe Ordnerliste, dieselbe Karte und derselbe Inspektor wie bei einem fertigen Scan, über einem Baum, der jede Sekunde wächst. Bisher stand bis zum Ende des Scans nur ein Prozentsatz auf dem Bildschirm. Jede Zahl darin ist das bisher Gelesene, deshalb ist die Ansicht als „unvollständig“ gekennzeichnet und weder Löschen noch Speichern ist darin erlaubt; was Sie geöffnet, ausgewählt oder herangezoomt haben, übersteht die Aktualisierungen und den Moment, in dem der Scan endet.
  • Scans öffnen sich jetzt in Tabs. Der Start-Tab bleibt links und wird nie geschlossen, ein weiterer Scan kostet also nicht mehr den, den Sie gerade lesen; jeder Scan bekommt einen eigenen Tab, und dazwischen lässt sich frei wechseln. Einen Tab zu schließen gibt seinen Speicher zurück — ein Scan mit einer Million Einträgen sind rund hundert Megabyte, solange er offen ist.
  • Der Startbildschirm listet die Laufwerke auf. Ein ganzes Dateisystem zu scannen war immer möglich und hatte nirgends einen Knopf: man musste wissen, dass die Ordnerauswahl auch die Wurzel eines Laufwerks annimmt. Jedes Laufwerk wird mit seinem freien Platz gezeigt, externe eingeschlossen.

Geändert

  • Die Kopfleiste trug vierzehn Schaltflächen und brach bei der Breite, in der das Fenster tatsächlich öffnet, auf drei Zeilen um — und schob damit die Karte nach unten. Jede Bedienung sitzt jetzt bei dem, was sie ändert: oben nur noch die App und woher ein Baum kommt, die Aktionen für den offenen Scan hinter dem ⋯ neben seinem Pfad, und Form und Farbe der Karte an der Karte selbst. Welches Maß gilt, wählen Sie durch Klick auf die Summe, die Sie sehen wollen: beide stehen ohnehin dort, die gewählte hell und unterstrichen. „Zoom zurücksetzen“ ist entfallen — der erste Eintrag im Pfad über der Karte tat schon dasselbe.
  • Die Ordnerliste startet schmaler. Über die Hälfte ihrer Breite ging für die Zahlenspalte drauf; diese wurde um 16px enger gefasst — nur Abstände und die Länge des Balkens, keine Zahl sagt weniger als vorher — und die Startbreite ist mit ihr gesunken. Eine selbst eingestellte Breite wird weiterhin gemerkt; ein Doppelklick auf den Trenner setzt sie zurück.
  • Das Fenster lässt sich nicht mehr so klein ziehen, dass man damit nicht mehr arbeiten kann. Die Mindestgröße ist jetzt 1080 × 700 statt 900 × 600: bei der alten war die Karte kleiner als die Ordnerliste daneben.
  • Erneut scannen, Snapshot speichern und Verlauf stecken nicht länger hinter einer einzigen unbeschrifteten Schaltfläche. Sie stehen benannt in der Zeile, die sagt was geöffnet ist, sie stehen unten im Rechtsklick-Menü, und der Verlauf — der einzige, der keinen offenen Scan braucht — steht zusätzlich auf dem Startbildschirm.

Behoben

  • Die Vorschau, die ein erster Scan zeichnete, blieb den ganzen Scan über leer: ihre Zeichenfläche konnte keine Höhe bekommen, sodass sie nie etwas anforderte und nur die Überschrift „Oberste Ebene wird gelesen“ stehen blieb.
  • Die Karte legte sich über die Detailspalte rechts, sobald die Ordnerliste breit genug gezogen war — oder das Fenster schmal genug —, dass für die Karte weniger Platz blieb, als ihre eigene Legende breit ist. Die beiden Seitenspalten weichen jetzt zurück, die Karte behält eine Mindestbreite, und keine der drei überlappt die andere mehr.
  • Sobald über der Karte ein Fehler gemeldet wurde, fiel die Karte in sich zusammen: der Fehlerstreifen übernahm den Platz, der ihr zustand. Sie verschwand also genau in dem Moment, in dem das Fenster erklären wollte, was schiefgelaufen war.
  • Die Karte ist deutlich schneller geworden, ohne ein Detail zu verlieren. Die Maus darüber zu bewegen ließ das ganze Fenster stocken: jede Bewegung zeichnete alle rund 112.000 Rechtecke neu, nur um einen dünnen Rahmen zu versetzen — 39,4 ms pro Bewegung, jetzt 0,13 ms. Das Bild selbst wird als einige Dutzend Pfade gezeichnet statt mit einem Aufruf pro Kachel (40,6 ms auf 21,4 ms), und die Koordinaten gehen kürzer über die Grenze, was die Antwort einer Karte von 10,4 MB auf 5,2 MB bringt.
  • Die Links Website und Quellcode im Über-Fenster sowie der Changelog-Link im Update-Hinweis taten nichts. Die Berechtigung, mit der diese App eine Adresse an den Browser übergibt, lässt ohne eine ihr übergebene Liste keine Adresse durch — und es gab keine; der Fehlschlag wurde an jeder Aufrufstelle verworfen, sodass ein Knopf, der nie funktionieren konnte, genauso aussah wie einer, der es tat.
  • Ein Rechtsklick überall dort, wo die App kein eigenes Menü hat, öffnete das der Web-Ansicht mit dem Eintrag Neu laden — der jeden offenen Scan verwarf und eher wie ein Absturz aussah als wie etwas Gewolltes. Dieses Menü ist jetzt überall unterdrückt außer in Textfeldern, wo es der einzige Weg zu Kopieren und Einfügen ist.
  • Ein Verzeichnisbaum, der tiefer als etwa 210 Ebenen verschachtelt ist, schließt die App nicht mehr. Der Durchlauf ruft sich einmal pro Ebene selbst auf und seine Threads hatten den gewöhnlichen Standard-Stack, sodass ein ausreichend tiefer Baum ihn überlief — und da die Analyse in der App selbst läuft, verschwand das ganze Fenster, ohne eine Meldung zu hinterlassen. Die Threads erhalten nun einen Stack von 16 MiB und halten bei 1024 Ebenen an: das Verzeichnis erscheint unter den Einträgen, die nicht gelesen werden konnten, und die Analyse läuft weiter.

0.7.0

Downloads und Prüfsummen

Hinzugefügt

  • Ein erster Scan zeigt jetzt schon während des Laufs, was er findet, statt einer leeren Fläche mit einem Zähler. Die obersten Ordner erscheinen als Karte und wachsen, während ihr Inhalt gelesen wird — der große meldet sich meist lange vor dem Ende. Die Zahlen sind das bisher Gefundene, und die Ansicht sagt das auch: ein Ordner, der nicht mehr wächst, sieht genauso aus wie einer, der fertig ist. Dieselbe Layout-Routine zeichnet diese und die fertige Karte, es ordnet sich also nichts neu, wenn der Scan landet. Ein erneuter Scan lässt die Karte, die Sie gerade lesen, unangetastet wie bisher.
  • Derselbe Ordner lässt sich jetzt als Ringe statt als Rechtecke zeichnen. Ein Ring je Ebene, und der Winkel eines Eintrags ist sein Anteil an dem Ordner, in dem er liegt — wie tief etwas geht und was worin steckt, ist damit das Bild selbst und nicht etwas, das man aus der Verschachtelung ableiten muss. Die Karte bleibt die Voreinstellung und dies ist die zweite Meinung, aus einem Grund, den man kennen sollte: ein weiter außen liegender Bogen bedeckt bei gleicher Größe mehr Bildschirm — vergleichen Sie also Winkel, nicht Flächen. Klicken wählt aus, ein Doppelklick auf einen Ordner geht hinein, und der Farbschalter wirkt auch hier.

0.6.2

Downloads und Prüfsummen

Behoben

  • Die Legende der Alters-Heatmap nannte jedes Band "undefined" statt "Unter einer Woche", "1–3 Monate" und so weiter. Die Farben und die Byte-Angaben daneben waren richtig; nur die Wörter fehlten, was den einen Teil der Ansicht unlesbar machte, der die Farben erklärt.

0.6.1

Downloads und Prüfsummen

Hinzugefügt

  • Die Karte lässt sich nach Alter statt nach Art einfärben. Blau ist diese Woche, Rot ist älter als zwei Jahre, und ein Ordner bekommt das Alter seines mittleren Bytes — die Hälfte seines Inhalts ist also älter, als die Farbe sagt. Die Legende daneben nennt die Bytes je Band für den gezeigten Ordner und macht aus „Rot heißt alt" ein „hier liegen 48 GB, die seit zwei Jahren niemand angefasst hat". Das Datum des Ordners selbst wird bewusst ignoriert: es ändert sich, sobald etwas daneben abgelegt wird, und sagt nichts über den Inhalt.

Behoben

  • Mit spacetrace import übernommene Snapshots lassen sich in der App öffnen. Sie wurden mit einer fehlerhaften Wurzel gespeichert, weshalb die App sie als unbrauchbaren Baum abwies.

0.6.0

Downloads und Prüfsummen

Hinzugefügt

  • Wenn ein Scan nicht mehr vorankommt, sagt der Fortschrittsstreifen das jetzt und nennt den Ordner, auf den gewartet wird — statt einen Balken weiterlaufen zu lassen. Eine Netzfreigabe, die aufgehört hat zu antworten, blockiert im Kernel und keine App kann das aufheben; aber wer weiß, worauf gewartet wird, kann entscheiden, ob er wartet oder abbricht.
  • Der gesamte Verlauf eines Ordners auf einer Linie. Verlauf zeigt alle gespeicherten Snapshots eines Ordners als Diagramm, daneben was sich zwischen je zwei Snapshots geändert hat; ein Klick auf einen Schritt öffnet den Vergleich genau für diesen Sprung. Die Achse beginnt bei null, die Höhe der Linie ist also die Größe selbst.

Leistung

  • Scans laufen mit höchstens acht Threads statt mit einem pro Kern und wurden dadurch auf jedem gemessenen Verzeichnisbaum schneller — 39% auf einem kleinen, 11% auf einem großen. Ein Durchlauf ist syscall-gebunden: jenseits eines Punkts warten die Threads im Kernel, statt zu arbeiten.
  • Scans auf macOS sind etwa 2,3-mal schneller, dank derselben Änderung im Scan-Kern: Das System kann die Namen eines Ordners und die Größen seiner Dateien in einer einzigen Anfrage melden statt in einer pro Datei.

Behoben

  • Der Fortschrittsstreifen schien am Ende jedes Scans einzufrieren: nach dem Durchlauf sucht ein weiterer Schritt nach Copy-on-Write-Klonen, und dabei bewegte sich kein Zähler. Diese Phase heißt jetzt „Wird abgeschlossen“ und zählt, was sie prüft, statt eine stehengebliebene Dateizahl zu zeigen.

0.5.0

Downloads und Prüfsummen

Hinzugefügt

  • Snapshots tragen jetzt eine Prüfsumme ihres Inhalts. Ein von einem Agenten geholter Snapshot, der unterwegs verändert wurde, wird abgelehnt statt gezeichnet: ein gekipptes Bit hinterlässt einen völlig gültigen Baum, und eine Treemap zeichnet die falsche Zahl genauso überzeugend wie die richtige.

Geändert

  • Die Snapshot-Datenbank, die sich die App mit dem Kommandozeilenwerkzeug teilt, wechselt auf ein neues Schema. Diese Version liest die alte ohne Weiteres; umgekehrt gilt das nicht, also aktualisiere beide zusammen, wenn du beide benutzt.

0.4.2

Downloads und Prüfsummen

Behoben

  • Das .dmg ließ sich unter macOS nicht mehr öffnen. Die Signaturidentität aus 0.4.1 wurde auch auf das Disk-Image gesetzt, und ein Image mit einem Zertifikat, dem macOS nicht vertraut, wird schon beim Einhängen abgewiesen — die Warnung erschien also vor dem ersten Start, beim Öffnen der Datei selbst. Das Image ist wieder unsigniert; die App darin behält ihre Identität.

0.4.1

Downloads und Prüfsummen

Behoben

  • macOS vergaß bei jedem Update alle erteilten Berechtigungen: ohne stabile Signaturidentität hält das System jede Version für eine andere App. Der Volle Festplattenzugriff stand auf „ein“ und wurde trotzdem ignoriert, und jeder Scan fragte wieder Ordner für Ordner nach. Die App trägt jetzt über Versionen hinweg eine einzige Identität, also bleibt einmal Erteiltes erteilt.

0.4.0

Downloads und Prüfsummen

Hinzugefügt

  • Vorübergehende Installationsskripte für macOS und Windows, die das Paket per curl bzw. Invoke-WebRequest holen, gegen SHA256SUMS prüfen und installieren. Weil ein so geholter Download die Markierungen eines Browsers nicht trägt, melden sich Gatekeeper und SmartScreen gar nicht erst. Sie verschwinden wieder, sobald die App signiert ist.
  • Ohne Vollen Festplattenzugriff fragt macOS für jeden geschützten Ordner einzeln nach — mitten im Scan, in unvorhersehbarer Reihenfolge. Der Startbildschirm sagt das jetzt vor dem ersten Scan und führt mit einem Knopf direkt zur richtigen Stelle in den Systemeinstellungen. Der Systemdialog erklärt endlich auch, wofür ein Speicheranalyse-Werkzeug Ihre Dateien liest.

Geändert

  • Das Fenster „Was ist neu“ listet nur noch veröffentlichte Versionen. Einträge, die zwar fertig, aber in keiner Version enthalten sind, beschrieben Arbeit, die in Ihrer Kopie gar nicht steckt.

Behoben

  • Die Installationsanleitung für macOS beschrieb den Rechtsklick-Öffnen-Trick, den Apple in macOS 15 entfernt hat. Sie nennt jetzt den Weg über Systemeinstellungen → Datenschutz & Sicherheit → Dennoch öffnen.

0.3.1

Downloads und Prüfsummen

Behoben

  • Die Update-Prüfung funktioniert. 0.3.0 hat sie angekündigt, aber es wurde kein Update-Manifest mitveröffentlicht, sodass die App nichts zum Prüfen hatte.

0.3.0

Downloads und Prüfsummen

Hinzugefügt

  • Auch die Fehlermeldungen sind in Ihrer Sprache. Was das Betriebssystem sagt — Permission denied und dergleichen — bleibt in seinen eigenen Worten, denn das sind die Worte, die bei einer Suche weiterhelfen.
  • Beim Start prüft die App, ob eine neuere Version vorliegt, und bietet die Installation an. Es wird nichts heruntergeladen, bevor Sie es verlangen. Unter macOS ist die App weiterhin nicht signiert, das System kann sie nach einem Update also erneut bestätigen lassen.
  • Die App spricht fünf Sprachen: Englisch, Türkisch, Italienisch, Französisch und Deutsch. Beim ersten Start folgt sie der Sprache Ihres Systems, und die Auswahl lässt sich jederzeit ändern.
  • Ein Panel mit der laufenden Version und dem Build sowie den Neuerungen der letzten Versionen. Es funktioniert offline: Das Changelog steckt in der App selbst.

Leistung

  • Das Öffnen eines großen Scans braucht weniger Speicher, dank der kompakteren Baumdarstellung im Scan-Kern.

0.2.0

· Entwicklungsmeilenstein

Hinzugefügt

  • Installierbare Pakete für macOS, Windows und Linux, bei jedem Push gebaut.
  • Ein Schalter dafür, welchem Maß Karte und Listen folgen: der Angabe der Dateien oder dem belegten Speicher.

Geändert

  • Das Fenster blockiert nie. Lange Arbeiten laufen außerhalb des Hauptthreads und melden ihren Fortschritt, und ein Scan lässt sich währenddessen abbrechen.

0.1.0

· Entwicklungsmeilenstein

Hinzugefügt

  • Die erste Desktop-App: eine Treemap eines Ordners, daneben der Baum und rechts die Details des ausgewählten Eintrags.
  • Öffne einen neuen Scan, einen gespeicherten Snapshot oder einen Snapshot direkt von einem Agenten auf einem Server oder NAS.
  • Verschiebe Einträge aus der App in den Papierkorb, hinter einer Bestätigung, die genau benennt, was verschwindet.

Alle Versionen · Download

Kommandozeile

0.10.0

Downloads und Prüfsummen

Hinzugefügt

  • spacetrace scan --ssh host /path scannt einen per ssh erreichbaren Rechner, ohne dort etwas zu installieren, und legt den Snapshot in der lokalen Datenbank ab, wo scans, diff, ls --scan und verify ihn wie jeden anderen behandeln. Eine Kopie genau dieser Version wird in ein privates temporäres Verzeichnis auf der Gegenseite hochgeladen (dieses Binary, wenn es dort läuft, sonst das veröffentlichte Release für jene Plattform, gegen SHA256SUMS geprüft und zwischengespeichert), scannt, schickt ihre Datenbank zurück und wird entfernt: auch bei einem Fehler, bei Ctrl-C und wenn spacetrace hart beendet wird, denn die Gegenseite räumt auf, sobald die Sitzung endet. Eine Verbindung, also höchstens eine Passwortabfrage. Der Snapshot trägt Hostnamen und Pfad des entfernten Rechners und reiht sich so in dessen Verlauf ein. Der Preis: ssh-Zugang, ein Upload von etwa 7 MB pro Lauf und Platz in /tmp oder $HOME für den Snapshot. Unter Windows noch nicht verfügbar.
  • spacetrace scan s3://bucket/prefix scannt einen S3-Bucket - AWS, oder über --endpoint MinIO, Cloudflare R2, Backblaze B2 und Wasabi - und --save speichert ihn als gewöhnlichen Snapshot, den ls --scan, diff --path s3://..., age --scan und export unverändert lesen. Zugangsdaten und Region kommen aus denselben Quellen, die die aws-CLI liest, in ihrer Reihenfolge: Schlüssel, eine übernommene Rolle, ein Web-Identity-Token, IAM Identity Center nach aws sso login, credential_process, Container-Zugangsdaten von ECS/EKS und die Instanz-Metadaten von EC2. Temporäre Schlüssel werden vor ihrem Ablauf erneuert; für eine Rolle, die einen MFA-Code verlangt, wird nicht nachgefragt, daher ihre Schlüssel zuerst mit aws configure export-credentials exportieren. --no-sign-request listet einen öffentlichen Bucket. Ein AWS-Bucket wird mit 16 Anfragen gleichzeitig gelistet, nach Ordnern aufgeteilt (587.000 Schlüssel in 30 s statt 175 s, gemessen gegen us-west-2); jeder andere --endpoint bleibt bei einem einzelnen Strom, solange --threads nicht mehr verlangt, denn MinIO war parallel messbar langsamer. Schlüssel werden als Ordner dargestellt, getrennt an /. Die Summe zählt nur aktuelle Versionen: alte Versionen, Löschmarkierungen und unvollendete Multipart-Uploads werden berechnet, aber nicht aufgelistet, und die Ausgabe sagt das. Schlüssel mit einem Pfadsegment . oder .. werden nicht dargestellt: sie zählen als unlesbare Einträge, und die Ausgabe nennt sie. diff --path s3://... vergleicht nur Snapshots desselben Dienstes, sodass ein MinIO- und ein AWS-Bucket gleichen Namens nie gepaart werden.
  • Neu: spacetrace watch <folder> zeigt live, welche Ordner seit dem Start wachsen oder schrumpfen, wie schnell, die größten zuerst - dieselben Zeilen, die diff melden würde. Es scannt einmal, folgt dann den Dateisystem-Ereignissen (FSEvents, inotify, ReadDirectoryChangesW) und liest nur die genannten Ordner mit dem Scanner neu, sodass Hardlinks, Symlinks, --exclude, -x und --depth dasselbe bedeuten wie bei scan. Im Terminal wird an Ort und Stelle aktualisiert, in eine Pipe werden Zeilen angehängt, mit --json ein JSON-Objekt pro Aktualisierung; --interval setzt den Takt. Eine Datei mit Hardlinks wird über Gerät und Inode verfolgt und einmal gezählt, sodass ein Build-Verzeichnis voller Hardlinks keinen vollständigen Neuscan braucht; nur vom System gemeldete verlorene Ereignisse oder ein Link, dessen andere Namen sich nicht finden lassen, lösen einen aus, und die Ausgabe sagt es; Klone zählen mit voller Größe. Unter Linux bricht es bei erschöpften inotify-Watches mit dem sysctl ab, der das Limit anhebt.
  • spacetrace pkgs zeigt, welchem installierten Paket die Bytes unter einem Ordner gehören und wie viel keinem Paket gehört - meist der Teil, den jemand von Hand dort abgelegt hat. Mit einer einzelnen Datei statt eines Ordners nennt es das Paket, dem sie gehört. dpkg, pacman, apk und Homebrew werden direkt von der Platte gelesen, und wo eine rpm-Datenbank existiert, wird rpm gefragt; eine Datenbank, die nicht gelesen werden kann, wird in der Ausgabe genannt, statt ihre Dateien stillschweigend als paketlos zu zählen. Auf Systemen mit zusammengeführtem /usr wird ein Eintrag /bin/ls mit /usr/bin/ls abgeglichen, wo die Datei tatsächlich liegt: wörtlich abgeglichen wären 17 % von /usr unter Debian 12 als paketlos erschienen. Unter macOS werden auch die Installationsbelege gelesen: Alles, was ein .pkg installiert hat - Apples eigene Pakete, die Command Line Tools, Office, Node.js - wird seinem Paket mit derselben Dateiliste zugerechnet, die pkgutil --files liefert, und zwar in einem Bruchteil einer Sekunde direkt von der Platte statt in Sekunden. Ein Scan von /System/Volumes/Data/Applications ergibt dieselbe Antwort wie einer von /Applications, und eine Datei, die ein Updater mit anderer Groß- und Kleinschreibung umbenannt hat, zählt weiterhin für ihr Paket. Ein beschädigter Beleg wird in der Ausgabe genannt, die übrigen werden trotzdem gelesen. Dateien, die erst das Installationsskript eines Pakets erzeugt, etwa Python-Bytecode oder Schriftcaches, stehen in keiner Liste und erscheinen als paketlos. Es funktioniert nur auf diesem Rechner, daher wird ein Snapshot von einem anderen Host abgelehnt.
  • Der Agent liefert jetzt Prometheus-Metriken unter /metrics, hinter demselben Bearer-Token wie der Rest seiner API. Je konfiguriertem Wurzelverzeichnis: wann der neueste Snapshot begann und wie lange er dauerte, logische Größe und Größe auf der Festplatte, Dateien, Verzeichnisse, unlesbare Pfade, der dabei gemessene freie und gesamte Speicherplatz, ob gerade ein Scan läuft und wie viele Snapshots gespeichert sind; dazu Build und Startzeit. Ein noch nie gescanntes Verzeichnis erscheint trotzdem, mit null Snapshots, sodass sich ein Alarm auf "nie gescannt" setzen lässt. Eine Scrape-Abfrage liest nur, was bereits gespeichert ist - sie startet keinen Scan und berührt die gescannten Datenträger nicht - und dauerte bei 20.005 gespeicherten Snapshots 2,2 ms. Die Scrape-Konfiguration steht in docs/AGENT.md.
  • Unter macOS beginnen spacetrace scan --save und die geplanten Scans des Agenten beim letzten Snapshot und lesen nur die Ordner neu, die laut FSEvents geändert wurden: /Applications in 239 ms statt 406 ms. Das Ergebnis ist dasselbe wie bei einem vollständigen Scan, oder es ist einer: Jeder Zweifel (kein Cursor, anderes Volume, langsames oder verlorenes Journal, zu viele Änderungen, eine Basis älter als zwei Tage, andere Optionen, beschädigte oder importierte Basis) bedeutet einen vollständigen Scan, und der Snapshot hält den Grund fest. --full und incremental = false pro Wurzel erzwingen einen vollständigen Scan. Eine Wurzel auf einem anderen Volume als dem, auf dem der temporäre Ordner liegt, etwa einer externen Platte, wird immer vollständig gescannt: Dort lässt sich nicht darauf verlassen, dass FSEvents eine kurz vor dem Scan gemachte Änderung schon nummeriert hat.
  • scan --json meldet rescan (full, incremental oder fallback:<reason>) und ein incremental-Objekt (Replay- und Basis-Ladezeit, neu gelesene Ordner, wiederverwendete Einträge).
  • spacetrace scan --disk auto|ssd|hdd passt das Tempo des Scans an die darunterliegende Platte an. hdd scannt mit einem Thread und fragt unter Linux die Einträge jedes Ordners in der Reihenfolge ab, in der sie auf der Platte liegen; auto, die Voreinstellung, erkennt drehende Platten unter Linux und scannt alles andere wie bisher. Auf einer simulierten drehenden Platte dauerte ein kalter Scan 0,9 s statt 11,5 s. --json meldet das Tempo (disk, threads, disk_decided). Der Agent nimmt dieselbe Einstellung pro Wurzel als disk.

Geändert

  • Auf btrfs und XFS zählt die Belegung auf der Festplatte Blöcke, die sich mehrere Dateien teilen, jetzt nur einmal - so, wie die Festplatte sie speichert: Reflink-Kopien (cp --reflink, bei coreutils 9 der Standard) und btrfs-Snapshots werden nicht mehr pro Name berechnet. Als root auf btrfs zählen komprimierte Dateien mit ihrer komprimierten Größe. Gemessen: Drei Reflink-Kopien einer 100-MB-Datei meldeten bisher 300 MB und melden jetzt 100 MB, genau wie df; ein komprimiertes 100-MB-Log meldet 3 MB statt 100 MB. Die Summen auf diesen Dateisystemen sinken daher, und ein Vergleich mit einem Snapshot einer früheren Version zeigt einen Rückgang, der auf der Festplatte nie stattgefunden hat. Ohne root bleiben komprimierte Dateien bei ihrer unkomprimierten Größe, und die Zusammenfassung sagt das. Auf ZFS weist sie darauf hin, dass Block-Klone und deduplizierte Blöcke für einen Scan unsichtbar sind. Dafür wird auf btrfs und XFS jede Datei einmal geöffnet; das kostet bei warmem Cache 0,4 bis 0,9 ms pro 1.000 Dateien, auf XFS mehr, wenn die meisten Blöcke geteilt sind. --no-clone-dedupe schaltet es ab und liefert wieder die Zahl von du.

Leistung

  • Das Speichern eines Snapshots dauert etwa 17 % kürzer: Der Inhalts-Hash wird beim Schreiben der Zeilen berechnet, nicht in einem zweiten Durchlauf. /status des Agenten meldet keine checksumming-Phase mehr.
  • Scans unter Linux sind schneller: Ordner werden in großen Blöcken gelesen und jeder Eintrag relativ zu seinem Ordner abgefragt, ohne Speicheranforderung pro Eintrag. Am meisten gewinnt der statische Build, mit dem der Agent ausgeliefert wird — auf den gemessenen Bäumen 1,3- bis 3,4-mal so schnell —, glibc-Builds 6 bis 14 %.
  • Auf XFS-Dateisystemen mit per Reflink geteilten Dateien sind Scans mit mehreren Threads nicht mehr langsamer als mit einem: Das Dateisystem wird jeweils von nur einem Thread und in Serien nach geteilten Blöcken gefragt. Ein Baum aus 100.000 per Reflink geteilten Dateien brauchte warm 200 ms statt 855 ms und kalt 248 ms statt 971 ms. XFS ohne Reflink-Dateien, btrfs und ext4 bleiben unverändert.
  • Unter Windows liest ein Scan eines ganzen NTFS-Volumes, der als Administrator läuft, die Master File Table des Volumes in einem einzigen sequenziellen Durchgang, statt jede Datei zu öffnen. Das Ergebnis ist Eintrag für Eintrag dasselbe, was die CI auf einem echten Volume prüft. Alles andere — ein Ordner unterhalb der Wurzel des Volumes, keine Administratorrechte, ReFS, FAT, ein Netzlaufwerk — wird wie bisher durchlaufen. --no-mft durchläuft immer.

Behoben

  • spacetrace update scheitert nicht mehr an einer langsamen Verbindung. Der Download des Archivs lief unter derselben Fünf-Sekunden-Grenze wie die Versionsprüfung, und diese Grenze gilt für die gesamte Antwort, also brauchte ein 12-MB-Archiv 2,4 MB/s oder lief in ein Timeout. Downloads haben jetzt fünf Minuten.
  • spacetrace age --scan ID meldete bei jedem gespeicherten Snapshot 0 B in jedem Altersband; nur ein frischer Scan zeigte echte Größen. Jetzt liefert ein Snapshot dieselbe Antwort wie der Scan, aus dem er gespeichert wurde.
  • Ein gepushter oder abgerufener Snapshot wird vollständig geprüft, bevor er gespeichert wird: sein Baum muss stimmig sein und jeder Wert den richtigen Typ haben. Bisher konnte ein Snapshot mit korrekter Prüfsumme und kaputtem Baum gespeichert werden, und danach scheiterte jeder Befehl, der diese Datenbank las, daran; jetzt wird er abgelehnt, und nichts davon bleibt zurück. Auch ein Snapshot, der mehr als einen Tag in der Zukunft datiert ist, wird abgelehnt: er wäre für immer der neueste seines Ordners geblieben. Die Prüfung hält die eigenen Scans des Agents nicht auf, und ein Snapshot mit einer absurden Dateianzahl lässt weder spacetrace beim Öffnen abstürzen noch den nächsten Scan dieses Ordners abbrechen.
  • Ein Befehl, dessen Ausgabe vorzeitig geschlossen wird (spacetrace scans | head -1), beendet sich jetzt still mit Code 0, statt mit „failed printing to stdout: Broken pipe“ abzustürzen. Code 0 und nicht 141, weil ein Leser, der aufhört, bekommen hat, was er wollte, und ein Skript mit set -o pipefail sonst dort scheitern würde, wo nichts schiefging.
  • Unter macOS wird der Platz einer APFS-Klonfamilie jetzt bei jedem Scan demselben Mitglied angerechnet: dem am wenigsten tief liegenden, bei Gleichstand dem mit dem ersten Pfad. Bisher bekam ihn das Mitglied, das ein Scan-Thread zuerst erreichte; die Summe stimmte, aber wenn die Klone in verschiedenen Ordnern lagen, wanderten die Bytes zwischen ihnen von Scan zu Scan, ohne dass sich auf der Festplatte etwas änderte. Ein diff zweier Snapshots einer unveränderten Festplatte zeigte dann einen Ordner wachsen und einen anderen schrumpfen. Ein diff gegen einen älteren Snapshot kann ein letztes Mal eine solche Verschiebung zeigen. Die Scanzeit bleibt gleich.

0.9.1

Downloads und Prüfsummen

Geändert

  • Auch Klone unter 64 KiB werden dedupliziert, und die Standardzahl der Threads sank von 8 auf 6. Die Groessenschwelle gab es, weil jede Klonpruefung eine Datei oeffnen musste; das kostet jetzt nichts mehr, also meldet ein Baum mit vielen kleinen Klonen weniger als zuvor - naeher an dem, was df als belegt ausweist. clones_deduped steigt entsprechend. Der Thread-Standard wurde neu gemessen, nachdem der Durchlauf guenstiger wurde: 6 liegt bei allen drei Testbestaenden am oder nahe am Bestwert, waehrend 8 beim groessten inzwischen 22% kostet. Mit --threads aenderbar.

Leistung

  • macOS-Scans sind 15-33% schneller und belegen ein Drittel weniger Speicher. Copy-on-Write-Klone wurden bisher in einer eigenen Phase nach dem Durchlauf gesucht, wobei jede Kandidatendatei einzeln geoeffnet wurde; APFS nennt die Klonfamilie bereits in der Verzeichnisauflistung, die der Durchlauf ohnehin liest, also entfaellt diese Phase. Gemessen gegen den vorherigen Build, warmer Cache, verschraenkte Laeufe: 50.189 Eintraege 94 auf 78 ms, 415.503 Eintraege 485 auf 412 ms, 1.064.452 Eintraege 2133 auf 1431 ms. Der Speicherhoechstwert beim groessten davon fiel von 299 auf 200 MiB, weil der Durchlauf nicht mehr fuer jeden aufgelisteten Eintrag einen vollen Pfad baut - nur noch fuer die Verzeichnisse, in die er absteigt. Die Klon-Deduplizierung kostet jetzt nichts mehr statt 15-31% des Scans, --no-clone-dedupe bringt also keinen Geschwindigkeitsgewinn mehr.

Behoben

  • ca_file in remotes.toml funktioniert jetzt unter Windows und vertraut nur noch dem Zertifikat, das es benennt. Die Verbindung zu einem Agenten mit eigenem TLS scheiterte dort mit InvalidCertificate(UnknownIssuer), so korrekt das Zertifikat auch war: der Client fuegte es den Wurzeln der Plattform hinzu, und der Windows-Pruefer zieht eine hinzugefuegte Wurzel nur dann erneut heran, wenn die Kette unvollstaendig zurueckkam - die Kette eines selbst signierten Zertifikats ist nicht unvollstaendig, sondern vollstaendig und nicht vertrauenswuerdig, also wurde die Wurzel nie angesehen, und selbst signiert ist die einzige Art, fuer die ca_file da ist. Der Client vertraut nun genau den Zertifikaten in ca_file und keiner oeffentlichen Instanz, was die Dokumentation bereits als Pinning beschrieb und was die anderen Plattformen ebenfalls haetten tun sollen.

0.9.0

Downloads und Prüfsummen

Hinzugefügt

  • Der Agent kann seine API jetzt selbst über HTTPS ausliefern: tls_cert_file und tls_key_file unter [server] in der Konfiguration, beide oder keines. Bisher war dafür ein vorgeschalteter Reverse-Proxy nötig, was auf einem NAS ohne eigenen Domainnamen bedeutete, Token und Dateiverzeichnis im Klartext über das Netz zu schicken. Ein selbst ausgestelltes Zertifikat genügt; der Client erfährt über ca_file in remotes.toml, welchem er vertrauen soll. Wo ein Domainname vorhanden ist, bleibt ein Reverse-Proxy die bessere Wahl, denn er erneuert Zertifikate, und der Agent tut das nicht: ein erneuertes Zertifikat erfordert einen Neustart. Das Zertifikat braucht die Adresse, die Clients verwenden, als Subject Alternative Name.

0.8.0

Downloads und Prüfsummen

Hinzugefügt

  • Der Agent begrenzt jetzt, wie viele Anfragen eine Client-Adresse stellen darf, und antwortet oberhalb der Grenze mit 429 und einem Retry-After. Gezählt wird vor der Prüfung des Tokens, denn die beiden Dinge, die ein Token nicht begrenzen kann, sind genau die, die es brauchen: /health benötigt bewusst kein Token, und ein falsches Token kostet trotzdem eine Antwort. Die Vorgabe von 120 pro Minute liegt weit über normaler Nutzung; verhindert wird damit, dass ein in einer Wiederholungsschleife feststeckender Client die Festplatte verbraucht, die der Agent messen soll. Hinter einem Reverse Proxy kommen alle Anfragen vom Proxy, die Grenze wird also zu einem gemeinsamen Kontingent — wo das zählt, rate_limit_per_minute = 0 setzen und im Proxy begrenzen.

Geändert

  • Der CSV-Export listet jeden Ordner jetzt unmittelbar gefolgt von seinem Inhalt. Zuvor wurden alle Einträge einer Ebene zusammen geschrieben und ihr Inhalt weit darunter, was Ordner und Dateien in der Tabelle um Seiten trennte. Spalten und Zeilen selbst bleiben unverändert.
  • spacetrace scan --save sagt jetzt, was es tut, während die Momentaufnahme in die Datenbank geschrieben wird. Dieses Schreiben ist kein kurzer Anhang an den Scan — bei einem Ordner mit 412.983 Einträgen dauert der Durchlauf 0,8 Sekunden und das Schreiben weitere 0,6, bei zehn Millionen Einträgen sind es rund vierzehn Sekunden — und bislang wurde die Fortschrittszeile gelöscht, sobald der Durchlauf endete, sodass der Befehl eingefroren wirkte. Der Agent meldet dieselben zwei Phasen über /status.

Behoben

  • spacetrace dupes listete dieselben Duplikate bei jedem Lauf in anderer Reihenfolge auf, sodass ein Vergleich zweier Berichte Unterschiede zeigte, die es nicht gab. Die Reihenfolge richtet sich jetzt nach den Pfaden, die sich zwischen Läufen nicht ändern.
  • Ein Verzeichnisbaum, der tiefer als etwa 210 Ebenen verschachtelt ist, bricht die Analyse nicht mehr ab. Der Durchlauf ruft sich einmal pro Ebene selbst auf und seine Threads hatten den gewöhnlichen Standard-Stack, sodass ein ausreichend tiefer Baum ihn überlief und der Prozess schlicht starb — im Agenten riss das die HTTP-API und den Scheduler mit sich, und es wurde kein Snapshot geschrieben. Die Threads erhalten nun einen Stack von 16 MiB und halten bei 1024 Ebenen an, vermerken das Verzeichnis als unlesbar und machen weiter; ein Baum, der tiefer ist als das Betriebssystem benennen kann, wird auf dieselbe Weise gemeldet, mit Pfad und Grund.

0.7.0

Downloads und Prüfsummen

Hinzugefügt

  • spacetrace dupes findet Dateien mit identischem Inhalt und sagt, was das Löschen der Überzähligen zurückgäbe. Es liest so wenig wie möglich: Dateien unterschiedlicher Länge können nicht übereinstimmen und der Scan kennt jede Länge bereits, gleich lange werden anhand ihrer ersten 16 KiB getrennt, und nur was beides übersteht, wird ganz gelesen. Bei einem Baum von 33,8 GiB mit 375.585 Dateien waren das 2,6 GiB Lesen — 7,7 % — und ein zweiter Lauf las 30 MiB, weil Hashes ganzer Dateien zwischen den Läufen gemerkt werden. Über Hardlinks verbundene Namen werden getrennt aufgeführt und als nicht rückgewinnbar gezählt, da sie ihre Bytes ohnehin teilen. Es wird nichts gelöscht: welche Kopie bleibt, ist keine Entscheidung, für die dieses Werkzeug den Kontext hat.

Leistung

  • Das Scannen benötigt deutlich weniger Speicher. Der Durchlauf baute bisher einen eigenen Baum auf und kopierte ihn in den endgültigen, sodass beide zum Höhepunkt im Speicher lagen; jetzt werden die Einträge direkt in den endgültigen Baum geschrieben, sobald ein Verzeichnis gelesen ist. Bei einem Ordner mit 412.983 Einträgen sank die Spitze von 91,5 MB auf 57,6 MB und auf 49,3 MB, wenn ein früherer Scan desselben Ordners vorliegt, an dem sich die Struktur bemessen lässt. Das Scannen dauert genauso lange wie zuvor, und alle gemeldeten Zahlen bleiben unverändert.

0.6.1

Downloads und Prüfsummen

Behoben

  • Ein mit spacetrace import erzeugter Snapshot ließ sich speichern, aber nie wieder öffnen: jeder Versuch scheiterte mit "entry 0 is not a root: it claims a parent". Der Import schrieb eine fehlerhafte Wurzel, und bis zum Lesen fiel das niemandem auf. Bereits importierte Snapshots sind mit dieser Version lesbar, ohne sie erneut zu importieren.

0.6.0

Downloads und Prüfsummen

Hinzugefügt

  • --threads N wählt die Breite eines Scans, und der Agent kennt dieselbe Einstellung pro Wurzel. Es gibt keine beste Zahl: das Optimum verschiebt sich mit der Größe des Baums, und wer seine Platte kennt, trifft eine bessere Wahl als jede eingebaute Vorgabe.
  • Wenn ein Scan nicht mehr vorankommt, sagt die Fortschrittszeile das jetzt und nennt das Verzeichnis, auf das gewartet wird — statt weiter „scanning…“ zu behaupten. Eine Netzfreigabe, die aufgehört hat zu antworten, blockiert im Kernel und kein Zeitlimit in diesem Programm kann das aufheben; wer aber weiß, worauf gewartet wird, kann entscheiden, ob er wartet oder abbricht.
  • spacetrace import liest einen JSON-Export von ncdu oder gdu und legt ihn als Snapshot ab, sodass bereits vorhandene Scans zum Vergleichsmaßstab werden — auch Scans einer Maschine, die es zum erneuten Scannen nicht mehr gibt. Die eigene scheinbare Größe eines Verzeichnisses wird dabei verworfen: sie mitzuzählen ist genau das, was du --apparent-size von der Zahl abweichen lässt, die dieses Werkzeug nennt.
  • spacetrace export --format csv schreibt eine Zeile je Eintrag für die Tabellenkalkulation, mit --depth, um bei den obersten Ebenen eines Baums haltzumachen, den keine Tabelle vollständig öffnen würde. Beide Maße sind Spalten statt einer Einstellung — was die Dateien angeben und was die Festplatte belegt — daneben die Eigenkosten jedes Eintrags, sodass sich eine Summe bilden lässt, ohne eine Datei für jeden darüberliegenden Ordner erneut zu zählen. Kommas, Anführungszeichen und Zeilenumbrüche in Namen werden korrekt maskiert: sie sind in Dateinamen erlaubt, und ein naiver Export macht daraus stillschweigend falsche Zeilen.
  • spacetrace age beantwortet die andere Frage, die eine volle Festplatte aufwirft: nicht was groß ist, sondern was niemand mehr anfasst. Bytes werden nach dem Zeitpunkt der letzten Änderung gruppiert — die Bänder legen Sie mit --bands fest — und nach Größe statt nach Dateianzahl gewichtet, denn hunderttausend alte Quelldateien sind nicht die Antwort, ein altes Festplatten-Image schon. Dateien ohne aufgezeichnetes Änderungsdatum werden getrennt ausgewiesen, statt als fünfzig Jahre alt zu gelten.

Geändert

  • Der /status des Agenten sagt jetzt, ob ein laufender Scan arbeitet oder feststeckt. scanning enthält pro Scan ein Objekt statt nur eines Pfades: laufende Zähler, die Phase (walking oder finishing — nach dem Durchlauf bewegt sich nur noch die Klon-Prüfung, wer also nur Dateien zählt, hält einen gesunden Scan für einen steckengebliebenen) und, sobald alle Zähler stillstehen, seit wann und auf welche Verzeichnisse er wartet. Der Stillstand wird von einem Beobachter im Agenten gemessen, seltenes Abfragen von /status bläht ihn also nicht auf.

Leistung

  • Scans laufen jetzt mit höchstens acht Threads statt mit einem pro Kern, was auf jedem gemessenen Verzeichnisbaum schneller war — 39% auf einem kleinen, 11% auf einem großen. Ein Durchlauf ist syscall-gebunden: jenseits eines Punkts warten die Threads im Kernel, statt zu arbeiten. Mit --threads N lässt sich das überstimmen.
  • Scans auf macOS sind etwa 2,3-mal schneller. Der alte Durchlauf fragte den Kernel zuerst nach den Namen eines Verzeichnisses und dann noch einmal, pro Eintrag, nach Größe und Datum; macOS kann beides in einem einzigen Aufruf beantworten und tut das jetzt. Von Anfang bis Ende an zwei echten Verzeichnisbäumen gemessen: von 1293 ms auf 556 ms beim einen, von 1554 ms auf 646 ms beim anderen, wobei beide Versionen aufs Byte identische Summen melden.

Behoben

  • Die Fortschrittsanzeige stand am Ende jedes Scans scheinbar still. Nach dem Durchlauf sucht ein weiterer Schritt nach Copy-on-Write-Klonen, und der bewegte keinen einzigen Zähler — auf ~/github waren das 1193 von 1989 Millisekunden. Diese Phase heißt jetzt so und zählt, was sie prüft.
  • Eine Netzwerkfreigabe, deren Server verschwunden ist, legt nicht mehr den ganzen Scan lahm. Die erste Abfrage an ein eingehängtes Dateisystem lässt sich nicht mehr abbrechen, sobald sie hängt, und da ein Verzeichnis auf einem einzigen Thread gelesen wird, riss eine tote Freigabe alle Nachbarn mit. Scans lesen jetzt zuerst die Mount-Tabelle, nähern sich einem Einhängepunkt über einen Thread, den sie aufzugeben bereit sind, und vermerken ihn nach 60 Sekunden als unlesbaren Pfad und machen weiter — das Ergebnis fehlt nur um dieses eine Dateisystem und sagt das auch, statt nie einzutreffen. --mount-timeout 0 stellt das alte Verhalten wieder her; die gemessenen Kosten der Prüfung liegen bei etwa einer Millisekunde auf einem Baum mit 300.000 Einträgen.

0.5.0

Downloads und Prüfsummen

Hinzugefügt

  • Snapshots tragen jetzt eine Prüfsumme ihres Inhalts, und spacetrace verify prüft sie. Ein übertragener Snapshot, der unterwegs verändert wurde, wird beim Import abgelehnt statt geglaubt: ein gekipptes Bit hinterlässt einen völlig gültigen Baum, der eine falsche Zahl meldet, und genau das war bisher nicht zu sehen.

Geändert

  • Die Snapshot-Datenbank wechselt auf ein neues Schema, damit die Prüfsumme Platz hat. Ältere Builds öffnen eine Datenbank nicht mehr, die diese Version geschrieben hat — sie sagen das klar, statt sie falsch zu lesen. Wer die Desktop-App auf derselben Historie benutzt, aktualisiert sie am besten mit.

0.4.1

Downloads und Prüfsummen

Behoben

  • install.sh und spacetrace update finden wieder die richtige Version. Alle drei Komponenten veröffentlichen in dasselbe Repository, sodass GitHubs neueste Version kurzzeitig die des Hubs war — die install.sh nicht installieren konnte und die die Update-Prüfung als gar keine Version las.

0.4.0

Downloads und Prüfsummen

Hinzugefügt

  • Der Agent meldet auf /status, wenn eine neuere Version vorliegt. Nur eine Meldung: er installiert nichts von selbst. Einmal täglich, ohne Angaben über die Maschine, und mit update_check = false ganz abschaltbar.
  • spacetrace update installiert die neueste Version über die laufende, nachdem der Download gegen die veröffentlichte SHA256SUMS geprüft wurde.
  • Eine tägliche Prüfung auf eine neuere Version, als eine Zeile auf stderr. Sie läuft nur bei einem getaggten Build im Terminal, erklärt sich beim ersten Mal und lässt sich mit SPACETRACE_NO_UPDATE_CHECK=1 ganz abschalten.
  • --version sagt jetzt, um welchen Build es sich handelt: Commit, Build-Datum und Kanal. Der Agent meldet dasselbe unter /health und /status.
  • Jede Version kommt jetzt mit geschriebenen Release Notes in fünf Sprachen, und das Repository hat eine CHANGELOG.md.

Geändert

  • Das Versprechen, dass die belegten Größen mit du übereinstimmen, solange keine Blöcke geteilt werden, wird jetzt durch einen Test mit echtem du abgesichert statt nur in der Dokumentation behauptet.

Leistung

  • Das Scannen großer Verzeichnisbäume braucht deutlich weniger Speicher: ein Knoten schrumpfte von 104 auf 72 Byte, und die Namen liegen jetzt in einer gemeinsamen Arena.

Behoben

  • install.sh prüft den Download gegen die veröffentlichte SHA256SUMS. Die Datei wurde bei jeder Version veröffentlicht und nie gelesen.
  • APFS-Klone werden einmal gezählt. Drei Klone von je 100 MB belegen keinen zusätzlichen Speicher, und spacetrace sagt das jetzt auch, während du weiterhin 400 MB meldet. Abschalten mit --no-clone-dedupe.
  • Unter Windows liest spacetrace jetzt den tatsächlich belegten Speicher und zählt hart verlinkte Dateien einmal, statt auf die angegebene Dateilänge zurückzufallen.

0.3.0

· Entwicklungsmeilenstein

Hinzugefügt

  • Ein laufender Scan lässt sich abbrechen, und ein Teilbaum kann aus einem geladenen Baum entfernt werden, ohne die umliegenden Einträge ungültig zu machen.
  • Sortierung und Darstellung benennen jetzt ausdrücklich ihr Maß, sodass eine Liste mit größten zuerst zu der Zahl daneben passt.
  • Jeder Push hinterlässt einen herunterladbaren Build, den install.sh unter Linux und macOS installiert.

0.2.0

· Entwicklungsmeilenstein

Hinzugefügt

  • spacetrace-agent: ein nur lesender Agent für Server und NAS-Geräte, mit eingebautem Scheduler und HTTP-API. Er löscht niemals etwas.
  • Die Kapazität des Dateisystems wird als frei und gesamt angegeben statt als Füllstand in Prozent, weil ein Prozentwert auf APFS und in Thin Pools df widerspricht.
  • Die Treemap-Layout-Engine: squarified Kacheln, Detailstufen und Hit-Testing entlang der Hierarchie.

Behoben

  • Das Öffnen einer Datenbank nimmt keine Schreibsperre mehr, sodass ein Lesevorgang einen noch schreibenden Scan nicht mehr abwürgen kann.

0.1.0

· Entwicklungsmeilenstein

Hinzugefügt

  • Scanne ein Verzeichnis und sieh, wohin der Platz gegangen ist - mit beiden Maßen nebeneinander: was die Dateien angeben und was die Festplatte wirklich belegt.
  • Snapshots in SQLite, sodass sich ein heutiger Scan mit einem vom nächsten Monat vergleichen lässt.
  • spacetrace diff benennt den Ordner, der für eine Änderung verantwortlich ist, statt jede Datei darin aufzulisten.
  • Export ins ncdu-Format, damit ein spacetrace-Snapshot mit bereits vorhandenen Werkzeugen geöffnet werden kann.
  • Symbolischen Links wird nicht gefolgt, harte Links werden einmal gezählt, und eine Sparse-Datei meldet ihren belegten Platz statt der angegebenen Länge.

Alle Versionen · Download

Hub

0.5.1

Downloads und Prüfsummen

Behoben

  • Ein gepushter Snapshot wird vollständig geprüft, bevor er gespeichert wird: sein Baum muss stimmig sein und jeder Wert den richtigen Typ haben. Einer mit korrekter Prüfsumme und kaputtem Baum wurde bisher trotzdem gespeichert, und danach scheiterte jede Seite, die ihn las; jetzt wird er mit 400 abgelehnt, und nichts davon bleibt zurück. Auch ein Snapshot, der mehr als einen Tag in der Zukunft datiert ist, wird abgelehnt, weil er für immer der neueste seiner Maschine geblieben wäre - ein Agent, dessen Uhr so weit vorgeht, bekommt also bei jedem Push 400, bis seine Uhr stimmt.

0.5.0

Downloads und Prüfsummen

Hinzugefügt

  • Eine Alarmregel kann eine E-Mail senden, statt einen Webhook aufzurufen. Dort, wo die URL stand, genügt eine Adresse; eine Regel hat genau ein Ziel, also kann nichts auseinanderlaufen. Die Mail-Einstellungen stehen in einem [smtp]-Abschnitt der Hub-Konfigurationsdatei und nicht im Dashboard, denn die Datenbank ist die Datei, die gesichert wird, und ein Passwort darin reist mit jeder Kopie. Eine neue Einstellungsseite zeigt den Relay, nie das Passwort, und sendet eine Testnachricht über denselben Weg wie ein Alarm — ein Erfolg dort heißt, dass Alarme ankommen, ein Fehlschlag benennt das Problem, bevor eine Platte volläuft.
  • Personen statt einer geteilten Zugangsdaten. Eine neue Personen-Seite vergibt ein Token je Person mit einer von zwei Rollen: wer nur schaut, sieht die ganze Flotte und kann nichts ändern; ein Administrator kann alles ändern, auch wer sonst Zugang hat. Alarmregeln halten jetzt fest, wer sie angelegt hat — die Frage, die ein geteilter Zugang nie beantworten konnte. Bewusst Tokens statt Passwörter: ein erzeugtes Token darf als einfacher Hash liegen, weil es nichts zu raten gibt, ein gewähltes Passwort nicht. Das Token in der Hub-Konfiguration funktioniert weiter und bleibt Administrator: es ist der Weg zurück, und aus demselben Grund kann sich der letzte Administrator nicht selbst entziehen.

0.4.0

Downloads und Prüfsummen

Hinzugefügt

  • Ein gepushter Snapshot wird gegen die Prüfsumme geprüft, die er mitbringt, und bei Abweichung mit 400 abgelehnt statt in die Flotte aufgenommen. Ein unterwegs gekipptes Bit hinterlässt einen gültigen Baum mit einer falschen Zahl — auf einem Dashboard, das nach Dringlichkeit sortiert, wäre das die falsche Maschine ganz oben.

Geändert

  • Die Snapshot-Datenbank des Hubs wechselt auf ein neues Schema, damit die Prüfsumme Platz hat. Ein Downgrade auf eine ältere Version öffnet die Datei nicht mehr — sie sagt das klar, statt sie falsch zu lesen. Vor dem Upgrade eine Kopie beiseitelegen kostet nichts.

0.3.1

Downloads und Prüfsummen

Geändert

  • Die About-Seite listet nur noch veröffentlichte Versionen. Einträge, die zwar fertig, aber in keiner Version enthalten sind, beschrieben Arbeit, die in Ihrer Kopie gar nicht steckt.

0.3.0

Downloads und Prüfsummen

Hinzugefügt

  • Die About-Seite zeigt jetzt, welcher Build läuft (Commit, Build-Datum und Kanal), und was sich in den letzten Versionen geändert hat.
  • /health meldet Commit und Kanal neben der Version, sodass sich ein laufender Container ohne Anmeldung identifizieren lässt.

Leistung

  • Das Laden eines großen Snapshots braucht weniger Speicher, dank der kompakteren Baumdarstellung im Scan-Kern.

0.2.0

· Entwicklungsmeilenstein

Hinzugefügt

  • Herunterladbare Binärdateien für Linux und macOS sowie Container-Images für amd64 und arm64.

0.1.0

· Entwicklungsmeilenstein

Hinzugefügt

  • Ein Flotten-Dashboard: jeder Agent und jedes Wurzelverzeichnis in einer Tabelle, sortiert danach, wem zuerst der Platz ausgeht.
  • Ein Wachstumstrend und eine Prognose, die klar sagt, wenn die Historie für eine Vorhersage nicht ausreicht.
  • Schwellenwert-Warnungen mit Abklingzeit, per Webhook zugestellt, dazu Agent-Tokens, die im Dashboard ausgestellt und widerrufen werden können.

Alle Versionen · Download