Ln -d'nin başarılı olduğu herhangi bir dosya sistemi var mı?


11

Ln için manpage'den :

-d, -F, --directory
  allow the superuser to attempt to hard link directories (note: will 
  probably fail due to system restrictions, even for the superuser)

Buna izin veren herhangi bir dosya sistemi sürücüsü var mı yoksa tek seçenek mount --bind <src> <dest>mi? Yoksa bu tür bir davranış, dosya sistemine özgü sürücüye ulaşmadan önce çekirdek tarafından engelleniyor mu?

NOT: Aslında bunu herhangi bir makinede yapmayı planlamıyorum, sadece merak ediyorum.

Yanıtlar:


6

Önce bir not: lnKomut gibi seçenekleri yok -d, -F, --directorybu olmayan bir taşınabilir GNUism olduğunu.

Aradığınız özellik link(1)komut tarafından uygulanır .

Orijinal sorunuza geri dönün:

Tipik bir UNIX sisteminde, dizinler üzerindeki sabit bağlantıların mümkün olup olmadığı kararı dosya sistemi sürücüsünde verilir.

Solaris UFS sürücüsü dizinlerdeki sabit bağlantıları destekler, ZFS sürücüsü desteklemez.

Solaris'teki UFS'nin sabit bağlantıları desteklemesinin nedeni AT&T'nin bu özellikle ilgilenmesidir - BSD'den gelen UFS sabit bağlantılı dizinleri desteklemez.

ZFS'nin sabit bağlantılı dizinleri desteklememesinin nedeni Jeff Bonwick'in bu özelliği sevmemesidir.

Linux ile ilgili olarak, Linux'un üst çekirdek katmanlarındaki dizinlerde sabit bağlantılar yaratma girişimlerini engellediğini tahmin ediyorum. Bu varsayımın nedeni, Linus Torvalds'ın git clonesabit bağlantılı dizinleri destekleyen bir platformda kök olarak çağrıldığında dizinleri parçalayan GIT için kod yazmasıdır .

Sabit bağlantılı dizinler oluşturmayı destekleyen bir dosya sisteminin unlink(1)boş olmayan dizinleri kök olarak kaldırmak için de desteklemesi gerektiğini unutmayın.

Dolayısıyla, Torvalds'ın Linux'un nasıl çalıştığını bildiğini varsayarsak ve Linux sabit bağlantılı dizinleri destekliyorsa, Torvalds unlink(2)bir dizini root olarak çağırmanın bir hatayla dönmeyeceğini, o dizini parçalayacağını bilmeliydi . Başka bir deyişle, Linux'un bir dosya sistemi sürücüsünün sabit bağlantılı dizinleri uygulamasına izin vermesi olası değildir.


3

OP'nin sorusundan bahsediyor mount --bind. Hızlı bir kontrol, bağlanan dizinin bağlantı sayısını değiştirmediğini gösterir. Sabit bağlantı her zaman kullanarak görebileceğiniz bağlantı sayısını değiştirir ls -ld.

Normalde (çoğu Unix benzeri sistemde), bir dizine yapılan sabit bağlantıların sayısı, bu ada bağlı olan dizinlerin sayısı, ör.

  • ".." (üst dizin)
  • "." (dizinin kendisi)
  • alt dizinleri

(Genellikle) daha bilgilendirici bilgi sayfasını okuduysanız, başkalarının yaptığı gibi keşfedebilirsiniz :

Oh great, one spends hours tying to find what is wrong only to
discover,
$ info ln
On all existing implementations, you cannot make a hard link to a
directory, and hard links cannot cross filesystem boundaries.  (These
restrictions are not mandated by POSIX, however.)

Therefore, kindly say everywhere you say super-user only,
instead say "few systems, super-user only".

şu anda ifade edilmiş olmasına rağmen

Çoğu sistem bir dizine sabit bağlantı yapılmasını yasaklar; izin verilen yerlerde, yalnızca süper kullanıcı bunu yapabilir (ve dikkatle, çünkü bir döngü oluşturmak diğer birçok yardımcı programda sorunlara neden olacaktır). Sabit bağlantılar dosya sistemi sınırlarını aşamaz. (Ancak bu kısıtlamalar POSIX tarafından zorunlu kılınmamıştır.)

Bir dizine sabit bağlantı oluşturmak (ve kaldırmak), bir dizinin bağlantısı kesildiğinde dosyaları kaybetmekten korunmak için kısıtlanmış bir özelliktir. C işletim sistemi arabirimindeki bağlantı / bağlantı kaldırma işlemleri simetrik olduğundan , dizinlere bağlantı normalde yalnızca mkdir / rmdir çağrılarında yapılır.

GNU çekirdeklerinin çoğunun 20-30 yıl önce, bazı gerçek müze parçalarının hala kullanımda olduğu yazıldığını (ve belgelendiğini) unutmayın. Belirtildiği gibi Sabit Linki ilgili , başlangıçta orada were hayır mkdir / rmdir çağrıları; sabit bağlantılar kullanılarak (ayrıcalıklı bir işlem olarak) dizinler oluşturuldu. Bahsedilen sorunları çözmek için sistem çağrıları eklendiğinde bunların hepsi ortadan kalktı. Ancak dokümantasyon, bu sistemlerin bakımını yapanların hafızasını geçmeye devam ediyor. Sorgulandı seçenek selefi oldu fileutils(kombine edilmiş textutilsve shellutilsoluşturmak üzere 1990'ların ortalarında coreutils). Değişiklik günlüğünden birkaç öğe, özelliğin kökenini netleştirmeye yardımcı olabilir:

Mon Jul 23 16:57:44 1990  David J. MacKenzie  (djm at albert.ai.mit.edu)

        * cp.c (copy): Make +update operate silently, like +one-file-system.
        * ln.c: Add -F as synonym for -d, for SunOS compatibility.

Wed Feb 21 11:13:26 1990  David J. MacKenzie  (djm at albert.ai.mit.edu)

        * ln.c (error): New function.
        (main, do_link): Call error instead of fprintf and exit. 
        (main): Recognize new -d +directory option to allow superuser to
        make hard links to dirs, like the BSD ln -f option.
        (do_link): Don't allow hard links to dirs (they are hard to
        get rid of -- rmdir and unlink don't do it), unless -d was given.
        (usage): Mention -d +directory option.

Örneğin, bu özelliğin uygulanabilir olduğu antikalardan birinin SunOS olduğunu görebilirsiniz. İlgili kılavuz sayfası şunları söyledi:

OPTIONS
       -f     Force a hard link to a directory -- this option is  only   avail-
              able to the super-user.

       -s     Create a symbolic link or links.

SYSTEM V OPTIONS
       -f     Force  files to be linked without displaying permissions, asking
              questions or reporting errors.

       -F     Force a hard link to a directory -- this option is  only  avail-
              able to the super-user.

       -s     Create a symbolic link or links.

Belgelerde belirtildiği gibi, bu özellik (ve karşılık gelen seçenek POSIX'te değildir (ve nedenini açıklayan Gerekçe bölümüne bakın). Aksine, özellik yeni bir komuta (GNU coreutils tarafından da sağlanır) çağrıldı link. komutun kendisi belirsizdir , standarttan herhangi bir şekilde faydalanmak için işlev çağrısının açıklamasını okumalısınız , ancak standart, gerekli ayrıcalıklar hakkında feragatnamenin yerine getirilmesinin yanı sıra, komutun çalışacağı koşulları açıklığa kavuşturmaz. Bunun için, standart dışındaki sisteme bağlı özelliklere gitmeniz gerekir:

Bir dizine bağlanma, geçmiş uygulamaların çoğunda süper kullanıcı ile sınırlıdır, çünkü bu özellik dosya hiyerarşisinde döngüler oluşturabilir veya dosya sistemini başka şekilde bozabilir. POSIX.1-2008'in bu cildi bu felsefeyi engelleyerek link()ve unlink()yaparak devam ettiriyor . Uygulayıcı böyle bir uzantı tasarladığında diğer işlevler bunu yapabilir.

Orada olan , normal numarası (2 artı alt dizinleri) ötesinde dizinlere sabit bağları kullanmak sistemleri.

OSX, sıradan dosyalar için dizinlere birden çok sabit bağlantı kullanır . Bunu kullanarak desteklemez ln( kılavuz sayfasına bakınız ). Time Machine Magic'in Nasıl Çalıştığı'na göre , Time Machine yedekleme tesisi için kullanılan sürümleri sağlamak için bunu yapar.

Daha fazla okuma:


3
Bu soruya hiç cevap vermiyor gibi görünüyor.
Michael Homer
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.