GNU/Linux >> Linux の 問題 >  >> Linux

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

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 

承認された回答:

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

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

[…]

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

つまり、デバイスのタイプごとに、メジャー:マイナーからデバイス:インスタンスへの一意のマッピングを提供することを目的としています。厳密に言えば、できます 同じメジャーを持つ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に重複するゼロ、ヌル、ランダムデバイスを作成することです:

# 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のデバイスノードと同じである必要はありません。 、および単一のドライバモジュールで、複数の論理/物理デバイスまたはデバイス名を管理できます。

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

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

更新 いくつかの興味深い歴史といくつかの*BSDの視点は、ポールヘニングカンプの2002年の BSDConにあります。 プレゼンテーション:https://www.usenix.org/legacy/events/bsdcon/full_papers/kamp/kamp_html/

1978年にさかのぼると(アルカテル・ルーセントの厚意により、ベルシステムテクニカルジャーナル 1978年7月から8月)「Unixタイムシェアリングシステム ‘明確に説明します(p1937):

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


Linux
  1. Ext4ファイルシステムのiノードの数を増やす方法は?

  2. Btrfsスナップショットの数に実際的な制限はありますか?

  3. Linux – Linuxカーネルはどのようにしてデバイスのメジャー番号とマイナー番号を認識しますか?

  1. Linux –デバイスツリー割り込みプロパティの値は何ですか?

  2. デフォルトのSSHサーバーのポート番号を変更する

  3. FedoraとUbuntu:主な違いは何ですか?

  1. CloudLinuxの利点は何ですか?

  2. Unix でブロック デバイスのメジャー番号とマイナー番号を識別する方法

  3. stat コマンド出力のデバイス番号