Özel aygıt dosyalarının neden düğümleri var?


11

Cihaz dosyaları kendi başına dosya değildir. Unix benzeri işletim sistemlerindeki cihazları kullanmak için bir G / Ç arabirimidir. Diskte boşluk kullanmazlar, ancak statkomut tarafından bildirildiği gibi hala bir inode kullanırlar :

$ stat /dev/sda
      File: /dev/sda
      Size: 0               Blocks: 0          IO Block: 4096   block special file
Device: 6h/6d   Inode: 14628       Links: 1     Device type: 8,0

Aygıt dosyaları dosya sisteminde fiziksel inode kullanıyor mu ve neden bunlara ihtiyaç duyuyorlar?


2
İnode ve veri vardır dosyası. Bir inode olmadan, dosyanız yok. (Cihaz dosyalarında veri yok)
user253751

Yanıtlar:


16

Kısa cevap, yalnızca fiziksel bir dosya sistemi desteğiniz /devvarsa (ve modern bir Linux dağıtımı kullanıyorsanız, muhtemelen kullanmamanızdır).

Uzun cevap şöyle:

Bu, her şeyin bir dosya olduğu orijinal UNIX felsefesine dayanıyor. Bu felsefe, UNIX'i bu kadar çok yönlü yapan şeyin bir parçasıdır, çünkü uygulamanızda doğrudan fiziksel donanımla konuşmak için özel bir koda ihtiyaç duymadan kullanıcı alanından cihazlarla doğrudan etkileşim kurabilirsiniz.

Başlangıçta, /devcihaz dosyalarınızı koyduğunuz tanınmış bir ada sahip başka bir dizindi. Bazı UNIX sistemleri hala bu yaklaşımı benimsemektedir (OpenBSD'nin hala yaptığını düşünüyorum) ve genellikle sistemin böyle olup olmadığını söyleyebilirsiniz, çünkü sistemin aslında sahip olmadığı cihazlar için çok sayıda cihaz dosyası olacaktır (örneğin, her biri için dosyalar) olası her diskte olası bölüm). Bu, bellekte yer ve zamandan daha az disk alanı kullanma maliyetinden tasarruf sağlar, bu da genellikle çok kısıtlı ve çok hızlı olmayan erken sistemler için iyi bir takas olmuştur. Buna genel olarak statik bir elektrik denir /dev.

Modern Linux sistemlerinde (ve FreeBSD'ye ve muhtemelen Solaris'in son sürümlerine de inanıyorum), /devçekirdek tarafından doldurulan geçici bir bellek içi dosya sistemidir (veya Systemd kullanıyorsanız udev, çünkü neredeyse her şeyi yapmak için çekirdeğe güvenmezler) . Bu, bazı bellek (genellikle birkaç MB'den daha az) ve çok küçük bir işlem yükü karşılığında biraz disk alanı tasarrufu sağlar. Ayrıca, başka bir avantajı da var, en büyüklerinden biri, sıcak takılı donanımı tespit etmenin daha kolay olmasıdır. Buna genel olarak bir dinamik olması denir /dev.

Her iki durumda da, cihaz düğümlerine normal VFS katmanı üzerinden erişilir, bu da tanım gereği bir inode'a sahip olmaları gerektiği anlamına gelir (sanal bir tane olsa bile, olması gerektiği gibi stat()çalışır. Pratik bir perspektiften, bu, dinamik kullanan sistemler üzerinde sıfır etkiye sahiptir, /devçünkü yalnızca düğümleri bellekte saklarlar veya gerektiğinde oluştururlar ve /devstatik olduğu yerde sıfıra yakın etki gösterir , çünkü inotlar disk üzerinde sıfır boşluğa yakındır ve çoğu dosya sisteminin üst sınırı yoktur. veya ihtiyaç duyabileceğinden çok daha fazlasını sağlar.


3
Dikkatle elini kaldırır. Bir sunucunun inode bitmiş bir projede bulundum. Sonunda, ekibimiz, herhangi birimiz oraya varmadan önce tasarlanan (kötü bir şekilde tahmin edebileceğiniz gibi!) Arka uç sistemi değiştirmeye yatırım yapmaya ikna etmek için ihtiyaç duyduğu krizdi.
KRyan

@KRyan Olabilir, ancak bu günlerde yönetici dosya sistemi oluşturmadaki sayıyı açıkça azaltmadıkça nadirdir. Birçok modern dosya sistemi (en azından NTFS, BTRFS ve ZFS, sanırım XFS de olabilir) aslında inode'ları dinamik olarak tahsis eder, bu nedenle birçok yeni sistemde aslında tükenmesi imkansızdır.
Austin Hemmelgarn

@KRyan Ben de bu problem yaşadım. Ve aslında iyi tasarlanmış bir sistemdi, eğer biraz tarihli ve uzantılara götürülürse (her işlem bağımsız bir kayıt gerektiriyordu, diskte tutuldu, sonunda küçük küçük
inotlarla

1
Od ve docker tam olarak bu inode problemine neden olduğu için meşhurdur.
coteyr

@AustinHemmelgarn Ext ailesi statik sayıda inode (ve daha sonra tükeniyor) olduğu için oldukça rezil . Bu arada, büyük olasılıkla büyük bir farkla (XFS'de büyük miktarda veri depolayan senaryolar, ZFS ve BTRFS nispeten yeni olan senaryolar) ve çoğu dağıtım için varsayılan olarak en çok kullanılan Linux dosya sistemidir. Elbette, modern bir sistemde, varsayılan maksimum inode, sahip olduğunuz cihaz dosyalarının sayısından daha fazla büyüklük sırasıdır.
Bob

15

Aygıt dosyalarının da izinleri vardır ve bu dosyalar bir inode içinde saklanır.


Bahsetmeyi unuttuğum mükemmel bir nokta.
Austin Hemmelgarn

5
Yalnızca izinler değil, aynı zamanda dosya türü ve diğer meta veriler. Klasik olarak, dizinin kendisi sadece adı ve inode numarasını içerir - siz inode okuyana kadar dosyanın bir cihaz olduğunu gösteren hiçbir şey yoktur.
Gilles 'SO- kötü olmayı kes'

12

Dizinler basitçe dosya adlarından inode'lara bir eşlemedir, bu nedenle adın atıfta bulunduğu şeyle ilgili her şey (bir dosya, bir sembolik bağlantı, bir cihaz, bir FIFO, bir soket) inode'da olmalıdır, onu koyacağınız başka bir yer yoktur.

Cihaz hakkındaki bilgiler inode içerisinde saklanır. Büyük ve küçük aygıt numaraları vardır, bu nedenle izinler, zaman damgaları vb. Vardır. Normal bir dosya yerine bir blok veya karakter aygıtı olduğunu söyleyen tür alanı burada saklanır.

Aygıtlar için inode, dosyanın blok haritasını içeren alanları kullanmaz.


0

Bir inode olmadan, yalnızca söz konusu cihazla ilgili tüm bilgileri tutmak için dosya adına sahip olursunuz. Bu, "güzel" cihaz adlarının /dev/sdasöz konusu olmayacağı anlamına gelir : gibi belirli bir sürücüye bağlanabilecek bir ada ihtiyacınız olacaktır /dev/ohci/sda.

Daha da önemlisi, inode'lara dayanan (örneğin stat, lsvb.) Tüm araçların , yolları /devözel bir şekilde tedavi etmek için değiştirilmesi gerekir . Bu, mevcut durumla karşılaştırıldığında belirgin bir faydası olmayan, oldukça büyük miktarda çalışma olurdu.

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.