私が知っている最も正確な方法は、lstat()システムコールの出力を使用することです。具体的には、st_devフィールド。この情報を表示するために使用できるコマンドラインユーティリティ、stat(1)があります。たとえば、私のラップトップでの「stat / etc / issue」の出力:
File: ‘/etc/issue’
Size: 65 Blocks: 8 IO Block: 4096 regular file
Device: 801h/2049d Inode: 1610916043 Links: 1
Access: (0644/-rw-r--r--) Uid: ( 0/ root) Gid: ( 0/ root)
3行目の最初のフィールド「デバイス」に注目してください。ここに801hがリストされています。その値は、8バイトと1バイトの2バイトに分けることができます。最初のバイトはメジャー番号と呼ばれ、2番目のバイトはマイナー番号です。したがって、次のステップは、デバイスメジャー8、マイナー1が何であるかを把握することです。
/ proc / partitionsのコンサルティングが最速だと思います。私の場合、/ proc / partitionsの内容は次のとおりです。
major minor #blocks name
8 16 234431064 sdb
8 17 33554432 sdb1
8 18 200875608 sdb2
8 0 500107608 sda
8 1 500106584 sda1
その出力から、メジャー8、マイナー1がsda1であることはかなり明らかです。これはls -l / dev / sda1で確認できます
brw-rw---- 1 root disk 8, 1 May 8 05:33 /dev/sda1
日付スタンプの前の8、1に注目してください。
/ dev / sda1のようなデバイスファイルの名前は単なるラベルであることを理解/記憶することが重要です。メジャー番号とマイナー番号は、デバイスファイルの重要で重要な値です。興味がある場合は、デバイスファイルの作成に使用されるmknod(1)ユーティリティを確認してください。次の構文を使用して、メジャー8、マイナー18のaardvarkという新しい/ devエントリを作成できます。
mknod /dev/aardvark b 8 18
その後、簡単にマウントできました。
mount /dev/aardvark /mnt
そして、mountコマンドの出力または/ proc / mountsの内容を見ると、次のことがわかります。
/dev/aardvark on /mnt type xfs (rw,relatime,attr2,inode64,noquota)
df -hの表示:
/dev/aardvark 192G 154G 38G 81% /mnt
...とにかく、このすべてのポイントは、ブロックデバイスを識別するための重要な詳細は、デバイスファイルラベルではなく、メジャー番号とマイナー番号であり、lstat()システムコールを使用することが最善の方法であることを示すことですそれらの値をクエリします。
最後のコメントとして、私はあなたの質問を読み直して回答したことを確認し、バインドマウントの/ proc / mountsに表示されるソースデバイスラベルを尋ねていることに気付きました。これは、バインドマウントのファイルシステムマウントポイントソースの元のmount(2)呼び出しで使用されたものと同じソースデバイスラベルになります。おそらく例が役立ちます:
/ dev / sdb2と/ dev / aardvarkがあります(上記と同じ)。両方ともメジャー8、マイナー18です。注、同じファイルシステムを2回マウントします。私は次のことを行います:
mkdir /mnt1 /mnt2 /foo
mount /dev/aardvark /mnt1
mount /dev/sdb2 /mnt2
/ mnt1のディレクトリをsomedirにしていることに注意してください。ただし、/ mnt1と/ mnt2には同じファイルシステムがマウントされているため、/ mnt2を介してsomedirにもアクセスできます。
mkdir /mnt1/somedir
mkdir /foo/left /foo/right
mount -o bind /mnt1/somedir /foo/left
mount -o bind /mnt2/somedir /foo/right
/ proc / mountsを確認すると、次のように表示されます。
/dev/aardvark /mnt1 xfs rw,relatime,attr2,inode64,noquota 0 0
/dev/sdb2 /mnt2 xfs rw,relatime,attr2,inode64,noquota 0 0
/dev/aardvark /foo/left xfs rw,relatime,attr2,inode64,noquota 0 0
/dev/sdb2 /foo/right xfs rw,relatime,attr2,inode64,noquota 0 0
/ foo / ...バインドマウントのソースデバイスラベルは、ファイルシステムのmount(2)呼び出しで最初に指定された値と同じです。私の例の/ dev / aardvarkと/ dev / sdb2は同じデバイスです。
私は小説をタイプしたばかりで、前半はあなたの質問にまったく答えていないことを理解していますが、それを削除するのはとても無駄のように思えました。おそらく他の誰かを助けるでしょう。
幸運を。
PS一部のファイルシステムは、NFSやCIFSのようにネットワークベースであるか、procfsやsysfsのように仮想であり、ソースブロックデバイスを持たないことに注意してください。statの出力でデバイスとして何が返されるかわかりませんが、それが価値があるだけです。
$PWD
(これは私が設置していますものですが)シンボリックリンク、バインドマウントなどの直列に埋設されているし、私は再帰的にマウントポイントのパスを検討する必要があります。