Büyük, küçük sayı benzersiz mi


11

Are major, minornumara Benzersiz?

Alıntılar ve referanslarımız var mı?

NAME   MAJ:MIN RM   SIZE RO MOUNTPOINT
sda      8:0    0 465.8G  0 
├─sda1   8:1    0 298.2M  0 
├─sda2   8:2    0     3G  0 
├─sda3   8:3    0 458.7G  0 /
├─sda4   8:4    0     1K  0 
└─sda5   8:5    0   3.8G  0 
sr0     11:0    1  1024M  0 

maj donanımdır, küçük ana donanımın alt bölümüdür
Kiwy

Yanıtlar:


20

Gönderen Linux Programlama Arabirimi , §14.1

Her aygıt dosyasının büyük bir kimlik numarası ve küçük bir kimlik numarası vardır. Ana kimlik, genel aygıt sınıfını tanımlar ve çekirdek tarafından bu tür aygıtlar için uygun sürücüyü aramak için kullanılır. Küçük kimlik, genel bir sınıf içindeki belirli bir cihazı benzersiz şekilde tanımlar. Bir aygıt dosyasının büyük ve küçük kimlikleri ls -l komutu ile görüntülenir.

[...]

Her aygıt sürücüsü, ilişkisini belirli bir ana aygıt kimliğiyle kaydeder ve bu ilişkilendirme, aygıtın özel dosyası ile aygıt arasındaki bağlantıyı sağlar. Çekirdek aygıt sürücüsünü ararken aygıt dosyasının adının hiçbir önemi yoktur.

Ayrıca bu eski (2001) Linux Aygıt Sürücüleri (2e) bölümüne bakın .

yani, her aygıt türü için majör: minörden cihaza: örnek için benzersiz bir eşleme sağlamaktır. Kesinlikle, aynı majörlü iki farklı cihazınız olabilir : biri char ve diğeri blok olduğu sürece küçük:

# ls -l /dev/ram1 /dev/mem
crw-r----- 1 root kmem 1, 1 Jan  1  1970 /dev/mem
brw-rw---- 1 root disk 1, 1 Jan  1  1970 /dev/ram1

Linux'ta, bir sistemde herhangi bir zamanda büyük: her cihaz tipi için küçük sayılar benzersizdir. Ancak sayılar zaman içinde değişebilir ve farklı Linux sistemlerinde (aynı dağıtım, çekirdek ve donanım) bile aynı olması gerekmez. Karakter ve blok aygıtlarının farklı numaralandırma boşlukları olduğunu, örneğin blok ana 1'in RAM disklerine, karakter büyük 1'in ise null ve sıfır da dahil olmak üzere bir çekirdek aygıt kümesine atandığını unutmayın.

Tarihsel olarak cihaz bölümleri (çoğunlukla) statik olarak bir kayıt defteri yoluyla tahsis edildi ( çekirdek kaynağında hala korunmasa da hala mevcut Documentation/devices.txt). Bugünlerde birçok cihaz dinamik olarak ayrılıyor, bu udev tarafından yönetiliyor ve eşleştirmeler görüntülenebilir /proc/devices. Sabit cihazlar hala var incude/uapi/linux/major.h(yakın zamanda taşındı include/major.h)

Büyük: küçük kombinasyon belirli cihaz örneklerini benzersiz bir şekilde tanımlasa da, aynı cihaza başvuran birden fazla cihaz düğümü (dosya) oluşturmanızı engelleyecek hiçbir şey yok. Oluşturulmaları bile gerekmez /dev(ancak cihaz düğümleri oluşturmayı destekleyen ve seçenekle bağlanmamış bir dosya sisteminde olması gerekir nodev).

Yaygın bir kullanım, bir krootta yinelenen sıfır, boş ve rastgele cihazlar oluşturmaktır:

# find /dev /var/chroot -regextype posix-extended -regex ".*/(zero|null|random)" -type c | 
xargs ls -l
crwxrwxrwx 1 root root 1, 3 2012-11-21 03:22 /dev/null
crw-rw-r-- 1 root root 1, 8 2012-05-07 10:35 /dev/random
crw-rw-rw- 1 root root 1, 5 2012-11-21 03:22 /dev/zero
crwxrwxrwx 1 root root 1, 3 2012-11-21 03:22 /var/chroot/sendmail/dev/null
crw-rw-r-- 1 root root 1, 8 2012-05-07 10:35 /var/chroot/sendmail/dev/random
crw-rw-rw- 1 root root 1, 5 2012-11-21 03:22 /var/chroot/sendmail/dev/zero

İsimler sadece takma adlardır, çekirdek çoğu isim veya konum hakkında fazla umursamaz, doğru numarayı seçebilmesi için büyük sayıyı önemser ve sürücü (genellikle) küçük sayıyı önemser. doğru örnek.

Çoğu isim basitçe kongre ( bazıları POSIX tarafından tanımlanmış olsa da ). Ayrıca bir aygıtın birden fazla ana numara için kayıt yaptırabileceğini unutmayın, sdsürücüyü kontrol edin /proc/devices; bir sürücü modülü adının ( .ko) aygıt adıyla aynı olması ve aygıt düğümü ile aynı olması gerekmez /devve tek bir sürücü modülü birden çok mantıksal / fiziksel aygıtı veya aygıt adını yönetebilir.


Özetlemek gerekirse: /dev/aynı ana öğeye sahip iki veya daha fazla cihaz düğümünüz olabilir (içinde veya başka yerlerde): küçük sayılar, ancak aynı türdeyse aynı cihaza atıfta bulunurlar. Birden çok ana örneği işleyebilen bir sürücünüz olabilir, ancak çekirdek içinde ve sürücü içinde, her tür (karakter veya blok) için ana sistem: küçük bir sayı, belirli bir aygıta (ana) ve belirli bir örneğe ( küçük).

Aynı tipte ve majörde iki cihaz düğümünüz olamaz: küçük ve iki farklı mantıksal veya fiziksel cihaza erişmelerini bekleyin. Bir aygıta erişilirken, türe ve ana numaraya (ve aygıt düğümü adına göre değil) bağlı olarak bir sürücü seçin ve kural olarak küçük sayı belirli bir örneği veya alt işlevi belirleyici olarak seçer.


Güncelleme Bazı ilginç tarihler ve bazı * BSD perspektifleri Poul-Henning Kamp'ın 2002 BSDCon sunumunda bulunabilir: https://www.usenix.org/legacy/events/bsdcon/full_papers/kamp/kamp_html/

Eğer varsa 1978 zamanda geri sıçrama (Alcatel-Lucent, nezaket Bell System Teknik Dergi '1978 Temmuz-Ağustos) Unix Zaman Paylaşımı Sisteminin (p1937) açıkça' oluşturduğunun dışarı:

Cihazlar büyük bir cihaz numarası, küçük bir cihaz numarası ve bir sınıf (blok veya karakter) ile karakterize edilir. Her sınıf için aygıt sürücülerine bir dizi giriş noktası vardır. Ana aygıt numarası, belirli bir aygıt sürücüsü için kod çağrılırken dizinin indekslenmesi için kullanılır. Küçük aygıt numarası, aygıt sürücüsüne bağımsız değişken olarak iletilir. Küçük sayının sürücünün atfettiği değerden başka bir önemi yoktur. Sürücü genellikle aynı fiziksel cihazlardan birine erişmek için küçük numarayı kullanır.


Bu yüzden aynı çifti veya iki cihaz olabilir MAJ:Minsayı
Dipak ingole

1
Evet, kısıtlamalarla. Güncellenmiş.
mr.spuratic

2

Tarafından bir aygıt dosyası oluşturulduğunda mknode, majorve minornumaraları verilir. Linux, bir aygıt dosyasıyla ilişkili temel donanım aygıtını nasıl tanımlar. Çoğu durumda majornumaralar sürücüyü tanımlar minor, sürücünün kontrol ettiği farklı aygıtları ayırt eder.

Bu nedenle, sayılar her cihaza özgü olmalıdır veya hepsi için doğru cihaz dosyaları oluşturmak mümkün olmaz.


0

Hayır, Linux'ta her zaman benzersiz değiller.

Linux, devptspsödoterminaller (ptys) sağlamak için bir sanal dosya sistemi kullanıyor ve sanal dosya sistemi, birden fazla kez ve farklı yerlere monte edilebiliyor. Bir major:minorgrup devptsdosya sistemi örneğinde benzersiz olsa da , çalışan bir sistemde benzersiz değildir:

# mount -t devpts devpts /dev/pts
# script -q /dev/null
# stat -c '%n %t:%T   %d:%i' `tty`
/dev/pts/0 88:0   34:3
# mount -t devpts devpts /dev/pts
# script -q /dev/null
# stat -c '%n %t:%T   %d:%i' `tty`
/dev/pts/0 88:0   35:3

Yukarıdaki örnekte, script(1)komut bir sözde terminal oluşturur ve içinde bir kabuk çalıştırır. İlk scriptişlem tarafından oluşturulan sözde terminalin ikincinin yarattığı ile aynı olmadığı açıktır , ancak aynı ada ve büyük, küçük sayılara sahiptirler.

Bir takmaoterminali benzersiz olarak tanımlamak için, gruplarını kullanmanız device:inodeveya aygıt numarasını (devpts dosya sisteminin) ile birleştirmeniz gerekir major:minor. Sorun 'tty' alanı /proc/PID/stat(7., proc(5)manpage bakın ; bu gibi araçlar lsofveya psbilgi almak gibi ) sadece st_rdevtty (paketlenmiş major:minor) içerir; bu bir pty köle ise, devptsbunu sağlayan dosya sistemine dair bir gösterge yoktur . Aynı sorunlar TIOCGDEVioctl ile elde edilebilen cihaz numarasını etkiler .

AFAICS, Linux'ta bir sürecin kontrol terminalini tanımlamanın güvenilir bir yolu yoktur. Düzeltmeler ve öneriler başka türlü hoş geldiniz!

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.