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


28

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

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

回答:


13

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模倣し、そのファイルのグローバルファイルが。マウント情報は、たとえばのためにプロセス間で異なる場合がありますchrootmountinfo異なる形式で、より多くの情報、特にデバイスのメジャー番号とマイナー番号を含む追加のファイルがあります。ドキュメントから:

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}'

「同じデバイスを指定する/ devの異なるパスを介してデバイスがマウントされた場合、この方法では気付かないでしょう。」—実際はそうです:udisksシンボリックリンクがあります(/ dev / disk / by-label / ...にあります)。ただし、を使用してデバイスノードに解決できますreadlink -f。私はこの/proc/mountsアイデアが好きです/etc/mtab
確実に

@detlyまたはを使用できますmountinfostatデバイス番号を取得するために呼び出します(更新された回答を参照してください。以前にコマンドを含めるのを忘れていました)。
ジル 'SO-悪であるのをやめる

そのコマンドには-d " "オプションが必要な場合があります。cutgrep
クレイグマックイーン


26

Linuxでは、バージョン2.18以降のfindmntコマンドを使用できますutil-linux

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

またはlsblk(またutil-linux、2.19以降):

$ 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

新しい何かを学ぶことは常に良いです
ロアイマ

6

mount引数なしのコマンドは、現在マウントされているすべてのファイルシステムをリストします。あなたはgrepあなたが望むディスクのためにそれをすることができます(またはgrep /etc/mtab、ファイルはmountそこから情報を読み取ります):

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

ただし、これには無関係なテキストがたくさんあります。マウントポイントを他のコマンドに渡すことができる必要があります。(申し訳ありませんが、私はそのQ.で明らかになってきました)
detly

ああ、それをするgrep ${NODE} /etc/mtab | cut -d ' ' -f 2必要があります。
確実に

grep ^"${NODE}[[:space:]]\+" /etc/mtab | cut -d ' ' -f 2"...それほど脆弱である
detly

2

はい。いくつかの使用例では、興味深いマウントポイントのみの表示/非興味深いタイプのフィルタリング、またはその下に/あるディレクトリのリストを見ることができますが、下にも簡単な要約があります。あなたが尋ねているコマンドは次のとおりですfindmnt (ただし、lsblk役立つこともあります)

lsblk -f /dev/sda[12]

NAME FSTYPE LABEL UUID                                 MOUNTPOINT
sda1 vfat   ESP   F0B7-5DAE                            /esp
sda2 btrfs  sys   94749918-bde1-46e6-b77c-b66e0368ecdb /    

ご覧のとおり、/dev/sda1はにマウントされてい/espます。他の場所にもマウントされているのだろうか?

findmnt /dev/sda1

TARGET SOURCE                    FSTYPE OPTIONS
/esp   /dev/sda1                 vfat   rw,relatime,fmask=0022,dmask=0022,codepage=437,iocharset=iso8859-1,shortname=mixed,errors=remount-ro
/boot  /dev/sda1[/EFI/arch_root] vfat   rw,relatime,fmask=0022,dmask=0022,codepage=437,iocharset=iso8859-1,shortname=mixed,errors=remount-ro

あぁ。そうですか。サブフォルダーも--bindブート時にマウントされます。OK...

sudo umount /boot /esp
findmnt /dev/sda1

なし。なんてこったい?

echo "$?"

1

ああ...それはいいですね。うーん...

for d in 1 2
do    findmnt "/dev/sda$d" >/dev/null
      printf  "/dev/sda$d%.$((6>>!$?))s%s\n"\
              " isn't" " currently mounted."
done

/dev/sda1 isn't currently mounted.
/dev/sda2 is currently mounted.

ああ、そう、それは本当にいい。

for d in /dev/sd*
do    findmnt -noSOURCE,TARGET "$d"
done

/dev/sda2[/arch_root] /

それでは、sda1を元の場所に戻し、もう一度試してみましょう...

sudo mount -a
for d in /dev/sd*
do    findmnt -noSOURCE,TARGET "$d"
done

/dev/sda1                 /esp
/dev/sda1[/EFI/arch_root] /boot
/dev/sda2[/arch_root] /

しかし、この魔法のコマンドはどこで見つけましたか?

man mount | sed -e:n -e'/findmnt/!d;N;/\n$/q;bn'

より堅牢でカスタマイズ可能な出力を使用するには、特にスクリプトでfindmnt(8)を使用します。マウントポイント名の制御文字はに置き換えられることに注意してください?


1

デバイスノード/devがマウントされているかどうかを検出するためのクリーンでシンプルな方法がわかりません。しかし、これは私が提供できるものです。直接マウントされたデバイス(/dev/sda1)およびUUIDでマウントされたデバイス()を処理します/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/mountsstdoutに書き込み、終了ステータスを0に設定します。それ以外の場合、終了ステータスは1です。


弊社のサイトを使用することにより、あなたは弊社のクッキーポリシーおよびプライバシーポリシーを読み、理解したものとみなされます。
Licensed under cc by-sa 3.0 with attribution required.