Birini diğerinden ne zaman kullanırsın?
Birini diğerinden ne zaman kullanırsın?
Yanıtlar:
Sert ve yumuşak bağlantılar arasındaki farklı semantikler, onları farklı şeyler için uygun kılar.
Sert bağlantılar:
Sembolik linkler (yumuşak linkler)
ls -l
bir linkin hangi yolu işaret ettiğini gösterecek)unlink(2)
. "normal" dosyalar (1 bağlantı sayısı ile) sadece özel bir durumdur. Eğer yardımcı olursa, inode'ları nesne olarak düşünebilir ve isimlendirilmiş işaretçiler olarak adlandırabilirsiniz (inode'un link sayısı referans sayısıdır).
..
ve .
.
Her iki bağlantı türünün amacı, bir dosyayı aynı anda iki konumda görünmesini sağlamak için bir yol sağlamaktır. Bunun birçok kullanımı var. 10 üzerinden 9 kez sembolik bağlantılar kullanmak istersiniz.
Sembolik bağlantılar veya "sembolik bağlantılar" Windows kısayollarına benzer şekilde çalışır. Bir linkin içeriği, dosyanın / dizinin gerçek konumuna işaretçidir. Gerçek dosyayı silerseniz, sembolik bağlantı "sarkacak" olacak ve çalışmayacaktır. Sembolik bağlantıyı silmek gerçek dosyayı silmez. İstediğiniz kadar tek bir dosyaya (veya hatta diğer işaretlere) kadar birçok sembolünüz olabilir.
Yine de Windows’tan farklı olarak, kabuk veya uygulama düzeyinde değil, dosya sistemi düzeyinde çalışıyorlar, bu yüzden hemen hemen herhangi bir uygulama beklendiği gibi sembolik bağlantıları “izleyecek”. ls -al
sembolik bağlantıların "işaret ettiği" yeri görmek için hızlı bir yol olarak kullanılabilir.
Hardlinks daha düşük bir seviyede bile çalışır. Bir hardlink, dosyanın dosya sistemi düzeyinde gerçek, fiziksel bir dizin girişidir. Teknik olarak, bir dizin girişi bir hardlink'tir, dolayısıyla her bir dosya bir yerde bir dizinde en az bir hard linke sahiptir. Hardlinks işaret ettikleri dosyadan ayrı değildir; Bir dosya farklı dizinlerde birden fazla bağlantıya sahipse, bağlantıyı gibi yardımcı programlarla rm
silmek, tüm bağlantıların tümü bitene kadar dosyayı gerçekten silmez.
Dosyaların kasten silinmesini önlemek istemediğiniz veya bölümler veya diğer dosya sistemiyle ilgili şeylerle ilgili garip, düşük seviyeli bir iş yaptığınız durumlar olmadan, hardlinks kullanımının yaygın veya hatta gerekli olduğu durumu düşünemiyorum. EDIT: Bu sorunun diğer cevaplarında harika fikirler var!
ls -l
Bir sembolik bağ ile bağlı olan ne olduğunu görmek için yeterlidir a
standları için --all
man sayfasına bakınız. Sembolik bağlantılar dosya sisteminde çalışsa bile, sembolik bağları takip etmek yerine dosya olarak kullanmak için alternatif fonksiyonlar vardır.
ln -s /home 1; ls -l 1
link link 1'in 5 byte uzunluğunda ln -s /usr/share/ 2; ls -l 2
olduğunu gösterirken, 2 nin 11 byte olduğunu gösterir.
Sabit bağlantılar, disk tabanlı yedekleme mekanizmaları için çok kullanışlıdır, çünkü değişmemiş dosyalar için alan paylaşırken her yedekleme için tam bir dizin ağacına sahip olabilirsiniz ve dosya sistemi referans sayımını takip eder, böylece son başvuru belirli bir sürüm ortadan kalkar, çünkü yedekleme alan nedeniyle boşa çıkarılmıştır / kaldırılmıştır, kullandığı alan otomatik olarak geri kazanılır. Bazı posta istemcileri aynı nedenden dolayı birden fazla klasöre gönderilen iletilerde de kullanır.
Sabit bağlantılar sadece aynı disk alanlarına yapılan referanslardır, bu nedenle 'neden' başka bir dosya sistemindeki bir şeyi sabitleyemezsiniz.
Symlinks, belki aynı dosya sisteminde, belki de değil, diğer dosyaları (Windows kısayolları gibi) bağlayan dosyalardır.
EDIT: Daha fazlasını açıklayacağım. Var olan her dosya en az 1 sabit bağlantıya sahiptir. Sabit bağlantılar , dosya sisteminin bir inode içeriğine erişmenin yoludur . Bir dosyanın inode numarasını ls -i
alabilir ve stat
bu örnekte aşağıdaki gibi sabit bağlantıların sayısını alabilirsiniz :
$ stat plantilla-disenos.odt
File: «plantilla-disenos.odt»
Size: 12367 Blocks: 32 IO Block: 4096 fichero regular
Device: 803h/2051d Inode: 319875 Links: 1
Access: (0644/-rw-r--r--) Uid: ( 1000/ d4rio) Gid: ( 1000/ d4rio)
Access: 2011-02-11 21:36:19.000000000 -0300
Modify: 2010-03-02 23:27:28.000000000 -0300
Change: 2010-04-10 17:46:27.000000000 -0300
Bu referans için teşekkürler @geekosaur:
Çekirdeklerin genişletilmesi için çekirdeğin yoldan diziye inode çevirisini (dizin ağacını geçerek) yeniden başlatması gerekir, oysa sert bağlantıların tümü aynı düğmeyi kullanır. (Bunu, geleneksel Unix'te bunu yapan çekirdek işlevinin adından, ad olarak adlandırılır) göreceksiniz.)
ve bu (düzenlendi):
Sabit bağlantılar, Apple'ın Time Machine gibi disk tabanlı artan yedekleme mekanizmaları için çok kullanışlıdır , çünkü değişmemiş dosyalar için alanı paylaşırken her yedekleme için tam bir dizin ağacına sahip olabilirsiniz - ve dosya sistemi referans sayımını izler. Verilen bir sürüme yapılan son referans, alanın sebepleri nedeniyle yedeklemenin süresi dolduğu / kaldırıldığı için ortadan kalktığında, kullandığı alan otomatik olarak geri kazanılır. Bazı posta istemcileri aynı nedenden dolayı birden fazla klasöre gönderilen iletilerde de kullanır.
Şerefe
namei
bunu, geleneksel Unix'te bunu yapan çekirdek işlevinin
stat
başarısız olur.
Yumuşak bir link başka bir yol adını gösterir. Bu yol, gerçekten var olabilir veya olmayabilir. Sen link linkine erişene kadar yol aranmaz. Yol erişmeye çalıştığınızda yol yoksa, bozuk bir bağlantıya sahip olursunuz.
Sabit bir bağlantıda, birden çok ada sahip bir dosyanız var. Bunlardan birinin “gerçek” dosya olduğunu ve diğerlerinin sadece bunun için bir bağlantı olduğunu söyleyemezsiniz. Hepsi eşittir. Kırık bir bağlantı gibi kırık bir sembolik bağlantı yoktur.
Sabit bağlantılar sadece tek bir dosya sisteminde çalışır. Farklı bir dosya sistemindeki bir dosyaya bağlanmak istiyorsanız (örneğin farklı bir bölüm veya bir ağ paylaşımı), yumuşak bir bağlantı kullanmanız gerekir .
Bağlantılı bir dosyayı sildiğinizde başka bir büyük fark ne olur. Bir çift hardlink dosyadan birini silip aynı isimde yeni bir dosya oluşturursanız, iki ayrı dosyaya sahip olacaksınız (link gitmiş). Bir bağlantının hedefini silip aynı ada sahip yeni bir dosya oluşturursanız, bağlantı yeni dosyayı gösterir.
"hard" linkler aynı inode'u paylaşıyor
$ touch foo
$ ln foo foolink # Creates a hard link
$ ls -li foo foolink
54996 -rw-r--r-- 2 bsd users 0 2011-12-11 09:06 foo
54996 -rw-r--r-- 2 bsd users 0 2011-12-11 09:06 foolink
Foo ya da foolink'i düzenlersem sadece bir dosya var ve güncellenecek. Dosya adlarından yalnızca birini kaldırırsam, inode ve veriler devam edecek, aptallar hayatta kalacaktır.
$ rm foo
$ ls -li foo foolink
ls: cannot access foo: No such file or directory
54996 -rw-r--r-- 1 bsd users 0 2011-12-11 09:06 foolink
Aynı şeyi ancak "yumuşak" veya sembolik bir bağlantıyla oluştursaydım, o zaman bir dosya, bir inode ve bir de kendi inode'una işaret eden yeni bir dosya var.
$ touch foo
$ ln -s foo foolink # Create symlink
$ ls -li foo foolink
55029 -rw-r--r-- 1 bsd users 0 2011-12-11 09:11 foo
55033 lrwxrwxrwx 1 bsd users 3 2011-12-11 09:11 foolink -> foo
Foo veya foolink'i düzenlersem hala sadece bir dosya var ve güncellenecek.
Yalnızca sembolik bağlantıyı kaldırırsam, inode ve veriler devam eder. Foo'yu kaldırırsam, veriler gider, sembolik bağlantı devam eder fakat var olmayan bir dosyaya işaret eder.
$ rm foo
removed `foo'
$ ls -l foo foolink
ls: cannot access foo: No such file or directory
lrwxrwxrwx 1 bsd bsd 3 2011-12-11 09:11 foolink -> foo
Sabit bağlantılar, aynı dosya için ek dizin girdileridir. Bunun anlamı
Pek çok editör kaydederken yeni içeriği aynı dosyaya yazmaz, ancak aşağıdaki prosedürü uygular:
Bu şema, aynı dosyaya yapılan diğer herhangi bir sabit bağlantının artık geçerli dosyayı göstermediğini, ancak önceki sürüme işaret edeceği anlamına gelir (editör eski dosyayı sildiğinde bile geçerlidir, çünkü Unix altında bir dosyayı "silme" sadece bağlantısının silinmesi anlamına gelir; yalnızca silinen bağlantı, asıl dosyanın silindiği tek bağlantıysa).
Sabit bağlantı doğrudan dosyaya gittiğinden, o dosyanın orijinal konumuna erişiminiz olmasa bile (örneğin, orijinal girişin bulunduğu dizinde herhangi bir izniniz olmadığı için) o dosyaya erişebilirsiniz. . Erişiminizi belirleyen tek haklar, dosyanın kendisinin erişim hakkıdır (dosyayla ilişkilendirilir, bağlantıyla değil; aynı dosya için farklı izinlerle bağlantı kuramazsınız) ve yolun bağlantı için erişim haklarıdır. (temelde, bağlantının bulunduğu dizini ve doğrudan ve dolaylı üst dizinleri çalıştırma hakları) bulunur.
Diğer yandan, sembolik bağlar, başka bir dosyanın yol adını (dosya adı - veya daha doğrusu dizin girişi - potansiyel olarak yolu /bin/sh
da dahil subdir/foo.bar
) saklar . Yol adı göreceli ise, her zaman bağlantının bulunduğu dizine göre yorumlanır.
Sembolik bir bağlantı, farklı bir dosya sistemindeki dosyaları (hatta FAT gibi sert veya yumuşak bağlantıları desteklemeyen bir dosya sistemine bile) işaret edebilir.
Orijinal dosya silinirse, sembolik link dosya içeriğini korumaz. Aynı dosyaya başka sert bağlantılar olmadığı sürece, dosya içeriği kaybolur. Daha sonra sembolik bağlantı sarkacak şekilde bırakılacaktır (yani, bir dizin girişine karşılık gelmeyen bir yol adına atıfta bulunun). Öte yandan, sembolik bağlantıyı silmek orijinal dosyayı etkilemez, çünkü yalnızca yol adını gösterir.
Orijinal dosya taşınır veya yeniden adlandırılırsa, sembolik bağlantı güncellenmez, ancak sarkan solda kalır. Sembolik bağlantıyı taşırsanız, yalnızca göreceli bir yol içeriyorsa kopar ve yol artık yeni konumdan geçerli değildir.
Orijinal dosya aynı ada sahip yeni bir dosyayla değiştirilirse (yukarıda açıklanan düzenleyici senaryoda olduğu gibi), bağlantı yeni dosyaya atıfta bulunur.
Sabit bağlantıların çoğu, temel olarak dosya içeriğini iki kez depolamak zorunda kalmadan bir dosyanın kopyasına sahip olmanın bir yoludur. Bu, dosyalar bir daha asla değiştirilmezse işe yarar, aksi halde bağlantıyı yanlışlıkla kesmek kolaydır (yukarıdaki editör senaryosuna bakın). Elbette, istediğiniz davalar var. birkaç yedeklemede olduğu gibi, bağlantının kopmasını : Yeni yedeklemelerde değişen dosyalar için, eski yedeklemelerdeki kopyanın da değişmesini istemezsiniz.
Normalde bir bağlantı istiyorsanız, sembolik bir bağlantı kullanırsınız. Bir örnek, bir dizini başka bir bölüme taşıdığınızda (üzerinde bulunduğu alan dolduğu için), eski konumdan yenisine yumuşak bir bağlantı ayarlayabilirsiniz, böylece eski yerde dizine erişmeye çalışan herhangi bir program bunun yerine yeni yerden eriş. Bu zor linklerle mümkün olmazdı. Ancak taşınan dizindeki sembolik bağlantıların, taşınan dizinden çıkan göreceli yollar içeriyorsa kopabileceğini unutmayın.
HARD LINK (Sadece Dosyalar) vs SOFT LINK (Dosyalar veya Dizinler) vs BIND (Dizinler için HARD LINK)
(kaynak: freesoftwareservers.com )
Daxelrod'un cevabı soruyu iyi açıklarken, bu davadaki resmin özellikle de inode anlamayan ve Linux'u henüz karmaşık hale getirmeyen yeni başlayanlar için büyük bir fark yarattığını düşündüm.
Bunu düşünün, sürücünüzdeki her şeyi "sildiyseniz", verileri geri yüklemek için yazılım çalıştırabilirsiniz, çünkü 1'ler ve 0'lar hala oradadır, sadece tüm Sabit Bağlantıları sildiniz. Kurtarma Yazılımının amacı, 0 ve 1’leri anlamak için Sabit Bağlantıları yeniden oluşturmaktır.
Tüm bunları mantıklı kılan harika bir "tek gömlek" okudum ve paylaşmak istedim!
Linux'taki tüm dosyalar diskteki 0'lara ve 1'lere "Hard Links" dir. Bir veri oluşturduğunuzda (0 ve 1'ler) işletim sistemi, sabit diskte bu noktaya atıfta bulunmak için Dosya Ağacı'nda bir Sabit Bağlantı oluşturur.
Başka bir sabit link oluşturabilir ve orijinal dosyayı silebilirsiniz ve yine de yeni oluşturulan sabit linke erişebilirsiniz.
HARD LINK 1'i sildiyseniz, SOFT LINK'in işe yarayacağını düşünüyor musunuz? Hayır, işletim sistemi HARD LINK 1'in mevcut olmadığını geri bildirir.
Tersine, SOFT LINK'ü silerseniz, HARD LINK çalışır mı? Evet. İşletim sistemi bir HARD LINK Dosyasına sahip olduğu sürece , dolgunun silinmediğini bildirir.
- Ayrıca araştırmaya / kaydetmeye değer BIND, iki dizini birbirine bağlamak gibi iki dizini birbirine bağlayabilmenin bir yoludur, ancak işletim sistemi için şeffaftır (işletim sistemleri Symlink'i ne zaman söyleyebileceğini ve bazılarının Symlinks'i izleyebilecekleri ile ilgili kuralları olduğunu söyleyebilir). LS değil, Mount kullanır ve FSTAB üzerinden yapılandırılabilir.
Sabit bağlantı, bir dosyayı tüm dosyalara, hatta ilk (bir "dosya adı" teknik olarak bir bağlantıdır) silinene kadar diskte tutacaktır. Yumuşak bir link, işaret ettiği dosya değiştirilene kadar "sarkan" bırakılabilir.
Bu çok eski bir soru, ancak benden sert bağlantılar kullanmamı gerektiren bir kullanım durumum var.
Ben bir müzisyenim ve bu yüzden Mac'ime bağlı birkaç sabit diskte çok ve çok sayıda ses dosyası var. Terabayt değer. Bunları çoğunlukla sembolik dizin dizinleri ile çok güzel bir şekilde organize ettim; böylece onları içerik yayıncısı, stil / ses ve o sırada nasıl düşündüğüme göre diğer kriterler yoluyla bulabilirim. Maalesef, kullandığım bir program olan Ableton Live, dosya tarayıcısından takma adları veya işaret linklerini göremiyor. Bulduğum tek çözüm, görebilmesini istediğim dizinlerin sıkı linklerini oluşturmak ve sonra her şey harika çalışıyor.
Yani, bu, başkalarına oluşmamış olabilecek zor bağlantıları kullanmanız gerekebileceği başka bir durumdur.