Bir sistemdeki tüm bozuk sembolik bağların silinmesinin bir dezavantajı var mı?


46

Linux sistemimdeki tüm dosyaları yineleyen ve onlar hakkında bazı meta veriler oluşturan bir komut dosyası çalıştırıyordum ve bozuk bir sembolik bağlantıya çarptığında hata attı.

Yeni doğanlar * nix, ancak dosyaları birbirine bağlamanın ve ne kadar kopuk bağlantıların oluştuğunun arkasındaki ana fikri anlıyorum. Bildiğim kadarıyla sokaktaki çöp eşdeğeri gibi. Kaldırdığım bir program, paket yöneticisinin var olduğunu ve kendisine ait olduğunu ya da bir yükseltme işleminde geride bırakıldığını söyleyecek kadar akıllı değildi. İlk başta, atlamak için koştuğum senaryoyu ayarlamaya başladım, sonra düşündüm ki, 'aşağıdayken her zaman onları silebiliriz ...'

Koşuyorum Ubuntu 14.04 (Trusty Tahr). Yapmamam için hiçbir neden göremiyorum, ancak devam etmeden ve bunu geliştirme sistemimde çalıştırmadan önce, bunun gerçekten korkunç bir fikir olması için herhangi bir neden var mı? Kırık sembolik bağlantılar farkında olmadığım bir amaca hizmet ediyor mu?


7
Evet: aşağıda verilen işaretli cevaba bakınız. Fakat daha da önemlisi, bu probleminize bir çözüm değildir: senaryo düzgün bir şekilde çalışmalı, sadece sterilize edilmiş bir sisteme değil. Bir sistem sterilize edilebilir ve sterilize olma ile senaryoyu çalıştırmanın ikinci yarısı arasındaki milisaniye. Ayrıca bu, tek sorumluluk ilkesini ve Unix felsefesini ihlal etti: “bir şeyi iyi yap”.
ctrl-alt-delor

Yanıtlar:


68

Kırık sembolik bağların birçok nedeni vardır:

  • Artık var olmayan bir hedefe bir bağlantı oluşturuldu.
    Çözünürlük: Kırık sembolik bağlantıyı kaldırın.
  • Taşınan hedef için bir bağlantı oluşturuldu. Veya hedefine göre taşınan göreceli bir bağlantıdır. (Göreli sembolik bağların kötü bir fikir olduğu anlamına gelmez - tam tersi: mutlak sembolik bağlar, hedefleri hareket ettiğinden daha bayatlığa eğilimlidir.)
    Çözünürlük: amaçlanan hedefi bulun ve bağlantıyı düzeltin.
  • Bağlantı oluşturulurken bir hata oluştu.
    Çözünürlük: amaçlanan hedefi bulun ve bağlantıyı düzeltin.
  • Bağlantı, çıkarılabilir bir diskte, ağ dosya sisteminde veya şu anda bağlı olmayan başka bir depolama alanında bulunan bir dosyaya bağlanır. Çözünürlük: yok, bağlantı her zaman kopmaz. Bağlantı, depolama alanı monte edildiğinde çalışacaktır.
  • Bağlantı, tasarımın sadece zamanının bir kısmını tutan bir dosyaya. Örneğin, dosya, bir işlemin önbelleğe alınmış çıktısıdır; bilgiler eskiyken silinir, ancak yalnızca kesin istek üzerine yeniden oluşturulur. Veya bağlantı, boşken silinen bir gelen kutusunadır. Veya link sadece ilgili çevre birimi takılı olduğunda mevcut olan bir cihaz dosyasına yöneliktir. Çözünürlük: yok, bağlantı her zaman kopmaz.
  • Bağlantı yalnızca farklı bir depolama hiyerarşisinde geçerlidir. Örneğin, yalnızca chroot hapishanesinde geçerlidir veya NFS sunucusu tarafından verilir ve yalnızca sunucuda veya bazı istemcilerinde geçerlidir.
    Çözünürlük: yok, bağlantı her yerde kopuk değil.
  • Bağlantı sizin için koptu, çünkü hedefe ulaşmak için bir dizini geçme izniniz yok, ancak uygun ayrıcalığa sahip kullanıcılar için kopuk değil.
    Çözüm: yok, bağlantı herkes için kopmuyor.
  • Bağlantı olduğu gibi, bilgi depolamak için kullanılan vinc17 aktardığı Firefox kilit örneğin . Bu şekilde yapmanın bir nedeni, bir atomik bağlantıyı atomik olarak doldurmanın daha kolay olmasıdır - başka bir yolu yoktur; oysa, bir dosyayı atomik olarak doldurmak daha karmaşıktır: dosya içeriğini geçici bir ad altında oluşturmanız, sonra yerine yerleştirmeniz ve Bir çökmeyle geride bırakılan eski geçici dosyaları işleme. Başka bir neden, sembolik bağların tipik olarak doğrudan kendi dosyalarının içinde bazı dosya sistemlerinde depolanmasıdır; bu da okumaları bir dosyanın içeriğini okumaktan daha hızlı yapar.
    Çözünürlük: yok. Bu durumda, bağlantıyı kaldırmak zararlı olacaktır.

Bir bağlantının ilk kategoriye girdiğini tespit ederseniz, emin olun, devam edin ve silin. Aksi takdirde, kaçının.

Dizinleri yinelemeli olarak geçen ve dosya içeriğiyle ilgilenen bir program genellikle bozuk sembolik bağlantıları görmezden gelmelidir.


sembolik bağlar (genellikle) üst dizinlerinde bulunmaz. Ancak bazı dosya sistemlerinde bağlantı hedefi inode'da saklanır.
James Youngman

Çok iyi bir liste. Hem 4 hem de 6 tipine giren bir sürü bağlantım var. SSHFS ile kurduğum bir dosya sistemine işaret ediyorlar. Dosya sistemi monte edilmediğinde, bunlar tip 4'tür; dosya sistemi monte edildiğinde, sadece ona erişebiliyorum, bu yüzden herkes için tip 6 (hatta root).
Barmar

Bozuk bir sembolik bağlantının bir başka olası nedeni: sadece bir kısmı var olan gerçek bir dosyaya ait sembolik bağlantı. Örneğin, derin yolları olan bir iş akışında, iş akışı tamamlandığında silinen, ancak bu iş akışının bir sonraki kullanımı sırasında yeniden oluşturulacak olan bir iş dosyasına (kolaylık sağlamak için) bir bağlantı olabilir. / dev / modem böyle bir şey çünkü fiziksel aygıt bağlandığında işaret ettiği asıl aygıt dosyası var.
Joe,

oldukça kapsamlı bir cevap!
njzk2

1
@MichaelDurrant Uh? Mesele şu ki olumsuz (veya eksikliğinin) kırık sembolik bağın nasıl oluştuğuna bağlı.
Gilles 'SO- kötülük yapmayı bırak'

19

Tüm sarkan sembolik bağlantıları kör bir şekilde çıkarmayın. Sadece bazı bilgileri taşımak için var olabilirler ve bir sembolik bağlantı oluşturması atomik olduğundan normal dosyalardan daha güvenli olabilirler.

Örneğin, Firefox, değeri "IP_adresi: + PID" gibi bir biçime sahip bir sembolik bağlantı olan bir kilit dosyası "kilit" oluşturur.


1
Örneğin, bir program dinamik olarak boş bir dosyayı doldurabilir, bu sembolik bağlantılardan biri programın çalışmadığı sırada kopmuş bir bağlantıdır ? Ya da sadece bir bilgi parçası olabilir?
blanket_cat

1
@knotech Bazı sembolik bağlantıların amacı (çalışan bir programla mutlaka ilişkilendirilmez) sadece var olabilir. Değerleri ya anlamsızdır ya da bazı özel bilgileri iletir; Her iki durumda da, genel olarak, hiçbir şeye işaret etmezler. Boş dosya yok, sadece bir sembolik bağlantı var. Ayrıca, bir örnek olarak, kendilerine işaret eden "damga uçları" sembolik bağları oluşturan gcc oluşumlarının
oluştuğunu unutmayın

6

Hem fnord hem de Gatling web sunucusu, Unix dosya sistemini kendi yapılandırma veritabanı olarak kullanır (örneğin, Windows kayıt defterini kullanan Microsoft IIS veya karmaşık bir ayrıştırma yapılandırma dosyası kullanan Apache).

Örneğin, sanal ana bilgisayarlar yalnızca dizinlerdir ve yeni bir sanal ana bilgisayar oluşturmak da bu kadar basittir.

mkdir www.example.com:80

Hangi dosyaların sunulacağını yapılandırma?

chmod o+r file_that_should_be_served
chmod o-r secret_passwords

Hangi dosyaların CGI olarak yürütüleceğini ve hangilerinin sunulacağını yapılandırma?

chmod a-x plain_file.html
chmod a+x cgi_script.html

Ve son olarak (ve bu soruyla alakalı): yönlendirmeyi yapılandırma?

ln -s 'http://www.google.com/?q=awesome+query+site:www.example.com' search.html

Şimdi search.htmlhiçbir yere işaret eden bir bağlantıya sahip olacaksınız , ancak sitenizin çalışması için çok önemlidir.


0

Bir bağlantı, yalnızca belirli bir dosya sistemi konumunda veya adında oluşturmayı zorlamak için henüz boş bir yere işaret edebilir.

Yani hayır - körlemesine onları kaldırmayın.


0

Eski sembolik bağları silmenin önemli bir dezavantajı, eskiden çok değerli olabilecekleri işaret ettikleri yere yapılan referansı kaybetmenizdir!

Ben adlı bir dosyayı "için sembolik bir bağlantı olduğunu varsayalım send_to" işaret ettiği /Users/myname/tmpve varsayalım /Users/myname/tmpyok.

Sembolik bağlantı ile ben dosya nerede biliyor amaçlanan olmak. Örneğin, bu durumda bunun geçici bir dizin olduğunu görebiliyorum ve "düzeltmem" gerekirse, geçici bir dizini hedef olarak düşünmeliyim.

Benzer şekilde, " my_config" işaretini veren bağlantı " /etc/conf_filekötüdür" çünkü conf_fileonay_dosyası olarak yeniden adlandırılmıştır. /etcDizine gittiniz ve bir lsve yaptığınız dosyayı conf_fileeksik gördüm ama confirmation_fileorada oldu şimdi bağlantıyı düzeltmek için yeterli bilgi olabilir.


-2

Linux Komut Satırı'ndan alıntı (Linux'taki yeni başlayanlar için şimdiye kadarki en iyi kitap ve buradan ücretsiz olarak indirebilirsiniz ):

Bu senaryoyu hayal edin: Bir program, “foo” adlı bir dosyada bulunan bir tür paylaşımlı kaynağın kullanılmasını gerektirir, ancak “foo” sık sık sürüm değişikliklerine sahiptir. Sürüm numarasını dosya adına eklemek iyi olur, böylece yönetici veya ilgili diğer taraf hangi foo sürümünün kurulu olduğunu görebilir. Bu bir sorun sunuyor. Paylaşılan kaynağın adını değiştirirsek, onu kullanabilecek her programı izlemeli ve kaynağın her yeni bir sürümü yüklendiğinde yeni bir kaynak adı arayacak şekilde değiştirmeliyiz. Bu hiç eğlenceli gelmiyor.

İşte sembolik bağların günü kurtardığı yer. Diyelim ki “foo-2.6” dosya adını taşıyan “foo” 2.6 sürümünü kurduktan sonra “foo-2.6” olarak işaret eden basitçe “foo” olarak adlandırılan sembolik bir bağlantı oluşturduk. foo ”, aslında“ foo-2.6 ”dosyasını açıyor. Şimdi herkes mutlu. “Foo” ya dayanan programlar onu bulabilir ve gerçekte hangi versiyonun kurulu olduğunu görebiliriz. “Foo-2.7” ya yükseltme zamanı geldiğinde dosyayı sistemimize ekliyoruz, “foo” sembolik bağlantısını siliyoruz ve yeni sürüme işaret eden yeni bir tane oluşturuyoruz. Bu yalnızca sürüm yükseltme sorununu çözmez, aynı zamanda her iki sürümü de makinemizde tutmamızı sağlar. “Foo-2.7” nin bir böceğinin (bu geliştiricilerin kahrolası!) Olduğunu ve eski sürüme geri dönmemiz gerektiğini hayal edin. Tekrar,

Bu yüzden hayır, sembolik bağları silmeyeceğim, çünkü bu kesinlikle devam eden bir baş ağrısı olacak ve sisteminizi ciddi şekilde bozma riskiyle karşı karşıya kalacaksınız.


6
OP, sembolik bağlantıları yerel mahkemeye çıkarmayı savunuyordu - sadece kırık sembolik ifadeler, yani mevcut herhangi bir dosyaya işaret etmeyen sembolik ifadeler.
LSerni
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.