Linux'ta sıfır baytlık bir dosya oluşturma kavramı nedir?


32

Aşağıdakileri yaparsam:

touch /tmp/test

ve sonra gerçekleştirmek

ls -la /tmp/

testDosyayı dizinde 0 Bayt ile görebiliyordum .

Ancak, İşletim Sistemi 0 Baytlık bir kavramı nasıl ele alıyor ? Bunu layman şartlarına koyarsam:

0 Bayt hiç hafıza değil, dolayısıyla hiçbir şey yaratılmıyor.

Bir dosya, oluşturulması zorunluluk veya gerektiği en azından sağ, belli bellek gerektirir?


Yanıtlar:


63

Bir dosya (kabaca) üç ayrı şeydir:

  • Bir "inode", dosyanın kime ait olduğunu, izinleri ve gerçekte verileri içeren disklerin bir listesini tutan bir meta veri yapısıdır.
  • Bu inode'a işaret eden bir veya daha fazla dizin girişi (dosya adı)
  • Gerçek veri blokları kendileri

Boş bir dosya oluşturduğunuzda, yalnızca inode ve bu inode'u gösteren bir dizin girişi yaratırsınız. Seyrek dosyalar için aynı ( dd if=/dev/null of=sparse_file bs=10M seek=1).

Varolan bir dosyaya sabit bağlantılar oluşturduğunuzda, sadece aynı inode'u gösteren ek dizin girişleri yaratırsınız.

Burada işleri basitleştirdim, ama sen anladın.


2
güzel belirtildi. "küçük linkler" paragrafınızla küçük bir bilmeceyi tanıtırken: eğer bir blok listesi olmadığını belirten boş bir dosyaya bir link oluşturursa, bu hard link nasıl (aynı) bloklar listesine işaret edebilir? hangisi yok?
Theophrastus

4
@Theophrastus İyi nokta. İşleri kolaylaştırmak için elimden geleni yaptım. Aslında, bloklar listesi ve dizin girişleri arasında, dosyaya ait (inode numarasıyla belirtilen) ve dosya öznitelikleri (sahip, izinler, ...) ve genişletilmiş öznitelikler içeren meta veriler vardır. Blokların listesi orada. Bu nedenle, tüm dizin girişleri doğrudan blok listesine (FAT yolu) değil, meta verilere işaret eder.
xhienne

6
Olmalı üç ayrı şeyler: verileri içeren blokların listesi; blokların kendileri ; ve blok listesine işaret eden bir dizin girişi (veya girişleri).
Joker

@Wildcard Üç şey yapmak için bir düzenleme yaptım ve ismine inode'a başvurdum. Hem inode hem de dizinler meta veridir; ama onlar farklı meta veri türleri. Bir dosyada her zaman bir inode ve en az bir dizin girişi bulunur. Bu inode, boş bir veri blokları listesi içerebilir.
Monty Harder

1
@Wildcard Yeni başlasanız bile, bir inode ile bir dizin arasındaki farkı anlamak önemlidir. Birisi "bir dizin adı" nın izinlerini / sahipliğini değiştirdiğinde ve aynı inode'un diğer bağlantılarının eski izinleri / mülkiyeti koruyacağını düşünüyorsa, Çok Kötü Bir Şey olabilir. İnode'un doğrudan bloklara, dolaylı bloklara, iki katına ve üç boyutlu indirekt bloklara nasıl bir bloklar listesi gösterdiğine dair detaylarını vermek zorunda değiliz. Ya da bir liste boş olabilir.
Monty Harder

24

touchbir inode oluşturacak ve ls -iveya statinode hakkında bilgi gösterecek:

$ touch test
$ ls -i test
28971114 test
$ stat test
  File: ‘test’
  Size: 0           Blocks: 0          IO Block: 4096   regular empty file
Device: fc01h/64513d    Inode: 28971114    Links: 1
Access: (0664/-rw-rw-r--)  Uid: ( 1000/1000)   Gid: ( 1000/1000)
Access: 2017-03-28 17:38:07.221131925 +0200
Modify: 2017-03-28 17:38:07.221131925 +0200
Change: 2017-03-28 17:38:07.221131925 +0200
 Birth: -

test0 blok kullanan dikkat edin . Görüntülenen verileri depolamak için, inode bazı baytları kullanır. Bu baytlar inode tablosunda saklanır. Bir inode yapısı örneği için ext2 sayfasına bakın .


19

ls(veya stat(2)sistem çağrısı) size dosyanın içeriğinin boyutunu bildirir . Dosya sisteminin defter tutma için ne kadar alana ihtiyacı olduğu bunun bir parçası değildir ve uygulama detayı olarak, genel olarak programların umursadığı ya da bilmesi gereken bir şey değildir . Uygulama ayrıntılarını görünür yapmak, dosya sistemi soyutlamasını daha az kullanışlı hale getirir.


9

Dosya kendi başına yer kaplamaz, ancak dosya sistemi dosya adını, konumunu, erişim haklarını ve benzerlerini saklar.


4
Dizin girişi tarafından kullanılan boşluğa bakarsanız, 0 bayt boyutunda bin dosya içeren bir dizininiz varsa, dizin yalnızca 2 büyük dosya içeren bir dizin girişinden daha büyük olacaktır.
Mark Stewart,

2
Bir dosyanın, örneğin bir disk üzerindeki fiziksel temsili ile sıkı sıkıya bağlı olmayan soyut bir kavram olduğunu belirtmek için destek atar.
Florian Castellane

5

Basit cevap: Çünkü bu şekilde tanımlanır.

Daha uzun cevap: Bu şekilde tanımlanmıştır, çünkü bazı işlemler kavramsal olarak daha basittir:

  • Bir dosya 20 harf "A" içeriyorsa ve tüm "A" harflerini kaldırırsanız, dosya 20 bayt kısalır. Sadece "AAAAAAAAAAAAAAAAAAAAA" dan oluşan bir dosyada aynı işlem, kaybolan bir dosyanın özel durumuyla ilgilenmek zorunda kalacaktır.
  • Daha pratik olarak, bir metin dosyasının son satırının silinmesi özel kasayla yapılmalıdır.
  • Düzenli olarak yedekleme yapan metin editörleri, kullanıcının son satırı silme, öğlen yemeğine gitme, sonra geri dönme ve başka bir satır ekleme durumuyla başa çıkabilmesi için özel durum koduna ihtiyaç duyacaktır. Diğer bazı kullanıcılar ortalama olarak bu isimde bir dosya oluşturduysa, başka komplikasyonlar ortaya çıkar.

Daha fazlasını yapabilirsiniz: * Hata günlüğü dosyaları boş oluşturulma eğilimindedir, eğer ve sadece bir hata olursa doldurulacaktır. * Kaç hata olduğunu bulmak için, günlük dosyalarındaki satır sayısını sayarsınız. Günlük dosyası boşsa, hata sayısı sıfırdır, bu da mantıklıdır. * Bazen ilgili tüm metnin dosya adında olduğu dosyaları görürsünüz, örn this-is-the-logging-directory. Bu, aşırı yüklenen yöneticilerin yükleme sonrasında boş dizinleri silmelerini önler ve ayrıca bir programın veya kullanıcının yanlışlıkla bir dizini görmek istediği bir dosyayı yanlışlıkla oluşturduğu hataları önler. gitProgram (ve diğerleri) boş dizinleri görmezden gelme eğilimi, ve bir proje / yönetici / kullanıcı dizin hiçbir yararlı içerik (henüz) olsa bile varolduğunu bir sicile sahip olmak istiyorsa, sen adında boş bir dosya görebilirsinizemptyveya empty.directory.

Hiçbir işlem daha karmaşık hale gelmez:

  • Birleştirme dosyaları: bu sadece boş bir dosyaya sahip bir no-op'tur.
  • Bir dosyada bir dize aranıyor: bu, "dosya arama teriminden daha kısa ise, arama terimini içeremez" standardının kapsamı dahilindedir.
  • Dosyadan okuma: programların beklediklerini elde etmeden önce dosyanın sonuna isabet etmesi gerekir, bu yüzden yine sıfır uzunluklu bir dosya durumunda programcı için fazladan düşünmeyi içermez: -En başından itibaren dosya.

Dosyalarda, "herhangi bir yerde kaydedilmiş bir dosya var" yönü (inode ve / veya dosya adı) yukarıdaki hususların üstüne gelir, ancak boş dosyalar işe yaramazsa dosya sistemleri bunu yapmaz.

Genelde, dosya adları ile ilgili olanlar hariç, yukarıdaki nedenlerin tümü dizilere uygulanır. En çok karakter dizileri olan dizelere: Sıfır uzunluklu dizeler programların içinde yaygındır. Dize anlamsız ise, genellikle kullanıcı düzeyinde dize izin verilmez: bir dosya adı bir dizedir ve çoğu dosya sistemleri boş bir dize dosya adı olarak izin vermiyor; dahili olarak, parçalardan dosya adları oluştururken, program parçalardan biri olarak boş bir dizeye sahip olabilir.


1

En basit analojiyi kullanarak:

Bir dosyayı, bir bardak suyla karşılaştıralım.

'touch / tmp / test', içinde hiç su olmayan boş bir cam oluşturmak gibi bir şey. Cam boş, yani boyutu sıfır. Ancak cam var.

Dosya sistemi düzeyinde, cam meta-veri iken, camın içeriği veridir. Meta-veri önceki yayınlarda belirtildiği gibi her türlü şeyi içerir.

Sıfır boyutlu dosyalar yararlı olabilir. Bunun bir örneği, onları bir tür durum belirtmek için kullanılabileceği bir kırıntı olarak kullanmaktır (yani, eğer dosya varsa: o zaman bir şeyler yap; yoksa: yoksay).


0

Bu şekilde düşünün: bir programın sunucunuza gönderilen SQL sorgularını takip ettiğini söyleyin. Program, istekleri düz bir metin dosyasına kaydettiğini belirtmek istiyor, ancak henüz bir istek kaydedilmedi. Bu neye benzemeli? Sıfır boyutlu bir dosya olması gerektiğini savunuyorum /var/log/acme-sql-server/queries.log. Bu şekilde, günlüğe kaydetmenin ne zaman başladığını (dosyanın oluşturulma zamanını), en son güncellendiğini (yani oluşturulduğunda), kaç sorgunun kaydedildiğini (dosyadaki yeni satırların sayısı = 0) ve günlüğü kimin yaptığını anlayabilirsiniz. (Acme SQL Server). Bu gibi durumlarda, yine de belirli bir yerde var olan boş bir dosya kavramına sahip olmak yararlıdır.

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.