Sabit link ve dosya arasındaki fark nedir?


37

Bir sabit bağlantı bir düğümüne bir işaretçi olarak tanımlanır. Bir yumuşak bağ aynı zamanda bir olarak bilinen sembolik bağlantı , sert bağlantıların kısıtlama olmadan başka bağlantıya işaret eden bağımsız bir dosya olarak tanımlanır.

Bir dosya ve sabit bağlantı arasındaki fark nedir? Sabit bir bağlantı inode'a işaret eder, peki dosya nedir? İnode girişi kendisi? Veya sert bağlantı içeren bir inode?

Diyelim ki dokunuşlu bir dosya oluşturdum. Sonra inode tablosunda bir inode girişi oluşturulur . Ve dosyayla aynı inode numarasına sahip bir sabit bağlantı oluşturdum. Peki ben yeni bir dosya mı yarattım? Yoksa dosya sadece inode olarak mı tanımlanıyor?



7
@infixed Kesinlikle hayır, bir dosya ve sabit bağlantı farkını soruyorum.
Levent Divilioğlu,

Ben de bu bağlantılı sorunun cevaplarında da yer aldığına inandığım orijinal cevabımı geri aldım. Öyleyse hala tam olarak değil mi?
sabitlendikten

7
Bir dosya ile bir hardlink arasındaki fark, siz ve telefon defterinde adınızla yazdığınız satır arasındaki farkla aynıdır.
Jörg W Mittag

Yanıtlar:


61

Çok kısa cevap:

  • bir dosya anonim bir veri bloğudur
  • hardlink bir dosya için bir addır.
  • sembolik bir bağlantı, içeriği bir yol adı olan özel bir dosyadır

Unix dosyaları ve dizinleri işe tam olarak gerçek dünyada dosya ve dizinleri (ve benzeri değil gibi klasörler gerçek dünyada); Unix dosya sistemleri (kavramsal olarak) şöyle yapılandırılmıştır:

  • bir dosya isimsiz bir veri bloğudur; bir adı yok, sadece bir numara (inode)
  • Bir dizin, dosyalara isim eşlemesi içeren özel bir dosya türüdür (daha özel olarak inode); Bir dizin sadece dosya olduğundan, dizinler o tekrarlama Unix dosya sistemleri tanıtıldı zaman, bu oldu (not uygulanır nasıl, dizinler için girişleri olabilir değil tüm bariz de, işletim sistemlerinin bir çok dizinleri geri dizinleri ihtiva izin vermedi sonra)
  • bu dizin girişlerine hardlinks denir.
  • sembolik bir bağlantı, içeriği bir yol adı olan başka bir özel dosya türüdür; Bu yol adı başka bir dosyanın adı olarak yorumlanır.
  • diğer özel dosya türleri: soketler, fifos, blok cihazları, karakter cihazları

Bunu göz önünde bulundurarak metaforunu tutulması ve özellikle Unix dizinleri gerçek dünya dizinleri gibi çalışırlar ve akılda tutarak değil neden bir dosyayı ı don silebilirsiniz': gerçek dünya klasörler gibi "tuhaflıklar" sık sık karşılaşma gibi yeni gelenler çok açıklar Yazma erişiminiz yok mu? Birincisi, dosyayı silmiyorsunuz, dosya için olası birçok addan birini siliyorsunuz ve bunu yapabilmek için dosyaya değil sadece dizine erişebiliyorsunuz. Tıpkı gerçek dünyadaki gibi.

Veya neden sarkan symlinks'i alabilirim? Şey, sembolik bağlantı basitçe bir yol adı içerir. Aslında bu isimde bir dosya olması gerektiğini söyleyen hiçbir şey yok.

Benim sorum basitçe bir dosya ve sabit link arasındaki fark nedir?

Bir dosya ile hard link arasındaki fark, siz ve telefon defterinde adınızla yazdığınız satır arasındaki farkla aynıdır.

Sabit bağlantı bir inode'a işaret ediyor, peki dosya nedir? Inode girişi kendisi? Ya da sert bir bağlantıya sahip bir Inode?

Bir dosya isimsiz bir veri parçasıdır. Bu kadar. Bir dosya, bir dosya, bir inode değildir sahiptir Eğer bir Sosyal Güvenlik Numarası olmayan tıpkı bir dosya düğümü sahip bir SSN.

Sabit bağlantı, bir dosyanın adıdır. Bir dosyanın birçok adı olabilir.

Diyelim diyelim ki, o zaman Bir Inode girdi oluşturulur, dokunuş ile bir dosya oluşturmak Inode Tablo .

Evet.

Ve dosya ile aynı İnode numarasına sahip bir sabit bağlantı oluşturdum.

Hayır. Bir hard link inode numarasına sahip değildir, çünkü dosya değildir. Sadece dosyalar inode numarasına sahiptir.

Sabit bağlantı, bir adı inode numarasıyla ilişkilendirir.

Peki ben yeni bir dosya mı yarattım?

Evet.

Veya dosya sadece bir Inode olarak tanımlanır?

Hayır. Dosyanın bir inode'u var, bir inode değil .


15
"Dizin" kelimesinin arkasındaki metaforun ne olduğunu gerçekten anlamadım (ya da doğru dürüst düşünmedim). Telefon rehberi örneği harika bir örnek; belki daha önce tanıtmalısın (gerçek dünyadan ilk söz ettiğinde). Benzer şekilde, çoğu insan nadiren bilgisayarın dışındaki "dosyalar" ile uğraşır, bu yüzden "tıpkı kağıt dosyalar gibi ve bir telefon rehberi gibi bir dizin" demek daha net olur.
IMSoP

2
@IMSoP Bir nesil açığı. Bilgisayarlardan önce, telefon rehberi bir dizinin türlerinden biriydi. Cambridge sözlüğü şöyle der: " dizin: adların, adreslerin veya diğer gerçeklerin listesini veren bir kitap [... örnek] telefon rehberindeki numaralarını arayın. "
kubanczyk

2
@kubanczyk Gerçekten - dijital öncesi ofislerde çalışan insanlara göre, metaforlar kendilerini açıklamak için neredeyse küçümseyecek kadar açık görünüyor. Ama benim neslim ve altındakiler için, bir arabanın arkasındaki depolama alanının neden "bagaj" veya "bagaj" olarak adlandırıldığı kadar belirsiz, bu yüzden gerçekten hecelemelisiniz.
IMSoP

"Bir hard link inode numarasına sahip değil" ifadesiyle "have" kelimesi yanıltıcı olabilir, çünkü o zaman "Hardlink bir ismi inode numarasıyla ilişkilendirir" diyorsunuz. "Hardlink" dizin girişinin veri yapısı aslında inode # içeriyor - bu link inode # ile "ilişkilendirilmiş" durumda. "Yok" derken, bağlantının diskte nerede depolandığını belirten bir inode # olmadığı anlamına geldiğini düşünüyorum.
Kelvin,

2
Bir dosya bu söyleyen sahip bir düğüm bir şekilde geriye doğru. Inode, "veri bloğunun" olduğu yer hakkında bilgi içeren yapıdır. Eğer inode yoksa, dosya yoktur.
Barmar

18

Sabit bağlantı bir dizin girişidir. Bir dosya, farklı adlar altında veya farklı dizinlerde mevcutsa, birden fazla dizin girişi içerebilir. Aynı dosya için diğer dizin girişleriyle ilişkilendirildiğinde bir dizin girişi “hard link” olarak adlandırılır.

Inode, dosyanın adını ve içeriğinden başka bir metadata içeriyor (içeriğin konumu, izinler, zaman damgaları vb.). Dosya başına bir inode var. (Tüm dosya sistemleri meta verileri diskte “inode” olarak adlandırabileceğiniz açıkça tanımlanabilir bir alana yerleştirmez, ancak bu ortak bir mimaridir.) Bir dizin girişi, bir adı inode'a bağlar. Birden fazla dizin girişinin aynı inode'a bağlanması mümkündür, bu nedenle “link” terimi. Bu tür bir bağlantı “yumuşak bağlantılar” ya da “bu isim için bu inode kullan” demeyen “sembolik bağlantılar” a karşı “sert bağlantı” olarak adlandırılır, ancak “bu isim için başka bir isim arayın”.

Dosyaları oda olarak ve dizin girişlerini kapı olarak düşünün. “Dosyayı aç /foo/bar” “koridora /foogit ve odaya git” anlamına gelir bar. “Odaya git bar” gerçekten “işaretli kapıyı aç barve odaya gir ” anlamına gelir ancak “odaya git bar” aynı şeyi daha kısa bir şekilde söylemenin olağanüstü bir yoludur. Aynı odaya açılan birden fazla kapı olması mümkündür.

Mevcut bir dosyaya ( ln existing new) sert bir bağlantı oluşturduğunuzda, aynı dosyaya ikinci bir bağlantı oluşturursunuz, yani zaten mevcut dosyaya bağlanan yeni bir dizin girişi oluşturursunuz. Oluşturulduktan sonra, iki dizin girişi eşit statüye sahiptir: “birincil” ve “ikincil” olan bir tane yoktur, ikisi de aynı dosyaya bağlanır.

Bir dosyanın tüm bağlantılarını, dosyanın kendisini kaldırmadan da kaldırabilirsiniz. Bir program dosyayı hala açıkken bir dosyayı silerseniz (yani, tüm dizin girişlerini kaldırırsanız) bu gerçekleşir. Dosya, dosya sisteminde kalır, yalnızca dosyayı açan son işlem onu ​​kapattığında silinir. Oda ve kapılar metaforunda, kapısı olmayan bir oda hala yer kaplıyor.


sırasıyla sert ve yumuşak bağlantılar ne zaman tanıtıldı?
n611x007

2
@ n611x007: Yeni veya takip eden bir sorunuz varsa, lütfen yeni bir soru açar mısınız? Yorum bölümü uygun değil veya yeni sorular veya genişletilmiş tartışmalar için tasarlandı. Teşekkürler.
David Foerster

1
@ n611x007 Sabit bağlantılar Unix'ten daha eski, v1'de de vardı . Unix'deki sembolik bağlantılar biraz daha yenidir; Wikipedia'nın bir geçmişi var.
Gilles 'SO- kötü olmayı bırak'

Oda ve kapılar harika bir benzetmedir! Sembolik bağlantılar daha sonra kapılardaki işaretler gibidir.
curiousdannii

1
@curiousdannii: Symlinks daha bir "yerine # 234 için oi m8 yanlış ofis gitmek" diyor içlerinde oturan kişiyle odaları gibi
Monica ile Hafiflik Yarışları

8

Diğer tüm cevaplara ek olarak, aşağıdaki önemli özellikleri de belirtmek istiyorum:

Softlink gerçek bir referanstır, yani bir yol adı içeren küçük bir dosyadır. Bir softline çözümleniyor uygulamayı saydam olur: Bir süreç bir dosya açarsa, ki /this/path/hereişaret eden bir sembolik olan /that/other/patho açıklığın tüm elleçleme /that/other/pathOS tarafından yapılır. Ayrıca, /that/other/pathbir sembolik bağlantı olması halinde , bu durum OS tarafından da ele alınmaktadır. Aslında, işletim sistemi başka bir şey bulana (örneğin normal bir dosya) veya birçok girişe ulaşana kadar SYMLOOP_MAX(bkz. sysconf(3)) Sembolik zincirini takip eder , bu durumda OS (daha doğrusu: uygun sistem çağrısı) bir hata verir ve ayarlar errnoiçin ELOOP. Dolayısıyla, benzer bir dairesel referans xyz -> xyzişlemi durdurmaz. (Linux sistemleri path_resolution(7)için tüm detayları görün.)

Bir işlemin bir yol adının bir sembolik bağlantı olup olmadığını kontrol lstat(2)edebileceğini ve dosya özniteliklerini (inode tablosunda depolanan) lchown(2)ve diğerleri arasında ( symlink(7)tüm öyküye bakın ) değiştirebileceğini kontrol edebileceğini unutmayın .

Şimdi, izin açısından, sembolik bağlantıların daima 777 numaralı izinlere sahip olduğunu göreceksiniz ( rwxrwxrwxsembolik notasyonda). Bu, yine de, gerçek dosyaya erişerek diğer izinlerin atlanabilmesi gerçeğinden kaynaklanmaktadır. Tersine, bir sembolik link için 777, sembolik bir dosyayı ilk etapta erişilebilir değilse, erişilebilir bir dosya yapmaz. Örneğin, 640 numaralı izinlere sahip bir dosyaya işaret eden 777 numaralı izinlere sahip bir halka, dosyayı "diğer" için (genel halka açık) erişilebilir kılmaz. Başka bir deyişle, bir dosyaya xyzbir link üzerinden erişilebilir ve eğer doğrudan erişilebilir ise, yani dolaysız olarak erişilebilir. Bu nedenle, sembolik bağlantının izinlerinin hiçbir şekilde güvenlik etkisi yoktur.

Hardlinks ve symlinks (aka softlinks) arasındaki gözle görülür ana farklardan biri, symlinlerin dosya sistemleri arasında çalışması, hardlinks bir dosya sistemi ile sınırlı kalmasıdır. Yani, A bölümündeki bir dosya B bölümünden sembolize edilebilir, ancak oradan sabit olamaz. Bu, bir hardlinkin aslında bir dosya adı ve inode numarasından oluşan bir dizindeki bir girdi olduğu ve inode numaralarının sadece her dosya sistemi için benzersiz olduğu gerçeğinden açıktır.

Hardlink terimi aslında biraz yanıltıcıdır. Sembolik bağlantıların kaynağı ve varış yeri açıkça ayırt edilebilir olsa da (sembolik bağlantı inode tablosunda kendi girişine sahipse), bu, hardlink'ler için doğru değildir. Bir dosya için bir hardlink oluşturursanız, orijinal giriş ve hardlink ilk önce ne olduğuna göre ayırt edilemez. (Aynı inode'a başvurdukları için, sahip, izinler, zaman damgaları vb. Gibi dosya özniteliklerini paylaşırlar.) Bu, her bir dizin girişinin aslında bir hardlink olduğu ve bir dosyanın hardlink edilmesinin sadece bir saniye oluşturmak anlamına geldiğini ifade eder ( veya üçüncü veya dördüncü ...) hardlink. Aslında, her bir inode, bu inode'a verilen hardlinks sayısı için bir sayaç saklar.

Son olarak, sıradan kullanıcıların hardlink dizinlerini almayabileceğini unutmayın. Bunun nedeni, çok dikkatli bir şekilde yapılması gerekmesidir: İstenmeyen bir kullanıcı, tüm olağan araçların (gibi fsck) ve işletim sisteminin kendisinin başa çıkmaya hazır olmadığı katı bir şekilde hiyerarşik dosya ağacına döngü ekleyebilir.


6

Basit bir cevap:

  • Bir dizindeki bir dosya girişi, o dosyanın zor bağlantısıdır.

  • Bazı dosyalar, aynı dosyaya birden fazla sabit bağlantıya izin verildiğinden, böyle bir sabit bağlantıdan daha fazlasına sahiptir.


3

Unix'in ilk günlerinde, dosyalar dahili olarak belirli bir disk sürücüsündeki düğümlerdi. Dosya adları, onlara erişmenin daha kolay bir yoluydu.

Sabit bağlantı, bir inode'a birden fazla dosya adı atadı. Bir dosya oluşturabilir, ona ikinci bir adı sabit bir şekilde bağlayabilir ve ilk adı silebilir ve dosyayı ilk adında ikinci adıyla yapmaktan ayırt edilemez hale gelir.

Nitekim, bir programın bir dosyayı silmek için kullanması gereken sistem çağrısı 'unlink (2) `dır. Soyadı inode'dan ayrılıncaya kadar veriler kaybolmaz. (ve inode, bir yerdeki bir işlem tarafından açılmaz)

Linux'un hala programları çalıştırırken bir şeyler yükseltmesini kolaylaştıran şey budur. Bir işlem çalıştırılabilir çalıştırıyorsa ve bir güncelleme gerçekleşirse, program adı yeniden kullanılır, ancak eski sürümü içeren inode yine de çalışmaya devam eder. Ve bu eski sürümü çalıştıran son işlem durduğunda, bu eski sürüm depolaması serbest bırakılır.

Yumuşak bağlantılar ortaya çıktı çünkü üniter bir dosya ağacınız olduğunda, çoklu bağlama noktalarına sahip olduğunuzda, bir sabit sürücüden diğerine inode'a bir sabit bağlantı kuramazsınız. Böylece yumuşak bağlantılar icat edildi.


Bunun bir kopyası olduğunu tahmin unix.stackexchange.com/questions/9575/...
sabitlendikten

2
early daysşimdi neden farklı? cevabınız bu görüşü yansıtmıyor mu?
n611x007

@ n611x007 Çünkü 'bugünlerde' Linux gibi şeyler inode modeline uymayan unix olmayan dosya sistemlerini kurabilir. Örneğin FAT türevleri ve ISO-9660. Bunun yerine tek boyutta çok daha farklı dosya sistemi ekoloji herkese uyar var
sabitlendikten

1

Bir dosya, diske yazılmış verilerdir. Bu verilere, sistemde bu dosya tarafından diskte hangi blokların kullanıldığını söyleyen dosya hakkında meta veriler içeren inode tarafından başvurulur. Sabit bir bağlantı bu dosyanın inode numarasını gösterir.

Teknik olarak, evet, yeni bir dosya oluşturuyorsunuz, ancak tüm bu dosya başvurduğu dosyanın inode numarası ve bir adı. İnode'a bir işaretçi veya dosyaya bir işaretçi oluşturmak olarak düşünmek daha iyidir.


1

Dosya, bir dosya sistemindeki girdiler hakkında yaygın olarak kullanılan bir kavramdır.

Genellikle Dizin , Normal Dosya (sabit link) ve Sembolik Bağlantı (yumuşak link) içerir. Ve hatta cihaz ve soket içerebilir.

Benim sorum basitçe bir dosya ve sabit link arasındaki fark nedir? Sabit bağlantı bir inode'a işaret ediyor, peki dosya nedir? Inode girişi kendisi? Ya da sert bir bağlantıya sahip bir Inode?

Diyelim ki dokunuşlu bir dosya oluşturdum, sonra Inode Table'ta bir Inode girişi yaratıldı. Ve dosya ile aynı İnode numarasına sahip bir sabit bağlantı oluşturdum. Peki ben yeni bir dosya mı yarattım? Veya dosya sadece bir Inode olarak tanımlanır?

Sembolik bağlantı bile genellikle dosya olarak sayıldığından, sabit bir bağlantının kendisi de dosya olarak sayılabilir. Sert veya yumuşak bir bağlantıdan bağımsız olarak bir dosya olduğunu söyleyebilirsin.

Konsept biraz belirsiz olduğundan, inode girişinin bir dosya olduğunu söylemek doğru olur, gerçekte verilere başvurmak isteyebilirsiniz.

Eğer bir C ++ veya Java programcısıysanız, std :: filesystem :: file_type , java.io.File ve java.nio.file.Files hakkında okumak isteyebilirsiniz .

Sabit link ile yumuşak link arasındaki farklarla ilgili detaylar, eklenmiş yorumda bulunan linkte bulunabilir.


1

Belirli bir isimdeki bir "dosya" ile "hard link" arasındaki fark tarihin bir örneğidir. Bir creat sistem çağrısı kullanılarak belirli bir ada sahip (normal) bir dosya oluşturulur, link sistem çağrısı kullanılarak bir hard link oluşturulur.

Bununla birlikte, insanlar dizin girişlerinin tarihini anlatıp hatırlıyor ve buna göre dosya ve hard linkleri çağırıyor olsa da, dosya sistemi yok. "Orjinal dosya" ve "hard link" dizin girişleri kalite açısından tamamen ayırt edilemez: Her ikisi de bir dosya adı ile bir dosyanın inode'u arasında bir referans oluşturur ve bu gibi son başvuru yapıldıktan sonra (referanslar sadece dosya isimleri değildir) bir dosya değil, aynı zamanda açık bir dosyaya erişilebilen dosya tanımlayıcıları), referans alınmayan inode için dosya silinmiş sayılır ve inode ve ilgili dosya alanı geri kazanılır.

Böylece, insanlar "dosyalar" ve "hard linkler" e zıt olduklarında, ilki "1 link sayısı" ile ortaya çıktı ve diğerleri daha büyük link sayımı ile ortaya çıktı. Aradaki fark akademik ve aslında bir dosyayı bir kerede yeniden adlandırmak, hedef ad için sert bir bağlantı oluşturmaktan ve ardından kaynak adı için bağlantıyı kaldırmaktan ibaretti. Günümüzde, genellikle bunu atomik olarak yapan tek bir sistem çağrısı kullanılmaktadı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.