Apakah major, minor
jumlahnya 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
Jawaban:
Dari Antarmuka Pemrograman Linux , §14.1
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:
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 diincude/uapi/linux/major.h
(baru saja pindah dariinclude/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 dengannodev
opsi).Penggunaan umum adalah membuat duplikat nol, nol, dan perangkat acak dalam chroot:
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
sd
drivernya/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):
sumber
MAJ:Min
nomor yang samaKetika file perangkat dibuat oleh
mknode
,major
danminor
nomor diberikan. Ini adalah bagaimana Linux mengidentifikasi perangkat keras yang mendasarinya yang terkait dengan file perangkat. Dalam kebanyakan kasus merekamajor
nomor mengidentifikasi driver sementaraminor
membedakan perangkat yang berbeda kontrol driver.Karenanya angka-angka tersebut harus unik untuk setiap perangkat atau tidak mungkin membuat file perangkat yang benar untuk semuanya.
sumber
Tidak, di Linux mereka tidak selalu unik.
Linux menggunakan
devpts
sistem 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. Meskipunmajor:minor
tuple unik padadevpts
instance sistem file, itu tidak unik pada sistem yang sedang berjalan:Pada contoh di atas,
script(1)
perintah menciptakan pseudo-terminal dan menjalankan shell di dalamnya. Jelas sekali bahwa pseudo-terminal yang dibuat olehscript
proses 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:inode
tuple mereka , atau menggabungkan nomor perangkat (dari sistem file devpts) dengan pseudoterminal merekamajor:minor
. Masalahnya adalah bahwa bidang "tty"/proc/PID/stat
(ke-7, lihat halamanproc(5)
manual; di situlah alat sukalsof
ataups
dapatkan informasinya) hanya berisi bagianst_rdev
dari tty (yang dikemasmajor:minor
); jika itu adalah pty slave, tidak ada indikasi padadevpts
sistem berkas yang menyediakannya. Masalah yang sama mempengaruhi jumlah perangkat yang dapat diperoleh denganTIOCGDEV
ioctl.AFAICS tidak ada cara yang dapat diandalkan untuk mengidentifikasi terminal pengontrol suatu proses di Linux. Koreksi dan saran, jika tidak, selamat datang!
sumber