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;
Dosya sisteminin boyutu
Dosya sisteminin etiketi(label)
Dosya sistemindeki mantıksal blok boyutu(logical block size)
Dosya sistemindeki boş blok(free blocks)ların sayısı
listesi(free block list) ve
listedeki bir sonraki boş bloğu göstermek için kullanılan indeks i tutar.
Dosya sistemindeki bos inode(free inodes) ların sayısı,
listesi , bos inode listesinin boyutu,ve
listedeki bir sonraki
boş inode u göstermek için kullanılan indeks i tutar.
Boş blok ve inode lara aynı anda bir den fazla erişimi engellemek için kullanılan kilit bölümü (lock field) bulunur.
Dosya sisteminin en son güncellenme tarihi ve saati
Süper bloğun değişip değişmediğini kontrol eden bir bayrak(flag) bulunur.
Silindir grup boyutu(cylinder group size) ve silindir grubundaki veri blokları(Data block) sayısı.
Veri bloklarının özeti
Dosya sisteminin durumu: temiz(clean), kararlı(stable) veya aktif
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;
Dosya sahibi(user id)
Dosya sahibinin grubu(group id)
Dosyanın oluşturulma tarihi(creat time)
Dosyaya en son erişim tarihi (acces time)
Dosyadaki en son değişiklik tarihi(modification time)
Dosyanın boyutu(size)
Dosyaya yapılan link sayısı(link count)
Dosya tipi (normal dosya, dizin,link...) (Type)
Dosyaya erişim hakları (Permissions)
Disk blok
adreslerini tutan 15 elemanlı dizi.
Dosya
sistemindeki her dosya için bir tane i-node numarası vardır. Bir
dosya sistemindeki Inode larin sayısı, dosya sisteminin boyutuna ve
her bir inode işin ne kadar disk alanı ayırtılacağına bağlıdır. On
tanımlı olarak her 2K(2048 byte) disk için bir inode atanır. Bu değer(2KB), dosya sistemi
oluşturulurken sistem yöneticisi tarafından değiştirilebilir.
Ö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.
In-core
inode nun durumu(status)
- Inode un kilitlenmiş(locked) olup olmadığı
-
Kilitlenmiş prosesin açılmasını(unlock) bekleyen
prosesin olup olmadığı
- Dosyanın bağlandığı(mount) yer
Dosyayı bulunduran dosya sisteminin mantıksal sürücü numarası(logical device number)
Inode numarası
-Inode lar disk üzerinde lineer dizi(linear array) seklinde saklandığından
çekirdek(kernel), disk
üzerindeki inodeların numaralarını, inode un dizideki yerini
belirlemek için kullanır.
yani inode numarası, inode un dizinin kaçıncı
elemanı olduğunu belirler(indeks)
Referans sayacı(reference count):dosya üzerinde işlem yapan proses veya proseslerin sayısını belirlemek için. Bu sayacın 0 olması, dosya üzerinde işlem yapan bir proses bulunmaması demektir.
Diğer in-core inode lara işaretçi(pointer). Çekirdek(kernel) inode
ları hem hash
queue(kuyruk) hem de free list e link atar.
hash queue inode un olduğu device
number(aygıt numarası) ve inode un numarasına göre tanımlanır. Çekirdek
diskteki
bir inode için sadece bir
in-core inode oluşturabilir. Ama diskteki bu inode hem hash queue de hem de
free liste de olabilir.
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)
Hash queue da ki inode başka bir proses tarafından kullanılıyorsa, yani kilitli ise(locked), inode serbest(unlocked) olana kadar beklenir(sleep)
Inode serbest olduktan
sonra inode un free list(bos liste) de olup olmadığına bakılır. Eğer inode bos listede ise bos listeden silinir ve inode un referans
sayacı(reference count) bir artırılır.(bos listedeki inode un
referans sayacı sıfırdı)
2-Disk inode hash queue de yoksa:
Free list(bos liste) de hiç inode yoksa hata oluşur. Bu durum; ayni anda açılabilecek maksimum dosya miktarına(max open file number) ulaşılmış, işletim sistemi daha fazla dosya açamıyor demektir.
Bos listede eleman varsa,
free listeden en uzun zamandır kullanılmayan eleman alınır. Bu
eleman(inode) bos listeden ve hash queue den silinir. İstenilen inode diskten okunur. Yeni inode bilgileri in-core inode a
yüklenir(örneğin,referans sayacı 1 e eşitlenir).
Hafızadaki Inode
un Bosaltilmasi(Release)
Çekirdek bir inode ile
isini bitirdiği zaman, in-core inode da ki referans sayacını bir
eksiltir. Eğer referans sayacı sıfır ise ve in-core inode ile disk
deki inode dan farklı ise(dosya içeriği veya inode bilgisi değişmiş
demektir.)
inode diske yazılır. Eğer inode un link sayacı(link count) sıfır ise
inode un bilgilerini tuttuğu dosya silinmiş demektir. Dosya silindiği için
inode ta dosya sisteminden silinir.
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,
Çekirdek yarış durumu(race condition) u önlemek için süper blok da ki boş inode listesi(free inode liste) ini şu an başka bir prosesin kilitleyip(locked) kilitlenmediğini yani kullanıp kullanmadığını kontrol eder.
Listeyi kullanan proses yoksa, çekirdek süper bloğu kilitler.
Eğer süper blok da ki boş inodeların içeren liste(free inode list)de boş değilse çekirdek listedeki boş inode listesindeki indeks in gösterdiği inode numarası alır. İndeks değeri bir sonraki boş inode u gösterecek şekilde değiştirilir. Alınan boş inode un artık kullanıldığını belirtmek için disk inode u güncellenir.
Eğer süper blok boş inode listesi boş ise, Çekirdek diske arama yapar ve bulduğu boş inode ları süper bloktaki boş inode listesine,istenin kapasitesi kadar inode eklenir. Buradan anlaşılacağı üzere süper bloktaki inode listesinin kapasitesi sınırlıdır. Diskteki tüm boş inodelar süper blok da ki boş inode listesinde saklanmaz.Çekirdek bir sonraki sefer disk de boş inode ları arayacağı zaman. Tekrar en baştan daha önce taradığı yerleri taramamak için “süper bloktaki boş inode listesinde” ki en son listeye eklenen inode dan sonraki inode ları aramaya başlar. Listenin en sonundaki bu inode a “hatırlama inode”(remembered inode) adı verilir. Çekirdek boş bir inode a bir dosya atadığı zaman süper bloktaki boş inode sayacını(free inode count) bir azaltır.
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.
Dosya sistemindeki toplam boş inode sayısı bir artırılır. Çekirdek süper bloğun kilitlenip kilitlenmediğini test eder.
Eğer süper blok kilitli ise(locked) yarış durumunu(race condition) u engellemek için hemen döner(return).
Süper blok kilitli değilse çekirdek boş inode listesinde boşalan inode için yer olup olmadığını kontrol eder.
Eğer listede boş yer varsa boşalan inode listeye eklenir.
Eğer
liste dolu ise çekirdek yeni boşalan inode u listeye
eklemez.çekirdek yeni boşalan inode ile hatırlama
inode(remembered inode) u
karşılaştırır.
Eğer yeni boşalan inode, hatırlama inode un dan küçük ise. Yeni boşalan inode Hatırlama inode'u olarak kernel tarafindan atanir.
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
dizinler 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
Dosyanın inode numarası
Değer(entry) inin byte olarak uzunluğu
Değerin tipi(dosya, dizin ...)
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:
Maurice J. Bach: The Design of The UNIX Operating System, Prentice-Hall, 1986
Andrew S. Tanenbaum: Modern Operating Systems, Second Edition, Prentice-Hall, 2001
Andrew S. Tanenbaum:
Operating Systems Design and Implementation, Second Edition, Prentice-
Hall, 1997
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
Abraham Silberschatz, Peter Galvin: Operating System Concepts, Fifth Edition, John Wiley & Sons, 1997
İ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.