メジャー、マイナー番号は一意ですか


11

あるmajor, minor数のユニークな?

引用と参照がありますか?

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はハードウェア、minorは主要なハードウェアの下位区分です
Kiwy

回答:


20

以下からのLinuxプログラミングインタフェース、14.1

各デバイスファイルには、メジャーID番号とマイナーID番号があります。メジャーIDはデバイスの一般的なクラスを識別し、このタイプのデバイスに適したドライバーを検索するためにカーネルによって使用されます。マイナーIDは、一般クラス内の特定のデバイスを一意に識別します。デバイスファイルのメジャーIDとマイナーIDは、ls -lコマンドで表示されます。

[...]

各デバイスドライバーは、特定のメジャーデバイスIDとの関連付けを登録します。この関連付けにより、デバイススペシャルファイルとデバイス間の接続が提供されます。カーネルがデバイスドライバーを探す場合、デバイスファイルの名前は関係ありません。

この古い(2001)Linux Device Drivers(2e)の章も参照してください。

つまり、デバイスのタイプごとにメジャー:マイナーからデバイス:インスタンスへの一意のマッピングを提供することを意図しています。厳密には、メジャーが同じである2つの異なるデバイスを使用できます。1つがcharで、もう1つは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

Linuxでは、1つのシステムの任意の時点で、デバイスのタイプごとにメジャー:マイナー番号が一意です。ただし、数値は時間の経過とともに変化する可能性があり、異なるLinuxシステム間で同じである必要はありません(同じディストリビューション、カーネル、ハードウェアでも)。文字デバイスとブロックデバイスには異なる番号付けスペースがあることに注意してください。たとえば、ブロックメジャー1はRAMディスクに割り当てられ、文字メジャー1はヌルとゼロを含むカーネルデバイスのセットに割り当てられます。

歴史的には、デバイスメジャーは(主に)レジストリを介し静的に割り当てられていまし(メンテナンスされていませんが、カーネルソースにも存在しますDocumentation/devices.txt)。最近、多くのデバイスが動的に割り当てられ、これはudevによって管理され、マッピングはで表示でき/proc/devicesます。固定デバイスはまだ存在しますincude/uapi/linux/major.h(最近から移動されましたinclude/major.h

ここで、major:minorの組み合わせは特定のデバイスインスタンスを一意に識別しますが、同じデバイスを参照する複数のデバイスノード(ファイル)の作成を妨げるものは何もありません。で作成する必要はありません/dev(ただし、デバイスノードの作成をサポートするファイルシステム上にある必要があり、nodevオプションでマウントされていません)。

一般的な使用法は、chrootで重複するゼロ、null、ランダムデバイスを作成することです。

# 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

名前は単なるエイリアスであり、カーネルはほとんどの名前や場所をあまり気にせず、メジャー番号を気にして正しいドライバーを選択できるようにし、ドライバーは(通常)マイナー番号を気にして正しいインスタンス。

ほとんどの名前は単なる規則です(ただし、一部はPOSIXで定義されています)。1つのデバイスが、複数のメジャー番号を登録するチェックすることができることにも留意されたいsdにおけるドライバ/proc/devices。ドライバモジュール名(.ko)はデバイス名と同じである必要はなく、のデバイスノードと同じである必要もありません。/dev単一のドライバモジュールで複数の論理/物理デバイスまたはデバイス名を管理できます。


要約すると:/dev/同じメジャー:マイナー番号を持つ2つ以上のデバイスノード(またはその他の場所)がある場合がありますが、それらが同じタイプの場合、同じデバイスを参照します。複数のメジャーインスタンスを処理できる1つのドライバーを持つことができますが、カーネル内およびドライバー内では、タイプ(charまたはブロック)ごとに、major:minor番号が特定のデバイス(major)および特定のインスタンス(デバイスのマイナー)。

同じタイプとmajor:minorの2つのデバイスノードを使用して、2つの異なる論理デバイスまたは物理デバイスにアクセスすることはできません。デバイスがアクセスされているとき、カーネルはタイプとメジャー番号に基づいて(デバイスノード名に基づくのではなく) 1つのドライバーを選択します。慣例により、マイナー番号は特定のインスタンスまたはサブ機能を決定的に選択します。


更新 いくつかの興味深い歴史といくつかの* BSDの見方は、Poul-Henning Kampの2002 BSDConプレゼンテーションで見つけることができます:https : //www.usenix.org/legacy/events/bsdcon/full_papers/kamp/kamp_html/

あなたがもし1978年までの時間に戻って飛躍(アルカテル・ルーセントの礼儀、ベルシステムテクニカルジャーナル 7月- 1978年8月)「Unixのタイムシェアリングシステム、それが明確に(p1937)」のセットをアウト:

デバイスは、メジャーデバイス番号、マイナーデバイス番号、およびクラス(ブロックまたは文字)によって特徴付けられます。クラスごとに、デバイスドライバーへのエントリポイントの配列があります。メジャーデバイス番号は、特定のデバイスドライバーのコードを呼び出すときに配列にインデックスを付けるために使用されます。マイナーデバイス番号は、引数としてデバイスドライバーに渡されます。マイナー番号は、ドライバーがマイナー番号に起因するもの以外に重要性はありません。通常、ドライバーはマイナー番号を使用して、いくつかの同一の物理デバイスの1つにアクセスします。


同じペアまたはMAJ:Min番号の2つのデバイスを使用できますか
Dipak Ingole 2014

1
はい、制約があります。更新しました。
mr.spuratic 2014

2

によってデバイスファイルが作成されるmknodeと、majorおよびminor番号が提供されます。これらは、Linuxがデバイスファイルに関連付けられたハードウェアデバイスを識別する方法です。ほとんどの場合、major番号はドライバーを識別し、minorはドライバーが制御するさまざまなデバイスを区別します。

そのため、番号はデバイスごとに一意である必要があります。そうでない場合、それらすべてに対して正しいデバイスファイルを作成することはできません。


0

いいえ、Linuxでは、それらは常に一意であるとは限りません。

Linuxはdevpts仮想ファイルシステムを使用して疑似端末(ptys)を提供しており、その仮想ファイルシステムは複数回、さまざまな場所にマウントできます。これは、chrootまたは名前空間コンテナーを設定するときに実用的です。一方でmajor:minorタプルが上で一意であるdevptsファイルシステムのインスタンスは、実行中のシステム上で一意ではありません。

# 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

上記の例では、script(1)コマンドは疑似端末を作成し、その内部でシェルを実行します。最初のscriptプロセスによって作成された疑似端末が2番目のプロセスによって作成されたものと同じではないことは明らかですが、それらは同じ名前とメジャー、マイナー番号を持っています。

疑似端末を一意に識別するには、それらのdevice:inodeタプルを使用するか、(devptsファイルシステムの)デバイス番号をと組み合わせる必要がありますmajor:minor。問題は、/proc/PID/stat(「7」、proc(5)マンページを参照してください。ここで、ツールが情報を取得しlsofたりps、情報を取得したりする)の「tty」フィールドにst_rdevは、tty(パックされた)のみが含まれmajor:minorます。それがptyスレーブである場合、devptsそれを提供するファイルシステムへの指示はありません。同じ問題が、TIOCGDEVioctlで取得できるデバイス番号に影響します。

AFAICSには、Linux上のプロセスの制御端末を識別する信頼できる方法はありません。それ以外の場合の修正と提案は歓迎します!

弊社のサイトを使用することにより、あなたは弊社のクッキーポリシーおよびプライバシーポリシーを読み、理解したものとみなされます。
Licensed under cc by-sa 3.0 with attribution required.