GNU/Linux Hard Link ve Symbolic Link Kullanımı - Inode Nedir? (ln,link,stat komutu)

Linking(bağlama), bir dosyayı başka bir dosyaya(link) bağlamaya denilebilir. Hardlink oluşturulan bağlantının aynı dosyaymış gibi davranmasına sebeb olurken sembolik link ise aynı dosyayı gösteren bir gösterici olarak düşünülebilir.

Inode Nedir?

Inode, Linux ve Unix benzeri işletim sistemlerinde dosya sistemindeki bir veri yapısıdır. Dosya adı ve dosya içeriği hariç dosya hakkındaki tüm bilgileri barındırır. Kısaca bir dosya hakkında metadata bilgisini barındırır. Dosyanın sistemdeki konumu, dosya nitelikleri, dosya boyutu, oluşturma tarihi vs.

Bir programa bir dosyayı kullanmasını söylediğimizde sistem dosyanın inode numarasından ismi bulur. Inode numaraları sistem üzerinde inode tablosunda bulunur. Dosya sisteminde, dosya isimleri birer inode ile gösterililr. Her inode tek bir dosyayı gösterir. Yani her dosya için o dosyayı gösteren eşsiz bir inode numarası vardır.

Dosyaların Inode Numaralarını Öğrenme

Bir dosyanın inode numarasını öğrenmek için ls komutunu -i şeçeneği ile beraber çalıştırabiliriz. Bu bize dosyanın inode numarasını verecektir.

user@linuxpc:~/links$ ls -lai
total 12
659602 drwxr-xr-x  2 user user 4096 Eki 28 16:53 .
524290 drwxr-xr-x 19 user user 4096 Eki 28 16:45 ..
659653 -rw-r--r--  1 user user   16 Eki 28 16:54 dosya1.txt

Yukarıdaki çıktıdan bulunduğumuz dizinin(.) 659602 inode numarasına sahip olduğunu, üst dizinin(..) yani home dizininin 524290 numaralı inode'a ait olduğunu ve son olarak links dizinindeki dosya1.txt dosyasının 659653 inode numarasına sahip olduğunu görebiliriz.


Aynı şekilde stat komutu kullanılarak bir dosyanın inode numarası öğrenilebilir.

user@linuxpc:~/links$ stat dosya1.txt
  File: dosya1.txt
  Size: 16        	Blocks: 8          IO Block: 4096   regular file
Device: 802h/2050d	Inode: 659653       Links: 1
Access: (0644/-rw-r--r--)  Uid: ( 1000/  user)   Gid: ( 1000/  user)
Access: 2018-10-28 16:53:56.228472967 +0300
Modify: 2018-10-28 16:54:04.584399901 +0300
Change: 2018-10-28 16:54:04.584399901 +0300
 Birth: -

Hard Link Oluşturma ve Kullanımı (ln, link komutu)

Hard Link bir dosyaya alternatif isimli bir dosya oluşturmak istenildiğinde kullanılır. Oluşturulan hard link orjinal dosya ile aynı inode numarasına sahip olacaktır. Bu sebeble birisine yapılan değişiklik iki dosyayada etki edecektir. Bir dosyaya istenilen sayıda hard link oluşturulabilir. Aynı zamanda bir hard link'e başka bir hard link oluşturulabilir. Ancak hard link oluşturamayacağımız durumlar vardır.

  1. Dizinlere
  2. Dosya Sistemlerine
  3. Partisyonlara

Hard link oluşturulamaz. Inode numaraları her dosya sisteminde ve partisyonda eşsizdir bu yüzden partisyonlar ve dosya sistemleri arasında hard link oluşturulamaz.


Bir dosyaya hard link oluşturmak için ln ya da link komutunu kullanabiliriz.

Kullanımı:

# ln <dosyaadı> <hardlinkadı>
# link <dosyaadı> <hardlinkadı>

Bir dosyaya hard link oluşturduğumuzda, oluşturduğumuz hard link orjinal dosya ile aynı inode numarasına sahip olacaktır. Yani iki dosyada hard disk üzerindeki aynı veriyi gösterir. Bu dosyalardan herhangi birine yapılan değişiklik iki dosya içinde uygulanmış olur.


user@linuxpc:~/links$ echo "Merhaba Dünya!" > dosya1.txt
user@linuxpc:~/links$ ls -i
659651 dosya1.txt

dosya1.txt adındaki dosyamızı oluşturduk içine Merhaba Dünya! yazdırdık. Dosyanın inode numarası 659651. Şimdi bu dosyaya bir hard link oluşturalım.


user@linuxpc:~/links$ ln dosya1.txt hlinkdosya1
user@linuxpc:~/links$ ls -li
total 8
659651 -rw-r--r-- 2 user user 16 Eki 28 17:43 dosya1.txt
659651 -rw-r--r-- 2 user user 16 Eki 28 17:43 hlinkdosya1

Oluşturduğumuz hard link'in ve orjinal dosyamızın inode numaralarının aynı olduğunu görüyoruz. İşletim sistemimiz için bu iki dosyanın birbirinden farkı yoktur.


Şimdi dosyalarımız stat komutu ile inceliyelim ve belirttiğimiz dosyanın yani inode numarasının kaç tane bağa(link) sahip olduğunu görelim.

user@linuxpc:~/links$ stat dosya1.txt hlinkdosya1
  File: dosya1.txt
  Size: 34        	Blocks: 8          IO Block: 4096   regular file
Device: 802h/2050d	Inode: 659651      Links: 2
Access: (0644/-rw-r--r--)  Uid: ( 1000/  user)   Gid: ( 1000/  user)
Access: 2018-10-28 18:01:30.805396974 +0300
Modify: 2018-10-28 18:01:26.457367046 +0300
Change: 2018-10-28 18:01:26.457367046 +0300
 Birth: -

  File: hlinkdosya1
  Size: 34        	Blocks: 8          IO Block: 4096   regular file
Device: 802h/2050d	Inode: 659651      Links: 2
Access: (0644/-rw-r--r--)  Uid: ( 1000/  user)   Gid: ( 1000/  user)
Access: 2018-10-28 18:01:30.805396974 +0300
Modify: 2018-10-28 18:01:26.457367046 +0300
Change: 2018-10-28 18:01:26.457367046 +0300
 Birth: -

Yukarıdaki çıktıda Links alanında yazan 2 sayısı belirttiğimiz dosyanın yani inode'un sahip olduğu hard linklerin sayısını gösteriyor. Bu inode'a iki bağ var. Anlaşıldığı üzere orjinal dosyayıda bir bağ(link) olarak görüyor.


Şimdi oluşturduğumuz hardlink dosyasını değiştirelim ve neler olacak görelim.

user@linuxpc:~/links$ echo "This is GNU/Linux" >> hlinkdosya1

user@linuxpc:~/links$ cat hlinkdosya1
Merhaba Dünya!
This is GNU/Linux

user@linuxpc:~/links$ cat dosya1.txt
Merhaba Dünya!
This is GNU/Linux

Görüldüğü üzere bir dosyaya yapılan değişiklik diğer dosyayada etki ediyor. Bunun sebebi aynı inode numaralarına sahip olmaları, sistem dosyanın inode numarasını alıyor ve değişikliği bu inode üzerinden gerçekleştiriyor. İki dosyada aynı inode numarasına sahip olduğundan iki dosyada değişmiş oluyor. Aynı şekilde bu dosyarın konumlarını değiştirsekte halen aynı veriyi işaret ediyor olacaklardır.


Şimdi orjinal dosyamızı silelim ve neler olacak görelim.

user@linuxpc:~/links$ rm dosya1.txt
user@linuxpc:~/links$ ls -i
659651 hlinkdosya1

user@linuxpc:~/links$ cat hlinkdosya1
Merhaba Dünya!
This is GNU/Linux

user@linuxpc:~/links$ stat hlinkdosya1 | grep Link
Device: 802h/2050d	Inode: 659651      Links: 1

Dosyayı silmek istiyorsak, dosyanın sahip olduğu inode'u silemiz gerekir. En azından inode ortadan kalktığı için dosya erişilemez olacaktır. Bunun içinde inode'un bağlı olduğu tüm linklerin silinmesi gerekir.


Sonuç olarak hard link dosyanın ikizi gibidir. Ancak aynı zamanda aynı dosyadır. Mitolojideki 3 başlı köpek olan Kerberos'a benzetebiliriz. Her kafa aynı vucuda sahip ancak bir kafayı kopardığında vucut hala ordadır. Yok etmek için hepsini yok etmek gerekir. İlginç bir tanım oldu!

Sembolik Link Oluşturma ve Kullanımı - (Soft Link)

Sembolik linkler daha kullanışlı olabilir. Hard linkteki gibi kısıtlamaları yoktur. Dizinlere, diğer dosya sistemlerine ve diğer partisyonlara sembolik link oluşturulabilir. Aslında windows ortamındaki kısayollar gibi düşünülebilir. Sembolik linkler bir dosyayının konumunu işaret ederler. Bir sembolik link, hard link gibi dosyanın diskketi fiziksel konumunu işaret etmek yerine dosyanın yolunu(path) işaret ederler.

  1. Eğer sembolik link başka bir dizine taşınırsa halen sembolik link geçerlidir.
  2. Ancak eğer orjinal dosya farklı bir dizine taşınırsa sembolik link artık geçersizdir.
  3. Orjinal dosya silinirse, sembolik link geçersizdir.
  4. Ancak sembolik link aynı konumu işaret etmeye devam eder. Bu sebeble sembolik linkin gösterdiği konuma aynı isimde dosya oluşturulabilir ve sembolik link kullanılmaya devam edilebilir.
  5. Sembolik linklerin boyutu, gösterdiği dosya boyutuyla alakalı değildir. Sadece dosya yolunu gösteren dosyalardır.

Kullanımı:

# ln -s <dosya-ya-da-dizin> <sembolik-link-adı>

-s seçeneği ile bunun bir sembolik link olduğunu belirtiyoruz. Links dizinimiz içerisindeki dosyaları silelim ve tekrar dosya1.txt adında bir dosya yaratalım.

user@linuxpc:~/links$ rm ./*
user@linuxpc:~/links$ echo "Merhaba Dünya!" > dosya1.txt
user@linuxpc:~/links$ ln -s dosya1.txt sym-dosya1
user@linuxpc:~/links$ ls -li
total 4
660760 -rw-r--r-- 1 user user 16 Eki 28 18:27 dosya1.txt
660853 lrwxrwxrwx 1 user user 10 Eki 28 18:27 sym-dosya1 -> dosya1.txt

Son satıra bakarsak oluşturduğumuz sembolik link'in inode numarasının orjinal dosyanınkinden farklı olduğunu görürüz. Yani bu iki dosya birbirinden bağımsız. Ancak oluşturduğumuz sembolik hedefteki dosyayı gösterdiğinden sembolik link üzerinden orjinal dosyamıza bağlanabiliriz ve o dosyayı değiştirebiliriz.


Son satırdaki sembolik linkin dosya erişim haklarının olduğu kısmın en sol başına bakarsak bu dosyanın bir sembolik link olduğunu belirten l karakterinin olduğunu görürüz.

660853 lrwxrwxrwx 1 user user 10 Eki 28 18:27 sym-dosya1 -> dosya1.txt

Aynı zamanda dosyanın ok işareti ile işaret ettiği dosya yolunu görebiliriz.


user@linuxpc:~/links$ stat dosya1.txt | grep Link
Device: 802h/2050d	Inode: 660760      Links: 1

Görüldüğü üzere sembolik linkler inode üzerinde bir bağ oluşturmuyor. Çünkü sembolik linkler belirtilen yolu(path) gösteriyor.


Eğer orjinal dosyayı silersek sembolik link'in gösterdiği adreste bir şey olmuyacaktır. Ancak sembolik link'in gösterdiği dosya ile aynı isimde yeni bir dosya oluşturursak sembolik link bu yeni dosyayı işaret edecektir.

user@linuxpc:~/links$ cat dosya1.txt sym-dosya1
Merhaba Dünya!
Merhaba Dünya!

user@linuxpc:~/links$ rm dosya1.txt

user@linuxpc:~/links$ ls -li
total 4
661354 lrwxrwxrwx 1 user user   10 Eki 28 18:57 sym-dosya1 -> dosya1.txt

user@linuxpc:~/links$ echo "Bu farklı dosya" > dosya1.txt
user@linuxpc:~/links$ ls -li
total 4
661357 -rw-r--r-- 1 user user   17 Eki 28 18:58 dosya1.txt
661354 lrwxrwxrwx 1 user user   10 Eki 28 18:57 sym-dosya1 -> dosya1.txt

user@linuxpc:~/links$ cat sym-dosya1
Bu farklı dosya

Yukarıdada görüldüğü gibi orjinal dosyamızı sildik ancak sembolik link aynı konumu göstermeye devam etti. Yeni bir dosya oluşturduk ve içeriğini farklı bir şey yaptık. Görüldüğü üzere sembolik link yeni dosyayı işaret ediyor. Oluşturduğumuz yeni dosyanın inode numarasının sildiğimiz dosyanın inode numarasından farklı olduğunu görüyoruz.