ディレクトリがどのデバイスにあるかを判断する

ディレクトリがどのデバイスにあるかを判断する

私が行った場合

# cd /
# ln -s /home test
# cd test
# mount --bind $PWD /mnt

のエントリー/proc/mounts

/dev/sda2 /mnt ext4 rw,noatime,data=ordered 0 0

which は にマウントされているデバイスであり/home、 から が簡単に推測できるものではありません$PWD。バインド マウントが、シンボリック リンク、他のバインド マウントなどによって潜在的に「隠される」ディレクトリ/ファイルである可能性があることを考慮すると、一般に/testどのデバイス (つまり、/dev/sda2) が表示される/proc/mountsかをどのように判断すればよいでしょうか。

答え1

ご質問の意味を理解しているのであれば、特定のマウントにどのデバイスが使用されたかを知りたいということでしょう。そのためには次の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 によって実際にどのデバイスが使用されているかを確認するには、さらにクエリを実行する必要があります。

答え2

Linuxではまさにこれのために作られfindmntutil-linux

findmnt -n -o SOURCE --target /path/to/FILE

他のソリューションの利点は、パスがシンボリックリンクや重複したバインドマウントによって隠されている場合でも機能することです。

答え3

私が知っている最も正確な方法は、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 の新しい /dev エントリ aardvark を作成できます。

mknod /dev/aardvark b 8 18

その後、簡単にマウントできました。

mount /dev/aardvark /mnt

そして、マウント コマンドの出力または /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 は同じデバイスであることに注意してください。

小説をタイプしたばかりで、前半はあなたの質問にまったく答えていないことに気づきましたが、削除するのはもったいないと思いました。おそらく他の誰かの役に立つでしょう。

幸運を。

PS 一部のファイルシステムは、NFS や CIFS のようにネットワーク ベースであったり、procfs や sysfs のように仮想的であったりして、ソース ブロック デバイスを持たないことに注意してください。統計出力でデバイスとして何が返されるかはわかりませんが、参考までに。

答え4

このコマンドは、他のマウントされたファイル システムからのコンテンツを無視するスイッチdu付きで呼び出すことができます。-x

スイッチ-kはディレクトリのサイズを KB 単位で表示します。

サイズが 1MB を超えるディレクトリを表示します。

du -xk / | awk ' $1 > 1000000 { print } '

関連情報