Neden sert bağlantılar var?


Yanıtlar:


56

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 -iseçeneği lssize 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, mvve rmhepsi 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 mvzaten 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.


4
Hakkında "Bağlantı aynı zamanda bağlantı metnini tutmak için disk üzerinde az miktarda yer kaplar." Modern dosya sistemlerinde, bağlantı yolunu saklamak için fazladan alan kullanılmaz, çünkü dizin girişi kendisini saklamak için kullanılır, en azından isim sığmayacak kadar uzun değilse. Buna "hızlı sembolik
çizgiler

Bazı uygulamaların yumuşak (sym) bağlantıların nasıl işleneceğini bilmediğini ve bu nedenle aynı bağlantıların aynı veri / yapılandırma dosyalarına başvurarak fazla yapılandırmalardan kaçınmak için yararlı olabileceğini de ekleyeceğim. Bir örnek, sembolik linkli pk3 dosyalarını takip edemeyen, ancak hardlinked pk3 dosyalarını takip edebilen ioquake3'tür.
gaborous

3
Ayrıca, bir link link hedefini silerseniz, dosya gider ve link link bozulur. Sabit bir bağlantı ile var olmayan bir sorun.
spektrumlar

1
Ancak, sert linklerde bir bilgi de var - isimleri. Bu yüzden yer kaplaması gerekiyordu.
Josef Klimuk

39

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 .


12

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 rmdosya 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, bzcatve bziphepsi 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ı.


12
Ama aynı zamanda bir takım sembolik bağlantılar var /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?
Dmitry Pashkevich

16
Bu cevap, yumuşak bağlantılar üzerinden sabit bağlantılar kullanmak için herhangi bir sebep vermemektedir.
Mark Amery

8

Ç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.cfgsonra ~ / tmp / * dosyaları güvenle silinebilir.


1
Neden ayrı lnve rmsadece bir yerine mv?
Tommiie

6

Zaten mevcut olan birkaç iyi tartışmaya eklemek için ...

  • Programlara kaynak erişiminin unix'te (yani "her şey bir dosyadır" ) uygulanma şekli , bir dosyanın birden fazla başvuruyu işleme altyapısının işletim sisteminin çalışabilmesi için gerekli olduğu anlamına gelir, bu nedenle burada ek bir maliyet yoktur.
  • Yolu dizinleri (orijinal unix dosya sistemi uygulanmıştır yani sabit bir biçim listesi (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.


2

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/myfilebağ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 /repobunun Git deposuna sahip olduğunu varsayalım . myfileİçinde olmayan bir dalı teslim alırsanız /repo/myfilesilinir. Bu anda, çiftin diğerinin bağlantısı kesildiği anda olduğu gibi /foo/myfilebasit 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/myfileGit 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:

  • Yumuşak bağlantı kopacakken, "kaynak" sabit bağlantısı güvenli bir şekilde hareket ettirilebilir.
  • Sabit bağlantı, bağlandığı dosyadan ayırt edilemez ve dosya, sabit bağlantılardan herhangi biri hayatta olduğu sürece canlıdır; yumuşak bağlantı asimetriktir.
  • Sabit bağlantılı eş, silinir ve yeniden oluşturulursa bağlantılı grubun dışına çıkar, ancak yumuşak bağlantı hedefini kaybetmez.
  • Yumuşak bağlantı dosya sistemlerini geçebilir, zor bağlantı yapamaz.
  • Yumuşak link bir dizine işaret edebilir, sert link genellikle olamaz (ve hemen hemen her zaman olmamalıdır).

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.

Sitemizi kullandığınızda şunları okuyup anladığınızı kabul etmiş olursunuz: Çerez Politikası ve Gizlilik Politikası.
Licensed under cc by-sa 3.0 with attribution required.