Come posso verificare la dimensione effettiva utilizzata in una directory NTFS con molti hardlink?


14

Su un volume NTFS Win7, sto usando cwrsync che supporta correttamente --link-dest per creare backup di tipo "snapshot". Quindi ho:

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

Il contenuto del 2010-12-02 è principalmente costituito da collegamenti a file nella directory 2010-11-28, ma ci sono alcuni file nuovi o modificati solo nel 2010-12-02. Su Linux, l'utilità 'du' mi dirà la dimensione effettiva presa da ogni istantanea incrementale. Su Windows, explorer e du under cygwin sono entrambi ingannati da hardlink e mostrano che il 2010-12-02 occupa un po 'più di spazio rispetto al 28-11-2010.

Esiste un'utilità di Windows che mostrerà lo spazio corretto utilizzato abitualmente?


Gli strumenti per risolvere questo problema sarebbero molto utili per ottenere un'immagine accurata di Perché la cartella / winsxs diventa così grande e può essere ridotta? e
matt wilkie,

questa sembra essere la domanda senza risposta e le risposte per il normale utilizzo del disco: come posso visualizzare l'utilizzo del file system su Windows?
Matt Wilson

Risposte:


11

Prova a utilizzare Sysinternals Disk Usage (altrimenti noto come du), in particolare l'utilizzo dei flag -ue -vconterà solo eventi univoci e mostrerà l'utilizzo di ciascuna cartella mentre procede.

Per quanto ne so, il file system non mostra la differenza tra il file originale e un collegamento reale (che è in realtà il punto di un collegamento reale), quindi non è possibile scartarli cartella per cartella, ma è necessario farlo comparativamente.

Per testare ho creato una cartella casuale con 6 file in. Clonato tutto. Quindi ha creato diversi collegamenti rigidi all'interno della prima cartella per fare riferimento ad altri file nella prima cartella, e anche alcuni nella seconda.

Esecuzione dei du -u -v testFldrisultati in (notare che i valori accanto alle cartelle sono in KiB):

       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

Esecuzione du -u -v testFld\arisultati in:

104  <path>\testFld\a
...

Esecuzione du -u -v testFld\brisultati in:

74   <path>\testFld\b
...

Notare la mancata corrispondenza?
I collegamenti simbolici in A che si riferiscono ai file in B vengono conteggiati solo rispetto ad A durante l'esecuzione "completa" e B restituisce solo 54 (anche se i file erano originariamente in B e collegati da A). Quando misuri B separatamente (o, se non usi la -ubandiera unica), conterà la sua misura "piena" di 74.


1
Grazie, non sapevo del sysinternals du, solo di quello cygwin. Apparentemente il cygwin du fa anche quello che voglio, non ho pensato di provarlo prima di iniziare la taglia.
kbyrd,

Questa risposta confonde la funzione della -ubandiera. Ottieni la misura "completa" se usi la -ubandiera. Senza di essa, conta solo 1 istanza di qualsiasi file collegato. Lo dice nei documenti: docs.microsoft.com/en-gb/sysinternals/downloads/du e il test lo verifica.
martixy,

2

PowerShell 5 potrebbe essere un'opzione. È disponibile per Windows 7, ma l'ho provato solo su un Server 2012 R2 con l' anteprima di aprile 2015

Il provider di filesystem in PowerShell 5 ha due nuove proprietà LinkTypee Target:

ls taskmgr.exe | fl LinkType,Target

questo ritorna:

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

Quindi ora posso solo mostrare tutti i file in system32 che non sono hardlink:

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

questo ritorna:

Count    : 844
Sum      : 502,486,831

puoi confrontarlo con tutti i file:

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

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

Quindi oltre 13.000 file con 2 GB + sono hardlink


1

TreeSize Professional (~ $ 55, prova di 30 giorni) afferma di distinguere lo spazio su disco fisso NTFS. Una rapida prova sembra confermarlo.

Supporto collegamento reale non è acceso fuori dalla scatola: Vai a Strumenti> Opzioni> Scan , ri-scan, quindi utilizzare Ctrl-1e Ctrl-2per passare da Dimensioni e allocato lo spazio. Allocato è lo spazio effettivo utilizzato, mentre Dimensione è la statistica normalmente riportata da altri programmi.

C'è una penalità prestazionale per l'attivazione del supporto hardlink (e anche collegamenti simbolici e montaggi se lo si desidera). La tavolozza dei colori è sgargiante per i miei gusti, ma sembra essere la norma per questo corso. Fai anche attenzione quando fai clic nell'area del grafico a riquadro: è facile spostare accidentalmente una cartella con un trascinamento della selezione errato quando intendevi solo espanderla.


1

Penso che alcuni fatti debbano essere stabiliti proprio qui.

Windows non è in grado di "rilevare" hardlink, poiché ogni file è in realtà un hardlink a un mucchio di byte sul disco.

Lo strumento du rileva i duplicati, ma anche questo è falso, poiché se la cartella A contiene file e B contiene solo collegamenti fissi ai file in A, allora du di A e du di B restituiranno la stessa risposta - la dimensione dei file originari da A, ma questi file sono ora anche in B.

Questo è in realtà corretto, poiché ad esempio se hai eliminato A, i suoi file non verranno eliminati sul disco, perché sono ancora indicati da B. Con hard-link, quale file è l'origine e quale è l'hard-link è abbastanza arbitrario e insignificante.

Prodotti come du elencheranno una directory mentre scontano i duplicati. Funzionerà solo se tutti i file e gli hard link sono contenuti in una directory. Molti prodotti dell'elenco cartelle lo fanno.

Conclusione: con i collegamenti reali, la questione della "dimensione effettiva utilizzata in una directory NTFS" non ha senso.


1

Faccio anche alcune ricerche su questa domanda. Ecco i risultati che ho scoperto.

La dimensione della cartella contenente file con collegamento reale in NTFS può essere considerata in tre diversi significati:

  1. Dimensioni comprese le dimensioni di tutti i file con collegamento fisico (come mostrato da WE).
  2. Dimensione dei file univoci solo in termini della cartella corrente.
  3. Dimensione dei file univoci solo in termini di intero disco.

Il numero 2 è ciò che viene mostrato da TreeSize Professional, nella scheda Dettagli, colonna Assegnata, se l'opzione "Traccia hardlink NTFS" è abilitata.

Ecco exaple per la cartella winsxs (7.5Gb in opposizione per 10):

Immagine

Ricevere il valore numero 3 è ancora una domanda per me. Anche se sono stato in grado di ottenere un limite inferiore utilizzando Total Commander con il plug-in NL_Info. Quello che ho è una dimensione occupata da file che hanno un solo hardlink (file unici). Era di circa 5 GB per un dato esempio.

Quindi, cercando di espandere la risposta di harrymc o di dirlo in altre parole.


0

È possibile utilizzare ln.exe per mostrare la "dimensione reale" di un albero di directory:

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

Rileverà solo hardlink sotto quella cartella iniziale.

Utilizzando il nostro sito, riconosci di aver letto e compreso le nostre Informativa sui cookie e Informativa sulla privacy.
Licensed under cc by-sa 3.0 with attribution required.