Wie kann ich die tatsächliche Größe überprüfen, die in einem NTFS-Verzeichnis mit vielen Hardlinks verwendet wird?

14

Auf einem Win7 NTFS-Volume verwende ich cwrsync, das --link-dest korrekt unterstützt, um Backups vom Typ "Snapshot" zu erstellen. Also habe ich:

z:\backups\2010-11-28\cygdrive\c\Users\...
z:\backups\2010-12-02\cygdrive\c\Users\...

Der Inhalt des 02.12.2010 besteht hauptsächlich aus Hardlinks zu Dateien im Verzeichnis 28.11.2010. Es gibt jedoch nur wenige neue oder geänderte Dateien im 02.12.2010. Unter Linux gibt mir das Dienstprogramm "du" die tatsächliche Größe jedes inkrementellen Snapshots an. Unter Windows werden explorer und du under cygwin beide von Hardlinks getäuscht und zeigen, dass der 02.12.2010 etwas mehr Platz einnimmt als der 28.11.2010.

Gibt es ein Windows-Dienstprogramm, das den aktuell verwendeten Speicherplatz anzeigt?

kbyrd
quelle
Tools zur Behebung dieses Problems sind sehr hilfreich, um ein genaues Bild des Problems zu erhalten. Warum wird der Ordner / winsxs so groß und kann verkleinert werden? und
Matt Wilkie
Dies scheint die De-Faktor-Frage & Antwort für die normale Datenträgernutzung zu sein: Wie kann ich die Dateisystemnutzung unter Windows visualisieren?
Matt Wilkie

Antworten:

11

Versuchen Sie, Sysinternals Disk Usage (ansonsten bekannt als du) zu verwenden. Wenn Sie insbesondere die Flags -uund verwenden -v, werden nur eindeutige Vorkommen gezählt und die Verwendung jedes Ordners im Laufe der Zeit angezeigt.

Soweit ich weiß, zeigt das Dateisystem nicht den Unterschied zwischen der Originaldatei und einem festen Link (das ist wirklich der Punkt eines festen Links), so dass Sie sie nicht ordnerweise rabattieren können, sondern müssen dies vergleichsweise tun.

Zum Testen habe ich einen zufälligen Ordner mit 6 Dateien angelegt. Das Ganze geklont. Erstellen Sie dann mehrere Hard- und Softlinks im ersten Ordner, um auf andere Dateien im ersten und auch im zweiten Ordner zu verweisen.

Laufende du -u -v testFldErgebnisse in (beachten Sie, dass die Werte neben den Ordnern in KB angegeben sind):

       104  <path>\testFld\A
        54  <path>\testFld\B
       149  <path>\testFld

Totals:
Files:        12
Directories:  2
Size:         162,794 bytes
Size on disk: 162,794 bytes

Laufende du -u -v testFld\aErgebnisse in:

104  <path>\testFld\a
...

Laufende du -u -v testFld\bErgebnisse in:

74   <path>\testFld\b
...

Beachten Sie die Nichtübereinstimmung?
Die Symlinks in A, die auf Dateien in B verweisen, werden nur während des "vollständigen" Laufs gegen A gezählt, und B gibt nur 54 zurück (obwohl die Dateien ursprünglich in B waren und von A aus fest verknüpft wurden). Wenn Sie B separat messen (oder wenn Sie das -ueindeutige Flag nicht verwenden ), zählt es sein "volles" Maß von 74.

DMA57361
quelle
1
Danke, ich wusste nichts über die sysinternals du, nur die cygwin. Anscheinend macht der Cygwin du auch, was ich will, ich habe nur nicht daran gedacht, es zu versuchen, bevor ich mit dem Kopfgeld angefangen habe.
kbyrd
Diese Antwort verwechselt die Funktion der -uFlagge. Sie erhalten die „voll“ Maßnahme , wenn Sie verwenden die -uFlagge. Ohne diese Option wird nur eine Instanz einer fest verknüpften Datei gezählt. Sagt dies in den Dokumenten: docs.microsoft.com/en-gb/sysinternals/downloads/du und das Testen bestätigt es.
Martixy
2

PowerShell 5 ist möglicherweise eine Option. Es ist für Windows 7 verfügbar, aber ich habe es nur auf einem Server 2012 R2 mit der Vorschau vom April 2015 getestet

Der Dateisystemanbieter in PowerShell 5 verfügt über zwei neue Eigenschaften LinkTypeund Target:

ls taskmgr.exe | fl LinkType,Target

das ergibt:

LinkType : HardLink
Target   : C:\Windows\WinSxS\amd64_microsoft-windows-advancedtaskmanager_..._6.3.9600.17..2\Taskmgr.exe

Daher kann ich jetzt nur alle Dateien in system32 anzeigen, die keine Hardlinks sind:

cd $env:SystemRoot\System32
ls -Recurse -File -force -ErrorAction SilentlyContinue | ? LinkType -ne HardLink | Measure-Object -Property Length -Sum

das ergibt:

Count    : 844
Sum      : 502,486,831

Sie können das mit allen Dateien vergleichen:

ls -Recurse -File -force -ErrorAction SilentlyContinue | Measure-Object -Property Length -Sum

Count    : 14092
Sum      : 2,538,256,262

Über 13.000 Dateien mit mehr als 2 GB sind Hardlinks

Peter Hahndorf
quelle
1

TreeSize Professional (~ $ 55, 30 Tage Testversion) gibt an, NTFS-Festplattenspeicherplatz zu unterscheiden. Ein schneller Versuch scheint dies zu bestätigen.

Die Hardlink-Unterstützung ist nicht standardmäßig aktiviert: Gehen Sie zu Extras> Optionen> Scannen, scannen Sie erneut und verwenden Sie dann Ctrl-1und Ctrl-2, um zwischen Größe und zugewiesenem Speicherplatz zu wechseln . Allocated ist der tatsächlich belegte Speicherplatz, während Size die Statistik ist, die normalerweise von anderen Programmen gemeldet wird.

Es gibt eine Leistungsstrafe für das Aktivieren der Hardlink-Unterstützung (und Symlinks und Mounts auch, wenn Sie das auch wollen). Die Farbpalette ist für meinen Geschmack grell, aber das scheint für dieses Genre selbstverständlich zu sein. Seien Sie auch vorsichtig, wenn Sie im Box-Chart-Bereich herumklicken - es ist leicht, versehentlich einen Ordner mit einem fehlerhaften Drag-and-Drop zu verschieben, wenn Sie ihn nur erweitern wollten.

Matt Wilkie
quelle
1

Ich denke, einige Fakten müssen hier richtig gestellt werden.

Windows kann Hardlinks nicht "erkennen", da jede Datei tatsächlich ein Hardlink zu einer Reihe von Bytes auf der Festplatte ist.

Das du-Tool erkennt Duplikate, aber das ist auch falsch, da, wenn Ordner A Dateien enthält und B nur Hardlinks zu den Dateien in A enthält, du von A und du von B dieselbe Antwort zurückgeben - die Größe der ursprünglich kommenden Dateien von A, aber diese Dateien sind jetzt auch in B.

Dies ist tatsächlich richtig, denn wenn Sie beispielsweise A gelöscht haben, werden seine Dateien nicht auf der Festplatte gelöscht, da sie immer noch von B referenziert werden. Bei Hardlinks ist welche Datei die Quelle und welche die Hardlink ganz willkürlich und bedeutungslos.

Produkte wie du listen ein Verzeichnis auf, während doppelte Einträge abgezinst werden. Dies funktioniert nur, wenn alle Dateien und Hardlinks in einem Verzeichnis enthalten sind. Viele Produkte mit Ordnerlisten tun dies.

Fazit: Bei Hardlinks ist die Frage nach der "tatsächlichen Größe eines NTFS-Verzeichnisses" ohne Bedeutung.

Harrymc
quelle
1

Ich recherchiere auch über diese Frage. Hier sind die Ergebnisse, die ich entdeckt habe.

Die Ordnergröße, die fest verknüpfte Dateien in NTFS enthält, kann in drei verschiedenen Bedeutungen betrachtet werden:

  1. Größe einschließlich der Größe aller fest verknüpften Dateien (die von WE angezeigt werden).
  2. Größe eindeutiger Dateien nur in Bezug auf den aktuellen Ordner.
  3. Größe der einzelnen Dateien nur in Bezug auf die gesamte Festplatte.

Die Nummer 2 wird von TreeSize Professional auf der Registerkarte "Details" in der Spalte "Zugewiesen" angezeigt, wenn die Option "NTFS-Hardlinks verfolgen" aktiviert ist.

Hier ist ein Beispiel für den Ordner "winsxs" (7,5 GB im Gegensatz zu 10):

Bild

Den Wert 3 zu erhalten, ist für mich immer noch eine Frage. Obwohl ich mit Total Commander und dem NL_Info-Plugin eine Untergrenze erreichen konnte. Was ich habe, ist eine Größe, die von Dateien belegt wird, die nur einen Hardlink haben (eindeutige Dateien). Für ein gegebenes Beispiel waren es ungefähr 5 GB.

Also versuchen, Harrymc Antwort zu erweitern oder mit anderen Worten zu sagen.

tschesseket
quelle
0

Sie können ln.exe verwenden , um die "wahre Größe" eines Verzeichnisbaums anzuzeigen :

ln.exe --truesize z:\backups\.

Es werden nur Hardlinks unterhalb dieses Startordners erkannt.

Limer
quelle