ディスクのデバイスノードを入力として受け取り、そのディスクがマウントされている場所(およびマウントされている場合)を知らせる簡単なコマンドはありますか?別のコマンドに渡すためにマウントポイントを別々にインポートできますか?
私は最小限にインストールされたDebian Squeezeライブシステムを使用しています(必要に応じて追加のパッケージをインストールできます)。
答え1
findmnt
Linuxでは、次のコマンドを使用できます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
または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
答え2
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}'
答え3
引数のないコマンドは、mount
現在マウントされているすべてのファイルシステムを一覧表示します。grep
必要なディスクを指定できます(またはgrep
/etc/mtab
情報を読み取るファイルです)。mount
$ grep /dev/sda /etc/mtab
/dev/sda3 /boot ext2 rw,noatime 0 0
答え4
/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
以下からエントリを書き込みます。標準出力見つかった場合、終了ステータスも 0 に設定します。それ以外の場合、終了ステータスは 1 です。