是否有一个简单的命令将磁盘的设备节点作为输入,并告诉我该磁盘安装在何处(以及是否安装)?是否可以单独获取挂载点,以便我可以将其传递给另一个命令?
我正在使用最小安装的 Debian Squeeze live 系统(如果需要,我可以安装额外的软件包)。
答案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
或者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
。
在这两个文件中,第一个空格分隔的字段包含设备路径,第二个字段包含安装点。
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。