Bağlantıların ne olduğunu biliyorum ama neden onları kullanayım? Sabit bir bağlantının faydası nedir?
Bağlantıların ne olduğunu biliyorum ama neden onları kullanayım? Sabit bir bağlantının faydası nedir?
Yanıtlar:
Sabit bağlantıların temel avantajı, yumuşak bağlantılara kıyasla boyut veya hız cezası olmamasıdır. Yumuşak bağlantılar, normal dosya erişiminin üstüne ekstra bir dolaylı katmandır; dosyayı açtığınızda çekirdek bağlantının kurallarını kaldırmalıdır ve bu işlem biraz zaman alır. Bağlantı, bağlantı metnini tutmak için disk üzerinde az miktarda yer kaplar. Bu cezalar hard linklerle mevcut değildir, çünkü dosya sisteminin yapısına yerleştirilmiştir.
Bunu görmenin en iyi yolu budur:
$ ls -id .
1069765 ./
$ mkdir tmp ; cd tmp
$ ls -id ..
1069765 ../
Bunu yapma -i
seçeneği ls
size dosyanın inode numarasını verir . Yukarıdaki örneği hazırladığım sistemde, 1069765 numaralı inode numaralı bir dizindeydim, ancak belirli bir değer önemli değil. Sadece belirli bir dosya / dizini tanımlayan benzersiz bir değer.
Bunun söylediği şey, bir alt dizine girip , adı verilen farklı bir dosya sistemi girişine ..
baktığımızda, daha önce elde ettiğimiz inode numarasına sahip olmasıdır. Bu, ..
MS-DOS ve Windows'ta olduğu gibi , kabuk sizin için yorumladığı için olmuyor. Unix dosya sistemlerinde ..
gerçek bir dizin girişidir; önceki dizine geri gösteren sert bir bağlantıdır.
Sabit bağlantılar, dosya sisteminin dizinlerini birbirine bağlayan tendonlardır. Bir zamanlar Unix'in sert bağlantıları yoktu. Unix'in orijinal düz dosya sistemini hiyerarşik bir dosya sistemine dönüştürmek için eklendiler.
(Bununla ilgili daha fazla bilgi için, bkz. '/' Neden '..' girişine sahip? )
Aynı çalıştırılabilir tarafından uygulanacak farklı komutlar için Unix sistemlerinde biraz yaygındır. Artık Linux üzerinde durum görünmüyor, ancak sistemlerde geçmişte kullanılan cp
, mv
ve rm
hepsi aynı yürütülebilir idi. Düşünürseniz mantıklıdır: bir dosyayı birimler arasında taşıdığınızda, etkin bir şekilde kaldırmanın ardından gelen bir kopyadır, bu nedenle mv
zaten diğer iki komutun işlevlerini uygulamak zorunda kaldı. Yürütülebilir, hangi işlemi sağlayacağını, çünkü onun adını verdiği adı bulabilir.
Gömülü Linux'larda yaygın olan bir başka örnek, düzinelerce komut uygulayan tek bir çalıştırılabilir olan BusyBox .
Çoğu dosya sisteminde, kullanıcıların dizinlerle bağlantı kurmasına izin verilmediğini belirtmeliyim. .
Ve ..
girişler, otomatik olarak tipik bir çekirdek parçasıdır dosya sistemi kodu, tarafından yönetilir. Kısıtlama, dizin bağlantılarını nasıl oluşturup kullandığınıza dikkat etmezseniz, ciddi dosya sistemi sorunlarına neden olabileceği için mevcuttur. Bu, yumuşak bağlantıların var olmasının birçok nedeninden biridir; aynı riski taşımazlar.
Son derece kullanışlı olan hardlinklerin bir kullanımı, rsync ile birlikte artımlı yedeklemelerdir. Yerden tasarruf sağlar ve restorasyon prosedürünü gerçekten kolaylaştırır. Bu yaklaşımı sunucularımda yedekleme için kullanıyorum.
Bu açıklamayı okumak için biraz zaman ayırın .
Bu wikipedia sayfasını okuduktan sonra sorunuz "neden onları hiç kullanmalıyım" ise, o zaman ne zor bağlantıların olduğunu anlamıyorsunuzdur.
Bir bağlantı diskteki blok işaret eden bir dizin giriştir. Başka bir deyişle, sisteminizdeki her dosyanın en az bir bağlantısı vardır. Bir rm
dosya olduğunda gerçek sistem çağrısı unlink()
. Dizin girişini kaldırır. Diskteki bloklar değişmedi fakat bağlantı gitti, böylece dosya dizin listesinden silindi.
Şahsen hiçbir zaman sert bağlantılar kullanmayabilirsiniz, ancak bunlar tüm sisteminizdedir. Örneğin:
$ ls -li /bin | grep 53119771
53119771 -rwxr-xr-x 3 root root 26292 2010-08-18 10:15 bunzip2
53119771 -rwxr-xr-x 3 root root 26292 2010-08-18 10:15 bzcat
53119771 -rwxr-xr-x 3 root root 26292 2010-08-18 10:15 bzip2
Bunu görebilirsiniz bunzip2
, bzcat
ve bzip
hepsi aynı düğüm kullanıyoruz. Özünde, üç isim içeren bir dosyadır. Sen olabilir üç dosyanın kopyasını, ama neden var? Gereksiz yere sadece disk alanı kullanırdı.
/bin
, sanırım bu karışıklık kaynaklarından biri. Neden bazen çalıştırılabilir bağlantılar sembolize edilmiş ve bazen de - hardlinked?
Çok sayıda kullanım var. Bunları dosya tabanlı kilitler oluşturmak için kullanıyorum. Link (2) sistem çağrısı, diğer sistem çağrılarının çoğundan farklı olarak atomiktir.
Başka bir kullanım, disk alanı miktarını azaltmak için sabit bağlantılar kullanarak zaman içinde yedeklemelerin alındığı rsnapshot içindedir. Bir dosya değişmediyse, dosya dosyanın daha eski örneklerine bağlanırsa, değiştirilen dosyalar yeniden kopyalanır.
Bunları sunuculardaki yapılandırma dosyalarını değiştirmek için de kullanıyorum:, rm file.cfg && ln ~/tmp/file.cfg file.cfg
sonra ~ / tmp / * dosyaları güvenle silinebilir.
ln
ve rm
sadece bir yerine mv
?
Zaten mevcut olan birkaç iyi tartışmaya eklemek için ...
(inode, name)
çiftleri sabit bağları (haiz için dosya sisteminde hiçbir ekstra maliyeti olduğu anlamına gelir de, sürece biz daha (dizinlere diğer hardlinke önleyerek döngüleri engellemek olarak .
ve ..
(Bu başkasına lisp gibi hissetmeye başlıyor mu?)))bu yüzden onları bedavaya alıyoruz.
Muhtemelen sert bağlantıların bir tuzak senaryosunu kapsamalıyım . Sabit bir bağlantı, yalnızca orijinal bağlı dosya bulunduğu sürece farklı bir ad ve / veya farklı bir konumdaki dosyayla aynı olacaktır . Dosyayı "orijinal" olarak düşünmek bile doğru değildir: her ikisi de kendi başlarına dizin girdileridir ve her ikisi de (veya daha fazlası) hepsi eşit eşlerdir. Uzun ömürlü dosyalar için, bu bir lütuf olabilir, ancak çiftlerden biri silinir ve daha sonra aynı ad ve içeriğe sahip olsa bile, dosyalar ayrılır.
Diyelim ki /foo/myfile
bağlantı veren bir bağlantı oluşturdunuz /repo/myfile
. Her ikisi de aynı dosya verilerine işaret eder; birini değiştir, diğerini değiştir. Ancak /repo
bunun Git deposuna sahip olduğunu varsayalım . myfile
İçinde olmayan bir dalı teslim alırsanız /repo/myfile
silinir. Bu anda, çiftin diğerinin bağlantısı kesildiği anda olduğu gibi /foo/myfile
basit bir kopyası haline gelir /repo/myfile
. Dosya repertuarının değiştiği şubeler arasında gezinirken farketmemeniz bile kolay, ancak orijinal şubeyi teslim ettiğinizde yeni bir dosya/repo/myfile
Git tarafından oluşturulur. Dikkat etmediyseniz, iki dosyanın neden artık farklı içeriklere sahip olduklarını merak edersiniz, dosyalar arasındaki hard link ilişkisinin adları hakkında hiçbir fikri yoktur. Tersine, yumuşak bir bağlantı bu silme-yaratma döngüsü boyunca hayatta kalır.
Öte yandan, sabit bağlantılar kullanan yazılımlar bunun kesinlikle farkındadır ve Git bunun en iyi örneğidir. Git, aynı dosya sistemindeki bir havuzu neredeyse ücretsiz olarak klonlar; çünkü dosyaları kopyalamak yerine varsayılan olarak sabit bağlantılar kullanır. Git için hard link mükemmel bir kullanım durumudur, çünkü nesnesi ve paketi dosyaları asla değişmez, bu nedenle havuzun bir klonu diğerini hiçbir zaman değiştirmez (Git, değiştirilebilir dosyaları sabitlememeyi bilir) ve klonların herhangi biri olabilir herhangi bir önlem alınmadan silinir: hangisinin "orijinal" olduğunu ve gerçekte dosyaları içerdiğini izlemeye gerek yoktur : sabit bağlantıların herhangi biri eşit bir ortaktır ve tam dosyayı "içerir". Yumuşak bağlantılar burada işe yaramaz.
Sabit bağlantının bir başka avantajı, herhangi bir bağlantının dosya içeriğine erişimi kesmeden hareket ettirilebilmesidir. Yumuşak linklerle, orijinal dosyayı hareket ettirmek tüm yumuşak linkleri sarkan hale getirir.
Sonuç olarak, çoğu kullanımda ya bağlantı türünün eşit derecede iyi çalışması, ancak bazılarında veya diğerinin avantaj sağlamasıdır. Buradaki birçok cevapta belirtilen verimlilik, bir puny gömülü denetleyicinin bir FLASH yongası üzerindeki bir dosya sistemini temizlemediğiniz sürece, modern makineler ve dosya sistemleriyle ilgili çok az endişe vericidir. Fonksiyonel farklılıklar daha önemlidir ve genellikle mühendislik kısıtlamaları ve nihai seçim dikte:
Ayrıca, bir dosyayı silen kütüphane çağrısının unlink()
bir nedenden dolayı çağrıldığını işaret etmeliyim ! Her dizin girişi sadece başlangıçta kendi inode için tekil bir hard link.