是否有命令查看磁盘的安装位置?


28

是否有一个简单的命令将磁盘的设备节点作为输入,并告诉我该磁盘的安装位置(以及是否安装)?是否可以单独获取安装点,因此可以将其传递给另一个命令?

我正在以最小的安装量在Debian Squeeze实时系统上工作(如果需要,我可以安装其他软件包)。

Answers:


13

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

“如果该设备是通过/ dev中指定相同设备的其他路径安装的,则您不会以这种方式注意到它。” —实际上是这样:我有udisks符号链接(在/ dev / disk / by-label / ...中)。但是我可以使用解析为设备节点readlink -f。我喜欢这个/proc/mounts主意,我认为这可能比可靠/etc/mtab
确实是2012年

@detly或者您可以使用mountinfo。致电stat以获取设备编号(请参阅我更新的答案,我忘记了之前包含的命令)。
吉尔(Gilles)“所以,别再邪恶了”

您可能需要在该命令中使用-d " "选项。cutgrep
克雷格·麦昆


26

在Linux上,您现在可以使用findmntfrom 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

学习新东西总是很好
roaima

6

mount不带参数的命令将列出当前所有已挂载的文件系统。您可以grep针对所需的磁盘(或grep /etc/mtab从文件中mount读取信息的磁盘)进行操作:

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

虽然那有很多无关紧要的文字。我需要能够将挂载点传递给其他命令。(对不起,我已在Q中对此进行了澄清。)
值得一提的是2012年

嗯,grep ${NODE} /etc/mtab | cut -d ' ' -f 2应该这样做。
确实是2012年

虽然grep ^"${NODE}[[:space:]]\+" /etc/mtab | cut -d ' ' -f 2"不那么脆弱...
值得一提的是2012年

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安装在引导上。好...

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/mounts标准输出,如果找到,退出状态也设置为0,否则退出状态为1。


By using our site, you acknowledge that you have read and understand our Cookie Policy and Privacy Policy.
Licensed under cc by-sa 3.0 with attribution required.