检查文件夹是否是已安装的远程文件系统


43

检查给定文件夹是否在Shell脚本中已安装的远程(nfs)文件系统上的最佳方法(可靠,可移植等)是什么?

我正在寻找一个如下所示的命令:

chk-remote-mountpoint /my/path/to/folder 

Answers:


34

正如斯蒂芬Stephane)所说:“没有通用的Unix答案”。

我发现我的问题的最佳解决方案:

df -P -T /my/path/to/folder | tail -n +2 | awk '{print $2}'

将返回文件系统类型,例如:nfsext3

-T选项不是标准选项,因此它可能无法在其他Unix / Linux系统上运行。

根据Gilles在下面的评论:“这适用于任何非嵌入式Linux,但不适用于BusyBox,* BSD等。”


1
这适用于任何非嵌入式Linux,但不适用于BusyBox,* BSD等。您可以自行决定是否足够好。
吉尔(Gilles)'所以

在某些情况下,可以查看/etc/mtabmount代替使用结果df
TNW

1
@TNW或什/proc/mounts
laebshade

1
显然,没有mount,也没有/etc/mtab,甚至没有/proc/mounts是标准所以有什么可以被发现那里没有保证...
Totor

1
这在OSX 10.8上不起作用,因为-T在这里有不同的含义
DavAlPi 2013年

13

您可以使用GNU stat

%m 找出挂载点。

$ stat --format=%m /usr/src/linux
/usr/src

%T (在文件系统模式下)以查找文件系统的名称。

$ stat --file-system --format=%T /usr/src/linux
reiserfs

因此,您知道/usr/src/linux在我的系统上,该文件存储在一个已挂载/usr/src并具有filesystem type的文件系统中reiserfs

还请参阅man stat用于进一步参考。这是一个非常通用的命令,几乎在您需要有关文件的信息而又不想grep | awk退守时常有用。


我的版本stat不具备%m的选项--format(使用Debian挤压,Coreutils的8.5)。因此,我猜这种解决方案不是很可靠。
Totor

我不敢相信,但是coreutils 8.5和8.13(debian wheezy)之间的区别表明您是正确的。让我感到非常惊讶:)挤压太老了:(错误,太稳定
frostschutz

1
来自coreutils changelog :2010-08-27 <Aaron Burgemeister> stat: add %m to output the mount point for a file。差不多3年前了。令人惊讶的是Debian仍然没有这个。
frostschutz

即使Debian Squeeze于2011-02-06发布,它还是在2010-08-06 被冻结,在此coreutils更改之前...我宁愿在可能的情况下寻求“标准”解决方案。
Totor

好吧,如果可以在旧版统计信息中使用,则可以只使用文件系统%T命令。如果这也不起作用,并且您的stat版本未提供您所需的信息,请返回令人尴尬的解决方案。
frostschutz

4

mount -l并使用grepsedawk查找引用该目录的行。


要弄清楚这/my/path/to/the/directory实际上是从安装点/my/path获得答案的结果,这似乎很复杂。也许你可以提供有关一些更多的细节grepsedawk命令你的建议(一个完整的答案)?
Totor

mount -l | grep 'type nfs' | sed 's/.* on \([^ ]*\) .*/\1/'应该为您提供系统上所有nfs安装点的列表。
安迪·舒尔曼2014年

这可以与stat结合使用:mount | fgrep "`stat --printf=" on %m type" /var/log/`". The mount`命令将以<device> on <mountpoint> type <type>格式打印所有安装点。为此,我已经stat --printf生成了on <mountpoint> type零件。
MSalters

有许多本地和远程文件系统挂载类型。拥有所有这些地图可能是具有挑战性的。(例如drvfs是本地还是远程?)
Erik Aronesty

是的,但是这个问题专门询问了nfs:“挂载远程(nfs)文件系统”
jayhendren

2

不幸的是,没有统一的Unix答案。

您可以针对给定的文件执行以下操作/a/b/c/d

  • / a / b / c /。
  • / a / b / c / ..
  • /a/b/c/../ ..
  • ...

...并stat(2)在每个级别执行一次,直到st_dev更改。然后,您将知道安装点在哪里。然后,您可以在/etc/mtab或输出中mount查找该安装点的规范路径,以查找文件系统类型。然后找出什么是远程的,哪些不是远程的,尤其对于保险丝类型的,将是棘手的。例如,nfscifsfuse.sshfsfuse.davfs是显而易见的,但对于例如fuse.gvfs-fuse-daemon或者fuse.avfsd可以有网络和非网络的文件?


好吧,我在这里使用nfs(编辑了我的问题)。至于stat(2),我认为您正在引用C函数,但我正在使用shell。然而,st_dev指的主要和次要设备ID(是Linux特有的?),和shell命令stat(1)有(非标)%t,并%T--format分别主次编号的选择,它始终返回“0”(本地和NFS )。我尝试了Debian Squeeze和Lenny。
Totor

您是否尝试此--file-system选项?
frostschutz

@frostschutz没有。如果与一起使用,则还有其他含义--file-system
Totor

2

df(1)的“ -l”将在非本地文件系统上失败并显示错误,因此您可以使用此行为来了解文件系统是否为远程:

df -l /path 2> /dev/null | grep -q "File"
rc=$?
if [ "$rc" = "0" ]
then
   echo "local mount, do stuff"
fi

但是,该-l选项不是standard


这不是答案
Totor

@Totor为什么不呢?当然,还有其他各种原因导致df失败的原因,仅此一项就不是一个很好的答案,但是它正在尝试回答这个问题,所以我不明白为什么您会称其为“不是答案”。
terdon

@terdon我同意。我没有仔细阅读。感谢您指出这一点。我将编辑并投票。:)
Totor

从根本上讲,这是唯一在Linux上可靠运行的软件。
Erik Aronesty

1

df /path/path如果安装点不是,它将告诉您这是一个安装点/


1
问题涉及远程安装点。
Totor

1

做就是了

df /me/path/to/folder

如果第一个字段(文件系统)的格式为host:/ path,那么您知道它是NFS


0

您可以df -t在Linux和df -TBSD系统上使用。

来自man df

-t,--type = TYPE

将列表限制为TYPE类型的文件系统

if df -t nfs | grep -q /path/to/folder$; then
  # it is an NFS
fi

挺好的。但是,不幸的是,该-t选项在POSIX / SUS中具有不同的含义。因此,使用此选项可能会在工具/ UNIX上的不同版本中提供不一致的结果。
Totor

-2

我会亲自使用mountpoint(在Linux上非常可移植!):

NAME
       mountpoint - see if a directory is a mountpoint

SYNOPSIS
       mountpoint [-d|-q] directory

showmount几乎需要在任何实际安装NFS共享(nfs-common软件包的一部分)的系统上安装:

NAME
       showmount - show mount information for an NFS server

SYNOPSIS
       showmount [ -adehv ] [ --all ] [ --directories ] [ --exports ] [ --help ] [ --version ] [ host ]

另一种选择是:

$ mount -l -t nfs | grep 'my mount point'

1
mountpoint实用程序不会告诉您安装点是否为远程。此外,远程文件系统不限于NFS文件系统。最后,mountpoint不是标准的(不在此列表中)。
Totor

您特别要求在Linux和NFS上使用工具,mountpoint在这种情况下是标准的。
malat

无论如何,这并不能回答我的第一点。
Totor

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.