Apakah angka utama, minor unik

11

Apakah major, minorjumlahnya unik?

Apakah kami memiliki kutipan dan referensi untuk itu?

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 
Dipak Ingole
sumber
maj adalah perangkat keras, minor adalah sub divisi dari perangkat keras utama
Kiwy

Jawaban:

20

Dari Antarmuka Pemrograman Linux , §14.1

Setiap file perangkat memiliki nomor ID utama dan nomor ID kecil. ID utama mengidentifikasi kelas umum perangkat, dan digunakan oleh kernel untuk mencari driver yang sesuai untuk perangkat jenis ini. ID minor mengidentifikasi secara unik perangkat tertentu dalam kelas umum. ID utama dan kecil dari file perangkat ditampilkan oleh perintah ls -l.

[...]

Setiap driver perangkat mendaftarkan hubungannya dengan ID perangkat utama tertentu, dan hubungan ini menyediakan koneksi antara file khusus perangkat dan perangkat. Nama file perangkat tidak memiliki relevansi ketika kernel mencari driver perangkat.

Lihat juga bab Driver Perangkat Linux (2e) yang lama (2001) ini .

maksudnya adalah untuk menyediakan pemetaan unik utama: minor ke perangkat: contoh untuk setiap jenis perangkat. Secara ketat, Anda dapat memiliki dua perangkat berbeda dengan mayor yang sama: minor, asalkan satu char dan satunya lagi block:

# 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

Di Linux, pada setiap titik waktu pada satu sistem yang utama: angka minor untuk setiap jenis perangkat adalah unik. Namun angka-angka dapat berubah dari waktu ke waktu, dan tidak harus sama di seluruh sistem Linux yang berbeda (bahkan distribusi, kernel dan perangkat keras yang sama). Perhatikan bahwa perangkat karakter dan blok memiliki ruang penomoran yang berbeda, mis. Blok mayor 1 ditetapkan ke disk RAM, karakter mayor 1 ditugaskan ke sejumlah perangkat kernel termasuk nol dan nol.

Secara historis perangkat utama (sebagian besar) dialokasikan secara statis melalui registri (juga masih ada, meskipun tidak dirawat, di sumber kernel Documentation/devices.txt). Saat ini banyak perangkat dialokasikan secara dinamis, ini dikelola oleh udev , dan pemetaan dapat dilihat di /proc/devices. Perangkat tetap masih ada di incude/uapi/linux/major.h(baru saja pindah dari include/major.h)

Sekarang meskipun yang utama: kombinasi minor mengidentifikasi secara unik contoh perangkat tertentu, tidak ada yang menghentikan Anda membuat beberapa perangkat node (file) yang merujuk ke perangkat yang sama. Mereka bahkan tidak harus dibuat di /dev(tetapi mereka harus berada di sistem file yang mendukung pembuatan node perangkat, dan tidak dipasang dengan nodevopsi).

Penggunaan umum adalah membuat duplikat nol, nol, dan perangkat acak dalam chroot:

# 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

Nama-nama itu hanya alias, kernel tidak terlalu peduli dengan sebagian besar nama atau lokasi, ia peduli dengan nomor utama sehingga dapat memilih driver yang benar, dan driver (biasanya) peduli dengan nomor minor sehingga dapat memilih contoh yang benar.

Sebagian besar nama hanya konvensi (meskipun beberapa didefinisikan oleh POSIX ). Perhatikan juga bahwa satu perangkat dapat mendaftar untuk beberapa nomor utama, periksa sddrivernya /proc/devices; nama modul driver ( .ko) tidak harus sama dengan nama perangkat, dan tidak perlu sama dengan simpul perangkat /dev, dan modul driver tunggal dapat mengelola beberapa perangkat logis / fisik atau nama perangkat.


Untuk rekap: Anda mungkin memiliki dua atau lebih perangkat node (di /dev/atau di tempat lain) yang memiliki utama: nomor kecil, tetapi jika mereka adalah tipe yang sama mereka merujuk ke perangkat yang sama. Anda dapat memiliki satu driver yang dapat menangani beberapa instance besar, tetapi di dalam kernel dan di dalam driver, untuk setiap jenis (karakter atau blok) mayor: nomor minor diambil untuk merujuk ke perangkat tertentu (mayor) dan instance khusus ( minor) dari perangkat.

Anda tidak dapat memiliki dua node perangkat dengan tipe dan mayor yang sama: minor dan mengharapkan mereka untuk mengakses dua perangkat logis atau fisik yang berbeda. Ketika sebuah perangkat sedang diakses, kernel memilih satu driver berdasarkan pada tipe dan nomor utama (dan tidak berdasarkan pada nama node perangkat), dan dengan konvensi, nomor minor tersebut dengan pasti memilih instance atau sub-fungsi tertentu.


Perbarui Beberapa sejarah yang menarik dan beberapa * perspektif BSD dapat ditemukan dalam presentasi BSDCon 2002 Poul-Henning Kamp : https://www.usenix.org/legacy/events/bsdcon/full_papers/kamp/kamp_html/

Jika Anda melompat ke masa lalu ke 1978 (milik Alcatel-Lucent, Bell System Technical Journal Jul-Agustus 1978) ' Unix Time Sharing System ' menjabarkannya dengan jelas (p1937):

Perangkat dicirikan oleh nomor perangkat utama, nomor perangkat kecil, dan kelas (blok atau karakter). Untuk setiap kelas, ada array titik masuk ke driver perangkat. Nomor perangkat utama digunakan untuk mengindeks array ketika memanggil kode untuk driver perangkat tertentu. Nomor perangkat kecil diteruskan ke driver perangkat sebagai argumen. Angka minor tidak memiliki signifikansi selain yang dikaitkan oleh pengemudi. Biasanya, pengemudi menggunakan nomor minor untuk mengakses salah satu dari beberapa perangkat fisik yang identik.

mr.spuratic
sumber
Jadi dapatkah kita memiliki dua perangkat dengan pasangan atau MAJ:Minnomor yang sama
Dipak Ingole
1
Ya, dengan kendala. Diperbarui.
mr.spuratic
2

Ketika file perangkat dibuat oleh mknode, majordan minornomor diberikan. Ini adalah bagaimana Linux mengidentifikasi perangkat keras yang mendasarinya yang terkait dengan file perangkat. Dalam kebanyakan kasus mereka majornomor mengidentifikasi driver sementara minormembedakan perangkat yang berbeda kontrol driver.

Karenanya angka-angka tersebut harus unik untuk setiap perangkat atau tidak mungkin membuat file perangkat yang benar untuk semuanya.

Graeme
sumber
0

Tidak, di Linux mereka tidak selalu unik.

Linux menggunakan devptssistem file virtual untuk menyediakan pseudoterminals (ptys), dan sistem file virtual dapat dipasang lebih dari satu kali dan di tempat yang berbeda, yang praktis saat mengatur chroot atau wadah namespace. Meskipun major:minortuple unik pada devptsinstance sistem file, itu tidak unik pada sistem yang sedang berjalan:

# 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

Pada contoh di atas, script(1)perintah menciptakan pseudo-terminal dan menjalankan shell di dalamnya. Jelas sekali bahwa pseudo-terminal yang dibuat oleh scriptproses pertama tidak sama dengan yang dibuat oleh yang kedua, namun mereka memiliki nama yang sama dan bilangan minor mayor.

Untuk mengidentifikasi pseudoterminal secara unik, Anda perlu menggunakan device:inodetuple mereka , atau menggabungkan nomor perangkat (dari sistem file devpts) dengan pseudoterminal mereka major:minor. Masalahnya adalah bahwa bidang "tty" /proc/PID/stat(ke-7, lihat halaman proc(5)manual; di situlah alat suka lsofatau psdapatkan informasinya) hanya berisi bagian st_rdevdari tty (yang dikemas major:minor); jika itu adalah pty slave, tidak ada indikasi pada devptssistem berkas yang menyediakannya. Masalah yang sama mempengaruhi jumlah perangkat yang dapat diperoleh dengan TIOCGDEVioctl.

AFAICS tidak ada cara yang dapat diandalkan untuk mengidentifikasi terminal pengontrol suatu proses di Linux. Koreksi dan saran, jika tidak, selamat datang!

mosvy
sumber