Sabit bağlantılar neden orijinallerle aynı alanı kaplıyor gibi görünüyor?


14

Buradaki ve bu sayfanın bazı iyi Soru-Cevapları sayesinde artık bağlantıları anlıyorum. Sabit bağlantıları farklı bir isimle aynı inode atıfta görüyorum ve kopyalar farklı "düğümler, farklı isimlerle. Artı yumuşak bağlantıları orijinal dosya adı ve onların inode olarak yol var, bu yüzden dosya taşınırsa, bağlantı kopar.

Bu yüzden, bazı dosyaları (aşağıda "saluton_mondo.cpp") öğrendiklerimi test ettim, sert ve yumuşak bir bağlantı ve bir kopya yaptı.

jmcf125@VMUbuntu:~$ ls -lh soft hard copy s*.cpp
-rw-rw-r-- 1 jmcf125 jmcf125 205 Aŭg 27 16:10 copy
-rw-rw-r-- 2 jmcf125 jmcf125 205 Aŭg 25 13:34 hard
-rw-rw-r-- 2 jmcf125 jmcf125 205 Aŭg 25 13:34 saluton_mondo.cpp
lrwxrwxrwx 1 jmcf125 jmcf125  17 Aŭg 27 16:09 soft -> saluton_mondo.cpp

Ancak, sabit bağlantının orijinal ve mantıksal olarak kopya ile aynı boyuta sahip olduğunu garip buldum. Sabit bağlantı ve orijinal, verileri içeren ve yalnızca dosya adına göre farklı olan aynı inode'u paylaşıyorsa, sabit bağlantı 205 bayt yerine yalnızca adının alanını almamalıdır mı? Yoksa ls -lhgeri dönen orijinal dosyanın boyutu mu? Ancak dosya adının hangi alanı kapladığını nasıl bilebilirim? Burada sabit bağlantıların boyutu yok diyor. Dosya adı orijinal dosya adının yanında mı tutuluyor? Sabit bağlantıların dosya adı nerede saklanır?

Yanıtlar:


17

Bir dosya, meta verileri içeren bir inode'dur.

Bir dosyaya erişebilmek için, dosyayı bir adla ilişkilendirmek için bir dizine bağlamanız gerekir (dizinleri klasör değil, telefon dizinleri olarak düşünün) .

Tüm bu bağlantılar, bu dosya adları aynı dosyayı gösterir. Biri orijinal, diğeri bağlantı olan yok. Hepsi dizin ağacında aynı dosyaya (aynı inode) erişim noktalarıdır. Dosyanın boyutunu ( lstatsistem çağrısı) aldığınızda, inode'da depolanan bilgileri (yukarıda belirtilen meta veriler) alırsınız, bu dosyaya başvurmak için hangi dosya adı, hangi bağlantıyı kullandığınız önemli değildir. .

Buna karşılık sembolik linkler, içeriği hedef dosyaya giden bir yol olan başka bir dosyadır (başka bir inode) . Diğer tüm dosyalar gibi, bu semboller de bir dizine bağlanmalıdır (bir isme sahip olmalıdır), böylece dosyalara erişebilirsiniz. Bir sembol bağlantısına birkaç bağlantınız olabilir veya başka bir deyişle, sembol bağlantılarına birkaç ad verilebilir (bir veya daha fazla dizinde).

$ touch a
$ ln a b
$ ln -s a c
$ ln c d
$ ls -li [a-d]
10486707 -rw-r--r-- 2 stephane stephane 0 Aug 27 17:05 a
10486707 -rw-r--r-- 2 stephane stephane 0 Aug 27 17:05 b
10502404 lrwxrwxrwx 2 stephane stephane 1 Aug 27 17:05 c -> a
10502404 lrwxrwxrwx 2 stephane stephane 1 Aug 27 17:05 d -> a

Dosya numarasının üstünde 10486707 normal bir dosyadır. Geçerli dizindeki iki giriş (biri adıyla a, biri adıyla b) ona bağlanır. Çünkü bağlantı sayısı 2'dir, mevcut dizinde bu dosya veya başka bir dizinin başka bir isim olduğunu biliyorum. Dosya numarası 10502404 başka bir dosyadır, bu kez symlink türü geçerli dizine iki kez bağlanır. İçeriği (hedefi), göreli yol "a" dır.

10502404 geçerli dizinden başka bir dizine bağlanmışsa, erişildiği şekle bağlı olarak genellikle farklı bir dosyayı işaret edeceğini unutmayın.

$ mkdir 1 2
$ echo foo > 1/a
$ echo bar > 2/a
$ ln -s a 1/b
$ ln 1/b 2/b
$ ls -lia 1 2
1:
total 92
10608644 drwxr-xr-x   2 stephane stephane  4096 Aug 27 17:26 ./
10485761 drwxrwxr-x 443 stephane stephane 81920 Aug 27 17:26 ../
10504186 -rw-r--r--   1 stephane stephane     4 Aug 27 17:24 a
10539259 lrwxrwxrwx   2 stephane stephane     1 Aug 27 17:26 b -> a

2:
total 92
10608674 drwxr-xr-x   2 stephane stephane  4096 Aug 27 17:26 ./
10485761 drwxrwxr-x 443 stephane stephane 81920 Aug 27 17:26 ../
10539044 -rw-r--r--   1 stephane stephane     4 Aug 27 17:24 a
10539259 lrwxrwxrwx   2 stephane stephane     1 Aug 27 17:26 b -> a
$ cat 1/b
foo
$ cat 2/b
bar

Dosyaların, kendileriyle ilişkilendirilen dizinler dışında kendileriyle ilişkili adları yoktur. İsimleri tarafından alınan alan, bu dizinlerdeki girdilerdir, dizinlerin dosya boyutu / disk kullanımında hesaba katılır.

Bir dosyayı kaldırmak için sistem çağrısının olduğunu göreceksiniz unlink. Yani, dosyaları kaldırmazsınız, referans verildikleri dizinlerle olan bağlantılarını kaldırırsınız. Belirli bir dosyaya girişi olan son dizinden bağlantısı kaldırıldıktan sonra, bu dosya daha sonra yok olur (işlemin olmadığı sürece) açıldı).


Ahh ... Şimdi anlıyorum. Yani "hi" adlı bir dosya ve "ajhĝjdmjefsjmksgskgjkmŝŭna" adlı tam kopyası tam olarak aynı alan boşluğunu alır; çünkü adları lstat, boyutlarını alan sistem çağrısı için sayılmaz .
JMCF125

@ JMCF125, evet isimleri tarafından alınan boyut ilgili dizinlere giriş, dizinlerin dosya boyutunda muhasebeleştirilir.
Stéphane Chazelas

Teşekkürler. Cevabınıza ekleyebilir misiniz? Bekle, önce sorumu açıklığa kavuşturacağım.
JMCF125

5

Sabit bağlantı esasen orijinal dosyadır. Bu nedenle, raporlanan boyutu, bağlanmakta olan dosyanın boyutudur. Sadece isimlerinin alanını kaplayan yumuşak linklerdir (tür).

Dosya sistemi söz konusu olduğunda, sabit bağlantı ve orijinal aynı şeydir, aynı boyutta işaret ederler, böylece aynı boyut rapor edilir.


Fakat sabit bağlantının adı yer kaplamalı, değil mi?
JMCF125

Aşağıdaki @ stephan'ın cevabına bakın, daha iyi açıklar.
terdon

2
@ JMCF125 Evet, ancak bu alan dizinin içinde. Yeterli dosya oluşturursanız, dizin boyutlarının arttığını fark edeceksiniz. Bir dosyanın boyutu, adı gibi meta verilerini içermez.
Gilles 'SO- kötü olmayı bırak

@Gilles, teşekkürler, ancak @Stephane cevabını bu bilgilerle zaten güncelledi. Ayrıca, şimdi daha iyi düşünmek, adını /yapmanız sanki kendi içinde saklanmalıdır cd ..içinde /sen kalmak /.
JMCF125
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.