私が行った場合
# cd /
# ln -s /home test
# cd test
# mount --bind $PWD /mnt
/proc/mounts
のエントリは
/dev/sda2 /mnt ext4 rw,noatime,data=ordered 0 0
これは、/home
にマウントされているデバイスであり、$PWD
である/test
から簡単に推定することはできません。バインドマウントがシンボリックリンク、他のバインドによって「隠されている」可能性があるディレクトリ/ファイルである場合、どのデバイス(つまり、/ dev/sda2)が一般的に/proc/mounts
に表示されるかを判断するにはどうすればよいですか。マウントなど?
私があなたの質問を理解しているなら、あなたは与えられたマウントに使用されたデバイスを知りたいです。これには、df
コマンドを使用できます。
$ df -h
Filesystem Size Used Avail Use% Mounted on
/dev/mapper/Fedora_greeneggs-root 50G 21G 27G 44% /
devtmpfs 3.8G 0 3.8G 0% /dev
tmpfs 3.8G 14M 3.8G 1% /dev/shm
tmpfs 3.8G 984K 3.8G 1% /run
tmpfs 3.8G 0 3.8G 0% /sys/fs/cgroup
tmpfs 3.8G 3.4M 3.8G 1% /tmp
/dev/sda1 477M 99M 349M 23% /boot
/dev/mapper/Fedora_greeneggs-home 402G 184G 198G 49% /home
特定のファイル/ディレクトリが見つかったデバイスを見つけるには、df
の引数としてファイルを指定します。あなたの例を使用して:
$ df -h /mnt
Filesystem Size Used Avail Use% Mounted on
/dev/sda1 477M 99M 349M 23% /
mount
コマンドを使用することもできます。
$ mount | grep '^/dev'
/dev/mapper/Fedora_greeneggs-root on / type ext4 (rw,relatime,seclabel,data=ordered)
/dev/sda1 on /boot type ext4 (rw,relatime,seclabel,data=ordered)
/dev/mapper/Fedora_greeneggs-home on /home type ext4 (rw,relatime,seclabel,data=ordered)
各デバイスにマウントされたディレクトリは、上記の出力の3番目の引数です。デバイス/dev/sda1
だろう /boot
。他のデバイスはLVM(論理ボリューム管理)を使用しており、LVMで使用されている実際のデバイスを知るには、さらにクエリを実行する必要があります。
Linuxでは、util-linux
のfindmnt
が正確に作成されています
findmnt -n -o SOURCE --target /path/to/FILE
他のソリューションの利点は、パスがシンボリックリンクまたは重複バインドマウントによって隠されている場合でも機能することです。
私が知っている最も正確な方法は、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をリストしています。その値は2バイト、8と1に分けることができます。最初のバイトはメジャー番号と呼ばれ、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には同じファイルシステムがマウントされているため、somedirは/ mnt2からも到達可能です。
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は同じデバイスであることを覚えておいてください。
小説を入力したばかりで、前半はまったくお答えできませんが、それを削除するのはもったいないようです。多分それは誰かを助けるでしょう。
幸運を。
追伸一部のファイルシステムは、NFSやCIFSなどのネットワークベースであるか、またはprocfsやsysfsのように仮想であり、ソースブロックデバイスがないことに注意してください。 stat出力でデバイスとして何が返されるかわかりませんが、それだけの価値があります。
次の典型的なマウントポイントがあるとします。
$ df --output=target
Mounted on
/
/dev
/run
/sys/fs/cgroup
/run/lock
/run/shm
/run/user
stat --format %m <path>
は、マウントポイントのみを丸くトラップ可能な方法で出力します(ただし、終了コードを確認して、アクセス許可エラーを明確に検出する必要があります。マウントテーブルアプローチはここで有効です)。
$ stat --format %m /
/
$ stat --format %m /tmp
/
$ stat --format %m /proc
/proc
$ stat --format %m /run
/run
$ stat --format %m /run/mount
/run
$ stat --format %m /run/user
/run/user
$ stat --format %m /run/user/1000/dconf
/run/user
$ stat --format %m /run/user/1000/gvfs
/run/user/1000/gvfs
シンボリックリンクはいつものように少し注意します:
$ ls -lh ~/.gvfs
/home/cwillu/.gvfs -> /run/user/1000/gvfs
$ stat --format %m ~/.gvfs
/run/user/1000/gvfs
$ stat --format %m ~/.gvfs
/
そしてもちろん、スクリプトを作成するときは必ず引用符を使用してください。スペースなどのあるマウントポイントパスを考えます。
$ mkdir /tmp/Something\ Like\ This\!
$ Sudo mount none /tmp/Something\ Like\ This\! -t tmpfs
$ stat --format %m /tmp/Something\ Like\ This\!
/tmp/Something Like This!
$ touch /tmp/Something\ Like\ This\!/pretend-I\'m-big
$ ls /tmp/Something\ Like\ This\!
pretend-I'm-big
どのくらいの大きさareあなたですか?
$ du $(stat --format %m /tmp/Something\ Like\ This\!/)
du: cannot access /tmp/Something: No such file or directory
du: cannot access Like: No such file or directory
du: cannot access This!: No such file or directory
$ du "$(stat --format %m /tmp/Something\ Like\ This\!/)"
0 /tmp/Something Like This!
私のディストリビューションのタブ補完ではこれが正しくないので、キャリッジリターンとラインフィードおよびスペースのランを含むこのサンプルマウントポイントをワイルドカードにします。
$ stat --format %m /tmp/Something*
/tmp/Something
Like This!
$ a="$(stat --format %m /tmp/Something*)"
# the above assignment is actually the one place you don't need quotes,
# but `export a=...` or similar _would_ need them, so we'll just put them in;
# they don't change the behaviour in this form of assignment.
$ stat "$a"
File: ‘/tmp/Something \r\n\rLike This!’
Size: 40 Blocks: 0 IO Block: 4096 directory
Device: 7bh/123d Inode: 1279171 Links: 2
Access: (1777/drwxrwxrwt) Uid: ( 0/ root) Gid: ( 0/ root)
Access: 2016-09-30 11:43:17.933467344 -0600
Modify: 2016-09-30 11:43:17.933467344 -0600
Change: 2016-09-30 11:43:17.933467344 -0600
Birth: -