番号は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
答え1
~からLinuxプログラミングインターフェース、§14.1
各デバイスファイルにはプライマリID番号とマイナーID番号があります。キーIDは一般的なデバイスクラスを識別し、カーネルがそのデバイスに適したドライバを見つけるために使用されます。セカンダリIDは、共通カテゴリ内で特定のデバイスを一意に識別します。装置ファイルのメイン ID とマイナー ID は、ls -l コマンドを使用して表示されます。
[...]
各デバイスドライバは特定のマスターデバイスIDとの接続を登録し、その接続はデバイス特殊ファイルとデバイス間の接続を提供します。カーネルがデバイスドライバを探すとき、デバイスファイルの名前は重要ではありません。
以前のバージョン(2001)も参照してください。Linuxデバイスドライバ章(2e)。
つまり、各デバイスタイプに対して、デフォルト:セカンダリとデバイス:インスタンスのユニークなマッピングを提供することが目的です。厳密に言えば、できる1つは文字で、もう1つはブロックの場合、同じメジャー:マイナーを持つ2つの異なるデバイスがあります。
# 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では、システムのどの時点でもメジャー:マイナー番号各デバイスタイプについてユニークです。ただし、これらの数字は時間の経過とともに変わる可能性があり、他のLinuxシステム(同じディストリビューション、カーネル、ハードウェアでも)は必ずしも同じではありません。文字およびブロック装置には異なる番号付けスペースがあります。たとえば、ブロックマスター1はRAMディスクに割り当てられ、文字マスター1はカーネルデバイスセット(nullと0を含む)に割り当てられます。
歴史的に装備専攻者は(ほとんど)静的経由で割り当て登録部(メンテナンスはされませんが、カーネルソースコードにはまだ存在していますDocumentation/devices.txt
。)今日、多くのデバイスが動的に割り当てられています。ウデブ、マッピングはで見ることができます/proc/devices
。固定装置がまだ存在します。incude/uapi/linux/major.h
(最近から移動するinclude/major.h
)
デフォルト:サブコンビネーションは特定のデバイスインスタンスを一意に識別しますが、同じデバイスを参照する複数のデバイスノード(ファイル)を作成するのを妨げることはありません。作成する必要はありません/dev
(ただし、デバイスノードの作成をサポートするファイルシステムに存在する必要があり、そのnodev
オプションでインストールしないでください)。
一般的な用途は、chrootに冗長な0、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 によって定義されます。)。さらに、デバイスは複数の主要なデバイス番号を登録できます。sd
でドライバを確認してください/proc/devices
。ドライバモジュール名(.ko
)はデバイス名と同じである必要はなく、デバイスノードと同じである必要もありません。/dev
、シングルドライバモジュールは、複数の論理/物理デバイスまたはデバイス名を管理できます。
要約すると、同じメジャー:マイナー番号を持つ複数のデバイスノード(その内部または別の場所)がある可能性がありますが、/dev/
同じタイプの場合は同じデバイスを参照します。複数の主要インスタンスを処理できるドライバがある場合がありますが、カーネルとドライバ内の各タイプ(文字またはブロック)について、メジャー:マイナー番号は、特定のデバイス(デフォルト)と特定のインスタンス(マイナー必須)を参照するために使用されます。 。 )機器。
タイプが同じで、プライマリ:セカンダリの2つのデバイスノードを持つことはできず、2つのノードが2つの異なる論理または物理デバイスにアクセスすることが期待されます。デバイスにアクセスすると、カーネルはタイプとキー番号(およびいいえ特定のインスタンスまたはサブ機能は、デバイスノード名と慣例的にマイナー番号に基づいて決定的に選択されます。
修正する いくつかの興味深い歴史といくつかの* BSDの視点は、Poul-Henning Kampの2002にあります。BSDConプロモーション会議: https://www.usenix.org/legacy/events/bsdcon/full_papers/kamp/kamp_html/
もしあなたなら時間をさかのぼって1978年に(アルカテル - ルーセント提供)ベルシステム技術マガジン1978年7~8月)Unixタイムシェアリングシステム'は明示的に言います(p1937):
デバイスは、メジャー番号、マイナー番号、およびクラス(ブロックまたは文字)で特徴付けられます。各クラスには、デバイスドライバのエントリポイントのセットがあります。キーデバイス番号は、特定のデバイスドライバのコードを呼び出すときに配列をインデックス化するために使用されます。マイナーデバイス番号は、デバイスドライバにパラメータとして渡されます。マイナー番号は、ドライバーが付与した番号以外には意味がありません。一般に、ドライバは、マイナーデバイス番号を使用して、複数の同じ物理デバイスのうちの1つにアクセスします。
答え2
デバイスファイルの作成時mknode
と番号が提供されますmajor
。minor
これは、Linuxがデバイスファイルに関連付けられている基本ハードウェアデバイスを識別する方法です。ほとんどの場合、major
番号でドライバを識別し、minor
ドライバが制御するさまざまなデバイスを区別します。
したがって、各デバイスの番号は一意でなければなりません。そうしないと、すべてのデバイスに対して正しいデバイスファイルを生成できません。
答え3
いいえ、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番目のプロセスで生成された擬似端末とは異なりますが、名前とメジャー番号とマイナー番号は同じです。
擬似端末を一意に識別するには、その端末のタプルを使用するか(devptsファイルシステムの)デバイス番号に対応しdevice:inode
ますmajor:minor
。 (ツールが/proc/PID/stat
から情報を取得する場所proc(5)
)にはtty(パッケージ)のみが含まれます。これがptyスレーブの場合、それを提供したファイルシステムには何も表示されません。同じ問題がioctlを介して取得したデバイス番号に影響します。lsof
ps
st_rdev
major:minor
devpts
TIOCGDEV
Linuxでプロセスの制御端末を識別する信頼できる方法はないようです。