UNIX Inode Yapısı:

Ismail YENIGUL <ismail~EnderUNIX.ORG>


Her işletim sisteminin kendine özgü dosya sistemi(file system) vardır.
Dosya sistemi, kullanıcıya sistemin iç detaylarından soyutlanmış bir arabirim sağlar.
Kullanıcı  dosya ve dizinler üzerinde  ekleme,silme,yazma, okuma gibi işlemler yapabilir.
Bu işlemleri yaparken sistemin iç işleyişi hakkında bilgi sahibi olmasına gerek yoktur.

Dosya sistemi disk üzerinde saklanmaktadır. Disk birden fazla bölümlere (partition) lara
ayırtılabilir ve her bölüme farklı dosya sistemi(Ayni işletim sistemine ait farklı bölüm veya farklı işletim sistemine ait bir bölüm olabilir) kurulabilir.

Boot blok

super blok

inode listesi

veri blokları(/, /usr, /etc)


Diskin 0. sektörüne MBR(Master Boot Record) adı verilir ve bu kısım bilgisayarı açmak(boot) için kullanılır. MBR nin sonunda her bölümün
başlama ve bitiş adresini gösteren bir bölüm tablosu(partition table) bulunur. Bu bölümlerden bir tanesi aktif bölüm olarak atanır.
Bilgisayar açıldığın(boot)da BIOS okunur ve MBR deki program çalıştırılır. MBR deki program, aktif bölümün yerini belirler ve
aktif bölümün boot blok adı verilen ilk bölmesini okur ve çalıştırır. Boot blok ta işletim sistemini (Operating System) i yükler.

Aktif bölüm dışındaki bölümlerde açılabilir(bootable) bir işletim sistemi olmasa bile, ileride olabilme ihtimali ile boot blok bulunur.

Boot bloğundan sonra süper blok gelir. süper blok sistem hakkındaki tüm önemli bilgileri içeri. Bunlar;

Süper blok un bozulması durumunda dosya sistemi okunmaz hale gelir!
Bilgisayar her açıldığında  süper blok hafızaya yüklenir. Ön tanımlı olarak 30 saniyede bir hafızadaki bilgiler diske yazılır. Eğer süper blok un hafızadaki kopyası diske yazılmadan önce bilgisayar kapatılırsa(halt) süper bloktaki en son diske yazılmayan değişiklikler kayıp edileceği için dosya sistemi kararsız(inconsistent) hale gelir. Bu durumda fsck komutu kullanılarak dosya sistemi kararlı(stable) gelir.


Süper blok ta dosya sisteminin tipini(FreeBSD, Linux, Solaris..) belirleyen sihirli sayı(magic number) vardır.
Süper bloktan sonra dosya sistemindeki free blocks(boş alanlar) bilgisi gelir. Daha sonra inode lar gelir. İnode lardan
sonra sistemin ana dizinini olan root dizini gelir. ve en son diğer dizinler ve dosyalar gelir.

UNIX, dosya ve dizinleri block device adı verilen disk veya tape lerde tutar. Çekirdek(Kernel) disk yerine mantıksal dosya sistemi(logical file system) ile iletişim kurar.Her bir mantıksal sürücü(logical device) bir mantıksal sürücü numarası(logical device number) ile tanımlanır.

Dosya sistemindeki bilgilerin diske aktarılmasını disk sürücü(disk driver) ler yapar.

Inode(index-node):

Normalde ismi index nodes ama tembellikten genelde inode(dügüm) seklinde yazılır.
Inode, dosya sistemi üzerinde bulunan dosyanın özelliklerini(sahibi, izinleri, erişimleri, erişim tarihi..),dosyayı oluşturan blokların listesini
ve bu blokların diskteki adresini tutan bir veri yapısıdır.Her dosya için bir tane inode vardır. Ama birden fazla dosya tek bir
inode ta işaret edebilir(link).

Kısaca inode; dosyanın adi hariç dosya ile ilgili tüm bilgiler tutmaktadır. Bu bilgiler; 


Örnek bir inode yapısı


Inode ta disk bloklarını adreslemek için ayrılmış 15 tane pointer(işaretci) vardır.
ilk 12 pointer,   blokların adresini direk olarak tutar. Bunlara direk bloklar(direct blocks) denir.Dosya açıldığı zaman
inode hafızaya yüklenir.ve  dosyanın ilk 12 blokluk kısmına direk olarak referans yapılabilir. Geri kalan 3 pointer  ise dolaylı bloklar(indirect block)dır.
Bu 3 pointer, dosyanın boyu 12 blok ile gösterilemediği zaman dosyanın geri kalan bloklarının adres bilgilerini tutmak için kullanılır.

13. pointer: 1. dereceden dolaylı bloktur(single indirect block). Yani bu pointer veri içeren bir bloğun adresini değil de,
veri içeren blokların adreslerini tutan blokların, adresini tutar örneğin blok adresi 4KB ise ve her bir disk adresi 4 byte ise
1.dereceden dolaylı blok 4K/4 = 1024 adet bloğun adresini tutabilir. Buda 1024*4KB = 4096KB ye kadar olan dosyaların blok adresleri gösterilebilir.

14. pointer: 2. dereceden dolaylı bloktur(double indirect block). 13. pointere benzer şekilde bu pointer da her biri 1024 tane blok adresi içeren 1024 (4KB/4) tane birinci dereceden dolaylı blokların adresini tutar. Buda çok ama çok büyük boyutta dosyaları adresleyebilecek durumdadır.

15. pointer: 3. derecen dolaylı bir bloktur. (triple indirect block). her biri 1024 tane blok adresi içeren, 1024 adet 2. dereceden blok
adreslerinden oluşur. ama 14. pointer şu an için çok rahat isimizi gördüğü için 15. pointer e pek ihtiyaç kalmıyor.

Inode un içeriği dosyanın içeriği değiştiği zaman veya dosyanın sahibi,izinleri veya link bilgileri değiştiği zaman değişir. Inode 64 Byte dır.

Bir proses yeni bir dosya oluşturduğu zaman kernel(cekirdek) bu dosyaya boş bir inode numarasını atar.
Dosyanın adı ve yolu(path) i inode tarafından tutulmaz. Kernel istenilen dosyaya erişmek için dosyanın inode numarasını bulur ve inode u hafıza(memory) e yükler. Hafızadaki inode a in-core inode adı verilir.Kernel dosya(yani dosyanın inode u) üzerindeki değişikliklerin hepsini hafızadaki in-core inode üzerinden yapar. Disk teki her bir inode için hafızada sadece bir tane in-core inode olabilir. Disk teki bir inode için iki veya daha fazla in-core inode olması dosya sistemi üzerinde tutarsız veriler oluşmasına sebep olur. In-core inode ,FreeBSD de Solaris te vnode olarak da adlandırılır.

in-core inode ta dosya sistemindeki inode dan farklı olarak su bilgiler bulunur.

Bir inode un referans sayacı(reference inode) 0 olduğunda bu inode free liste alınır. Bir inode free liste alındığı zaman in-core inode un içerdiği disk inode un yerine çekirdek başka bir disk inode  atayabilir. Bos listenin kaç tane elemanı olacağı sistem yönetici tarafından belirlenir. Bos listenin eleman miktarı, işletim sisteminin aynı anda açabileceği en fazla dosya sayısıdır(max open file number) sistem açıldığı zaman(boot) max open file number sayısı kadar bos listeye eleman eklenir. Bir proses dosya üzerinde işlem yapacağı zaman, dosyanın inode için in-core inode da yer ayrılması gerekir. Çekirdek(kernel) bos listeden bir eleman alır(en az kullanılan(least recently used) algoritmasına göre) ve inode bilgilerini bu eleman üzerine yükler ve eleman hash queue ye eklenir.

Inode Erişim:

Çekirdek(kernel) bir inode a nasıl erişir ?

1-Disk inode hash queue da varsa:(inode su an hafızada)

2-Disk inode hash queue de yoksa:

Hafızadaki Inode un Bosaltilmasi(Release)


Yeni bir dosyaya inode atama:

Dosya sistemi inode ların listesini lineer olarak yani dizi şeklinde tutar.inode un dosya tipi ile alakalı kısmı sıfır ise bu inode boş demektir.
Performans için süper blokta dosya sistemindeki bos inodeların listesini tutan bir dizi(array) vardır. Yeni bir dosyaya bir inode atamak için ilk önce,

Inode un bırakılması(freeing)(dosyanın silinmesi):


Bir inode un referans sayacı(reference count) sıfır olduğunda inode bir dosyaya işaret etmiyor demektir. Inode un boşaltılması gerekir.


Dizinler(Directories):

Dizinler ve ve metin dosyaları(text files) arasında gerçekleme(implementation) olarak pek bir fark
yoktur. Dizin bilgileri de veri bloklarında tutulur(data blocks), dosyalarda olduğu dizinlerde
inode ile gosterilir. Fakat dizinlerin dosyalardan farklı olarak özel bir yapısı vardır.  7. Versiyon UNIX
lerde dosya adları 14 karakterle sınırlıdır. Bu yüzden dizinler 16 byte tir. 14 byte dosya adi 2 byte ise
dosyanın inode numarası(sadece inode un numarası, kendisi değil).


Inode no

Dosya adı


Örnek bir UNIX Versiyon 7 dizini yapısı

Her dizinde bulunduğu dizine gösteren "." ve bir üst dizini gösteren ".." dizinleri vardır.


Dosyaya Erişim(Pathame Translation):

Diyelim ki /usr/sbin/mutt dosyasına erişmek istiyoruz. çekirdek(kernel) ne gibi işlemler yapar?.


Çekirdek ilk önce / (root) dizininden aramaya başlar. root dizinine ait inode numarası bulunup
inode gösterdiği veri bloğunun hafızaya yüklenmesi gerekir. Genel olarak root dizinin inode numarası 2 dir.
Bunu stat / (stat komutu Linux te FreeBSD de yok) komutunu vererek görebilirsiniz.

yenigul$ stat /

File: "/"
Size: 4096 Blocks: 8 IO Block: 4096 Directory
Device: 302h/770d Inode: 2 Links: 19
Access: (0755/drwxr-xr-x) Uid: ( 0/ root) Gid: ( 0/ root)
Access: Fri Oct 18 15:16:22 2002
Modify: Fri Oct 18 14:19:14 2002
Change: Fri Oct 18 14:19:14 2002

Örnek bir root dizini veri bloğunun içeriği aşağıdaki gibidir.
Root dizininin veri bloğu hafızaya yüklendikten sonra çekirdek usr dizinine ait değeri(entry) aramaya
başlar.arama sonucu usr dizinine ait inode numarasının 8 olduğu bulunur.


/ (root) dizini

2

.

2

..

4

bin

9

etc

12

sbin

8

usr

11

tmp




çekirdek 8 numaralı  inode ve inode un işaret ettiği veri bloklarını belleğe yükler. usr dizini ait veri bloğunda sbin
dizine ait değer aranır. Aşağıdaki örnek tabloda sbin dizinin inode numarasının 15 olduğu bulunur.

/usr dizini

8

.

2

..

14

bin

15

sbin

17

local


15 numaralı inode ve inodun işaret ettiği veri blokları hafızaya yüklenir. Bu veri bloğunda mutt dosyasına
ait değer aranır. Çekirdek mutt dosyasının inode numarası aramaya başlar. 19 inode numarasına
sahip olan inode ve içeriği hafızaya yüklenir. Böylece işlem gerçekleşmiş olur.

/usr/sbin dizini

15

.

8

..

19

mutt

26

sshd

65

mailq



UNIX V7
de dizin
ler içindeki dosyaların inode numaralarını ları bulmak için dizinde(dizinin veri bloğunda) lineer(doğrusal) bir arama söz konusudur. Dennis Ritchie lineer aramanın, dizindeki deger sayısının sınırlı olmasından dolayı etkili(efficient) olduğunu belirtmiştir.
(Ritchie, D. “A Retrospective” The Bell System Technical Journal, July-August 1978).


4.4BSD lerde dizin yapısı biraz farklıdır.

4.4BSD de dizindeki bir dosya adının uzunlugu 255 byte a kadar çıkarılmıştır.
Her değer(entry) uzunluğu da değişkendir. Dizindeki değer in ilk 4 elemanının uzunluğu sabittir ve
bu elemanlar

  1. Dosyanın inode numarası

  2. Değer(entry) inin byte olarak uzunluğu

  3. Değerin tipi(dosya, dizin ...)

  4. Dosya isminin uzunluğu.

Daha sonra dosya adı gelir.
Dizindeki dosya adını bulurken çekirdek, ilk önce dizindeki değerin uzunluğu ile aradığı değerin
uzunluğun eşit olup olmadığını karşılaştırır. Eğer değerlerin uzunlukları eşit ise dosya adları karşılaştırır.
Eğer aranan dosya bulunursa arama tamamlanır. Ama aranan dosya bulunamazsa bir sonra değere geçilir.



Kaynaklar:

 

  1. Maurice J. Bach: The Design of The UNIX Operating System, Prentice-Hall, 1986

  2. Andrew S. Tanenbaum: Modern Operating Systems, Second Edition, Prentice-Hall, 2001

  3. Andrew S. Tanenbaum: Operating Systems Design and Implementation, Second Edition, Prentice-
    Hall, 1997

  4. Marshall Kirk McKusick,Keith Bostic,Michael J.Karels, John S. Quarterman: The Design and Implementation of the 4.4 BSD
    Operating System, Addison-Wesley, 1996

  5. Abraham Silberschatz, Peter Galvin: Operating System Concepts, Fifth Edition, John Wiley & Sons, 1997

  6. http://www.informit.com

İsmail YENİGÜL
www.EnderUNIX.ORG

Bu makale Open Office 1.0.1 kullanılarak yazılmıştır. Makalenin en yeni haline
http://www.enderunix.org/docs/unix/inode.html adresinden ulaşabilirsiniz.