确定文件系统或分区是通过Bash Script RO还是RW挂载的?


37

有没有一种简单的方法来确定挂载的文件系统是以只读还是读写方式挂载的?我本来只是想用管道传输,mount但我认为可能会有更简单的方法。


1
为此,理想的系统调用是statvfs返回一个标志字段和一个标志,指示只读装载。不幸的是,我不知道要直接执行此操作的shell命令。我会用过的stat -f,但是该命令会显示除标志以外的所有内容。
kasperd '16

2
注意:正如@Travis Campbell在serverfault.com/a/277449/236916的评论中有帮助地解释的那样,mount它并不总是告诉您想要的内容:解释一下,它从读取/etc/mtab,它是数据的缓存版本,并且可能在某些情况下会过时。输入的信息/proc/mounts是您真正想要的。
mwfearnley '16

Answers:


50

如果存在ro文件系统,则此小单行代码会弹出某些内容。

grep "[[:space:]]ro[[:space:],]" /proc/mounts 

假设驱动器中通常没有像CD这样的ro文件系统,那么对于一些基本的监视类型的东西就足够了,并且不需要更改文件系统来查找当前状态。它还不假定您的文件系统类型。如果要将CD保留在记录之外,请将其传送到grep -v iso9660。


1
我不得不使用grep -P "\sro[\s,]" /proc/mountsgrep " ro[ ,]" /proc/mounts
WhiteKnight

3
这比“尝试创建文件”谢谢要好得多。
瓦格纳尔16'Feb

这不是只告诉您用于安装的选项,而不是当前状态吗?例如,将带有选项的条目ext4 rw,noatime,nobarrier,errors=remount-ro,data=ordered 0 0设置为在发生错误时以只读方式重新安装为只读,因此,如果不进行检查,mount您将不知道是否发生了该重新安装,因此实际上是否当前在ro
沃尔夫

那不是我的经验。
flickerfly

3
我今天只有一个。这是ro中的根文件系统,但启动时为rw。 $ grep "\sro[\s,]" /proc/mounts输出:/dev/mapper/root / ext4 ro,relatime,errors=remount-ro,user_xattr,acl,barrier=1,data=ordered 0 0
flickerfly '16

11

旧的问题,但我遇到过它寻求相同的帮助,并且似乎找到了更简单的方法而无需创建文件。

    [ -w /root-rw ] && echo "rw" || echo "ro"
    rw
    [ -w /root-ro ] && echo "rw" || echo "ro"
    ro

当然,root-ro是ro挂载的fs,而root-rw是rw fs。


3
这似乎是在测试文件系统的权限,但不是挂载状态。
罗伯特·卡尔洪

1
是的,但这非常简单,并且可以在某些情况下(例如我的情况)工作。
Yajo 2015年

man dash-w选项- “的文件是不是即使这个测试表明真正的只读文件系统上可写的。” AFAIK这与其他外壳相同。
Graeme

7

如果文件系统已挂载,我将cd到一个临时目录并尝试创建一个文件。如果文件系统未满,则返回码将告诉您文件系统是只读的还是读写的(感谢Willem)。


1
如果仅检查文件系统的安装方式,从安装获取输出就足够了。但是我必须同意,这是一种更详尽的检查方法。在某些情况下,mount可以报告它已读/写,但实际上是只读的。一个常见的示例是设备上的大量SCSI错误,导致该设备通过变为只读状态来保护自己。毫无疑问,创建文件将验证读+写/只读。
Alex

1
这会很整洁:touch afile && { rm afile; echo "read-write"; } || echo "read-only"
格伦·杰克曼

所写的脚本具有竞争条件。我将使用FILE = mktemp -p /filesystem/of/interest/而不是仅使用'afile'来生成文件和文件名。最佳
Rik Schneider

1
这将错误地将整个文件系统报告为只读。
威廉2015年

@David,这似乎是权宜之计,而不是真正的解决方案。
Pacerier

4

我刚遇到这个问题,这些是真正的粘贴...

看看/ proc / mounts-

egrep " ro,|,ro " /proc/mounts 
/dev/sda3 / ext4 ro,seclabel,relatime,barrier=1,data=ordered 0 0    
/dev/sda5 /var ext4 ro,seclabel,relatime,barrier=1,data=ordered 0 0

仅供参考-仅使用mount命令时,这两个分区显示为rw挂载。


2
如果“ ro”是唯一的安装选项,则此方法将不起作用
Willem 2015年

3

根据flickerdfly的回答,受WhiteKnight的评论影响

动态创建一个检测器功能。

eval "function is_readonly () {
          $( grep -P "\sro[\s,]" /proc/mounts | awk '{print "if echo $1 | grep -q \""$2"\"; then return 0;fi"}' )
      return 1;}";    

使用它来确定路径是否在只读fs上

is_readonly /path/to/file/on/read/only/fs && echo "sorry. can't delete that"

并在完成后处理

#dump temp function
unset -f is_readonly;


0

例如,要检查根分区是否处于只读模式:

if [[ ! -z `mount | grep "on / type ext3 (ro,"` ]]
then
   echo "It's in read-only mode"
fi

2
这并不涵盖所有情况。/ sbin / mount将在/ etc / mtab中查找当前已挂载文件系统(及其当前选项)的缓存版本。如果/由于某种原因设法重新安装了ro,则mtab可能未正确更新,因此/可能仍显示为rw。/ proc / mounts应该始终显示正确的值。
特拉维斯·坎贝尔2012年

1
我同意需要使用/ proc / mounts。我认为应该将此测试简化为一个shell函数(因为OP要求这样做,所以要进行重击),以确保所引用的字符串不是其他路径的子字符串。
Skaperen

0

与Antonio相似,您可以使用/ proc / mounts执行相同的操作。使用您自己的驱动器代替sda4。

cat / proc / mounts | grep / dev / sda4 | awk'{print substr($ 4,1,2)}'

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.