ディスクがマウントされている場所を確認するコマンドはありますか?

ディスクがマウントされている場所を確認するコマンドはありますか?

ディスクのデバイス ノードを入力として受け取り、そのディスクがマウントされている場所 (およびマウントされているかどうか) を通知する簡単なコマンドはありますか? マウント ポイントを単独で取得して、別のコマンドに渡すことは可能ですか?

私は最小限のインストールで Debian Squeeze ライブ システムに取り組んでいます (必要に応じて追加のパッケージをインストールできます)。

答え1

Linux では、findmnt以下のコマンドを使用できるようになりましたutil-linux(バージョン 2.18 以降):

$ findmnt -S /dev/VG_SC/home
TARGET SOURCE                 FSTYPE OPTIONS
/home  /dev/mapper/VG_SC-home ext4   rw,relatime,errors=remount-ro,data=ordered

または( 2.19 以降からlsblkも):util-linux

$ lsblk /dev/VG_SC/home
NAME       MAJ:MIN RM  SIZE RO TYPE MOUNTPOINT
VG_SC-home 254:2    0  200G  0 lvm  /home

これは、特定のデバイス (ディスクまたはパーティションなど) にマウントされているすべてのファイル システムを見つけるのにも役立ちます。

$ lsblk  /dev/sda2
NAME                    MAJ:MIN RM   SIZE RO TYPE MOUNTPOINT
sda2                      8:2    0  59.5G  0 part
├─linux-debian64 (dm-1) 252:1    0    15G  0 lvm
└─linux-mint (dm-2)     252:2    0    15G  0 lvm  /

マウントポイントのみを取得するには:

$ findmnt -nr -o target -S /dev/storage/home
/home
$ lsblk -o MOUNTPOINT -nr /dev/storage/home
/home

上記は、findmntデバイスがマウントされていない場合は失敗の終了ステータスを返しますlsblk

それで:

if mountpoint=$(findmnt -nr -o target -S "$device"); then
  printf '"%s" is mounted on "%s"\n' "$device" "$mountpoint"
else
  printf '"%s" does not appear to be directly mounted\n' "$device"
fi

答え2

Linux では、 でカーネルから直接マウント ポイント情報を取得できます/proc/mountsmountプログラムは に同様の情報を記録します/etc/mtab。パスとオプションは異なる場合があります。 はカーネルに渡された/etc/mtabものを表し、 はカーネル内部で見られるデータを示します。は常に最新ですが、ブート スクリプトで予期されていない時点で読み取り専用になった場合は最新ではない可能性があります。形式は に似ています。mount/proc/mounts/proc/mounts/etc/mtab/etc/etc/fstab

どちらのファイルでも、最初の空白で区切られたフィールドにはデバイス パスが含まれ、2 番目のフィールドにはマウント ポイントが含まれます。

awk -v needle="$device_path" '$1==needle {print $2}' /proc/mounts

またはawkがない場合は:

grep "^$device_path " /proc/mounts | cut -d ' ' -f 2

期待どおりの結果にならないエッジケースがいくつかあります。 で/dev同じデバイスを指定する別のパスを介してデバイスがマウントされた場合、このようには気付かないでしょう。 では/proc/mounts、バインド マウントは元のマウントと区別できません。マウント ポイントが別のマウント ポイントをシャドウする場合、複数の一致が存在する可能性があります (これは珍しいことです)。

/proc/selfまたはには、グローバルファイルを模倣した/proc/$pidプロセスごとのmountsファイルがあります。マウント情報は、たとえば次のような理由でプロセスごとに異なる場合があります。chrootと呼ばれる追加ファイルがありmountinfo、これは異なる形式で、特にデバイスのメジャー番号とマイナー番号などの詳細情報が含まれています。ドキュメンテーション:

36 35 98:0 /mnt1 /mnt2 rw,noatime master:1 - ext3 /dev/root rw,errors=continue
(1)(2)(3)   (4)   (5)      (6)      (7)   (8) (9)   (10)         (11)

(1) mount ID:  unique identifier of the mount (may be reused after umount)
(2) parent ID:  ID of parent (or of self for the top of the mount tree)
(3) major:minor:  value of st_dev for files on filesystem
(4) root:  root of the mount within the filesystem
(5) mount point:  mount point relative to the process's root
(6) mount options:  per mount options
(7) optional fields:  zero or more fields of the form "tag[:value]"
(8) separator:  marks the end of the optional fields
(9) filesystem type:  name of filesystem of the form "type[.subtype]"
(10) mount source:  filesystem specific information or "none"
(11) super options:  per super block options

したがって、番号でデバイスを検索する場合は、次のようにします。

awk -v dev="$major:minor" '$3==dev {print $5}'
awk -v dev="$(stat -L -c %t:%T /dev/block/something)" '$3==dev {print $5}'

答え3

mount引数なしのコマンドは、現在マウントされているすべてのファイルシステムを一覧表示します。必要grepなディスク(または情報が読み取られるgrep /etc/mtabファイル)の を指定できます。mount

$ grep /dev/sda /etc/mtab
/dev/sda3 /boot ext2 rw,noatime 0 0

答え4

のデバイス ノードがマウントされているかどうかを検出する、明確で簡単な方法は知りません。ただし、私が提案できるのはこれです。直接マウントされたデバイス ( ) と UUID によってマウントされたデバイス ( )/devを処理します。デバイス名に空白が含まれていると機能しません。/dev/sda1/dev/disk/by-uuid/aa4e7b08-6547-4b5a-85ad-094e9e1af74f

deviceIsMounted()
{
    local DEVICE="$1"
    local MOUNT=$(
        (
            echo "$DEVICE"
            find /dev -type l -lname "*${DEVICE/*\/}" -exec readlink -f {} \; -print |
                xargs -n2 |
                awk -v device="$DEVICE" '$1 == device {print $2}'
        ) |
            xargs -n1 -i{} grep -F {} /proc/mounts
    )
    test -n "$MOUNT" && echo "$MOUNT"
}

deviceIsMounted /dev/sda1 && echo yes              # Mountpoint and status
deviceIsMounted /dev/md2 >/dev/null && echo yes    # Just status

この関数はエントリをからに書き込み/proc/mountsます標準出力見つかった場合は、終了ステータスも 0 に設定されます。それ以外の場合は、終了ステータスは 1 になります。

関連情報