Bashスクリプトを使用して、ファイルシステムまたはパーティションがROまたはRWにマウントされているかどうかを判断しますか?


37

マウントされたファイルシステムが読み取り専用または読み取り/書き込みとしてマウントされているかどうかを判断する簡単な方法はありますか?私はただパイプmountすることを考えていましたが、もっと簡単な方法があるかもしれないと思いました。


1
これに対する理想的なシステムコールは、statvfsとりわけ、読み取り専用マウントを示すフラグとともにフラグフィールドを返すものです。残念ながら、これを直接行うためのシェルコマンドは知りません。私はを使用stat -fしていましたが、このコマンドはフラグ以外のすべてを表示します。
カスペルド

2
注:@Travisキャンベルは親切に彼のコメントで説明しているようserverfault.com/a/277449/236916mount言い換えに、それからの読み取り:いつもあなたが望むものを教えてくれていない/etc/mtabデータのキャッシュされたバージョンである、と5月場合によっては時代遅れになります。情報/proc/mountsはあなたが本当に欲しいものです。
mwfearnley

回答:


51

roファイルシステムが存在する場合、この小さなワンライナーは何かをポップアウトします。

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

通常、ドライブにCDのようなroファイルシステムがない場合は、基本的な監視タイプのもので十分であり、現在の状態を見つけるためにファイルシステムを変更する必要はありません。また、ファイルシステムの種類を想定していません。CDをレコードから外したい場合は、grep -v iso9660にパイプします。


1
grep -P "\sro[\s,]" /proc/mountsまたは使用しなければなりませんでしたgrep " ro[ ,]" /proc/mounts
-WhiteKnight

3
これは、「ファイルを作成して作成する」よりもはるかに良い回答です。
Vagnerr

これは、現在の状態ではなく、マウントに使用されたオプションのみを示しているのではありませんか?たとえば、オプションext4 rw,noatime,nobarrier,errors=remount-ro,data=ordered 0 0が指定されたエントリは、エラーが発生した場合に読み取り専用として再マウントするように設定されているため、チェックmountせずに再マウントが発生したかどうかはわかりませんro
ウォルフ

それは私の経験ではありません。
フリッカーフライ

3
今日はちょうど1つありました。これは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
フリッカーフライ

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

以下からman dashのための-wオプション- 「ファイルには、このテストが真を示している場合でも、読み取り専用のファイルシステム上の書き込み可能ではありません。」知る限り、これは他のシェルでも同じです。
グレアム

7

ファイルシステムがマウントされている場合、一時ディレクトリにcdしてファイルを作成しようとします。戻りコードは、ファイルシステムがいっぱいでない場合に、ファイルシステムが読み取り専用か読み取り/書き込みかを示します(Willemに感謝)。


1
ファイルシステムがどのようにマウントされているかを確認するだけであれば、mountから出力を取得するだけで十分です。しかし、私は同意する必要があります、これはチェックするためのより包括的な方法です。mountは、読み取り/書き込みでマウントされていることを報告できますが、実際には読み取り専用です。これの一般的な例は、読み取り専用になることによってデバイスを保護するデバイス上の多数のSCSIエラーです。ファイルを作成すると、間違いなく読み取り+書き込み/読み取り専用が検証されます。
アレックス

1
これはきちんと次のようになりますtouch afile && { rm afile; echo "read-write"; } || echo "read-only"
グレンはジャックマン

書かれているスクリプトレットには競合状態があります。mktemp -p /filesystem/of/interest/'afile'を使用する代わりにFILE =を使用して、ファイルとファイル名を生成します。最高
リックシュナイダー

1
これにより、完全なファイルシステムが読み取り専用として誤って報告されます。
ウィレム

@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

参考-これら2つのパーティションは、mountコマンドを使用するだけでrwとしてマウントされていると表示されます。


2
「ro」が唯一のマウントオプションである場合、これは機能しません。
ウィレム

3

WhiteKnightからのコメントの影響を受けた、flickerdflyの回答に基づく

その場で検出機能を作成します。

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は常に正しい値を表示する必要があります。
トラビスキャンベル

1
/ proc / mountsを使用する必要があることに同意します。このテストは、参照されている文字列が別のパスの部分文字列ではないことを確認するシェル(OPが要求するためbash)関数に還元されるべきだと思います。
スカペレン

0

Antonioと同様に、/ proc / mountsを使用して同じことを行うことができます。sda4の代わりに独自のドライブを使用します。

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

弊社のサイトを使用することにより、あなたは弊社のクッキーポリシーおよびプライバシーポリシーを読み、理解したものとみなされます。
Licensed under cc by-sa 3.0 with attribution required.