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

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

もし私がするなら

# 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/proc/mountsバインドマウントがシンボリックリンク、他のバインドマウントなどによって「隠れる」可能性のあるディレクトリ/ファイルを指すことができることを考えると、一般的に表示されるデバイス(/ dev / sda2など)をどのように決定しますか?

答え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では、これをfindmnt特別に設計しました。util-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行目の最初のフィールド「Device」を参照してください。 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など)であり、ソースブロックデバイスがないことに注意してください。統計出力のデバイスが何を返すかは不明です。ただその価値についてだけです。

答え4

du-xマウントされた他のファイルシステムの内容を無視するスイッチを使用してコマンドを呼び出すことができます。

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

サイズが1MB以上のディレクトリを表示します。

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

関連情報