回答:
Linuxでは、のカーネルからマウントポイント情報を直接取得できます/proc/mounts
。mount
プログラムは、同様の情報を記録します/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}'
mountinfo
。stat
デバイス番号を取得するために呼び出します(更新された回答を参照してください。以前にコマンドを含めるのを忘れていました)。
-d " "
オプションが必要な場合があります。cut
grep
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
mount
引数なしのコマンドは、現在マウントされているすべてのファイルシステムをリストします。あなたはgrep
あなたが望むディスクのためにそれをすることができます(またはgrep
/etc/mtab
、ファイルはmount
そこから情報を読み取ります):
$ grep /dev/sda /etc/mtab
/dev/sda3 /boot ext2 rw,noatime 0 0
grep ${NODE} /etc/mtab | cut -d ' ' -f 2
必要があります。
grep ^"${NODE}[[:space:]]\+" /etc/mtab | cut -d ' ' -f 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)を使用します。マウントポイント名の制御文字はに置き換えられることに注意してください?
。
デバイスノード/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/mounts
をstdoutに書き込み、終了ステータスを0に設定します。それ以外の場合、終了ステータスは1です。
udisks
シンボリックリンクがあります(/ dev / disk / by-label / ...にあります)。ただし、を使用してデバイスノードに解決できますreadlink -f
。私はこの/proc/mounts
アイデアが好きです/etc/mtab
。