Bu sadece kötü bir fikir, çünkü sabit bağlantı ile orijinal isim arasındaki farkı söylemenin bir yolu yok.
Dizinlere sıkı bağlantılar verilmesi, dosya sisteminin yönlendirilmiş asiklik grafik yapısını bozabilir, muhtemelen dizin döngüleri yaratabilir ve dizin alt ağaçlarını sarkar fsck
ve bu da diğer dosya ağacı yürüyüşçülerinin hata yapmasına neden olur .
İlk önce, bunu anlamak için, inode hakkında konuşalım. Dosya sistemindeki veriler diskteki bloklarda tutulur ve bu bloklar bir inode tarafından toplanır. İnode'u THE dosyası olarak düşünebilirsiniz. İnode dosya isimlerinden yoksundur. Bağlantıların girdiği yer.
Bir bağlantı sadece bir inode için bir işaretçidir. Bir dizin, bağlantıları tutan bir inode'dur. Bir dizindeki her dosya adı sadece bir inode için bir link. Unix'te bir dosyayı açmak da bir bağlantı oluşturur, ancak farklı bir bağlantı türüdür (adlandırılmış bir bağlantı değildir).
Sabit bağlantı, bu inode'a işaret eden yalnızca bir dizin girişidir. Siz ls -l
, izinlerden sonraki sayı, adlandırılmış bağlantı sayısıdır. Çoğu normal dosya bir linke sahip olacaktır. Bir dosyaya yeni bir sabit bağlantı oluşturmak, her iki dosya adının da aynı inode'u göstermesini sağlar. Not:
% ls -l test
ls: test: No such file or directory
% touch test
% ls -l test
-rw-r--r-- 1 danny staff 0 Oct 13 17:58 test
% ln test test2
% ls -l test*
-rw-r--r-- 2 danny staff 0 Oct 13 17:58 test
-rw-r--r-- 2 danny staff 0 Oct 13 17:58 test2
% touch test3
% ls -l test*
-rw-r--r-- 2 danny staff 0 Oct 13 17:58 test
-rw-r--r-- 2 danny staff 0 Oct 13 17:58 test2
-rw-r--r-- 1 danny staff 0 Oct 13 17:59 test3
^
^ this is the link count
Şimdi, açıkça görebileceğiniz gibi sert bir bağlantı yoktur. Sabit bir bağlantı normal bir adla aynıdır. Yukarıdaki örnekte, test
ya test2
, orijinal dosya hangi olup sabit bağlantı hangisi? Sonunda, gerçekten söyleyemezsiniz (zaman damgalarıyla bile) çünkü her iki isim de aynı içeriğe, aynı inode'a işaret eder:
% ls -li test*
14445750 -rw-r--r-- 2 danny staff 0 Oct 13 17:58 test
14445750 -rw-r--r-- 2 danny staff 0 Oct 13 17:58 test2
14445892 -rw-r--r-- 1 danny staff 0 Oct 13 17:59 test3
Gösterilecek -i
bayrak ls
, satırın başındaki inode numaralarını gösterir. Nasıl test
ve test2
aynı inode numarasına sahip olduğuna dikkat edin, ancak test3
farklı bir numara var.
Şimdi, bunu dizinler için yapmanıza izin verildiyse, dosya sistemindeki farklı noktalardaki iki farklı dizin aynı şeye işaret edebilir. Aslında, bir alt dizin bir döngü yaratarak büyükanne ve büyükbabasına işaret edebilir.
Bu döngü neden endişe verici? Çünkü, hareket halindeyken, döndüğünüzü saptamanın hiçbir yolu yoktur (hareket halindeyken inode numaralarını takip etmeden). du
Disk kullanımı hakkında bilgi edinmek için alt dizinlerde yinelenmesi gereken komutu yazdığınızı düşünün . du
Bir döngüye çarptığında nasıl anlarsınız? Sadece du
bu basit işi yapmak için hataya açık ve yapılması gereken çok fazla defter tutma var.
Sembolik bağlantılar tamamen farklı bir canavardır, çünkü birçok dosya dosya sistemi API'sinin otomatik olarak takip etme eğiliminde olduğu özel bir "dosya" tipidir. Bir symlink, varolmayan bir varış noktasına işaret edebilir, çünkü bunlar doğrudan bir inode'a değil, isimle işaret ederler. Bu kavram sabit linklerle anlam ifade etmiyor, çünkü bir "hard link" in varlığı sadece dosyanın var olduğu anlamına geliyor.
Öyleyse neden du
zor linklerle değil, sembolik bağlantılar ile kolayca başa çıkabilirsiniz ? Yukarıda, zor linklerin normal dizin girişlerinden ayırt edilemez olduğunu görebildik. Bununla birlikte, sembolik bağlantılar özel, algılanabilir ve atlanabilir özelliktedir!
du
sembolik bağlantının sembolik bağlantı olduğunu fark eder ve tamamen atlar!
% ls -l
total 4
drwxr-xr-x 3 danny staff 102 Oct 13 18:14 test1/
lrwxr-xr-x 1 danny staff 5 Oct 13 18:13 test2@ -> test1
% du -ah
242M ./test1/bigfile
242M ./test1
4.0K ./test2
242M .
..
işaret etmeli ? Özellikle bu dizindeki sabit linki çıkardıktan sonra, dizinde gösterilen..
? Bir yere işaret etmesi gerekiyor.