もし私がするなら
# 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 } '