Unix dosya sistemlerinde dizinler nasıl uygulanır?


19

Benim sorum dizinlerin nasıl uygulandığıdır? Tablo, dizi veya benzeri bir değişken gibi bir veri yapısına inanabilirim. UNIX Açık Kaynak olduğundan, yeni bir dizin oluştururken programın ne yaptığını kaynağa bakabilirim. Konuya nereden bakacağımı veya ayrıntılı bir şekilde bakacağımı söyleyebilir misiniz? Bir dizinin anlayabildiğim bir dosya olduğunu ve bir dizinin gerçekten bir dosya olduğunu? Ben hala bir şey hakkında kelime dosyasını söyleyebiliriz hala dosyaların "dosyalarda" saklandığından emin değilim ve bir değişken bile diyebilirsiniz çünkü kesinlikle bir dosya değil emin değilim dosya. Örneğin, bağlantı kesinlikle bir dosya değildir ve bağlantı bir dizin gibidir, ancak bu bir dizinin bir dosya olduğunu ihlal eder mi?


1
Herhangi bir dosya sistemi ile ilgileniyor musunuz?
Ignacio Vazquez-Abrams

3
UNIX'te her şey bir dosyadır (tarihi bilgelik). Ancak her UNIX Açık Kaynak değildir. Gnu Unix Değil, Biliyor musun? Açık Solaris bir Açık Kaynak Unix, Linux ise sadece unixoid bir işletim sistemidir. :) Ve evet - dosya sistemleri - Reiserfs? Ext2-3-4? XFS'in? NFS?
kullanıcı bilinmiyor

2
Bir bağlantı olduğu da aslında bir dosya.
mattdm

5
Bir sembolik bağ bir dosyadır. Sabit bağlantı, dosya sistemi grafiğindeki bir kenardır.
dmckee

3
Reklam: İşletim Sistemleri Geliştirme site teklifi ile ilgileniyor olabilirsiniz .
Gilles 'SO- kötü olmayı bırak'

Yanıtlar:


22

Dizinlerin iç yapısı kullanılan dosya sistemine bağlıdır. Ne olduğunu tam olarak bilmek istiyorsanız, dosya sistemi uygulamalarına göz atın.

Temel olarak, çoğu dosya sisteminde, dizin dosya adları (anahtarlar) ve inode numaraları (değerler) arasında ilişkilendirilebilir bir dizidir . Böyle bir şey¹:

1167010 .
1158721 ..
1167626 subdir
 132651 barfile
 132650 bazfile

Bu liste (genellikle) 4KB bloklar zincirinin içinde - az ya da çok - verimli bir şekilde kodlanmıştır. Normal dosyaların içeriğinin benzer şekilde depolandığına dikkat edin. Dizinler söz konusu olduğunda, bu bloklar içinde gerçekte hangi boyutun kullanıldığını bilmenin bir anlamı yoktur. Bu nedenle rapor edilen dizinlerin boyutları du4KB'nin katlarıdır.

Düğümler, blokları birbirine bağlamak için, genel anlamda tek bir varlık, yani bir 'dosya' oluşturmak için vardır. Bir tür adres olan bir numara ile tanımlanırlar ve her biri genellikle tek bir özel blok olarak saklanır.

Tüm bunların yönetimi çekirdek modunda gerçekleşir. Yazılım sadece int mkdir(const char *pathname, mode_t mode);sistem çağrısına yol açan bir fonksiyona sahip bir dizin oluşturulmasını ister ve geri kalanı perde arkasında gerçekleştirilir.

Bağlantılar yapısı hakkında:

Sabit bağlantı bir dosya değildir, yalnızca önceden var olan bir inode öğesine² işaret eden yeni bir dizin girdisidir (yani bir ad - inode numarası ilişkilendirmesi). Bu, aynı inode'a farklı yol adlarından erişilebileceği anlamına gelir. Özellikle, meta veriler (izinler, sahiplik, zaman damgaları…) inode içinde saklandığından, bunlar benzersizdir ve dosyaya erişmek için seçilen yol adından bağımsızdır.

Bir sembolik bağlantı olduğu bir dosya ve kendisine hedef ayrıdır bu. Bu, kendi inodeuna sahip olduğu anlamına gelir. Eskiden normal bir dosya gibi işlenirdi: hedef yol bir veri bloğunda saklandı. Ancak şimdi, son ext dosya sistemlerinde verimlilik nedenleriyle, 60 bayttan daha kısa yollar inode içinde saklanır (normalde işaretçileri veri bloklarına depolamak için kullanılan alanlar kullanılarak).

-
1. Bu, kullanılarak elde edildi ls -ai1 testdir.
2. Günümüzde türü 'dizin' den farklı olması gereken.


Dizinler ve dosyalar arasındaki farkı programatik düzeyde anlayabilmem için detaylandırdığınız için teşekkür ederiz.
Niklas

12

Stéphane Gimenez'den gelen gönderiyi genişletmek için yeni bir dizin oluşturmak, S_IFDIR'in st_mode değeriyle (izinler modu ile) yeni bir düğüm oluşturma ve bağlantı ile yeni düğümün ilk veri bloğunda iki giriş oluşturma işlemidir ( 2) sistem çağrısı: '.' bu yeni inode ve ana dizini gösteren '..' işaretlerini gösterir, ardından inode ve yeni dizinin adıyla üst dizinde bir giriş oluşturur - ilk ve son bölüm sistem çağrısı mknod ( 2). Ayrıca, bugünlerde konuştuğumuz görevler için sadece kök mknod (2) kullanabilir.

Örneğin mkdir("/home/larry.user/xyzzy", 0666), esasen aşağıdakilerdir (bu SysV günlerinden [1] C kodu idi):

int mode = 0666;
char newdir[] = "/home/larry.user/xyzzy";
char path1[NAMESZ+4, path2[NAMESZ+4], *p;
mknod(newdir, S_IFDIR|mode);
strcpy(path1, newdir);
strcat(path1, "/."); /* "." link */
link(newdir, path1);
strcat(path1, ".");  /* ".." link */
strcpy(path2, newdir);
if ((p = strrchr(path2, '/') == (char *)0) /* root directory */
    link(".", path1);
else {
    *p = '\0';
    link(path2, path1);
}
  1. Haviland & Salama, "UNIX Sistem Programlama", 1987, ss69-71.

Bu çok hataya açıktı (ve fsck'in ana nedenlerinden biri), bu yüzden bunu sizin için yapabilmek için bir mkdir (2) sistem çağrısı oluşturuldu.

Amy dosya sistemi nesnesinin mknod (2) ile oluşturulabileceğini unutmayın: normal dosya, dizin, aygıt dosyası, sembolik bağlantı, vb. Yani OP'nin sorularından birine cevap vermek için evet, bir dizin bir dosyadır, yani " msgstr ", bir inode ile temsil edilen ve bir g / Ç arabirimiyle çalışan bir dosya sisteminde bulunan bir nesnedir".


Çok ilginç cevap için teşekkür ederim. Anlıyorum ve touchboş bir dosya oluşturan programın kaynağına bakabileceğimi ve ne yaptığını görebileceğimi düşünüyorum.
Niklas

2

Unix / Linux dosya sistemleri hakkında daha fazla bilgi edinmek isterseniz, size 2 kitabı Linux Çekirdeğini ve Linux Çekirdeği Geliştirme'yi Anlama öneririm . Bunlar Linux çekirdeğini anlamak için en iyi kitaplar.

"Ortak Dosya Modeli" Unix sistemlerinde, her dizin dosya ve dizinlerin listesini içeren bir dosya olarak kabul edilir.

VFS'de (Sanal Dosya Sistemleri), dizinler adlı bir yapıda temsil edilir dentry. dentry Bir dizge adıyla (C yapıdır d_name ), bir inode'a (bir işaretçi d_inode ) ve üst dentry (bir işaretçi d_parent ). Bir inode, dosya sistemindeki bir dosya hakkındaki bilgileri işlemek için kullanılan bir yapıdır. Örneğin, dizine sahipseniz /tmp/test/foo, VFS yol adındaki her bileşen için bir diş açma nesnesi oluşturur. Bu nedenle , kök dizininin girişi /için ikinci bir dişçilik nesnesi ve test dizininin girişi testiçin üçüncü bir dişçilik nesnesi oluşturacaktır foo.


Teşekkürler Dimitri. Bazı projelerin neden bir B-Ağacı, bir ikili ağaç, bir üçlü veya ilişkisel dizi gibi belirli bir veri yapısını seçtiğini anlamak istiyorum. Bence uygun bir veri yapısı / veri modeli seçmek önemlidir. Farklı uygulamaları öğrenmek, aradığım ayrıntıları verir.
Niklas

1

Http://www.freebsd.org/doc/en/books/design-44bsd/book.html#OVERVIEW-FILESYSTEM adresini okuyarak başlayabilirsiniz . Daha fazla ayrıntı için "4.4 BSD İşletim Sisteminin Tasarımı ve Uygulanması" adlı mükemmel klasik kitabı edinin.


Bağlantı için teşekkürler. Her iki dosyanın da temelde dosya veya dizin olarak yorumlanan diziler olduğunu anlıyorum. Yanılıyorsam lütfen beni düzeltin ..
Niklas

1
Dizinler geleneksel olarak sadece özel olarak biçimlendirilmiş dosyalardır, ancak bu artık doğru değildir: en.wikipedia.org/wiki/ReiserFS#Design ReiserFS ve bazılarında dizinler bir veritabanındaki girdilerdir. Dizinler diziler gibi davranabilir, ancak bu sadece programlama soyutlamasıdır.
Bruce Ediger

Ayrıntıları belirttiğiniz için çok teşekkür ederim. Şimdi dosya sistemlerinin nasıl çalıştığını ve neden locateçalıştığını ve bunun yerini belirleme programının çalıştırılarak güncellenmesiyle ilgili olduğunu merak ettiğimden daha fazlasını anladığımı düşünüyorum updatedb(spec PC-BSD, DragonflyBSD ve Ubuntu Natty kullanıyorum Canlı CD'lerden önyükleme ve farklı yüklemeleri karşılaştırma ve arayüzler)
Niklas
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.