2 Nis, 2020

Linux'ta İnode limitleri Hakkında Her Şey
" Linux’ta İnode limitleri Hakkında Her Şey "

15 / 100 SEO Score

Linux dosya sistemi inode’lara dayanır. Dosya sisteminin iç işleyişinin bu hayati parçaları genellikle yanlış anlaşılmaktadır. Tam olarak ne olduklarına ve ne yaptıklarına bakalım.

Bir Dosya Sisteminin Elemanları

Tanım olarak, bir dosya sisteminin dosyaları depolaması gerekir ve ayrıca dizinler içerirler. Dosyalar dizinlerde saklanır ve bu dizinlerin alt dizinleri olabilir. Bir şey, bir yerde, tüm dosyaların dosya sisteminde nerede bulunduğunu, ne adlandırıldığını, hangi hesaplara ait olduklarını, hangi izinlere sahip olduklarını ve çok daha fazlasını kaydetmelidir. Bu bilgilere, diğer verileri tanımlayan veriler olduğu için meta veri denir.

Linux ext4 dosya sisteminde, inode ve dizin yapıları birlikte çalışarak her dosya ve dizin için tüm meta verileri depolayan bir destek çerçevesi sağlar. Çekirdek, kullanıcı uygulamaları veya ls, stat ve df gibi Linux yardımcı programları olsun, meta verileri isteyen herkes için kullanılabilir hale getirir.

İnode’lar ve Dosya Sistemi Boyutu

Bir çift yapı olduğu doğru olsa da, bir dosya sistemi bundan daha fazlasını gerektirir. Her yapının binlerce ve binlerce vardır. Her dosya ve dizin bir inode gerektirir ve her dosya bir dizinde olduğundan, her dosya da bir dizin yapısı gerektirir. Dizin yapılarına dizin girişleri veya “Mounted” de denir.

Her inode, bir dosya sisteminde benzersiz olan bir inode numarasına sahiptir. Aynı inode numarası birden fazla dosya sisteminde görünebilir. Bununla birlikte, dosya sistemi kimliği ve inode numarası, Linux sisteminizde kaç dosya sisteminin takılı olduğuna bakılmaksızın benzersiz bir tanımlayıcı yapmak için birleşir.

Unutmayın, Linux’ta bir sabit disk veya bölüm takmazsınız. Bölümdeki dosya sistemini bağlarsınız, böylece fark etmeden birden çok dosya sistemine sahip olmak kolaydır. Tek bir sürücüde birden fazla sabit sürücünüz veya bölümünüz varsa, birden fazla dosya sisteminiz vardır. Aynı tür olabilirler (örneğin, tümü ext4), ancak yine de farklı dosya sistemleri olacaktır.

Tüm inode’lar tek bir tabloda tutulur. Bir inode numarası kullanarak, dosya sistemi ofseti o inode’un bulunduğu inode tablosuna kolayca hesaplar. İnode’daki “i” nin neden indeks olduğunu görebilirsiniz.

İnode numarasını içeren değişken, kaynak kodda 32 bit, imzasız uzun bir tamsayı olarak bildirilir. Bu, inode sayısının, maksimum büyüklüğü 2 ^ 32 olan bir tamsayı değeri olduğu anlamına gelir;

Bu teorik maksimum. Uygulamada, bir ext4 dosya sistemindeki inode sayısı, dosya sistemi 16 KB dosya sistemi kapasitesi başına bir inode varsayılan oranında oluşturulduğunda belirlenir. Dizin yapıları, dosya sistemi kullanılırken, dosya sistemi içinde dosyalar ve dizinler oluşturulduğu için anında oluşturulur.

Bilgisayarınızdaki bir dosya sisteminde kaç inode olduğunu görmek için kullanabileceğiniz bir komut vardır. Df komutunun -i (inodes) seçeneği, çıktısına inode sayısı olarak göstermesini söyler.

İlk sabit diskteki ilk bölümdeki dosya sistemine bakacağız, bu yüzden aşağıdakileri yazıyoruz:

Kod:
df -i /dev/sda1

Çıktı bize:

  1. Dosya sistemi: Raporlanan dosya sistemi.
  2. Inodes: Bu dosya sistemindeki toplam inode sayısı.
  3. IUsed: Kullanılan düğüm sayısı.
  4. IFree: Kullanılabilecek kalan düğüm sayısı.
  5. IUse%: Kullanılan düğümlerin yüzdesi.
  6. Bağlanma tarihi: Bu dosya sisteminin bağlama noktası.

Bu dosya sistemindeki inode’ların yüzde 10’unu kullandık. Dosyalar sabit diskte disk bloklarında saklanır. Her inode, temsil ettikleri dosyanın içeriğini depolayan disk bloklarını gösterir. Milyonlarca küçük dosyanız varsa, sabit sürücü alanınız bitmeden önce inode’unuz bitebilir. Ancak, bu çok zor bir problem.

Geçmişte, e-posta iletilerini ayrı dosyalar olarak depolayan bazı posta sunucuları (bu, hızla küçük dosya koleksiyonlarının çoğuna yol açtı) bu sorunu yaşadı. Bu uygulamalar arka uçlarını veritabanlarına dönüştürdüğünde, bu sorunu çözdü. Ortalama ev sistemi inode’ların tükenmez, çünkü ext4 dosya sistemiyle dosya sistemini yeniden yüklemeden daha fazla inot ekleyemezsiniz.

Dosya sisteminizdeki disk bloklarının boyutunu görmek için --getbsz (blok boyutunu al) seçeneğiyle blockdev komutunu kullanabilirsiniz:

Kod:
sudo blockdev --getbsz /dev/sda

Blok boyutu 4096 bayttır.

4096 baytlık bir blok boyutu belirtmek için -B (blok boyutu) seçeneğini kullanalım ve normal disk kullanımını kontrol edelim:

Kod:
df -B 4096 /dev/sda1

Bu çıktı bize şunları gösterir:

  1. File system: Raporladığımız dosya sistemi.
  2. 4K-blocks: Bu dosya sistemindeki toplam 4 KB blok sayısı.
  3. Used: Kaç adet 4K blok kullanılıyor?
  4. Available: Kullanılabilecek kalan 4 KB’lık blok sayısı.
  5. Use%: : Kullanılan 4 KB’lık blokların yüzdesi.
  6. Mounted on: Bu dosya sisteminin bağlama noktası.

Örneğimizde, dosya depolama (ve düğümlerin ve dizin yapılarının depolanması), bu dosya sistemindeki alanın yüzde 28’ini, düğümlerin yüzde 10’u pahasına kullanmıştır, bu nedenle iyi durumdayız.

Inode Meta Verileri

Bir dosyanın inode numarasını görmek için, li’yi -i (inode) seçeneğiyle kullanabiliriz:

Kod:
ls -i rabbyte.txt

Bu dosyanın inode numarası 1441801’dir, bu nedenle bu inode, bu dosyanın meta verilerini ve geleneksel olarak dosyanın sabit sürücüde bulunduğu disk bloklarına yönelik göstergeleri tutar. Dosya parçalanmışsa, çok büyük veya her ikisi birden, inode noktalarının bloklarından bazıları diğer disk bloklarına başka işaretçiler tutabilir. Ve diğer disk bloklarından bazıları başka bir disk bloğu setine de işaret tutabilir. Bu, inodeun sabit bir boyutta olması ve disk bloklarına sınırlı sayıda işaretçi tutabilme sorununun üstesinden gelir.

Bu yöntemin yerini “uzantılar” kullanan yeni bir düzen aldı. Bunlar, dosyayı depolamak için kullanılan her bitişik blok kümesinin başlangıç ve bitiş bloğunu kaydeder. Dosya parçalanmamışsa, yalnızca ilk bloğu ve dosya uzunluğunu saklamanız gerekir. Dosya parçalanmışsa, dosyanın her bir bölümünün ilk ve son bloğunu saklamanız gerekir. Bu yöntem (tabii ki) daha verimlidir.

Dosya sisteminizin disk bloğu işaretçileri veya uzantıları kullanıp kullanmadığını görmek istiyorsanız, bir inode içine bakabilirsiniz. Bunu yapmak için, debugfs komutunu -R (istek) seçeneğiyle kullanacağız ve ilgilenilen dosyanın inode’unu geçireceğiz. Bu, debugfs’den inode içeriğini görüntülemek için dahili “stat” komutunu kullanmasını ister. İnode numaraları yalnızca bir dosya sisteminde benzersiz olduğundan, hata ayıklama işlemine inode’un bulunduğu dosya sistemine de hata bildirmeliyiz.

Bu örnek komut şöyle görünecektir:

Kod:
sudo debugfs -R "stat <1441801>" /dev/sda1

Debugfs komutu bilgileri inode’dan çıkarır ve bize daha az bir şekilde sunar.

Aşağıdaki bilgileri gösteriyoruz:

  1. Inode: Baktığımız inode sayısı.
  2. Type: Bu normal bir dosyadır, dizin veya sembolik bağlantı değildir.
  3. Mode: Sekizli dosya izinleri.
  4. Flags: Farklı özellikleri veya işlevleri temsil eden göstergeler. 0x80000 “extents” bayrağıdır (daha fazlası aşağıdadır).
  5. Generation: Bir Ağ Dosya Sistemi (NFS), birisi yerel makineye takılıymış gibi ağ bağlantısı üzerinden uzak dosya sistemlerine eriştiğinde bunu kullanır. Inode ve nesil numaraları bir dosya tanıtıcısı biçimi olarak kullanılır.
  6. Version: İnode sürümü.
  7. User: Dosyanın sahibi.
  8. Group: Dosyanın grup sahibi.
  9. Project: Her zaman sıfır olmalıdır.
  10. Size: Dosyanın boyutu.
  11. File ACL: Dosya erişim kontrol listesi. Bunlar, sahip grubunda olmayan kişilere kontrollü erişim sağlamanız için tasarlanmıştır.
  12. Links: Dosyaya yapılan sabit bağlantıların sayısı.
  13. Blockcount: 512 baytlık yığınlar halinde verilen bu dosyaya ayrılan sabit disk alanı miktarı. Dosyamızın 4.096 bayt olan sekiz tanesi ayrıldı. Bu nedenle, 98 bayt dosyamız tek bir 4.096 bayt disk bloğunda bulunur.
  14. Fragment: Bu dosya parçalanmamış. (Bu eski bir bayrak.)
  15. Ctime: Dosyanın oluşturulduğu saat.
  16. Atime: Bu dosyanın en son erişildiği saat.
  17. Mtime: Bu dosyanın en son değiştirilme zamanı.
  18. Crtime: Dosyanın oluşturulduğu saat.
  19. Size of extra inode fields: ext4 dosya sistemi format zamanında daha büyük bir disk üzerindeki inode tahsis etme yeteneğini getirdi. Bu değer, inodeun kullandığı fazladan bayt sayısıdır. Bu ekstra alan, yeni çekirdekler için gelecekteki gereksinimleri karşılamak veya genişletilmiş özellikleri depolamak için de kullanılabilir.
  20. Inode checksum: Bu inode için, inodeun bozuk olup olmadığını tespit etmeyi mümkün kılan bir sağlama toplamı.
  21. Extents: Uzantılar kullanılıyorsa (ext4’te varsayılan olarak bunlar), dosyaların disk bloğu kullanımına ilişkin meta veriler, parçalanmış bir dosyanın her bir bölümünün başlangıç ve bitiş bloklarını gösteren iki sayıya sahiptir. Bu, bir dosyanın her bölümü tarafından kapsanan her disk bloğunu depolamaktan daha etkilidir. Bir boyutumuz var çünkü küçük dosyamız bu blok ofsetinde bir disk bloğunda oturuyor.

Dosya Adı nerede?

Artık dosya hakkında çok fazla bilgimiz var, ancak fark etmiş olabileceğiniz gibi dosya adını alamadık. Dizin yapısı devreye giriyor. Linux’ta, tıpkı bir dosya gibi, bir dizinin de inode’u vardır. Bununla birlikte, bir dizin inode, dizin verileri içeren disk bloklarını işaret etmek yerine, dosya verilerini içeren disk bloklarını işaret eder.

Bir inode ile karşılaştırıldığında, dizin yapısı bir dosya hakkında sınırlı miktarda bilgi içerir. Yalnızca dosyanın inode numarasını, adını ve adının uzunluğunu tutar.

Inode ve dizin yapısı, bir dosya veya dizin hakkında bilmeniz gereken her şeyi (veya bir uygulamayı) içerir. Dizin yapısı bir dizin disk bloğundadır, bu nedenle dosyanın bulunduğu dizini biliyoruz. Dizin yapısı bize dosya adını ve inode numarasını verir. Inode bize zaman damgaları, izinler ve dosya sisteminde dosya verilerinin nerede bulunacağı da dahil olmak üzere dosya hakkında her şeyi anlatır.

Dizin Kodları

Bir dizinin inode numarasını dosyalar için gördüğünüz kadar kolay görebilirsiniz.

Aşağıdaki örnekte ls’yi -l (uzun biçim), -i (inode) ve -d (dizin) seçenekleriyle kullanacağız ve iş dizinine bakacağız:

Kod:
ls -lid work/

-D (dizin) seçeneğini kullandığımız için, ls içeriği değil dizin üzerinde raporlar verir. Bu dizinin inode değeri 1443016’dır.

Bunu giriş dizini için tekrarlamak üzere aşağıdakileri yazıyoruz:

Kod:
ls -lid ~

Giriş dizininin inode değeri 1447510’dur ve çalışma dizini giriş dizinindedir. Şimdi çalışma dizininin içeriğine bakalım. -D (dizin) seçeneği yerine -a (tümü) seçeneğini kullanırız. Bu bize genellikle gizli dizin girişlerini gösterir.

Aşağıdakileri yazıyoruz:

Kod:
ls -lia work/

-A (tümü) seçeneğini kullandığımız için, tek- (.) Ve çift noktalı (..) girişler görüntülenir. Bu girdiler dizinin kendisini (tek nokta) ve üst dizinini (çift nokta) temsil eder.

Tek nokta girişi için inode numarasına bakarsanız, bunun 1443016 olduğunu görürsünüz – iş dizini için inode numarasını keşfettiğimizde elde ettiğimiz aynı inode numarası. Ayrıca, çift nokta girişi için inode numarası ana dizinin inode numarası ile aynıdır.

Bu yüzden dizin ağacında bir seviye yukarı çıkmak için cd .. komutunu kullanabilirsiniz. Aynı şekilde, bir uygulama veya komut dosyası adından önce ./ ile geldiğinizde, kabuğa uygulamanın veya komut dosyasının nereden başlatılacağını bildirin.

Inodes ve Links

Ele aldığımız gibi, üç bileşenin dosya sisteminde iyi biçimlendirilmiş ve erişilebilir bir dosyaya sahip olması gerekir: dosya, dizin yapısı ve inode. Dosya sabit sürücüde depolanan verilerdir, dizin yapısı dosyanın adını ve inode numarasını içerir ve inode dosyanın tüm meta verilerini içerir.

Sembolik bağlantılar, dosyalara benzeyen dosya sistemi girişleridir, ancak gerçekten varolan bir dosya veya dizine işaret eden kısayollardır. Bunu nasıl yönettiklerini ve üç öğenin bunu başarmak için nasıl kullanıldığını görelim.

İçinde iki dosya bulunan bir dizinimiz olduğunu varsayalım: biri komut dosyası diğeri ise aşağıda gösterildiği gibi bir uygulamadır.

Komut dosyasına yumuşak bir bağlantı oluşturmak için ln komutunu ve -s (sembolik) seçeneğini kullanabiliriz:

Kod:
ls -s my_script rabbyte.sh

My_script.sh dosyasına rabbyte.sh adlı bir bağlantı oluşturduk. Aşağıdakileri yazabilir ve iki komut dosyasına bakmak için ls kullanabiliriz:

Kod:
ls -li *.sh

Geek.sh girdisi mavi renkte görünür. İzin bayraklarının ilk karakteri bağlantı için “l” dir ve -> my_script.sh’yi gösterir. Tüm bunlar geek.sh’ın bir bağlantı olduğunu gösterir.

Muhtemelen beklediğiniz gibi, iki komut dosyasının farklı inode numaraları vardır. Bununla birlikte, daha şaşırtıcı olabilecek şey, yumuşak bağlantı olan rabbyte.sh, orijinal komut dosyası ile aynı kullanıcı izinlerine sahip olmamasıdır. Aslında, rabbyte.sh izinleri çok daha liberal – tüm kullanıcıların tam izinleri var.

rabbyte.sh dizin yapısı bağlantının adını ve inode değerini içerir. Bağlantıyı kullanmaya çalıştığınızda, normal bir dosya gibi inode değerine başvurulur. Bağlantı inode, bir disk bloğunu gösterecektir, ancak dosya içeriği verilerini içermek yerine, disk bloğu orijinal dosyanın adını içerir. Dosya sistemi orijinal dosyaya yönlendirir.

Orijinal dosyayı sileceğiz ve rabbyte.sh içeriğini görüntülemek için aşağıdakileri yazdığımızda ne olacağını göreceğiz:

Kod:
rm my_script.sh

cat rabbyte.sh

Sembolik bağlantı koptu ve yönlendirme başarısız.

Şimdi uygulama dosyasına sabit bir bağlantı oluşturmak için aşağıdakileri yazıyoruz:

Kod:
ln special-app rabbyte-app

Bu iki dosyanın düğümlerine bakmak için aşağıdakileri yazıyoruz:

Kod:
ls -li

Her ikisi de normal dosyalara benziyor. Geek-app ile ilgili hiçbir şey, bunun geek.sh için ls listesinin yaptığı gibi bir bağlantı olduğunu göstermez. Ayrıca, geek-app orijinal dosya ile aynı kullanıcı izinlerine sahiptir. Bununla birlikte, şaşırtıcı olan her iki uygulamanın da aynı inode numarasına sahip olmasıdır: 1441797.

Geek-app dizin girişi “geek-app” adını ve bir inode numarasını içerir, ancak orijinal dosyanın inode numarası ile aynıdır. Bu nedenle, her ikisi de aynı inode işaret eden farklı adlara sahip iki dosya sistemi girişimiz var. Aslında, herhangi bir sayıda öğe aynı inode işaret edebilir.

Aşağıdakileri yazacağız ve hedef programa bakmak için istatistik programını kullanacağız:

Kod:
stat special-app

İki sabit bağlantının bu dosyaya işaret ettiğini görüyoruz. Bu inode içinde saklanır.

Aşağıdaki örnekte, orijinal dosyayı sildiğimiz ve bağlantıyı gizli ve güvenli bir parola ile kullanmaya çalışıyoruz:

Kod:
rm special-app

./rabbyte-app correcthorsebatterystaple

şaşırtıcı bir şekilde, uygulama beklendiği gibi çalışır, ama nasıl? Çünkü bir dosyayı sildiğinizde inode tekrar kullanılabilir. Dizin yapısının inode sayısı sıfır olarak işaretlenir ve disk blokları başka bir dosyanın o alanda depolanması için kullanılabilir.

Ancak, inode sabit bağlantı sayısı birden fazla ise, sabit bağlantı sayısı bir azaltılır ve silinen dosyanın dizin yapısının inode numarası sıfır olarak ayarlanır. Sabit sürücü ve inode üzerindeki dosya içeriği hala mevcut sabit bağlantılar tarafından kullanılabilir.

Aşağıdakileri yazacağız ve stat’i bir kez daha kullanacağız – bu sefer rabbyte uygulamasında:

Kod:
stat rabbyte-app

Bu ayrıntılar, önceki stat komutuyla aynı düğümden (1441797) alınır. Bağlantı sayısı bir azaltıldı.

Bu inode’la ilgili tek bir sabit bağlantımız olduğundan, geek uygulamasını silersek dosyayı gerçekten sileriz. Dosya sistemi inode’u serbest bırakır ve dizin yapısını sıfır inode ile işaretler. Yeni bir dosya daha sonra sabit sürücüdeki veri deposunun üzerine yazabilir.

Inode Genel Giderleri

temiz bir sistem, ama genel giderler var. Bir dosyayı okumak için, dosya sisteminin aşağıdakilerin tümünü yapması gerekir:

  • Doğru dizin yapısını bulun
  • İnode numarasını okuyun
  • Doğru inode’u bulun
  • İnode bilgilerini okuyun
  • İnode bağlantılarını veya ilgili disk bloklarının uzantılarını izleyin
  • Dosya verilerini okuyun

Veriler bitişik değilse biraz daha fazla atlamak gerekir.

Birçok dosya için uzun formatlı bir dosya listesi gerçekleştirmek için yapılması gereken işi düşünün. Sadece çıktısını oluşturmak için ihtiyaç duyduğu bilgiyi alabilmesi için çok fazla ileri ve geri var.

Tabii ki, dosya sistemi erişimini hızlandırmak, Linux’un mümkün olduğunca önleyici dosya önbellekleme yapmaya çalışmasının nedenidir. Bu çok yardımcı olur, ancak bazen – herhangi bir dosya sisteminde olduğu gibi – ek yükler belirginleşebilir.

 

Kaynak: https://rabbyte.net/ams/linuxta-inode-limitleri-hakkinda-her-sey.41/

Bu yazı 170 Defa okundu, Beğendiyseniz üstteki benzer yazıları okumanızı öneririm, isterseniz site içinde farklı içerikleri arama yapabilirsiniz.

Ali Çömez / Slaweally

Kaldırımda yürürken beyaz çizgilere basmamaya çalışan, Sabah yüzünü yıkarken dirseklerinden su sızmasından nefret eden, Dönerle ayranı aynı anda bitirebilen, son dakikada otobüsü kaçırsada grur yapıp arkasından koşmayan... bir insanım :)

  1. linux terminal komutlarını öğrendiğim zamanlarda benimde ilgimi çekmişti, inode limitleri hakkında vermiş olduğunuz detaylı bilgi için teşekkürler.

Bir cevap yazın

E-posta hesabınız yayımlanmayacak. Gerekli alanlar * ile işaretlenmişlerdir