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 du
komutla görebilirsiniz: dosya sisteminiz 4KiB blok boyutuna du
sahipse, 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 -l
veya GNU tarafından bildirildiği şekilde gösterilmez du --apparent-size
; du
disk 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.
du
Dosya 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 du
dosya boyutunun toplamından farklı?
Yukarıda gördüğümüz gibi, du
her 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 -l
boyutları bayt cinsinden du
listelediğine , ancak bazı daha geleneksel sistemlerde ( du -k
kilobayt 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 -lh
ve du -h
kullanır. (KiB, MiB, GiB için) yeterlidir.
Bir du
dizinde ç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 -l
ilişkisiz bir sayı olduğunu, KiB veya sektörlerde ifade edilen listelenen öğelerin bloklarındaki boyutların toplamı olduğunu unutmayın.)
Unutmayın du
içerir nokta dosyalarınıls
kullandığınız sürece göstermez -A
veya -a
seçenek.
Bazen du
beklenen toplamın altında raporlar. Bu , dizin ağacının içinde sert bağlantılar varsa gerçekleşir : du
her dosyayı yalnızca bir kez sayar.
ZFS
Linux 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
, -x
seç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 du
bulamı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 -m
veya lsof
bağ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
loop
cihazın arka ucu ise, dosyanın alanı geri alınmayabilir . losetup -a
(as root
) size hangi loop
cihazların kurulu olduğunu ve hangi dosyada olduğunu söyleyebilir . losetup -d
Disk 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 df
tam 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. /home
Neredeyse 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 -i
kaç 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 -l
ext2 / 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 /home
dosya sistemi vardır ve dışa aktarır/home/bob
), o zaman df
bir 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 df
her 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 -l
ile 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, lsblk
kullanılabilir depolama birimlerine güzel bir genel bakış sunar. Ek bilgi için veya sahip lsblk
değ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
, pvs
için LVM , fdisk
geleneksel PC tarzı ( “MBR”) bölümleri (aynı zamanda GPT olarak son sistemler) için, gdisk
için GPT bölümleri, disklabel
BSD disk etiketleri için parted'in Linux Altında, vb cat /proc/partitions
hı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.
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.