Sembolik bir bağlantı ile sabit bir bağlantı arasındaki fark nedir?


768

Son zamanlarda bana bir iş görüşmesi sırasında sordum. Dürüst oldum ve sembolik bir bağlantının nasıl davrandığını ve nasıl oluşturulacağını bildiğimi söyledim, ancak sert bir bağlantının kullanımını ve sembolik bir bağlantının nasıl farklı olduğunu anlamıyorum.


2
'bir sabit bağlantının kullanımını anlamıyorum' hakkında, ikili kopyaların çoğunu yapan yapı sistemlerinde kullanılabilir. Gerçek kopyalama yerine sabit bağlantı oluşturmak işleri hızlandırır. MSBuild 4.0 bunu desteklemektedir.
Ankush

13
Bu bağlantıyı anlamak için çok yararlı buluyorum. askubuntu.com/questions/108771/…
kta

2
unix.stackexchange, mermi noktalarının iyi bir listesine sahiptir ... çok yararlı çünkü tüm kısıtlamaları çok kısaca ortaya koyuyor ve yağlanması kolay. (bu mermi noktalarının birçoğu, yalnızca bu sorunun yorumlarında bahsedilen kenar davalarını / uyarıları kapsar ... veya hiç bahsedilmiyor)
Trevor Boyd Smith

Yanıtlar:


780

Dosya sisteminin altında, dosyalar inode ile temsil edilir. (Yoksa birden fazla inode mu? Emin değilim.)

Dosya sistemindeki bir dosya temel olarak bir inode bağlantısıdır.
Sabit bir bağlantı, o zaman, aynı temel inode bağlantısına sahip başka bir dosya oluşturur.

Bir dosyayı sildiğinizde, temeldeki inode bağlantısından bir bağlantı kaldırılır. İnode sadece inode bağlantılarının tümü silindiğinde silinir (veya silinebilir / yazılabilir).

Sembolik bağlantı, dosya sistemindeki başka bir ada bağlantıdır.

Sabit bağlantı yapıldıktan sonra bağlantı inode'dur. Orijinal dosyayı silmek, yeniden adlandırmak veya taşımak, temeldeki inode ile bağlantı kurduğu için sabit bağlantıyı etkilemez. Inode üzerindeki verilerde yapılan herhangi bir değişiklik, o inode'a başvuran tüm dosyalara yansıtılır.

Not: Sabit bağlantılar yalnızca aynı Dosya Sistemi içinde geçerlidir. Sembolik bağlantılar, dosya sistemlerini başka bir dosyanın adı oldukları için kapsayabilir.


2
Eminim i-düğümleri işletim sisteminin belirli bir varyantına bağlıdır; ancak, genellikle tek bir i-düğüm olduğuna inanıyorum. İ-düğümü dosya hakkında bilgi ve verilerin diskte nerede saklandığı hakkında bilgi içerir. Büyük dosyaların ek tablolara dolaylı işaretçileri olacaktır.
terson

76
Sembolik bağlantıların dosya sistemlerini geçebileceği, sabit bağlantıların yapamayacağı yararlı özelliği eklemek isteyebilirsiniz (aynı dosya sistemindeki bir dosyaya başvurmaları gerekir).
paxdiablo


1
Ayrıca bazı okuma ve deneylerden sonra bir blog yazdım csharpbsharp.tumblr.com
Adnan Bhatti

1
@zen: Bir dosya sistemini kullanılmadığı zaman bağlantısını kesebilir / yeniden monte edebilirsiniz. Kök bölüm için bu biraz zor ama yapılabilir (tavsiye edilmez). Kök için bunu yapmak için öncelikle bir yeniden başlatma CD'sinin önyüklemesi en iyisidir, önce bağları değiştirin ve yeniden önyükleyin. Ancak bu tür bir soruyu süper kullanıcı hakkında sormalısınız.
Martin York

464

Herhangi bir Linux (ish) konsolunu kullanarak yardımcı olabilecek bazı güzel sezgi.

İki dosya oluşturun:

$ touch foo; touch bar

Bunlara bazı Veriler girin:

$ echo "Cat" > foo
$ echo "Dog" > bar

(Aslında, ilk etapta yankı kullanabilirdim, çünkü eğer yoksa dosyaları yaratırlar ... ama bunu boş verin.)

Ve beklendiği gibi:

$cat foo; cat bar
Cat
Dog

Sert ve yumuşak bağlantılar oluşturalım:

$ ln foo foo-hard
$ ln -s bar bar-soft

Bakalım ne oldu:

$ ls -l

foo
foo-hard
bar
bar-soft -> bar

Foo'nun adını değiştirmek önemli değil:

$ mv foo foo-new
$ cat foo-hard
Cat

foo-hard, dosyanın değiştirilmemiş olan inode, içeriğini, işaret eder.

$ mv bar bar-new
$ ls bar-soft
bar-soft
$ cat bar-soft  
cat: bar-soft: No such file or directory

Yumuşak bağlantı, içeriği değil, adı değiştirdiğinden dosyanın içeriği bulunamadı.

Aynı şekilde, foosilinirse, foo-hardiçeriği hala tutar; eğer barsilinir, bar-softvar olmayan bir dosyaya sadece bir bağlantıdır.


12
bu bir "dosya" ve "sabit bağlantı" nın aynı olduğunu ima ediyor mu, ikisi de bir inode işaret ediyor mu? dosya veya sabit bağlantı silinirken, biri hala inode doğru işaret ettiği sürece içerik var mı?
Daniel W.

1
@DanFromGermany Doğru. En az bir sabit bağlantı (yani dosya) işaret ettiği sürece içeriğe ulaşılabilir.
Adam Matan

6
touch blah1; touch blah2kısaltılabilirtouch blah1 blah2
Dmitri Zaitsev

11
@DmitriZaitsev Doğru, ancak yeni başlayanlar IMO için daha az okunabilir olacak.
Adam Matan

8
Bence bu, okuduğum birçok cevaba göre en iyi anlaşılabilir cevap. Bir örnek, açıklama metninden daha iyidir.
Scott Chu

435

Söyledikçe, bir resim bin kelimeye bedeldir. İşte nasıl görselleştirmek:

resim açıklamasını buraya girin

Bu resme nasıl ulaşacağız:

  1. myfile.txtDosya sisteminde yeni bir inode işaret eden bir ad oluşturun (dosyanın meta verilerini içerir ve içeriğini içeren veri bloklarını, yani "Merhaba, Dünya!" Metnini gösterir:

    $ echo 'Hello, World!' > myfile.txt
    
  2. my-hard-linkDosyaya sabit bir bağlantı oluşturun myfile.txt, yani "aynı inode'yu göstermesi gereken bir dosya oluşturun myfile.txt":

    $ ln myfile.txt my-hard-link
    
  3. my-soft-linkDosyaya yumuşak bir bağlantı oluşturun myfile.txt, yani "dosyayı göstermesi gereken bir dosya oluşturun myfile.txt":

    $ ln -s myfile.txt my-soft-link
    

Eğer myfile.txtsilinirse (veya taşınırsa) şimdi ne olacağını görün : my-hard-linkhala aynı içeriği gösterir ve bundan etkilenmez, oysa my-soft-linkşimdi hiçbir şeye işaret etmez. Diğer cevaplar her birinin artılarını / eksilerini tartışıyor.


3
@ThunderWiring "Nokta" ile, bağlantı referansları ne olursa olsun kastediyorum. Sabit bir bağlantı söz konusu olduğunda, doğrudan bir inode'a (yani başvuruda bulunulan aynı inode myfile.txt) başvurur . Yumuşak bağlantı için, referans inode değil (verileri içeren), ancak referans myfile.txt(örneğin /home/Documents/myfile.txt) için dosya sistemi yolu
akivajgordon

4
@Akivajgordon görsel tepkinizi gerçekten çok seviyorum - farkları daha iyi anlamama yardımcı oldu!
wmock

7
On bin kelime!
SaganRitual

13
Belki yavaşım, ama resminiz yaklaşık 2 saniyede 20 yıllık gizemi temizledi.
jdk1.0

3
En faydalı cevap, bu yazıya bu kadar derinden gömülmüş bir kızım. Sana yüz internet puanı verirdim ama ne yazık ki sadece bir tane verebilirim.
Dagrooms

71

Sabit bağlantılar, orijinal dosya taşındığında yararlıdır. Örneğin, bir dosyayı / bin'den / usr / bin'e veya / usr / local / bin'e taşımak. / Bin içindeki dosyaya herhangi bir sembolik bağlantı bu şekilde bozulur, ancak dosyanın doğrudan inode'una bir bağlantı olan bir sabit bağlantı umursamaz.

Sabit bağlantılar, yalnızca bir dizin girdisi aldıklarından daha az disk alanı kaplayabilir;

Sabit bağlantıların da çözülmesi daha az zaman alır - sembolik bağlantılar, sembolik dizinlerde bulunan diğer sembollere işaret edebilir. Bunlardan bazıları NFS veya diğer yüksek gecikmeli dosya sistemlerinde olabilir ve bu nedenle ağ trafiğinin çözümlenmesine neden olabilir. Sabit bağlantılar, her zaman aynı dosya sisteminde olmakla birlikte, her zaman tek bir aramada çözümlenir ve hiçbir zaman ağ gecikmesini içermez (bir NFS dosya sisteminde bir sabit bağlantıysa, NFS sunucusu çözünürlüğü yapar ve istemci sistemi). Bazen bu önemlidir. Benim için değil, bunun önemli olabileceği yüksek performanslı sistemler hayal edebiliyorum.

Ayrıca mmap (2) ve hatta open (2) gibi şeyler, bir dosyanın inode'unu aktif tutmak için hardlinklerle aynı işlevselliği kullandığını düşünüyorum, böylece dosya bağlantısı kaldırılsa bile (2), inode, işlemin sürekli erişime izin vermek için kalır ve sadece işlem kapandığında dosya gerçekten kaybolur. Bu, daha güvenli geçici dosyalara izin verir (açık ve bağlantıyı atomik olarak gerçekleştirirseniz, hatırlamadığım bir POSIX API olabilir, o zaman gerçekten güvenli bir geçici dosyaya sahip olabilirsiniz) verilerinize kimse erişemez. / Proc herkese dosya tanımlayıcılarınıza bakma yeteneği vermeden önce doğruydu, ama bu başka bir hikaye.

Bundan bahsetmişken, A işleminde açık, ancak dosya sisteminde bağlantısı kaldırılmış bir dosyayı kurtarmak, inode bağlantılarını yeniden oluşturmak için sabit bağlantıların kullanılması etrafında döner, böylece açık olan işlem kapatıldığında veya kaybolduğunda dosya kaybolmaz.


35

Yumuşak Bağlantı :

yumuşak veya sembolik orijinal dosya için bir kısayol daha .... orijinali silerseniz, kısayol başarısız olur ve sadece kısayolu silerseniz orijinal hiçbir şey olmaz.

Yumuşak bağlantı Sözdizimi :ln -s Pathof_Target_file link

Çıktı : link -> ./Target_file

İspat: readlink link Ayrıca ls -l linkçıktıda , dosyanın yumuşak bir bağlantı olduğunu gösteren ilk harfi llrwxrwxrwx olarak görürsünüz .

Bağlantı siliniyor: unlink link

Not: İsterseniz, softlink'iniz geçerli dizinden başka bir yere taşıdıktan sonra bile çalışabilir. Yumuşak bağlantı oluştururken göreceli değil mutlak yol verdiğinizden emin olun. yani (/ root / kullanıcı / Hedef_dosyasından başlayıp. / Hedef_dosyasından)

Sabit Bağlantı:

Sabit bağlantı daha çok bir ayna kopyası veya aynı dosyaya giden birden çok yoldur. Dosya1'e bir şey yapın ve dosya 2'de görünür. Birini silmek hala diğerini korur.

Inode (veya dosya) yalnızca tüm (sabit) bağlantılar veya (aynı dosya) inode'a giden tüm yollar silindiğinde silinir.

Bir sabit bağlantı yapıldıktan sonra, bağlantı orijinal dosyanın inode'una sahiptir. Orijinal dosyanın yeniden adlandırılması veya taşınması, temeldeki inode bağlantı verdiği için sabit bağlantıyı etkilemez. Inode üzerindeki verilerde yapılan herhangi bir değişiklik, o inode'a başvuran tüm dosyalara yansıtılır.

Sabit Bağlantı sözdizimi :ln Target_file link

Çıktı: Targetfile ile aynı inode numarasına sahip ad bağlantısına sahip bir dosya oluşturulur.

İspat: ls -i link Target_file (inodelarını kontrol edin)

Bağlantıyı silme: rm -f link (Bağlantıyı normal bir dosya gibi sil)

Not : Sembolik bağlantılar, dosya sistemlerini başka bir dosyanın adı oldukları için kapsayabilir. Sabit bağlantılar sadece aynı Dosya Sistemi içinde geçerlidir.

Sembolik bağlantıların bazı özellikleri vardır, sabit bağlantılar eksik:

  • Sabit bağlantı, dosya içeriğine işaret eder. Yumuşak bağlantı ise dosya adını gösterir.
  • sabit bağlantının boyutu içeriğin boyutu iken, yumuşak bağ dosya adı boyutuna sahipken.
  • Sabit bağlantılar aynı inode'u paylaşır. Yumuşak bağlantılar yapmaz.
  • Sabit bağlantılar dosya sistemlerini geçemez. Yumuşak bağlantılar yapar.
  • Sabit bağlantılarla sembolik bir bağlantının nereye işaret ettiğini hemen bilirsiniz, aynı inode'u paylaşan dosyaları bulmak için tüm dosya sistemini keşfetmeniz gerekir.

    # find / -inum 517333

    /home/bobbin/sync.sh
    /root/synchro
    
  • sabit bağlantılar dizinleri gösteremez.

Sabit bağlantıların iki sınırlaması vardır:

  • Dizinler birbirine bağlanamaz. Linux, dizinlerin döngüsel olmayan ağaç yapısının korunmasına izin vermez.
  • Sabit bir bağlantı, dosya sistemlerinde oluşturulamaz. Her iki dosya da aynı dosya sistemlerinde olmalıdır, çünkü farklı dosya sistemleri farklı bağımsız inode tablolarına sahiptir (farklı dosya sistemlerindeki iki dosya ancak aynı inode numarasına sahip farklı olacaktır).

3
msgstr "sabit bağlantının boyutu içeriğin boyutu iken, yumuşak bağ dosya adı boyutuna sahipken." Sadece açıklığa kavuşturmak için, başka bir sabit bağlantı yapmak boş alanı sadece birkaç bayt etkiler.
Ingo

34

Sabit bağlantı ile sembolik bağlantı arasındaki farkı görmenin basit bir yolu basit bir örnektir. Bir dosyaya yapılan sabit bağlantı, dosyanın depolandığı yeri veya o dosyanın inode'unu gösterir. Sembolik bir bağlantı asıl dosyanın kendisine işaret eder.

Yani "a" adında bir dosyamız varsa ve "b" sabit bağlantısı ve "a" sembolik bağlantısı "c" oluşturursak:

echo "111" > a
ln a b
ln -s a c

"A", "b" ve "c" çıktıları şöyle olacaktır:

cat a --> 111
cat b --> 111
cat c --> 111

Şimdi "a" dosyasını kaldıralım ve "a", "b" ve "c" çıktılarına ne olduğunu görelim:

rm a
cat a --> No such file or directory
cat b --> 111
cat c --> No such file or directory

Peki ne oldu?

"C" dosyası "a" dosyasını işaret ettiğinden, "a" dosyası silinirse "c" dosyasının göstereceği hiçbir şey olmaz, aslında da silinir.

Ancak, "b" dosyası "a" dosyasının bulunduğu yeri veya inode'u gösterir. Dolayısıyla, "a" dosyası silinirse, artık inode işaret etmeyecektir, ancak "b" dosyası yapıldığından, inode artık daha fazla sabit bağlantı göstermeyene kadar "a" ya ait olan içeriği depolamaya devam edecektir.


Bir dosyanın çok soyut bir nesne olduğunu ve tüm soyut şeylerle sahip olduğunu, yüksek seviyeli uygulamaların gerçek niyetinin soyutlamaları uçurma riski olmadan uygun açıklamanın yetersiz olabileceğini belirtmek yararlı olabilir.
Cholthi Paul Ttiopic

28

Sembolik bağlantılar bir yol adına bağlanır. Bu, bir sistemin dosya ağacında herhangi bir yerde olabilir ve bağlantı oluşturulduğunda var olması bile gerekmez. Hedef yol göreceli veya mutlak olabilir.

Sabit bağlantılar bir inode için ek işaretçilerdir, yani yalnızca hedefle aynı hacimde var olabilirler. Bir dosyaya ek sabit bağlantılar, bir dosyaya başvurmak için kullanılan "orijinal" addan ayırt edilemez.


Ayrıca, bağlandığınız dosyayı kaldırdığınızda, sembolik bir bağlantı kopar, sabit bir bağlantı geçerli kalır, çünkü dosyayı dosya sisteminde "tutar".
njsf

21

Sizi Wikipedia'ya yönlendiririm:

Birkaç nokta:

  • Symlinks, sabit bağlantıların aksine, dosya sistemlerini geçebilir (çoğu zaman).
  • Simgeler dizinleri gösterebilir.
  • Sabit bağlantılar bir dosyayı işaret eder ve aynı dosyaya birden fazla adla başvurmanızı sağlar.
  • En az bir bağlantı olduğu sürece veriler hala kullanılabilir.

1
Teoride (ve bazı durumlarda pratikte bile) sabit bağlantılar dizinlere de işaret edebilir (aslında "." Geçerli dizine sabit bir bağlantıdır ve ".." ana dizine sabit bir bağlantıdır). Ancak tehlikeli olabilirler, bu nedenle UNIX'lerin çoğu onlara izin vermez (veya bunu yapmak için özel adımlar atmanızı gerektirir). Apple bunları zaman makinesi uygulamaları için kullanıyor: earthlingsoft.net/ssp/blog/2008/03/x5_time_machine
Joachim Sauer

3
Bir makalenin bağlantısını işaret ediyorsunuz ... bu sizi sembolik bir bağlantı yapıyor mu?
Ian Campbell

@JoachimSauer Yeni Apple dosya sisteminin Time Machine'in dizinlere sabit bağlantılar kullanma ihtiyacını ortadan kaldıracağını düşünüyor musunuz?
cjm

Vikipedi'nin açıklamasını en iyi yanıtlardaki açıklamalardan önemli ölçüde daha kısa ve daha somut buldum.
lakesare

9

Sabit bağlantılar, artımlı yedeklemeler yaparken çok kullanışlıdır. Örneğin rsnapshot'a bakın . Fikir sabit bağlantıları kullanarak kopya yapmaktır:

  • yedek numarasını n'den n + 1'e kopyala
  • yedek kopya n - 1'den n'ye
  • ...
  • yedeklemeyi 0 yedek 1'e kopyala
  • yedek 0'ı değiştirilen dosyalarla güncelleyin.

Yeni yedek, yaptığınız değişikliklerin dışında fazladan yer kaplamaz, çünkü tüm artımlı yedeklemeler değişmemiş dosyalar için aynı inode kümesine işaret edecektir.


6

Sert bağlantı ve Yumuşak bağlantı

Sert bağlantı Vs Yumuşak bağlantı bu görüntü ile kolayca açıklanabilir.


5
Sanırım yumuşak bağlantı resminiz doğru değil. Nokta: yumuşak bağlantının inode'u orijinal dosyanın inode'unu göstermemelidir. Çünkü orijinal dosyayı yeniden adlandırırsanız, ilgili yazılım bağlantısı
kesilir

@ percy507 evet haklısın - ama yine de çok hoş ve sezgisel bir açıklama buluyorum. Sadece inodlar arasındaki okun orada olmadığını hayal edin ...
Michael Litvin

5

Nick'in sorusunu ekliyorum: sabit bağlantılar ne zaman yararlı veya gerekli? Aklıma gelen, sembolik bağlantıların işi yapamayacağı tek uygulama, köklü bir ortamda bir sistem dosyasının bir kopyasını sağlamaktır.


Farklı sistemlerde farklı yerlerde montaj noktaları ile dağıtılmış sistem. Tabii ki, bu tutarlı olarak sistemden tasarlanabilir.
terson

@Tanktalus'un harika bir örnek verdiğini düşünüyorum.
Nick Stinemates

4

Gönderen MSDN ,

Sembolik bağlantı

Sembolik bağlantı, başka bir dosya sistemi nesnesine işaret eden bir dosya sistemi nesnesidir. İşaret edilen nesneye hedef denir.

Sembolik bağlantılar kullanıcılar için şeffaftır; bağlantılar normal dosyalar veya dizinler olarak görünür ve kullanıcı veya uygulama tarafından aynı şekilde kullanılabilir.

Sembolik bağlantılar UNIX işletim sistemleriyle taşıma ve uygulama uyumluluğuna yardımcı olmak için tasarlanmıştır. Microsoft, sembolik bağlantılarını tıpkı UNIX bağlantıları gibi işlev görmek üzere uyguladı.

Sembolik bağlantılar mutlak veya göreli bağlantılar olabilir. Mutlak bağlantılar, yol adının her bir bölümünü belirten bağlantılardır; göreli bağlantılar, göreli bağlantı belirticilerinin belirtilen bir yolda olduğu yere göre belirlenir

Mutlak Sembolik Bağlantı örneği

X: "C:\alpha\beta\absLink\gamma\file"
Link: "absLink" maps to "\\machineB\share"
Modified Path: "\\machineB\share\gamma\file"

Göreli Sembolik Bağlantılara bir örnek

X: C:\alpha\beta\link\gamma\file
Link: "link" maps to "..\..\theta"
Modified Path: "C:\alpha\beta\..\..\theta\gamma\file"
Final Path: "C:\theta\gamma\file"

Sabit bağlantı

Bir sabit bağlantı birden fazla yol tek bir dosya başvuran hangi bir dosyanın dosya sistemi temsilidir aynı hacimde .

Pencerelerde sabit bağlantı oluşturmak için bağlantının oluşturulacağı yere gidin ve bu komutu girin:

mklink /H Link_name target_path

Sabit bağlantıları, oluşturuldukları sıradan bağımsız olarak herhangi bir sırayı silebileceğinizi unutmayın. Ayrıca, aşağıdaki durumlarda sabit bağlantılar oluşturulamaz

  • referanslar farklı yerel sürücülerde
  • referanslar ağ sürücüsünü içerir. Başka bir deyişle, referanslardan biri bir ağ sürücüsüdür
  • oluşturulacak sabit bağlantı hedefle aynı yolda

Kavşak noktası

NTFS, bağlantı adı verilen başka bir bağlantı türünü destekler. MSDN bunu şu şekilde tanımlar:

Bir bağlantı (yumuşak bağlantı olarak da adlandırılır), başvuruda bulunduğu depolama nesnelerinin ayrı dizinler olması ve bir bağlantı , aynı bilgisayardaki farklı yerel birimlerde bulunan dizinleri bağlayabilmesinden dolayı sabit bağlantıdan farklıdır . Aksi takdirde, kavşaklar sert bağlantılarla aynı şekilde çalışır.

Sabit bağlantı bölümü ve bağlantı bölümündeki kalın bölümler, ikisi arasındaki temel farkı gösterir.

Pencerelerde bir bağlantı oluşturma, bağlantının oluşturulacağı yere gidin ve ardından şunu girin:

mklink /J link_name target_path

3

Ayrıca:

  1. Sabit bağlantıların okuma performansı sembolik bağlantılardan (mikro performans) daha iyidir
  2. Sembolik linkler kopyalanabilir, versiyon kontrollü, vb. Başka bir deyişle, bunlar gerçek bir dosyadır. Öte yandan, bir sabit bağlantı biraz daha düşük bir seviyede ve sembolik bağlantılara kıyasla, sabit bağlantılar ile normal dosyalar olarak değil, sabit bağlantılar ile çalışmak için araçlar sağlayan daha az araç olduğunu göreceksiniz.

3

Basitçe, Sabit bağlantı: sadece bir dosyaya yeni ad eklemek, yani bir dosyanın aynı anda birçok adı olabilir, tüm adlar birbirine eşittir, hiç kimse tercih edilmez, Sabit bağlantı tüm içeriği kopyalamak anlamına gelmez ve yeni dosya yapmak değil, sadece bilinmesi için alternatif bir isim oluşturmak ..

Sembolik bağlantı (symlink): başka bir dosyaya yönelik bir dosya tanıtıcısıdır; sembolik bağlantı daha sonra silinmiş olan varolan bir dosyayı işaret ediyorsa, ad artık herhangi bir dosyayı adlandırmasa da sembolik bağlantı aynı dosya adını göstermeye devam eder.


3

Sıradan bir "dosya" olarak düşündüğünüz şey aslında iki ayrı şeydir: Bir dosyanın verileri ve bir dizin girişi. Bir dosya için sabit bir bağlantı oluşturduğunuzda, aslında aynı verilere karşılık gelen ikinci bir dizin girdisi oluşturursunuz. Her iki dizin girişi de aynı işlevselliğe sahiptir; her biri dosyayı okumak için açmak için kullanılabilir. Yani gerçekten "bir dosya artı bir sabit bağlantınız" yok, "iki dizin girişli dosya verileriniz" var. Bir dosyayı silmek olarak düşündüğünüz şey aslında bir dizin girişini siler ve verilerin son dizin girişi silindiğinde, verilerin kendisi de silinir. Yalnızca bir dizin girişi olan normal dosyalar için, dizin girişini silmek verileri her zamanki gibi siler. (Bir dosya açılırken işletim sistemi dosyaya geçici bir bağlantı oluşturur,

Örnek olarak, bir A.txt dosyası, bir sabit bağlantı B.txt dosyası oluşturun ve A.txt dosyasını silin. A.txt oluşturduğunuzda, bazı veriler ve A.txt dizin girişi oluşturuldu. Sabit bağlantıyı oluşturduğunuzda, aynı verileri işaret eden başka bir dizin girişi B.txt oluşturuldu. A.txt dosyasını sildiğinizde, yine de ilk başta bir B.txt dosyası oluşturmuş gibi, tüm verilere ve tek bir dizin girdisi B.txt'ye sahip olursunuz.

Yazılım bağlantısı, veri içermemesi dışında başka bir dizin girişinin yolu olması dışında yalnızca (neredeyse) sıradan bir dosyadır. Geçici bağlantının başvurduğu dosyayı silerseniz, geçici bağlantı artık bir dizin girdisine işaret etmeyen bir yol içerir; o kırık. Elektronik bağlantıyı silerseniz, başka bir dosyayı silmek gibi, işaret ettiği dosya etkilenmez.


2

Bir dizin girişi bir structrue bağlantısıdır:

struct dentry{
    ino_t ino;
    char  name[256];
}

ino inode sayısı, isim dosya adı, inode yapısı belki : gibi

struct inode{
      link_t nlink; 
      ...
}

örneğin bir dosya / 1 oluşturursanız, dizin girişi şöyle olabilir:

struct dentry{
     ino_t ino; /* such as 15 */
     char  name[256]; /* "1" */
} 

inode yapısı belki şöyle olabilir:

   struct inode{ /* inode number 15 */
         link_t nlink; /* nlink = 1 */
         ...
    }

sabit bir bağlantı oluşturursanız (/ 100 olabilir), dizin girdisi şöyle olabilir:

  struct dentry{
     ino_t ino; /* 15 */
     char  name[256]; /* 100 */
  }

inode yapısı belki şöyle olabilir:

   struct inode{ /* inode numebr 15 */
         link_t nlink; /* nlink = 2 */
         ...
    }

daha sonra dosya 1'e sembolik bir bağlantı (/ 200 olabilir) oluşturursunuz, dizin girişi şöyle olabilir:

  struct dentry{
        ino_t ino; /* such as 16 */
        char  name[256]; /* "200" */
  }

inode yapısı belki şöyle olabilir:

   struct inode{ /* inode number 15 */ 
         link_t nlink; /* nlink = 2 */
         ...
    }

   struct inode{ /* inode number 16 */
         link_t nlink; /* nlink = 1 */
         ...
    } /* the data of inode 16 maybe /1 or 1 */

2

Yukarıdaki tüm cevaplara ek olarak, hardlink ve softlink dosyasını bulma farkı aşağıdaki gibi anlaşılabilir:

f6Geçerli dizinde bir dosya yanı sıra adlı bir dizin var t2.

Dosya isimlendirilmiş f1ve ./t2/f2sembolik linklerdir f6.

Dosya adlı f7ve ./t2/f8sabit bağlantıları vardır f6.

Yumuşak ve sert bağlantı bulmak için şunları kullanabiliriz:

$ find -L . -samefile f6 

> ./f1
> ./f6
> ./f7
> ./t2/f2
> ./t2/f8

Yalnızca sabit bağlantıyı bulmak için şunu kullanabiliriz:

$ find . -xdev -samefile f6

> ./f6
> ./f7
> ./t2/f8

Sabit dosyalar aynı dosya sisteminde oluşturulabildiğinden , aynı dosya sisteminde / bağlama noktasında -Lkullanılan ( -xdevisteğe bağlı) seçenek olmadan tüm sabit bağlantıları arayabiliriz . Gereksiz aramayı farklı bağlama noktalarına kaydeder.

Bu nedenle, hardlink aramak, softlinkleri aramaktan biraz daha hızlıdır (Lütfen yanlış olduğumu veya net olmadığımı düzeltin).


1

Sembolik bağlantılar, dosyaya sabit bağlantılara benzer şekilde başka bir ad verir. Ancak, kalan sembolik bağlantılar olsa bile bir dosya silinebilir.


Hayır. Symlink "aynı dosya için başka bir ad" değil, kendi başına, hedef dosyaya bağlanan bir dosyadır.
Kusalananda

1

Kullanımdaki iki sentim:

Yazılım bağlantıları uzun yol adlarını kısaltmak için kullanılabilir, yani:

ln -s /long/folder/name/on/long/path/file.txt /short/file.txt

/short/file.txtÜzerinde yapılan değişiklikler orijinal dosyaya uygulanır.

Sabit bağlantılar büyük dosyalar arasında gezinmek için kullanılabilir:

$ ls -lh /myapp/dev/
total 10G
-rw-r--r-- 2 root root 10G May 22 12:09 application.bin

ln /myapp/dev/application.bin /myapp/prd/application.bin

Farklı klasöre anında kopyalama ve orijinal dosya (açık /myapp/dev), dosyaya dokunmadan taşınabilir veya silinebilir/myapp/prd


0

Ben sadece ortak bir senaryoda, yazılım yükleme sabit bağlantıları anlamak için kolay bir yol buldum.

Bir gün Downloadskurulum için klasöre bir yazılım indirdim. Ben yaptıktan sonra sudo make install, bazı yürütülebilir dosyalar cpyerel bin klasörüne düzenlenmiştir. Burada, sabit bağlantıcp oluşturur . Yazılımdan memnun kaldım ama kısa sürede bunun uzun vadede iyi bir yer olmadığını fark ettim . Bu yüzden yazılım klasörünü dizine düzenledim. Eh, Windows'ta olduğu gibi herhangi bir hedef bağlantı şeyi hakkında endişelenmeden yazılımı daha önce olduğu gibi çalıştırabilirim. Bu, sabit bağlantının doğrudan inode ve çevresindeki diğer dosyaları bulduğu anlamına gelir .Downloadsmvsource


0

Bu cevapta bir dosya söylediğimde hafızadaki konum demek istiyorum

Kaydedilen tüm veriler inode adı verilen bir veri yapısı kullanılarak bellekte saklanır. Her inode inodenumber içerir. İnode numarası inode'a erişmek için kullanılır. Tüm sabit bağlantılar aynı inodenumber'a (aynı inode'a erişen) sahip olduğundan, hepsi aynı fiziksel belleğe işaret eder.

Sembolik bağlantı özel bir tür dosyadır.Ayrıca bir dosya olduğundan bir dosya adı ve bir inode numarası olacaktır. Yukarıda belirtildiği gibi inode numarası verilere işaret eden bir inode'a erişir.Şimdi sembolik bir bağlantıyı özel yapan şey sembolik bağlantılardaki inodenumbers, başka bir dosyaya "yol" u gösteren inode'lara erişir.Daha özel olarak sembolik bağlantıdaki inode numarası, başka bir sabit bağlantıya işaret eden inodelara erişir.

GUI'de bir dosyayı taşırken, kopyalarken, silerken fiziksel bellekle değil, dosyanın hardlink'leriyle oynarız. bir dosyayı sildiğimizde dosyanın hardlinkini siliyoruz. Fiziksel belleği silmiyoruz. dosyadaki tüm hardlinkler silinirse, hafızada hala mevcut olmasına rağmen saklanan verilere erişmek mümkün olmayacaktır.

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.