私は通常、特定のデバイスに対して全体のメジャー/マイナーデバイス番号付けがどのように機能するかを理解します(ここから離れている場合は変更してください)、主なデバイス番号は基本的にデバイスクラス(ブロックデバイスなど)に関連付けられています。文字デバイス/特殊文字)、マイナー番号は、そのデバイスの下の特定の種類のデバイスに関連付けられています。この数値に基づいて、カーネルはデバイスと対話するために必要なデバイスドライバを決定できます。ファイルシステムレベルでは、デバイス番号はinode stat構造に格納されているため、ファイルをユーザーとして指定すると、デバイスIDは2バイトの値で返されます。ここで、高バイトと低バイトは基本デバイスを表します。そして低い装置。それぞれマイナー番号です。 stat構造体には、この形式でデバイスIDを指定するための2つのメンバー(st_devとst_rdev)があります。ここで、st_devはそのファイルを持つデバイスに関連付けられています(ストレージデバイスの通常のファイルの場合、st_devはパーティションのデバイスになります)。デフォルト/補助ファイルがある場所)。
ただし、ファイルにデバイスがマウントされていないか、特殊文字などがある場合、st_devの主なデバイス番号は0に設定され、マイナーデバイス番号はに設定されます。何これとは対照的に、st_rdevはデバイスタイプを埋め込んでもいなくてもかまいません(ファイルシステムがそれを実装しているかどうかによって異なります)。だから私の質問は、何このインスタンスでマイナー番号を入力すると、使用する値/使用する値を使用する理由をどのように理解できますか?
例えば
stat /etc/passwd
=>デバイス:801h、「デバイスタイプ」が設定されていません - メジャー番号8はSCSIデバイスに関連付けられ、マイナー番号1はファイルの最初のパーティション(sda1)に関連付けられると予想されます。
stat /dev/sda1
=> Device:6h、DeviceType:8,1 - ここのデバイス(st_dev)には、メジャー番号0(予想)とマイナー番号6があります。なぜ6?
stat /dev/null
- 繰り返しますが、6のマイナーバージョン
stat /proc/version
- 4のマイナーバージョン
私は何を見逃していますか?
ここで構造体を参照していることがわかり、この質問はおそらくスタックオーバーフローにうまく配置されます。しかし、これが明確な開発の質問ではなく、低レベルのLinuxの質問に近いと思います。それでも再配置することができて嬉しいです。
答え1
私のシステムでは/proc
yes 6h
、/dev
yesです5h
。
クイックテスト:
# for x in a b c d e f g h i j; do mkdir $x; mount -t tmpfs tmpfs $x; done
# stat */.
途中で欠落している数字が与えられます(使用されます33h
)。インストール時に最初の空き番号を動的に割り当てて使用するようです。3dh
35h
/run/user/1000/gvfs
この番号は再利用されるため、少なくともこの場合、特定のパスst_dev
でファイルシステムが変更されたかどうかを検出するために確実に使用することはできません。