İçeriğe geç
academia.sh

Ders 09 / 20

Bağlantılar

Dizin girdisi ile düğüm ayrımı, sabit bağın aynı düğümü paylaşması, sembolik bağın yol dizesi tutması ve iki türün kısıtlarının karşılaştırılması.

İçindekiler

Önceki ders silmeyi “bağ koparmak” olarak tanımladı ve bir dosyanın birden çok adı olabileceğini söyleyerek bitti. Bu ders o olasılığı kurar.

Dayanak, gezinme dersinde tanıtılan ayrımdır: dizin girdisi bir adı bir düğüme eşler, düğüm (inode) ise dosyanın üstverisini ve veri bloklarının yerini tutar. Ad düğümün içinde saklanmaz. Öyleyse birden çok girdinin aynı düğümü göstermesini engelleyen bir şey yoktur.

Sabit Bağ

Sabit bağ (hard link), var olan bir düğüme yeni bir dizin girdisi eklemektir.

$ ln veri/ham/olcum-03.csv veri/son-olcum.csv
$ ls -li veri/ham/olcum-03.csv veri/son-olcum.csv
22143 -rw-r--r-- 2 ogrenci ogrenci 47 Jul 26 19:03 veri/ham/olcum-03.csv
22143 -rw-r--r-- 2 ogrenci ogrenci 47 Jul 26 19:03 veri/son-olcum.csv

İki satırda da düğüm numarası 22143’tür ve bağlantı sayısı sütunu 1’den 2’ye çıkmıştır. Bu bir kopya değildir: tek bir dosya ve iki adı vardır. Diskte ek yer kullanılmamıştır; yalnızca bir dizin girdisi eklenmiştir.

İki ad arasında hiyerarşi yoktur. Hangisinin “asıl” olduğu sorusu anlamsızdır; ikisi de aynı düğüme eşit uzaklıktadır. Bunun sonucu silmede görünür:

$ rm veri/ham/olcum-03.csv
$ ls -li veri/son-olcum.csv
22143 -rw-r--r-- 1 ogrenci ogrenci 47 Jul 26 19:03 veri/son-olcum.csv
$ cat veri/son-olcum.csv
zaman,sicaklik,nem
08:00,22.6,58
12:00,26.3,44

Adlardan biri silinmiş, bağlantı sayısı 1’e düşmüş, veri yerinde kalmıştır. Önceki dersteki kural burada doğrulanır: veri blokları ancak bağlantı sayısı sıfırlandığında serbest bırakılır.

Silinen ad geri konabilir, çünkü düğüm hâlâ erişilebilirdir:

$ ln veri/son-olcum.csv veri/ham/olcum-03.csv
$ ls -li veri/ham/olcum-03.csv veri/son-olcum.csv
22143 -rw-r--r-- 2 ogrenci ogrenci 47 Jul 26 19:03 veri/ham/olcum-03.csv
22143 -rw-r--r-- 2 ogrenci ogrenci 47 Jul 26 19:03 veri/son-olcum.csv

Sabit Bağın İki Kısıtı

Sabit bağların iki kısıtı vardır ve ikisi de düğüm kavramının doğrudan sonucudur.

Dosya sistemi sınırını geçemez. Düğüm numarası yalnızca kendi dosya sistemi içinde anlamlıdır; başka bir dosya sistemindeki düğüme girdi yazılamaz.

$ ln veri/ham/olcum-01.csv /dev/shm/olcum-01.csv
ln: failed to create hard link '/dev/shm/olcum-01.csv' => 'veri/ham/olcum-01.csv': Invalid cross-device link

Bu, taşıma dersindeki gözlemin aynı kökten gelen ikizidir: aynı dosya sistemi içinde taşıma ucuzdur, dışına taşıma kopyalamaya dönüşür. Her ikisinin de nedeni, dizin girdisinin yalnızca kendi dosya sistemindeki düğümlere işaret edebilmesidir.

Dizinlere kurulamaz.

$ ln veri/ham veri/ham-bag
ln: veri/ham: hard link not allowed for directory

Yasak, dosya sistemini ağaç olarak tutmak içindir. Dizinlere sabit bağ kurulabilseydi döngüler oluşabilir ve ağacı dolaşan her araç sonsuz özyinelemeye girebilirdi. Yasağın tek istisnası, sistemin kendi kurduğu iki girdidir:

$ ls -lid veri/. veri/ham/..
21906 drwxr-xr-x 4 ogrenci ogrenci 4096 Jul 26 19:08 veri/.
21906 drwxr-xr-x 4 ogrenci ogrenci 4096 Jul 26 19:08 veri/ham/..

veri/. ile veri/ham/.. aynı düğümü gösterir: ikisi de veri dizininin kendisidir. Bu, gezinme dersinde açıklanmadan bırakılan bir sayıyı da açıklar. Bir dizinin bağlantı sayısı şunlardan oluşur: üst dizindeki adı, kendi . girdisi ve her alt dizinin .. girdisi. veri dizininin iki alt dizini olduğu için sayı 1+1+2=41 + 1 + 2 = 4’tür.

Sembolik Bağ

Sembolik bağ (symbolic link) bambaşka bir nesnedir: kendi düğümü olan, içeriği bir yol dizesinden ibaret küçük bir dosyadır. Çekirdek bu dosyayı okuduğunda içindeki yolu çözümlemeye devam eder.

Ölçüm dizinindeki en son dosyaya sabit adla erişmek için sembolik bağ uygundur:

$ ln -s ham/olcum-03.csv veri/guncel.csv
$ ls -li veri
total 8
28322 lrwxrwxrwx 1 ogrenci ogrenci   16 Jul 26 19:08 guncel.csv -> ham/olcum-03.csv
21908 drwxr-xr-x 2 ogrenci ogrenci 4096 Jul 26 19:07 ham
21909 drwxr-xr-x 2 ogrenci ogrenci 4096 Jul 26 19:03 islenmis

Çıktıda dört ayrıntı vardır. Tür karakteri l’dir. Düğüm numarası hedefinkinden farklıdır — ayrı bir dosyadır. Boyut 16’dır; bu, hedefin içeriğinin değil, ham/olcum-03.csv dizesinin uzunluğudur. İzin bitleri rwxrwxrwx görünür ve anlamsızdır: erişim denetimi hedefin izinlerine göre yapılır.

Hedef readlink ile okunur, içerik ise doğrudan erişilir:

$ readlink veri/guncel.csv
ham/olcum-03.csv
$ cat veri/guncel.csv
zaman,sicaklik,nem
08:00,22.6,58
12:00,26.3,44

Çoğu komut sembolik bağı izler: cat bağı değil hedefi okur. Bağın kendisiyle ilgilenen komutlar (rm, mv, ls -l) ise izlemez. rm guncel.csv bağı siler, hedefe dokunmaz.

Göreli Hedef Hangi Dizine Göredir

Sembolik bağın içindeki yol göreli olabilir. Bu durumda çözümleme, komutun çalıştırıldığı dizine göre değil, bağın bulunduğu dizine göre yapılır.

Yukarıdaki bağ veri/ içinde durur ve hedefi ham/olcum-03.csv’dir; çözümleme veri/ham/olcum-03.csv verir. Aynı bağ farklı bir dizinde oluşturulsaydı hedef bulunamazdı:

$ ln -s veri/ham/olcum-01.csv /dev/shm/olcum-01.csv
$ ls -l /dev/shm/olcum-01.csv
lrwxrwxrwx 1 ogrenci ogrenci 21 Jul 26 19:08 /dev/shm/olcum-01.csv -> veri/ham/olcum-01.csv
$ cat /dev/shm/olcum-01.csv
cat: /dev/shm/olcum-01.csv: No such file or directory

Bağ oluşturulmuştur — hedefin var olup olmadığı denetlenmez — ama çözümlenemez. /dev/shm içinde veri/ham diye bir yol yoktur. Bu duruma kırık bağ (dangling link) denir.

Kırık bağ bir hata değil, tanımın doğal sonucudur: sembolik bağ bir yol dizesidir, hedefe bir tutamak değildir. Hedef silinirse, taşınırsa veya bağ başka bir yere kopyalanırsa bağ kırılır.

Seçim ölçütü buradan çıkar. Göreli hedef, bağla hedefi birlikte taşınabilir kılar: tüm ağaç başka bir yere kopyalandığında bağ çalışmayı sürdürür. Mutlak hedef ise bağ nereye giderse gitsin aynı dosyayı gösterir, ama ağaç taşındığında kırılır. Ağaç içi bağlarda göreli, sistem genelindeki sabit konumlara yapılan bağlarda mutlak hedef tercih edilir.

İki Türün Karşılaştırması

Ölçüt Sabit bağ Sembolik bağ
Ne tutar Aynı düğüme ikinci girdi Hedefin yol dizesi
Kendi düğümü Yok Var
Dosya sistemi sınırı Geçemez Geçer
Dizine kurulabilir Hayır Evet
Hedef silinince Veri yaşar, sayı azalır Bağ kırılır
Ayırt edilmesi ls -i ile aynı numara ls -l çıktısında l ve ->

Kullanım ayrımı basit bir soruya indirgenir: aynı veriye ikinci bir ad mı gerekiyor, yoksa değişebilen bir hedefe sabit bir işaret mi? Birinci durumda sabit bağ, ikinci durumda sembolik bağ kullanılır. Proje ağacındaki guncel.csv, ikinci duruma örnektir: yeni bir ölçüm dosyası geldiğinde bağın hedefi değiştirilir, bağın adı sabit kalır.

Sistem yerleşiminde de aynı yaklaşım görülür. Dizin hiyerarşisi dersindeki /bin -> usr/bin bağı, eski yolun çalışmayı sürdürmesini sağlayan sembolik bir bağdır — dizine kurulduğu için sabit bağ olamazdı.

Özet

  • Ad dosyanın bir özelliği değildir; dizin girdisi bir adı bir düğüme eşler.
  • Sabit bağ aynı düğüme ikinci bir girdi ekler; bağlantı sayısı artar ve adlar arasında hiyerarşi yoktur.
  • Sabit bağ dosya sistemi sınırını geçemez ve dizinlere kurulamaz; . ve .. bu yasağın sistem tarafından kurulan istisnalarıdır.
  • Sembolik bağ kendi düğümü olan, içeriği bir yol dizesi olan bir dosyadır; boyutu hedef dizesinin uzunluğudur.
  • Göreli hedefli sembolik bağ, bağın bulunduğu dizine göre çözümlenir; hedef yoksa bağ kırıktır ve bu bir hata değil tanımın sonucudur.
  • Ağaç içinde göreli, sistem genelindeki sabit konumlarda mutlak hedef tercih edilir.

Sonraki Adım

Proje ağacı artık dosyalar, kopyalar ve bağlar içeriyor. Bu ağacın tamamını tek bir dosyaya paketlemek — başka bir makineye göndermek veya bir zaman noktasını saklamak için — ayrı bir sorun kümesi doğurur: bağlar nasıl saklanır, dizin yapısı düz bir bayt dizisine nasıl çevrilir ve sıkıştırma bu işin neresindedir? Sonraki ders arşivleme ile sıkıştırmayı birbirinden ayırarak başlar.

İlerlemeni kaydetmek ve not almak için Giriş yap

Notlarım

Not almak için giriş yapmalısın.

Aramak için yazmaya başlayın.

↑↓ Esc gezin · aç · kapat