Bir sabit link ile sembolik link arasındaki fark nedir?


488

Başlığın dediği gibi, bir sabit bağlantı ile komut tarafından oluşturulan yumuşak bağlantı arasındaki farkı bilmek istiyorum ln. Komut man lnbilgi veriyor, ancak sorumu yeterince cevaplamıyor.

Ayrıca, birisinin sembolik bir bağlantı üzerinden sert bağlantının tercih edilebileceği bir ortam sağlaması iyi olurdu.


15
farklılıklardan biri ... bazı dosyalarınız var, örneğin dosya testi. Ln testi hardlinkini yaparsanız, ln -s testi sembolik linkini yapın ve daha sonra dosya testini diğer dizine taşıyın (veya yeniden adlandırın), sembolik link çalışmaz. Hardlink çalışacak. Şimdi dosya testini silmeyi deneyin. Hardlink hala işe yarayacak, aslında hala dosyaya ulaşabilecek hardlinks sayısı 0 olana kadar dosyalara
erişebileceksiniz

5
Bunu yeniden açtım, çünkü bu konuda iyi bir jenerik cevabı hak ediyor (belirsiz bir C örneği olan önceki sorunun aksine).
Oli


1
Ayrıca oldukça eksiksiz bir cevap: stackoverflow.com/questions/185899/…
Elzo Valugi

@AbhishekBhatia videoya ulaşılamıyor
Ooker

Yanıtlar:


59

Linux / Unix'te Kısayollar Bağlantılar olarak bilinir.


Bağlantı iki türdür: yumuşak bağlantılar (sembolik bağlantılar) veya sert bağlantılar.

  1. Yumuşak linkler (sembolik linkler)

    Dosyalara ve dizinlere bağlantılar oluşturabilir, farklı bölümlerde ve orijinalden farklı bir inode numarasına sahip bağlantılar (kısayollar) oluşturabilirsiniz.

    Eğer gerçek kopyası silinir, bağlantı çalışmaz .

  2. Sabit bağlantılar

    Sabit bağlantılar sadece dosyalar içindir; farklı bölümdeki bir dosyaya, farklı bir inode numarası ile bağlanamazsınız.

    Eğer gerçek kopyası silinir bağlantı çalışacak gerçek kopya erişen edildi yatan verilere erişir, çünkü.


Soru: Nasıl yumuşak bağlantı kurabilirim?

Cevap: Yumuşak bir link ile yapılabilir ln -s; ilk önce kaynağı tanımlamanız ve sonra varış yerini tanımlamanız gerekir. (Hem kaynağın hem de hedefin tam yollarını tanımlamanız gerektiğini unutmayın; aksi takdirde çalışmaz.)

 sudo ln -s /usr/lib/i386-linux-gnu/mesa/libGL.so.1 /usr/lib32/libGL.so.1
             (----------Source-------)             ( Destination )

görüntü tanımını buraya girin

Gördüğünüz gibi farklı bir inode var ve farklı bir bölüme yapılabiliyor.


Soru: Nasıl Hard Link yapabilirim?

Cevap: Bir Hard link ile yapılabilir ln; ilk önce kaynağı tanımlamanız ve sonra varış yerini tanımlamanız gerekir. (Hem kaynağın hem de hedefin tam yolunu tanımlamanız gerektiğine dikkat edin; aksi takdirde çalışmaz.)

Diyelim ki /scriptdizinde bir betiğim var firefox.

 ls -i # Shows you the inode
 5898242 firefox

 ln /scripts/firefox /scripts/on-fire
       ( Source )    ( Destination )

görüntü tanımını buraya girin

Gördüğünüz gibi, aynı inode'a sahip. Orijinali silersem bağlantı çalışır ve orijinal gibi çalışır.

görüntü tanımını buraya girin

Yukarıda bağlantının çalışıp çalışmadığını kontrol ediyorum ve ardından orijinal firefox betiğini siliyorum.


Sen Soru: Birisi sembolik bir link üzerinden sert link tercih edilebilecek bir ortam sağlayabilirse iyi olurdu.

Cevap : Disk bölümü düzenine bağlı olarak, Sabit Bağlantılar , aynı bölümde (-1 nokta) olması gerektiğini ve yalnızca dosyalara bağlantı verebilir (-1 nokta) ), ancak orijinal bağlantı silinmişse +1 çalışacak ve orijinali gibi davranır.

Öte yandan, yumuşak bir link dizinleri veya dosyaları gösterebilir (+1 puan) ve bölüm sınırlaması yoktur (+1 puan), ancak kaynak silinirse (-1 puan) bağlantı çalışmaz.


Sabit bir bağlantı oluşturabilir ve inode'u kaynak olarak sağlayabilir miyim?
TMOTTM

324

Bir hardlink bir dosyaya bir işaretçi değildir, aynı inode'u gösteren bir dizin girişidir (bir dosya). Diğer dosyanın adını değiştirseniz bile, hardlink dosyaya işaret eder. Diğer dosyayı yeni bir sürümle değiştirirseniz (kopyalayarak), bir hardlink yeni dosyayı göstermez. Aynı dosya sisteminde sadece sabit bağlantılara sahip olabilirsiniz. Hardlinks ile orijinal dosyalar ve linkler kavramına sahip değilsiniz, hepsi eşittir (bir nesneye referans olarak düşünün). Bu çok düşük seviye bir kavramdır.

Öte yandan, bir bağlantı aslında başka bir yola (dosya adı) işaret ediyor; sembolik bağlantı yoluyla her eriştiğinizde dosyanın ismini çözer. Dosyayı taşırsanız, sembol link takip etmez. Dosyayı bir başkasıyla değiştirirseniz, adı koruyarak, link link yeni dosyayı gösterir. Symlinks dosya sistemlerini kapsayabilir. İşaret halkaları ile, gerçek dosya ve işaret ettiği dosya yolunun yanında hiçbir bilgi saklamayan işaret bağlantı arasında çok net bir fark vardır.


1
(Kendi kelimeleri ile) “dosyayı işaret eden” bir imleç olarak adlandırılabilir (önemsizce neredeyse tamamen otomatik olarak doğrudur). Nitpicking eğer o zaman (genel olarak), bir dosya sistemi inode kullanmasa bile, hardlinks nosyonu olabilir.
jfs

320

"Bir resim bin kelime değerinde bir olup." Resimsel gösterim


Ve, "Bir örnek yüz paragrafa değiyor ..."

İki dosya oluşturun:

$ touch blah1   
$ touch blah2

İçlerine bazı veriler girin:

$ echo "Cat" > blah1
$ echo "Dog" > blah2

Ve beklendiği gibi:

$cat blah1; cat blah2
Cat
Dog

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

$ ln blah1 blah1-hard
$ ln -s blah2 blah2-soft

Bakalım ne oldu:

$ ls -l

blah1
blah1-hard
blah2
blah2-soft -> blah2

Blah1 ismini değiştirmek önemli değil:

$ mv blah1 blah1-new
$ cat blah1-hard
Cat

blah1-hard, dosyanın inode'una, içeriğine işaret eder - değişmedi.

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

Dosyanın içeriği bulunamadı; çünkü yumuşak bağlantı, adı değiştirdi, içeriği gösterdi.
Benzer şekilde, eğer blah1 silinirse, blah1-hard hala içeriği tutar; Eğer blah2 silinirse, blah2-soft sadece var olmayan bir dosyanın bağlantısıdır.


kaynak: açıkça StackOverflow! ' dan kopyala !


13
Dürüst olmak gerekirse - en üstteki güzel resmi ekledin ... ah, sen de kopyaladın! İki cevabı birleştirmek aslında çok yardımcı oldu :)
icc97

2
daha iyi, hiçbir yerde açıkladı!
dennisbot

3
20 saniye boyunca görüntüye baktım ve sonra aniden anladım. Bu aslında mükemmel.
Mohammed Joraid,

1
btw: Sabit bağlantıların git kullanılması kötü bir fikirdir , birisinin (yumuşak bağlantılar yüzünden sinirli) harikaları ... diğer versiyonlama sistemlerine de uygulanabilir.
Frank Nocke

1
Herhangi bir cihaza erişen bulutta depolanan bir dosyaya benzer bağlantıların bir inode'u bağlantıda mı?
Ooker

89

Her ikisi de dosyalara işaret eder; fark işaretçi türüdür . Sembolik bir bağlantı isme göre başka bir dosyaya işaret eder . Sembolik bir bağlantı olarak tanımlayan özel bir mod biti vardır ve içeriği gerçek dosyanın adıdır. Yalnızca bir ad içerdiğinden, bu adın gerçekten var olması gerekmez veya farklı bir dosya sisteminde bulunabilir. Adlandırılmış dosyayı değiştirirseniz (içeriğini adını etkilemeden değiştirin), bağlantı hala aynı adı içerir ve bu nedenle şimdi yeni dosyayı gösterir. Sembolik bir bağlantıyı kolayca tanımlayabilir ve işaret ettiği dosyanın adını görebilirsiniz.

Sabit bir bağlantı dosyayı inode numarasına göre gösterir. Bu nedenle, sabit bağlantılar bir dosyanın ilk adından farklı değildir. Sabit bağlantı adına karşı "gerçek" bir ad yoktur; tüm sabit bağlantılar, dosya için eşit olarak geçerli adlardır. Bu nedenle, bağladığınız dosyanın gerçekte var olması ve bağlantıyı oluşturmaya çalıştığınız aynı dosya sisteminde olması gerekir. Orijinal adı silerseniz, o zaman sabit bağlantı yine de aynı dosyayı gösterir. Tüm sabit bağlantılar dosya için eşit olarak geçerli adlar olduğundan, bunlardan birine bakamaz ve dosyanın diğer adlarını göremezsiniz; Bunu bulmak için her dosyaya bakmalı ve aynı inode numarasına sahip diğer isimleri bulmak için inode numaralarını karşılaştırmalısınız.

Bir dosyanın çıktısından kaç tane ad olduğunu söyleyebilirsiniz ls -l. Dosya modundan sonraki ilk sayı bağlantı sayısıdır. 1'den fazla bağlantıya sahip bir dosya başka bir yerde başka adlara sahiptir ve bunun tersine, yalnızca 1 bağlantı sayısı olan bir dosyada (diğer) sabit bağlantı yoktur.


If you replace the named file, then the link still contains the same name, and so now it points to the new file- Bunun iyi açıklanmadığını düşünüyorum. Sembolik bir bağın bulunduğu dosyayı değiştirirsem, adı içeren bağlantılara dokunulmaz mı demek istiyorsun? Ancak, yalnızca değiştirilen dosyaya, dosya adı (yani eskisinin yerini alan yeni dosya), değiştirilen (yani yenisi ile değiştirilen eski dosya) ile aynı olduğu zaman, doğru mu?
Mike,

@Mike, yes: sembolik link orijinal dosya ismine işaret eder, bu yüzden o dosyanın değiştirilmesi, linkin yeni dosyayı işaret ettiği anlamına gelir.
psusi

Fakat aynı ismi doğru bulduysa? Symlink banana işaret eder ve dosyayı turuncu ile değiştiririm, sonra sy link artık muz dosyasını bulamaz, yani işe yaramaz
Mike

@Mike, dünya değiştirme aynı ada sahip olduğu anlamına gelir, aksi halde sadece bir dosyayı silip başka bir tane
eklersiniz

58

Bir hardlink sadece aynı dosya sisteminde çalışabilir, aynı inode için sadece farklı bir isimdir (dosyalar dahili olarak inode'lar tarafından belirtilir). Bir dosya yalnızca diskten son bağlantısı bittiğinde diskten silinir ( son bağlantıyı rmd veya unlinkd yaptınız ). Hardlinks genellikle dizinler için değil, sadece dosyalar için çalışır.

Bir sembolik link (sembolik link), başka bir dosyaya giden yolu içeren özel bir dosyadır. Bu yol mutlak veya bağıl olabilir. sembolik bağlantılar dosya sistemlerinde çalışabilir ve hatta örneğin harici bir sabit sürücüyü çıkarır ve aynı yolda farklı bir dosyaya sahip başka bir dosyayla değiştirirseniz, farklı dosyalara işaret edebilir. Bir link, dosyalara veya dizinlere işaret edebilir.


Teşekkürler, bu bana nasıl çalıştıklarını anlatıyor, ama hard link tam olarak ne yapıyor? Ve neden dizinler için çalışmıyor?
ste_kwr

@knittl: emin misin? Bazı dosya sistemlerinde, dizinlere izin verilen hardlinks izin verilir, ancak yalnızca root bunları oluşturabilir. -d, -F, --directoryAnahtarlara bakınız . Ve evet, var notu görülen ln(1):) sayfa
0xC0000022L

1
@kniwor: Hardlinks tanımlamanın en kolay yolu "aynı dosya için sadece başka bir isim (yani diskteki veri)". Ve - en azından sistemimde - lndizinlere bağlantı yapmak için kullanılamaz. Orada dizinlere sabit bağlarının olsa var en belirgin örneğidir olmak .ve ... Bunu orijinal cevaba eklemek istemedim, çünkü bu sadece işleri karmaşıklaştıracaktı.
knittl

2
@STATUS_ACCESS_DENIED: peki tamam… ama bu genellikle iyi bir fikir değildir. Bu yüzden orijinal cevabımda »genellikle« yazdım. Ayrıca örnekler için önceki yorumuma bakın.
knittl

bu nedenle bir hard link farklı klasörlere sahip aynı klasöre / dosyaya işaret edebilir, yani aynı inode'a link veren farklı isimler var?
Charlie Parker,

21

(Şimdi yazının üstünden bağlantılı) diğer iplikten yanıtlardan biri bahseder bu sayfayı ben oldukça iyi orta düzey açıklama olduğunu düşünüyorum. Ascii sanatında kayboluyorsanız, işte tl; dr versiyonu:

  • Standart dosyalar, dosya sisteminden fiziksel verilere işaret eden inode'a bir işaretçidir. Dosya bileşeni, dosya sistemine olan bağlantıyı (esasen onun yolu) ve inode için bir bağlantı depolar.
  • Sabit bağlantılar, tıpkı dosyalar gibidir. Bunlar doğrudan bir inode'a ek bir göstericidir.
  • Sembolik bağlantılar, bir dosyaya dosya sistemi yolu depolayan ayrı dosyalardır (ayrı inode ve veriler dahil).

Çekirdek ve dosya sistemleri, her şeyi şeffaf bir şekilde çevirir.

Buna dayanarak:

  • Sabit bağlantılar yalnızca aynı dosya sistemi bağlantısına izin verir. Symlinks herhangi bir yola işaret edebilir.
  • Sabit bağlantılar (temel olarak) mutlak verilere işaret eder. Sembolik bağlantılar göreceli yollara işaret edebilir (örn. ../parent.file)
  • Ek olarak, eğer bir hard linkin hedef göstergesini hareket ettirirseniz (ki, hatırlamak gerekirse, esasen sadece bir inode'a işaret eden hard linktir), hard link hala çalışır. Bir sembolik bağın hedefini hareket ettirmek genellikle sembolik bağlantıyı keser.
  • Bir hard linkin çözümlenmesi daha hızlı olur fakat ölçülemez bir şekilde olur. Hızın önemsiz kısmı, esnek olmayan bir dosya sisteminin pahasına geliyor.

Kendimi biraz şaşırtmış olabilirim ama çeşitli şeyler okumaktan, standart bir dosya ile bir hardlink arasındaki farkı bulmakta zorlanıyorum. Okuduğum yol, her dosyanın fiziksel veriye işaret eden bir inode'a bağlanan bir hardlink (dosya ismini saklamak) şeklinde oluşudur.

Bir hardlink eklemek sadece dosya sistemi tabanlı bir gösterici ile inode sağlar. Bu doğru mu?


5
Bence haklısın, her dosya bir inode için bir yol adı ve sabit bir bağlantı aynı inode için ek bir yol. Bu yüzden sabit bir bağlantı normal bir dosyadan farklı değildir.
enzotib

Bunu anlamaya çalışıyorum ... ama şunu diyorsunuz:> "Sembolik bağlantılar, bir dosyaya dosya sistemi yolu depolayan ayrı dosyalar (ayrı inode ve veriler dahil )." Bir linkin gerçekten ayrı verileri var mı? Öyleyse bağlantı kurduğu dir'in kopyası gibi, değil mi? ... ve ne zaman birşeyin linke yazılması halinde, diske iki kere mi yazılmalı? Anlamı yok.
MiniGod

@MiniGod Hiçbir bağlantı, başka bir inode'a (dosya adı) giden yolu depolayan bir veri bloğunun bir inode'u değildir. Evet, Matrix benzeri bir kafa karıştırıcı ama bir kez olsun, asla unutamayacağım :)
Oli

@Oli Kafam karıştı, ama: “ayrı inode ve veri dahil” derken , sembolik bağlantıda ayrı veri var demek istiyorsun !?
MiniGod

1
@MiniGod Evet. Sembolik bağlantı veriye işaret eden bir inode'dur (normal bir dosya gibi) ve bu veri bir yoldur. Bundan biraz daha zekice - sembolik bağlantılar yoluyla şeffaf kullanıma izin vermek - ama aslında hepsi bu.
Oli

15

Soft Link ne zaman kullanılır:

Dosya sistemlerinde bağla: Dosyaları dosya sistemlerine bağlamak istiyorsanız, yalnızca sembolik bağlantılar / yumuşak bağlantılar kullanabilirsiniz.

Dizine linkler: Dizinlere link vermek istiyorsanız, dizine sert bir link oluşturamayacağınız için Soft linkler kullanıyor olmalısınız.

Hard Link ne zaman kullanılır:

Depolama Alanı: Sabit bağlantılar oluşturulurken yeni bir düğüm oluşturmadığından, sert bağlantılar çok önemsiz alan kaplar. Yazılım bağlantılarında yer kaplayan bir dosya oluşturuyoruz (dosya sistemine bağlı olarak genellikle 4KB)

Performans: Başka bir dosyadan geçmek yerine doğrudan disk işaretçisine eriştiğinizden, performans sabit bir bağlantıya erişirken biraz daha iyi olacaktır. Dosya konumunu taşıma: Kaynak dosyayı aynı dosya sistemindeki başka bir konuma taşırsanız, sabit bağlantı çalışmaya devam eder, ancak yumuşak bağlantı başarısız olur.

Yedeklilik: Verilerinizin güvenliğinden emin olmak istiyorsanız, hard link'te olduğu gibi hard link kullanıyor olmalısınız, verilere güvenlidir, dosyalara giden tüm linkler silinene kadar, soft link'teki veriler yerine, kaybedersiniz. Dosyanın ana örneği silinmişse, veriler.


Ayrıca, yol adı boyutu 64 byte'a kadar hızlı bir sembolik bağlantı bulunduğunu unutmayın. Hala bir inode alır, ancak 4kb blok alanını tüketmez.
syockit

8

Karışıklık, "dosya adı" ile sabit bağlantı arasındaki farkı bulmaya çalıştığınızda ortaya çıkıyor, çünkü yok.

Yarattığınız her dosya, diskteki verilerden ve bir dizindeki bir dosya adı ve diskteki verilere bir işaretçi olan bir sabit bağlantıdan oluşur . Hikayenin sonu. Son (veya yalnızca) sabit bağlantı silindiğinde, işletim sistemi artık veriye gerek olmadığını bilir.

Bundan, gerçek verilerin hiçbir zaman silinmediğini görebilirsiniz; yalnızca sabit bağlantılar bulunur. Diskte yeterince kalabalıklaştığında, başka bir dosyanın verileri üzerine verilerin üzerine yazılabilir. O zamana kadar, silinen dosyadaki veriler kurtarılabilir, ancak sabit bağlantı olmadan bulmak biraz zor.

Symlinks, daha önce açıklandığı gibi, sadece "adında <targetname>bir klasörde adlandırılmış bir dosya var" deyin <targetfolder>. Hard linke işaret ediyorlar. Verilerin nerede olduğunu bilmiyorlar. Sabit bağlantı bunu biliyor.


0

Çok basit. Dosyalar (ve dizinler!) Blok cihazındaki adreslerde saklanır (HDD ya da her neyse). Normalde, bir adrese eşlenmiş tek bir adınız vardır ve bu şekilde dosyanızı alırsınız. Bir sabit bağlantı aynı adrese eşleştirilmiş bir ikinci, üçüncü, vb adıdır. Bunun yerine sembolik bir bağlantı sembole atıfta bulunur - isim - ve böylece ilk isimle eşlenen ikinci isim. Çekirdek söz konusu olduğunda, sembolik bağlantı hedefini okuduktan sonra durur ve dosya adı (az ya da çok) olarak hedef değerle başlangıcına geri döner, böylece göreceli sembolik bağlar mümkün ancak çılgınca yararsızdır. Hedef adı, açıkça kullanıcı alanı kodunda sorgulanmış olması dışında dosya sistemi seviyesinin üzerinde kullanılmaz.

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.