Dizinler için neden zor bağlantılara izin verilmiyor?


129

Ubuntu 12.04 kullanıyorum. Herhangi bir dizin için sabit bir bağlantı oluşturmaya çalıştığımda başarısız oluyor. Dosya sistemi sınırları içindeki dosyalar için sabit bağlantılar oluşturabilirim. Dosya sisteminin ötesindeki dosyalar için neden sabit bağlantılar oluşturamadığımızı biliyorum.

Bu komutları denedim:

$ ln /Some/Direcoty /home/nischay/Hard-Directory
hard link not allowed for directory
$ sudo ln /Some/Direcoty /home/nischay/Hard-Directory
[sudo] password for nischay: 
hard link not allowed for directory

Sadece bunun arkasındaki nedeni bilmek istiyorum. Tüm GNU / Linux dağıtımları ve Unix lezzetleri (BSD, Solaris, HP-UX, IBM AIX) için mi yoksa sadece Ubuntu veya Linux'ta mı?



2
Deneyin ln -F <src> <dst>ve belki çalışır. Elbette, Unix'in eski sürümlerinde süper kullanıcı için çalışıyordu. Bunun UCB veya Sistem V olup olmadığını hatırlayan var mı? Evet, kötü şeyler olabilirdi, ama genellikle değil. Hatırladığım rmdirkadarıyla , sert bir bağlantıdan silmeyi sürdürmemeyi biliyordum. Ancak, kullanıcılar karışabilir ve hatalı şeyleri silebilirler.
Steve Pitchers

@StevePitchers rmdirSabit bağlantıları nasıl özel bir şekilde ele alabilirim? Sert bir bağlantı sadece normal bir bağlantıdır - ek bir bağlantıdır. Ekstra kayıt olmadan alışılmadık bir ekstra bağlantı olup olmadığını bulmak bile kolay değildir.
Volker Siegel

1
Her düğüm, kendisine işaret eden sabit bağlantıların sayısını depolar: içerikler yalnızca kalan bağlantı olmadığında serbest bırakılır. Böylece rmdirdizinin başka yerlerden bağlantıları olup olmadığını anlayabilirsiniz. Özyinelemeli kaldırma, rm -r"izin reddedildi" gibi hatalar olsa bile doğru şekilde çalışacağından emin olmak için dikkatlice kodlanmalıdır. BTW, UCB = BSD, hıh!
Steve Pitchers

2
ln -FDizinler üzerinde çalıştım ve çalışmasını sağladım. Ancak daha sonra dosya sistemini bozma korkusuyla dizini silmeye cesaret edemezsiniz.
Edward Falk

Yanıtlar:


159

Dizin sabit bağlantıları dosya sistemini çeşitli yollarla bozuyor

Döngü oluşturmanıza izin veriyorlar

Bir dizine sabit bir bağlantı, bir dosya sistemi döngüsü yaratan bir ebeveyne bağlanabilir. Örneğin, bu komutlar arka bağlantı ile bir döngü oluşturabilir l:

mkdir -p /tmp/a/b
cd /tmp/a/b
ln -d /tmp/a l

Dizin döngüsüne sahip bir dosya sistemi sonsuz derinliğe sahiptir:

cd /tmp/a/b/l/b/l/b/l/b/l/b

Böyle bir dizin yapısını geçerken sonsuz bir döngüden kaçınmak biraz zordur (örneğin, POSIX bundan findkaçınmayı gerektirir ).

Bu tür bir sabit bağlantıya sahip bir dosya sistemi artık bir ağaç değildir, çünkü bir ağacın tanımı gereği bir döngü içermemesi gerekir.

Üst dizinlerin belirsizliklerini kırarlar

Bir dosya sistemi döngüsüyle, birden fazla üst dizin dizini vardır:

cd /tmp/a/b
cd /tmp/a/b/l/b

İlk durumda, /tmp/aana dizinidir /tmp/a/b.
İkinci durumda, /tmp/a/b/lüst dizin /tmp/a/b/l/bile aynıdır, /tmp/a/b.
Yani iki tane ana dizin var.

Dosyaları çoğaltırlar

Dosyalar, linkleri çözdükten sonra yollar ile tanımlanır. Yani

/tmp/a/b/foo.txt
/tmp/a/b/l/b/foo.txt

farklı dosyalar.
Dosyanın daha birçok yolu var. İnode sayılarına göre de aynıdır. Ancak açıkça döngü beklemiyorsanız, bunu kontrol etmek için hiçbir neden yoktur.

Bir dizin hardlink ayrıca bir alt dizine veya ne alt ne de herhangi bir derinliğe sahip olan bir dizine işaret edebilir. Bu durumda, bağlantının çocuğu olan bir dosya iki yolla tanımlanan iki dosyaya çoğaltılır.

Senin örnek

$ ln /Some/Direcoty /home/nischay/Hard-Directory
$ echo foo > /home/nischay/Hard-Directory/foobar.txt
$ diff -s /Some/Direcoty/foobar.txt /home/nischay/Hard-Directory/foobar.txt
$ echo bar >> /Some/Direcoty/foobar.txt
$ diff -s /Some/Direcoty/foobar.txt /home/nischay/Hard-Directory/foobar.txt
$ cat /Some/Direcoty/foobar.txt
foo
bar

Dizinlere yumuşak bağlantılar nasıl çalışır?

Yumuşak bağlantılar ve hatta yumuşak bağlantılı dizin döngüleri içerebilecek bir yol genellikle yalnızca bir dosyayı tanımlamak ve açmak için kullanılır. Normal, doğrusal bir yol olarak kullanılabilir.

Ancak, dosyaları karşılaştırmak için yollar kullanıldığında başka durumlar da vardır. Bu durumda, yoldaki sembolik bağlantılar ilk önce çözülebilir, onu minimal hale getirebilir ve kanonik bir yol oluşturarak genel olarak kararlaştırılmış olur :

Bu mümkündür, çünkü yumuşak bağlantıların tümü bağlantı olmadan yollara genişletilebilir. Bunu bir yoldaki tüm yumuşak bağlantılarla yaptıktan sonra, kalan yol bir yolun her zaman net olmadığı bir ağacın parçasıdır.

Komut readlink, kurallı yoluna giden yolu çözebilir:

$ readlink -f /some/symlinked/path

Yumuşak bağlantılar dosya sisteminin kullandıklarından farklı

Yumuşak bağlantı tüm sorunlara neden olamaz çünkü dosya sistemi içindeki bağlantılardan farklıdır. Sert bağlantılardan ayırt edilebilir ve gerektiğinde sembolik bağlantıları olmayan bir yola çözümlenebilir.
Bir anlamda, sembolik bağlantılar eklemek, temel dosya sistemi yapısını değiştirmez - onu tutar, ancak bir uygulama katmanı gibi daha fazla yapı ekler.


Kimden man readlink:

 NAME
        readlink - print resolved symbolic links or canonical
        file names

 SYNOPSIS
        readlink [OPTION]... FILE...

 DESCRIPTION
        Print value of a symbolic link or canonical file name

        -f, --canonicalize
               canonicalize by  following  every  symlink  in
               every component of the given name recursively;
               all but the last component must exist
        [  ...  ]

1
Neden tüm bunları yumuşak bir bağlantı yapamıyor?
Tanay

1
@Tanay Doğru, yumuşak bağlantıları olan benzer durumlara karşılaştırmak için genişlemeye yardımcı olabilir. Deneyeceğim.
Volker Siegel

Tam olarak bu sadece dizinlerle nasıl ilgilidir? Anladığım kadarıyla bu problemler aynı zamanda hardlink dosyalar için de bir problemdir. Dahası, hardlinking'i, verilen bir yönetmenin başkalarının içeri girmesine izin vermek, ebeveyn zincirinin içinde de izin vermek zorunda kalmadan değiştirmek için kolay bir yol olarak görüyorum. Grup ekleme / değiştirme beceriniz yoksa çok kullanışlı bir ses ...
inetknght

Harika bir cevap, ama sonra ... Apple, Time Machine için bu sorunları nasıl çözdü?
Damien,

Kulağa çok ilginç geliyor! Ama sorunun ne olduğu hakkında hiçbir şey bilmiyorum - bana bir ipucu verebilir misin?
Volker Siegel

77

“Genelde yine de sert bağlantılar kullanmamalısınız” aşırı geniş. Sabit bağlantılar ve sembolik bağlantılar arasındaki farkı anlamanız ve her birini uygun şekilde kullanmanız gerekir. Her birinin kendine özgü avantajları ve dezavantajları vardır:

Symlinks şunları yapabilir:

  • Dizinleri göster
  • Var olmayan nesnelere gelin
  • Aynı dosya sisteminin dışındaki dosyalara ve dizinlere gelin

Sabit bağlantılar şunları yapabilir:

  • Başvurdukları dosyayı silinmekten koruyun

Sabit bağlantılar özellikle "yazarken kopyala" uygulamalarını gerçekleştirmede yararlıdır. Yalnızca iki sürüm arasında değişen dosyalar için alan kullanırken, bir dizin yapısının yedek kopyasını saklamanıza izin verir.

Komut cp -albu konuda özellikle yararlıdır. Tüm dosyaların orijinal dosyalara sabit bağlantılarla temsil edildiği bir dizin yapısının tam bir kopyasını oluşturur. Daha sonra yapıdaki dosyaları güncellemeye devam edebilirsiniz ve yalnızca güncellediğiniz dosyalar daha fazla yer kaplar. Bu, çoklu jenerasyon yedeklemelerini korurken özellikle yararlıdır.


41
düzenlediğiniz takdirde son paragrafında ilişkin, "kopyalanmış" hardlinked dosya, orijinal dosya da değiştirilir - bkz unix.stackexchange.com/questions/70531/...
marcin

32
Sabit bağlantıların bu açıklaması yanıltıcıdır. Temel olarak, bağlantıların "başvurdukları dosyayı silinmekten alıkoyması" doğrudur, ancak bu, bağlantıların yalnızca bir yan etkisidir. Bir dizinde hard linkler oluşturabileceğiniz, "orjinal" dosyasını değiştirebileceğiniz ve daha sonra hard linkleri bir şekilde eski içeriğe işaret edebileceğiniz kesinlikle doğru DEĞİLDİR. Aslında, hard linklerin yol gösterici gerçeği, bir link değil, en azından bir dosyaya işaret eden bir isim olan orijinal "dosyadan" değil. Sabit bağlantı, aynı dosyaya işaret eden başka bir addır.
mat

7
Yedekleme fikri iyi ve aslında bunu çok kullanıyorum, ancak kullanıcıların bir dosyayı değiştirmenin de yedeği değiştireceği konusunda uyarılması gerektiğini düşünüyorum.
Mark

3
Heck, bir sembolik bağlantının hiçbir şeye işaret etmesi gerekmez. ln -s "Don't use this directory" READMEmeşru. Aslında, düşünürseniz, bir dizin ilişkisel veritabanı olarak kullanılabilir ve hiç bir gerçek dosya içermez.
Edward Falk

5
-1 Bu soruya cevap vermiyor ve bazı bilgiler açıkça yanlış.
wjandrea

43

Bilginize, mount kullanarak dizinler için aynı bağlantıları elde edebilirsiniz:

mount -t bind /var/www /home/user/workspace/www

Bu çok tehlikelidir, çünkü çoğu araç ve program bağlayıcılığın farkında olmayacaktır . Bir keresinde yukarıdaki örnekte olduğu gibi bir şey yaptım ve sonra devam etti rm -rf /home/user. Neyse ki, ilgili hiçbir şey yoktu /var/www.


6
Ben kullandım mount --bind <src> <dest>. Silmek için dikkatle kullanın src)
Kachar

1
Anladım:mount: unknown filesystem type 'bind'
Wizek

4
Busybox üzerinde, o itmount -o bind src dest
Mat M

@MatM, Debian ile aynı
hanshenrik

2
Okumak için sadece montaj yapmanız gerekiyorsa, montaj noktasında izinleri ayarlayabilir ve rm -rfsorunu önleyebilirsiniz . superuser.com/questions/320415/…
zanerock

19

Dizinleri birbirine bağlamanın zor olmasının nedeni biraz tekniktir. Temel olarak, dosya sistemi yapısını bozarlar . Genelde zaten sabit linkler kullanmamalısınız. Sembolik linkler aynı işlevselliğin çoğuna problem yaratmadan izin verir (örn. ln -s target link).


17
Sabit bağlantıların iyi kullanım durumları vardır. Bunları genellikle kullanmamalısınız demek, biraz fazla geniş.
Sander Steffann 28:13

4
OP'nin sorusunu (ve benimki) gerçekte yanıtlayan bağlantıyı sağlamak için +2, bir fikir vermek için -1 ("Genelde yine de sert bağlantıları kullanmamalısınız" - - eğer destekleyecek bağlantıları varsa). Güzeldi, çünkü yine de +2 veremiyorum. D
msb

3
"Dosya sistemi yapısını bozuyorlar" bağlantısı çalışmıyor.
Charlie Parker

5
Cevaptaki bağlantının içeriğini özetlemeye çalışın ve bağlantıyı referans olarak tutun. Bu, Bağlantı Çürüklüğü'nü önlemek için bir Yığın Değişimi için iyi bir uygulama.
Oxwivi 17:14

3
Aferin @CharlieParker; en iyi istenmeyen (?) tüm zamanların ironik yorumu :)
Eliran Malka
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.