Disk kullanımını ölçmenin neden bu kadar farklı yolları var?


114

Dosyalarımın boyutlarını topladığımda bir rakam elde ederim. Eğer koşarsam du, başka bir figür alırım. Bölümümdeki dutüm dosyaları çalıştırırsam df, kullanılan iddialarla eşleşmiyor . Dosyalarımın toplam boyutu için neden bu kadar çok farklı rakam var? Bilgisayar ekleyemez mi?

Eklemeden dfbahsetmek : “Used” ve “Available” sütunlarını eklediğimde toplam rakamı alamıyorum. Ve bu toplam rakam benim bölümümün boyutundan daha küçük. Ve eğer bölüm boyutlarımı eklersem disk büyüklüğümü elde edemiyorum! Ne oluyor?

Yanıtlar:


144

Sayıları eklemek kolaydır. Sorun şu ki, eklenecek çok sayıda farklı numara var.

Bir dosya ne kadar disk alanı kullanıyor?

İçeren bir dosya bu temel fikir n bayt kullanır n (vb izinler, zaman damgaları,) dosyasının meta ve bilgi için yükü biraz sistemi için ihtiyaç duyduğu: disk alanı bayt artı bazı kontrol bilgileri için biraz Dosyanın nerede saklandığını bulun. Ancak birçok komplikasyon var.

Mikroskobik komplikasyonlar

Her dosyayı bir kütüphanede bir kitap dizisi olarak düşünün. Daha küçük dosyalar yalnızca bir birim oluşturur, ancak daha büyük dosyalar ansiklopedi gibi bir çok birimden oluşur. Dosyaları bulabilmek için, her birime referans veren bir kart kataloğu var. Her birimin, kapaklardan dolayı bir miktar ek yükü vardır. Bir dosya çok küçükse, bu ek yük nispeten büyüktür. Ayrıca kart kataloğunun kendisi de biraz yer kaplıyor.

Biraz daha teknik hale geldiğinde, tipik bir basit dosya sisteminde, alan bloklar halinde bölünmüştür . Tipik bir blok boyutu 4 KB'dir. Her dosya bir tam sayı bloğu alır. Dosya boyutu blok boyutunun katı değilse, son blok sadece kısmen kullanılır. Bu yüzden 1 baytlık bir dosya ve 4096 baytlık bir dosya 1 blok alır, oysa 4097 baytlık bir dosya iki blok alır. Bunu şu dukomutla görebilirsiniz: dosya sisteminiz 4KiB blok boyutuna dusahipse, 1 baytlık bir dosya için 4KiB rapor eder.

Bir dosya büyükse, yalnızca dosyayı oluşturan blokların listesini depolamak için ek bloklar gerekir (bunlar dolaylı bloklardır ; daha karmaşık dosya sistemleri bunu uzantılar biçiminde optimize edebilir ). Bunlar dosya boyutunda ls -lveya GNU tarafından bildirildiği şekilde gösterilmez du --apparent-size; dudisk kullanımını büyüklük yerine rapor eden, onları hesaba katar.

Bazı dosya sistemleri , aynı blokta birkaç dosya kuyruğu paketlemek için son blokta kalan boş alanı yeniden kullanmaya çalışır . Bazı dosya sistemleri ( Linux 3.8'den beri ext4 gibi), inode'a tamamen uyan küçük dosyalar (sadece birkaç byte) için 0 blok kullanır.

Makroskopik komplikasyonlar

Genel olarak, yukarıda görüldüğü gibi, bildirilen toplam boyut du, dosya tarafından kullanılan blokların veya uzantıların boyutlarının toplamıdır.

duDosya sıkıştırılmışsa, bildirilen boyut daha küçük olabilir. Unix sistemleri geleneksel olarak kaba bir sıkıştırma biçimini destekler: bir dosya bloğu yalnızca boş baytlar içeriyorsa, bir sıfır bloğu depolamak yerine, dosya sistemi bu bloğu tamamen yok satabilir. Bunun gibi ihmal edilmiş bloklara sahip bir dosya, seyrek dosya olarak adlandırılır . Bir dosya büyük bir boş bayt dizisi içerdiğinde seyrek dosyalar otomatik olarak oluşturulmaz, uygulamanın dosyanın seyrek olması için düzenlemesi gerekir.

Gibi bazı dosya sistemleri Btrfs ve ZFS genel amaçlı destekleyen sıkıştırma .

Gelişmiş komplikasyonlar

Zfs ve btrfs gibi çok modern dosya sistemlerinin iki ana özelliği, dosya boyutu ve disk kullanımı arasındaki ilişkiyi çok daha uzak yapar: anlık görüntüler ve veri tekilleştirme.

Anlık görüntüler , belirli bir tarihte dosya sisteminin donmuş bir halidir. Bu özelliği destekleyen dosya sistemleri, farklı tarihlerde alınan birden fazla anlık görüntü içerebilir. Bu fotoğraflar elbette yer kaplar. Bir uçta, tüm dosyaları dosya sisteminin aktif sürümünden silerseniz, kalan fotoğraflar varsa, dosya sistemi boş olmaz.

Bir anlık görüntüden sonra veya iki anlık fotoğraf çekilmesinden bu yana değişmeyen herhangi bir dosya veya blok, aynı anlık görüntüde ve etkin sürümde veya diğer anlık görüntüde var. Bu yazma üzerine kopyala uygulanır . Bazı son durumlarda, bir dosyayı tam bir dosya sisteminden silmenin yetersiz alan nedeniyle başarısızlığa uğraması olasıdır - çünkü bu dosyanın kaldırılması dizinde bir bloğun bir kopyasını almayı gerektirir ve bir blok için bile yer kalmaz.

Tekilleştirme , aynı blokları saklamaktan kaçınmaktan oluşan bir depolama optimizasyon tekniğidir. Tipik verilerde, kopyaları aramak her zaman çabaya değmez. Hem zfs hem de btrfs isteğe bağlı bir özellik olarak tekilleştirmeyi destekler.

Neden toplam dudosya boyutunun toplamından farklı?

Yukarıda gördüğümüz gibi, duher bir dosya için bildirilen boyut normalde dosyanın kullandığı blokların veya uzantıların boyutlarının toplamıdır. Varsayılan olarak, ls -lboyutları bayt cinsinden dulistelediğine , ancak bazı daha geleneksel sistemlerde ( du -kkilobayt kullanımını zorlayan ) KiB veya 512 bayt birimindeki (sektörler) boyutları listelediğine dikkat edin. Çoğu modern birlik , K, M, G vb. Kullanarak “insan tarafından okunabilen” sayıları destekler ls -lhve du -hkullanır. (KiB, MiB, GiB için) yeterlidir.

Bir dudizinde çalıştırdığınızda , dizinler de dahil olmak üzere dizin ağacındaki tüm dosyaların disk kullanımını özetler . Bir dizin veri içerir (dosyaların adları ve dosyanın meta verilerinin bulunduğu bir işaretçi), bu nedenle biraz depolama alanı gerekir. Küçük bir dizin bir blok alır, daha büyük bir dizin daha fazla blok gerektirir. Bir dizin tarafından kullanılan depolama miktarı bazen yalnızca içerdiği dosyalara değil, aynı zamanda eklendikleri ve bazı dosyaların kaldırıldığı sıraya da bağlıdır (bazı dosya sistemlerinde disk boşluğu ile performans arasında bir uzlaşma olabilir. ), ancak fark küçük olacaktır (burada ve orada ekstra bir blok). Kaçtığındals -ld /some/directory, yönetmenin boyutu listelenir. (Çıktının tepesindeki “total NNN” satırının ls -lilişkisiz bir sayı olduğunu, KiB veya sektörlerde ifade edilen listelenen öğelerin bloklarındaki boyutların toplamı olduğunu unutmayın.)

Unutmayın duiçerir nokta dosyalarınıls kullandığınız sürece göstermez -Aveya -aseçenek.

Bazen dubeklenen toplamın altında raporlar. Bu , dizin ağacının içinde sert bağlantılar varsa gerçekleşir : duher dosyayı yalnızca bir kez sayar.

ZFSLinux gibi bazı dosya sistemlerinde du, bir dosyanın genişletilmiş özniteliklerinin kapladığı tam disk alanını bildirmez.

Bir dizinin altında bağlama noktaları varsa du, -xseçenek belirtilmediği sürece bu bağlama noktalarındaki tüm dosyaları da sayar . Örneğin, kendi kök dosya sisteminde dosyaların toplam boyutunu istiyorsanız, koşmak du -x /değil du /.

Bir dosya sistemi boş olmayan bir dizine monte edilmişse , bu dizindeki dosyalar bağlı dosya sistemi tarafından gizlenir. Hala kendi alanlarını işgal ediyorlar ama dubulamıyorlar.

Silinen dosyalar

Bir dosya silindiğinde , bu mutlaka dosyanın kendisini değil, yalnızca dizin girişini kaldırır. Bir dosyayı gerçekten silmek ve böylece disk alanını geri kazanmak için iki koşul gereklidir:

  • Dosyanın bağlantı sayısı 0'a düşmelidir: bir dosyanın çok sayıda sabit bağlantısı varsa, birinin kaldırılması diğerlerini etkilemez.
  • Dosya bir işlem tarafından açık olduğu sürece, veriler kalır. Sadece tüm işlemler kapandığında dosya silinir. Çıktı fuser -mveya lsofbağlama noktasındaki bir dosya, dosya silinmiş olsa bile o dosya sisteminde açık olan işlemleri içerir.
  • Silinen dosya açık olmasa bile, bu dosya bir loopcihazın arka ucu ise, dosyanın alanı geri alınmayabilir . losetup -a(as root) size hangi loopcihazların kurulu olduğunu ve hangi dosyada olduğunu söyleyebilir . losetup -dDisk alanı geri kazanılmadan önce, döngü cihazı (ile ) imha edilmelidir .

Bazı dosya yöneticilerindeki veya GUI ortamlarındaki bir dosyayı silerseniz, silinemediği bir çöp kutusuna koyulabilir. Dosya silinemediği sürece alanı hala tüketilir.

Bu rakamlar dftam olarak nedir?

Tipik bir dosya sistemi şunları içerir:

  • Dosya (dizinler dahil) verileri ve bazı meta veriler içeren bloklar (dolaylı bloklar ve bazı dosya sistemlerinde genişletilmiş özellikler).
  • Bedava bloklar.
  • Kök kullanıcıya ayrılan bloklar.
  • süper bloklar ve diğer kontrol bilgileri.
  • düğüm
  • Bir günlük

Sadece ilk tür tarafından rapor edilir du. Konuya gelince df, “kullanılmış”, “kullanılabilir” e ne giriyorsa ve toplam sütunlar dosya sistemine (elbette kullanılan bloklar (dolaylı olanlar dahil) daima “kullanılmış” sütunda ve kullanılmamış bloklar daima “kullanılan” sütundadır) mevcut ”sütun).

Ext2 / ext3 / ext4 içinde Filesystems rezerv kök kullanıcıya alanı% 5. Bu, kök dosya sisteminde, doldurulursa sistemin çalışmaya devam etmesini sağlamak (özellikle kayıt için ve sistem yöneticisinin sorunu düzeltirken bir miktar veri saklamasını sağlamak) için kullanışlıdır. /homeNeredeyse tam bir dosya sistemi parçalanmaya yatkın olduğundan, ayrılmış alanın saklanması gibi veri bölümleri için bile yararlıdır. Linux, bir dosya yazılırken arka arkaya birçok bloğu önceden tahsis ederek parçalara ayırmayı (özellikle de sabit diskler gibi mekanik aygıtları döndürmeyi sağlarken) engellemeye çalışır; .

Ext4'e kadar olan ve btrfs olmayan geleneksel dosya sistemleri, dosya sistemi oluşturulduğunda sabit sayıda inode ayırır . Bu, dosya sisteminin tasarımını önemli ölçüde basitleştirir, ancak inode sayısının uygun şekilde boyutlandırılması gerektiğinin dezavantajı vardır: çok fazla sayıda inode ile, boşa harcanır; Çok az sayıda düğüm olduğunda, dosya sistemi boşalmadan önce düğümlerin tükenmesine neden olabilir. Komut, df -ikaç tane düğüm kullanıldığını ve ne kadarının kullanılabilir olduğunu bildirir (konseptin uygulanmadığı dosya sistemleri 0 rapor edebilir).

Koşu tune2fs -lext2 / ext3 / ext4 dosya sistemini içeren birimde boş inode ve blokların toplam sayısı ve numarası dahil bazı istatistikler raporlar.

Madde de kafasını karıştırabilir başka özelliği alt hacimleri (desteklenen Btrfs adı altında ve ZFS içinde veri setleri ). Birden fazla alt hacim aynı alanı paylaşır, ancak ayrı dizin ağacı köklerine sahiptir.

Bir dosya sistemi ağ üzerine monte edilmişse (NFS, Samba, vb.) Ve sunucu bu dosya sisteminin bir bölümünü dışa aktarırsa (örneğin , sunucunun bir /homedosya sistemi vardır ve dışa aktarır/home/bob ), o zaman dfbir istemcide tüm dosya sisteminin verilerini yansıtmaz. Sadece müşteriye verilen ve takılan parça için.

Diskimdeki boşluğu ne kullanıyor?

Yukarıda gördüğümüz gibi, bildirilen toplam boyut dfher zaman dosya sisteminin tüm kontrol verilerini dikkate almaz. Gerekirse, dosya sisteminin tam boyutunu elde etmek için dosya sistemine özgü araçları kullanın. Örneğin, ext2 / ext3 / ext4 tune2fs -lile blok boyutunu çalıştırın ve blok sayısıyla çarpın.

Bir dosya sistemi oluşturduğunuzda, normalde ekteki bölümdeki veya birimdeki kullanılabilir alanı doldurur. Bazen, dosya sistemlerini taşırken veya birimleri yeniden boyutlandırırken daha küçük bir dosya sistemine sahip olabilirsiniz.

Linux'ta, lsblkkullanılabilir depolama birimlerine güzel bir genel bakış sunar. Ek bilgi için veya sahip lsblkdeğilseniz, hangi bölümlerin olduğunu kontrol etmek için özel bir birim yönetimi veya bölümleme araçları kullanın. Linux'ta, orada oluyor lvs, vgs, pvsiçin LVM , fdiskgeleneksel PC tarzı ( “MBR”) bölümleri (aynı zamanda GPT olarak son sistemler) için, gdiskiçin GPT bölümleri, disklabelBSD disk etiketleri için parted'in Linux Altında, vb cat /proc/partitionshızlı bir özet sunar. Tipik kurulumlar işletim sistemi tarafından kullanılan en az iki bölüme veya cihaza sahiptir: bir dosya sistemi (bazen daha fazla) ve bir takas hacmi.

Bazı bilgisayarlarda BIOS veya diğer tanılama yazılımlarını içeren bir bölüm bulunur . UEFI'ye sahip bilgisayarların özel bir bootloader bölümü vardır.

Son olarak, çoğu bilgisayar programının 1024 = 2 10'luk güçlere dayalı birimleri kullandığına dikkat edin (çünkü programcılar ikili ve 2'nin güçlerini severler). Yani 1 kB = 1024 B, 1 MB = 1048576 B, 1 GB = 1073741824, 1 TB = 1099511627776 B,… Resmi olarak, bu birimler kibibyte KiB, mebibyte MiB vb. Olarak bilinir , ancak çoğu yazılım sadece k veya kB rapor eder, M veya MB vb. Öte yandan, sabit disk üreticileri sistematik olarak metrik (1000 tabanlı üniteler) kullanırlar. Böylece 1 TB sürücü yalnızca 931 GiB veya 0.904 TiB'dir.


1
@Kiwy tune2fs, genel olarak herhangi bir dosyanın içeriğini okumanıza olanak sağlayan kök sistemi gerektiren dosya sistemini içeren blok cihazına okuma erişimi gerektirir.
Gilles

21
SE’de 'teşekkür ederim’in cesaretinin kırıldığını biliyorum ama Gilles, bu müthiş yazı için çok büyük bir' Teşekkürler’i hakediyorsunuz.
dotancohen

1
6 yaşındayken bir kart kataloğu gördüğümü hatırlıyorum. Ne kadarının ne olduğunu bilemeyeceğini merak ediyorum.
Izkata

1
@ illuminÉ Bu benim için çok gelişmiş Solaris, hangi seviyeye uyduğunu bilmiyorum.
Gilles

1
du yapar dolaylı bloklar için hesap. Bu, bildirildiği gibi dosya boyutundan temel farktır ls -l.
Stéphane Chazelas

4

Dosya boyutlarını ve disk alanlarını hesaplamak için kısa bir komplikasyon özeti:

  • Dosyanın diskte aldığı alan, her bloğun büyüklüğüne karşı aldığı blok sayısının + aldığı düğüm sayısı çarpanıdır. 1 bayt uzunluğunda bir dosya en az 1 blok, 1 inode ve bir dizin girişi alacaktır.

    Ancak, dosya başka bir dosyaya sabit bir bağlantı ise sadece 1 ek dizin girişi alabilir. Aynı blok grubuna sadece bir referans olacaktır.

  • Dosyanın içeriğinin boyutu. Bu ne lsgörüntüler.
  • Boş disk alanı, sığabileceği en büyük dosyanın boyutu veya diske sığacak tüm dosya içeriği boyutlarının toplamı değildir. Arada bir yerde. Blok sayısına bağlı dosya sayısına (inode'ların alınması) ve her dosyanın içeriğinin blokları ne kadar yakından doldurduğuna bağlıdır.

Bu sadece dosya sistemlerinin yüzeyini çiziyor ve aşırı derecede basitleştiriliyor. Ayrıca, farklı dosya sistemlerinin farklı çalıştığını unutmayın.

statbu bilgilerin bir kısmını bulmakta çok faydalıdır. İşte nasıl stat kullanılacağına ve bunun ne işe yaradığına dair örnekler: http://landoflinux.com/linux_stat_command_examples.html


1
1 baytlık bir dosya genellikle bir blok alır, 8 değil. Sabit bir bağlantı oluşturmak hiç bir inode oluşturmaz: bir dosya dosyaya kaç tane bağlantı olursa olsun bir inode'dur. Bir sabit link oluşturmak sadece rehber girişi için alan gerektirir.
Gilles,

Düzeltmeler için teşekkür ederim, benim hatırladığım kadarıyla yeniden: ext2'yi derinlemesine incelemek artık biraz bulanık. Stat re'nin çıktısını takip ediyordum: blok sayımı - aşırı hissettiriyordu, fakat işte orada. Cevabı düzelteceğim.
Pedro,

1
Bunun nedeni 1 ext2 bloğu = 8 stat bloğu, eğer ext2 dosya sistemi 4kB blok kullanıyorsa: stat 512 bayt bloğu geçmiş sebeplerle sayar. Unix.stackexchange.com/questions/14409/…
Gilles

3

Burada, farklı duolmasından kaynaklanan farklı vakaları göstereceğim df.

dfAyrılan blokları dosya sistemi sayar, duher dosyanın boyut bilgisini kullanır. Bir farkın birçok nedeni olabilir:

1) Uygulama tarafından hala açık olan bağlantısız (silinmiş) dosyalar. Dosya bilgisi eksik, blok hala tahsis edilmiş. lsof +aL1 <filesystem>işlemleri tanımlamanıza yardımcı olacaktır. Alanı boşaltmak için çoğu zaman süreçleri öldürmek zorunda kalırsınız (sürece bağlıdır, bazen bir yapılandırma yüklemesi yeterlidir).

2) Bağlanma noktalarının altındaki dosyalar gizlenir duancak eklenir df. debugfsdosya sistemini okumanıza yardımcı olabilir.

$ sudo debugfs 
debugfs 1.42.12 (29-Aug-2014)
debugfs:  open /dev/xxx    (the desired file system  device)
debugfs:  cd /boot
debugfs:  ls -l 
 1966081   40755 (2)      0      0    4096 26-May-2016 16:28 .
      2   40555 (2)      0      0    4096 11-May-2016 10:43 ..
 1974291  100644 (1)      0      0       0 26-May-2016 16:28 bob   <---<<< /boot/bob is hidden by /boot fs

3) Gerçeklikten daha büyük görünen dosyaları seyredin . tahsis edilmeyen bloklar sayılmaz, dfancak görünen dosya boyutu sayılır du.

Sabit bağlantıların aptal olmadığını unutmayın du


3

dfGenellikle dosya sistemlerinin ne olduğunu, her birinin ne kadar dolu olduğunu ve nereye monte edildiğini görmek için kullanılır. Bir dosya sistemindeki boş alanınız bitiyorsa ve belki de dosya sistemleri arasında bir şeyleri değiştirmek istediğinizde ya da daha büyük bir disk vb.

duHer birinin dizinlerinin ne kadar kümülatif depolama kullandığının ayrıntılarını gösterir ( windirstatWindows'taki gibi ). Dosya temizliği yapmaya çalışırken alanı nereye kapattığınızı bulmak için harika.

Kenara başkaları ile açıklanabilir küçük sayısal farklılıklardan bence duve dfyardımcı programlar çok farklı amaçlara hizmet eder.

Sitemizi kullandığınızda şunları okuyup anladığınızı kabul etmiş olursunuz: Çerez Politikası ve Gizlilik Politikası.
Licensed under cc by-sa 3.0 with attribution required.