Neden dizinler için sabit linklere izin verilmiyor?

97

Ubuntu 12.04 kullanıyorum. Herhangi bir dizin için bir sabit bağlantı oluşturmaya çalıştığımda, başarısız olur. Dosya sistemi sınırları içindeki dosyalar için sabit bağlantılar oluşturabilirim. Dosya sisteminin ötesinde dosyalar için neden hardlink 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 sebebi bilmek istiyorum. Tüm GNU / Linux dağıtımları ve Unix lezzetleri (BSD, Solaris, HP-UX, IBM AIX) veya sadece Ubuntu veya Linux'ta aynı mıdır?

    
sordu Nischay 01.11.2012 22:18

4 cevap

124

Dizin sabit bağlantıları dosya sistemini birden çok şekilde kırıyor

Döngüler oluşturmanıza izin veriyorlar

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

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

Bir 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

find yüklemi olmadan -maxdepth komutu sonsuz bir döngüye girecektir. Bu, artık önemli bir komut olan find 'yi tutarlı bir şekilde kullanamayacağınız anlamına gelir. Aynı derecede önemli locate komutu için de benzer.

Tanım olarak bir ağacın döngüleri yoktur, bu nedenle dosya sistemi artık bir ağaç değildir.

Ebeveyn dizinlerinin belirsizliğini bozarlar

Bir dosya sistemi döngüsü ile birden çok üst dizin bulunur:

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

İlk durumda, /tmp/a , /tmp/a/b 'nin üst dizinidir.
İkinci durumda, /tmp/a/b/l , /tmp/a/b/l/b ile aynı olan /tmp/a/b dizinidir.
Yani iki tane ana dizin var.

Dosyaları çoğalttılar

Dosyalar, symlinks çözümlendikten sonra yollar tarafından tanımlanır. Yani

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

farklı dosyalar. Dosyanın sonsuz sayıda başka yolu var. Onlar, onların inode sayısı bakımından aynıdır. Ama açıkça döngüler beklemiyorsan, bunu kontrol etmek için bir sebep yok.

Bir dizin bağlantı noktası ayrıca bir alt dizini veya herhangi bir derinlikte alt öğe veya üst öğe olmayan bir dizini işaret edebilir. Bu durumda, bağlantının alt öğesi olan bir dosya, iki yolla tanımlanan iki dosyaya çoğaltılabilir.

Örneğiniz

$ 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 linkler ve hatta yumuşak bağlantılı dizin döngüleri içerebilen bir yol genellikle bir dosyayı tanımlamak ve açmak için kullanılır. Normal, doğrusal bir yol olarak kullanılabilir.

Ancak, yolları karşılaştırmak için yollar kullanıldığında başka durumlar da vardır. Bu durumda, yoldaki sembolik bağlantılar önce çözülebilir, onu minimum 'a dönüştürebilir ve genellikle kanonik bir yol oluşturarak temsil üzerinde anlaşmaya varılır:

:

Bu mümkündür, çünkü yumuşak bağlantılar, bağlantı içermeyen yollara genişletilebilir. Bunu bir yoldaki tüm yumuşak bağlantılar ile yaptıktan sonra, kalan yol, bir yolun her zaman kesin olduğu bir ağacın parçasıdır.

% co_de komutu%, yolunu kanonik yoluna çözebilir:

$ readlink -f /some/symlinked/path

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

Yumuşak bir bağlantı, tüm sorunlara neden olamaz, çünkü dosya sisteminin içindeki bağlantılardan farklıdır. Zor bağlantılardan ayırt edilebilir ve gerektiğinde symks olmadan bir yola çözülebilir. Bazı anlamlarda, symlinks eklenmesi temel dosya sistemi yapısını değiştirmez - bunu tutar, ancak uygulama katmanı gibi daha fazla yapı ekler.

readlink 'den:

 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
        [  ...  ]
    
verilen cevap Volker Siegel 17.09.2014 13:06
72

"Genelde sert linkleri kullanmamalısınız", aşırı geniş. Sabit bağlantılar ve sembolik bağlantılar arasındaki farkı anlamalı ve her birini uygun şekilde kullanmalısınız. Her birinin kendine özgü avantaj ve dezavantajları vardır:

Symlinks şunları yapabilir:

  • Dizinlere yönlendir
  • Varolmayan nesnelere yönlendirme
  • Aynı dosya sistemi dışındaki dosya ve dizinlere yönlendirme

Sabit bağlantılar şunları yapabilir:

  • Başvurduğu dosya silinmeye devam etsin

Sabit linkler özellikle "copy on write" uygulamalarında kullanışlıdır. Bir dizin yapısının yedek kopyasını tutmanıza izin verirken, yalnızca iki sürüm arasında değişen dosyalar için alan kullanmanız gerekir.

cp -al komutu bu bağlamda özellikle yararlıdır. Tüm dosyaların orijinal dosyalara sabit bağlantılar tarafından 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 ek alan kaplar. Bu özellikle multigenetrasyonel yedekleri korurken kullanışlıdır.

    
verilen cevap user133232 18.02.2013 16:06
37

FYI, dizinleri için sabit bağlantı olarak aynı şeyi mount kullanarak gerçekleştirebilirsiniz:

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

Bu çok tehlikelidir çünkü çoğu araç ve program bağlayıcıdan haberdar olmaz . Yukarıdaki örnekteki gibi bir şey yaptım ve sonra rm -rf /home/user 'ye ilerledim. Neyse ki, /var/www ile alakalı hiçbir şey yoktu.

    
verilen cevap stackount 07.11.2013 18:39
18

Sabit bağlantı dizinlerine izin verilmemesinin nedeni biraz tekniktir. Esasen, dosya sistemi yapısını bozarlar . Genelde sert linkleri kullanmamalısınız. Sembolik bağlantılar, aynı işlevselliklerin çoğuna sorun oluşturmadan izin verir (ör.% Co_de%).

    
verilen cevap astex 01.11.2012 22:25

Etiketlerdeki diğer soruları oku