Neden ki '.' Unix'te sert bir bağlantı mı?


51

Unix tabanlı işletim sistemlerinde boş bir dizinin bağlantı sayısının neden 1 yerine 2 olduğu konusunda birçok açıklama gördüm. Hepsi bunun 'yüzünden' olduğunu söylüyor. Her dizinin kendisine işaret ettiği dizin. Neden bir 'kavramı' olduğunu anlıyorum. Bağıl yolları belirlemek için kullanışlıdır, ancak dosya sistemi düzeyinde uygulayarak ne kazanılır? Neden sadece kabukları olmasın ya da yolu izleyen sistem çağrıları nasıl yorumlandığını biliyor?

Bu '..' gerçek bir bağlantı bana çok daha anlamlı geliyor - dosya sistemi içinde gezinmek için bir işaretçiyi tekrar ana dizine kaydetmesi gerekiyor. Ama neden '' anlamıyorum. gerçek bir bağlantı olmak gereklidir. Ayrıca uygulamada çirkin bir özel duruma yol açıyor gibi görünüyor - yalnızca bağlantı sayısının 1'den az olduğu düğümler tarafından kullanılan alanı boşaltacağınızı düşünürdünüz, ancak dizinleri kullanıyorsanız, aslında kontrol etmeniz gerekir. bir bağlantı 2'den az sayılır. Neden tutarsızlık?


1
Bir kez ..sabit bağları da ağaç yürüme yazılım zaten olması gerekir "üst dizin bağlantısı olan yok döngüleri" istisnalar, bu yüzden biraz dışında da karmaşıklığı eklenir .linke.
dmckee

Yanıtlar:


37

Gerçekten de ilginç bir soru. İlk bakışta aşağıdaki avantajları görüyorum:

Öncelikle ., geçerli dizin olarak " " yorumlamasının Shell veya sistem çağrıları tarafından yapılabileceğini belirtirsiniz . Ancak dizinde nokta girişinin olması aslında bu gerekliliği ortadan kaldırır ve tutarlılığı daha düşük bir seviyede bile zorlar.

Ancak bunun, bu tasarım kararının arkasındaki temel fikir olduğunu sanmıyorum.

Bir dosya oluşturulurken veya bir dizinden kaldırılırken, yönetmenin değişiklik zaman damgası da güncellenmelidir. Bu zaman damgası düğümü içinde saklanır. Inode numarası ilgili dizin girişinde saklanır.

EĞER nokta girişi olmaz, rutinler yine bir dizin araması neden olacak üst dizinde bu dizine için girişinde inode numarasını aramak zorunda kalacaktı.

ANCAK Neyse ki geçerli dizinde nokta girdisi yoktur. Geçerli dizine bir dosya ekleyen veya silen rutinin ilk girişe geri dönmesi gerekir (nokta girişinin genellikle bulunduğu yer) ve hemen geçerli dizinin inode numarasını bulmuş olur.

Nokta girişi ile ilgili üçüncü güzel bir şey var:

fsckÇürük bir dosya sistemini kontrol ettiğinde ve serbest listede olmayan bağlı olmayan bloklarla uğraşması gerektiğinde, bir veri bloğunun (bir dizin listesi olarak yorumlandığında) bir inode'a işaret eden bir nokta girişi olup olmadığını doğrulaması kolaydır. hangi sırayla bu veri bloğuna işaret ediyor. Eğer öyleyse, bu veri bloğu yeniden bağlanması gereken kayıp bir dizin olarak kabul edilebilir.


Çok faydalı cevap.
Navaneeth KN

6
Dizin inode için arama yordamları hakkında yorum sahte. Çekirdek rutinleri .mevcut dizinde aramak için gerek yok . Aslında bu şekilde çalıştığı bir çekirdek bulamazsanız (şüpheliyim ...)
Dietrich Epp

1
@ DietrichEpp ile aynı fikirdeyim; sistemin ilk başta dizin girişlerine bakması için, inode hakkında zaten bilgi sahibi olması gerekir - çünkü dizin girişlerini içeren veri bloklarına bu şekilde ulaşır.
Lqueryvg

10

(Hmm: aşağıdakiler şimdi biraz epik ...)

Unix dosya sistemlerinde dizinin tasarımı ( tipik olarak mutlaka unix işletim sistemlerine bağlı olması gerekmeyen), aslında gerekli olan özel durumların sayısını azaltan harika bir içgörüyü temsil eder.

Bir 'dizin' gerçekten sadece dosya sistemindeki bir dosyadır. Dosya sistemindeki tüm dosyaların içeriği inode cinsindendir (sorunuzdan, bazı şeylerin zaten farkında olduğunuzu görebiliyorum). Diskteki inodelarda hiçbir yapı yoktur - bunlar sadece disk üzerine yer fıstığı yağı gibi yayılmış büyük bir grup byte bloğudur. Bu kullanışlı değildir ve gerçekten de aklı başında bir derneği olan herkese karşı iticidir.

Sadece özel bir düğüm (Geleneği nedeniyle değil, 0 veya 1,) düğüm sayısı 2 olduğu; inode 2 bir dizin dosyasıdır: kök dizin . Sistem dosya sistemini monte ettiğinde, kendisini başlatmak için inode 2'yi okumak zorunda olduğunu 'bilir'.

Bir dizin dosyası sadece bir dosyadır, opendir (3) ve arkadaşları tarafından okunması amaçlanan dahili bir yapıya sahiptir. İç yapısını dir (5) belgesinde görebilirsiniz (işletim sisteminize bağlı olarak); Buna bakarsanız, dizin dosyası girişinin dosya hakkında neredeyse hiçbir bilgi içermediğini göreceksiniz - hepsi dosya kodunda. Bu dosya için özel olan birkaç şeyden biri, yazma işlemini mümkün kılan modlu bir dizin dosyasını açmaya çalışırsanız, open (2) fonksiyonunun bir hata vermesidir. Diğer bazı komutlar (sadece bir örnek seçmek için hexdump), dizin dosyalarıyla normal şekilde davranmayı reddedecektir, çünkü sadece yapmak istediğin şey bu değildir (ama bu onların özel durumu, dosya sisteminin değil).

Bir sabit bağlantı bir dizin dosyasının haritasında bir girişin daha başka bir şey, ne de daha azdır. Böyle bir haritada, her ikisinin de aynı inode numarasına eşlendiği iki (veya daha fazla) girişiniz olabilir: bu nedenle inode'un iki (veya daha fazla) sabit bağlantısı vardır. Bu aynı zamanda her bir dosyada neden en az bir 'hard link' bulunduğunu açıklar . Inode, bir inode dosyasının dosya sistemindeki herhangi bir yerde bir dizin dosyasında kaç kez bahsedildiğini kaydeden bir referans sayısına sahiptir (bunu yaparken gördüğünüz sayıdır ls -l).

Tamam: Şimdi konuya geliyoruz.

Dizin dosyası, sayıların (inode numaralarının) dizeleri ('dosya adları') haritasıdır. Bu inode sayıları, o dizinde bulunan dosyaların inode sayılarıdır. Bu dizinde bulunan dosyalar diğer dizin dosyalarını içerebilir, bu yüzden inode numaraları dizinde listelenenlerin arasında olacaktır. Bu nedenle, bir dosyanız varsa /tmp/foo/bar, o zaman dizin dosyası fooiçin bir girdi içerir; barbu dizgiyi bu dosyanın inode'uyla eşleştirir. Ayrıca /tmpdizinde foo'içinde' olan dizin dosyası için dizin dosyasında bir giriş vardır /tmp.

Mkdir (2) ile bir dizin oluşturduğunuzda, bu işlev

  1. doğru iç yapıya sahip bir dizin dosyası (bazı inode numaraları ile) yaratır,
  2. ana dizine bir giriş ekleyerek yeni yönetmenin adını bu yeni düğüme eşler (bağlantılardan birini oluşturur),
  3. 'dizini eşleyerek yeni dizine bir giriş ekler. aynı inode'a (bu diğer linke ait hesaplar) ve
  4. yeni dizine başka bir giriş ekler, '..' dizesini adım (2) 'de değiştirdiği dizin dosyasının inode'uyla eşleştirir (bu, alt dizinleri içeren dizin dosyalarında göreceğiniz daha fazla sayıda sabit bağlantıyı hesaba katar) ).

Sonuçta (neredeyse) sadece özel durumlar şöyledir:

  • Open (2) işlevi, dizin dosyalarını yazmak için açmanızı önleyerek, ayağınızı vurmanızı zorlaştırmaya çalışır.
  • Mkdir (2) işlevi, yeni dosya dizinine birkaç ekstra giriş ekleyerek ('.' Ve '..') işleri tamamen güzel ve kolay hale getirir, sadece dosya sisteminde dolaşmayı elverişli kılar. Dosya sisteminin '' olmadan 'mükemmel çalışacağından şüpheleniyorum. ve '..', fakat kullanmak acı verici olurdu.
  • Dizin dosyası, 'özel' olarak işaretlenen birkaç dosya türünden biridir - bu gerçekten açık (2) gibi şeylerin biraz farklı davranmasını söyleyen şeydir. Bkz st_modestat (2).

(2011-10-20 yığınındaki orijinal sorudan kopyalandı)


1
Blokları inode ile karıştırıyorsun. Özel bir durum olarak, kısa dosyalar için dosya içeriği inode içinde olabilir , ancak inode'ların yapılandırılmamış olduğunu iddia etmek yanlıştır. Dosyanın bulunabileceği dosya adları hariç, hemen hemen tüm dosya meta verilerini içeren yüksek düzeyde yapılandırılmıştır. Inode, dosya içeriğinin bulunduğu diskteki bloklara işaretçiler (doğrudan, dolaylı, iki yönlü dolaylı vb.) İçerir.
Phil P

1
Hayır, blokları inode ile karıştırmıyorum. İnode'lar blokların üzerinde oturan bir soyutlamadır ve bu kaydın amacı dosyalar ve dizinler arasındaki ilişkiyi ve içeriğini tanımlamaktı: tüm dosya sistemi yapısı dizin dosyalarından geliyor. İnode uygulamalarında tıkanmadan zaten yeterince uzundu! (bu, ilk paragraf çiftini daha net bir şekilde yazabileceğimi söyledi). Ayrıca, gördüğünüz gibi, açıkça dosya hakkında tüm bilgilerin (adı hariç) dizin dosyasında değil inode olduğunu belirtirim.
Norman Gray

@NormanGray: Kendinizi savunurken bile, ayağınızı vuruyorsunuz. "Dosya sistemindeki tüm dosyaların içeriği inode'dur ..." dedin. Bu yanlış.  Bir dosyanın özellikleri / özellikleri (örneğin, sahip, izinler, değişiklik zamanı, vb.) İnode'da saklanır. İçerik sıradan dosyasının veri blokları depolanır. Eğer inode uygulamalarında tıkanmak istemiyorsanız, o zaman yapmayın, ama lütfen yanıltıcı aşırı basitleştirmeler de yapmayın.
G-Man 'eski durumuna Monica' Diyor
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.