如何检查特定目录是否是挂载点?

如何检查特定目录是否是挂载点?

如何检查特定目录是否是挂载点?例如,存在一个名为/testthat 的文件夹,我想检查它是否是挂载点。

答案1

如果您想检查它是文件系统的挂载点,则可以mountpoint使用以下命令(在大多数基于 Linux 的系统上):

if mountpoint -q -- "$dir"; then
  printf '%s\n' "$dir is a mount point"
fi

它通过检查.和是否..具有相同的设备编号(st_devstat()结果中)来实现这一点。因此,如果您没有该mountpoint命令,您可以执行以下操作:

perl -le '$dir = shift; exit(1) unless
  (@a = stat "$dir/." and @b = stat "$dir/.." and
  ($a[0] != $b[0] || $a[1] == $b[1]))' "$dir"

就像 一样,即使不是挂载点(例如在监狱中),或者对于 a 的挂载点mountpoint,它也会返回 true//chrootfalse绑定在其自身内安装相同的文件系统。

与 相反mountpoint,对于符号链接,它将检查符号链接的目标是否是挂载点。

答案2

正如 HalosGhost 在评论中提到的,目录本身不一定是挂载的。相反,它们存在于已安装的设备上。要检查这一点,您可以使用df如下命令:

$ df -h /boot/
Filesystem            Size  Used Avail Use% Mounted on
/dev/hda1              99M   55M   40M  59% /boot

在这里我们可以看到该目录/boot是文件系统的一部分/dev/hda1。这是系统上的物理设备,即 HDD。

mount您还可以通过使用命令查询系统以查看当前安装的设备来稍微不同地解决这个问题:

$ mount | column -t
/dev/mapper/VolGroup00-LogVol00  on  /                         type  ext3         (rw)
proc                             on  /proc                     type  proc         (rw)
sysfs                            on  /sys                      type  sysfs        (rw)
devpts                           on  /dev/pts                  type  devpts       (rw,gid=5,mode=620)
/dev/hda1                        on  /boot                     type  ext3         (rw)
tmpfs                            on  /dev/shm                  type  tmpfs        (rw)
/dev/mapper/lvm--raid-lvm0       on  /export/raid1             type  ext3         (rw)
none                             on  /proc/sys/fs/binfmt_misc  type  binfmt_misc  (rw)
sunrpc                           on  /var/lib/nfs/rpc_pipefs   type  rpc_pipefs   (rw)
nfsd                             on  /proc/fs/nfsd             type  nfsd         (rw)

在这里您可以看到系统上当前安装的设备类型和文件系统类型。第三列显示它们在系统文件系统中的安装位置。

答案3

当我想检查安装新的 XFS 文件系统时,我正在寻找同样的问题。

我找到了命令发现:findmnt /directoryname

[root@CentOS7-Server /]# findmnt /mnt
TARGET SOURCE    FSTYPE OPTIONS
/mnt   /dev/sdb1 xfs    rw,relatime,seclabel,attr2,inode64,noquota
[root@CentOS7-Server /]# 

答案4

可以基于以下构建漂亮而简短的Python单行代码吉尔斯的回答:

$ python -c 'import os,sys;print(os.path.ismount(sys.argv[1]))' /mnt/HDD
True

$ python -c 'import os,sys;print(os.path.ismount(sys.argv[1]))' /etc                
False

mountpoint我已经在 Python 中自定义了命令的实现,它解析/proc/self/mounts文件。与 Stephane 的答案中的行为类似mount,除了命令 parses /proc/self/mountinfo。用法非常简单:is_mountpoint.py /path/to/dir

#!/usr/bin/env python3
from os import path
import sys

def main():

    if not sys.argv[1]:
       print('Missing a path')
       sys.exit(1)

    full_path = path.realpath(sys.argv[1])
    with open('/proc/self/mounts') as mounts:
       print
       for line in mounts:
           if full_path in line:
              print(full_path,' is mountpoint')
              sys.exit(0)
    print(full_path,' is not a mountpoint')
    sys.exit(1)

if __name__ == '__main__':
    main()

测试运行:

$ python3 ./is_mountpoint.py /mnt/HDD                                          
/mnt/HDD  is mountpoint
$ lsblk | grep HDD
└─sdb6   8:22   0 405.3G  0 part /mnt/HDD
$ python3 ./is_mountpoint.py $HOME                                             
/home/xieerqi  is not a mountpoint

相关内容