2017-02-07 7 views
3

まず最初に、この質問の動機づけを提供するための少しの背景情報:ヘッドレスLinuxサーバ上で実行され、それぞれext4ファイルシステムでフォーマットされた複数のリムーバブル外部ハードドライブ上のファイルを読み書きするプログラムがあります。非常に時々、これらのドライブの1つのファイルシステムのメタデータが何らかの理由で(ext4ジャーナリングにもかかわらず)壊れてしまい、ext4ファイルシステムドライブが問題を検出し、そのパーティションを読み取り専用として再マウントする可能性があります。ドライブはさらに進みます。マウントされたファイルシステムが読み取り専用かどうかを調べるためのLinux C API呼び出しはありますか?

よろしいですか。私が今したいのは、ドライブがこの再マウントされた読み取り専用状態にあることを検出できる機能をプログラムに追加することです。これにより、ドライブが問題になっていることをユーザーにプロアクティブに通知できます。

私の質問は、読み込み専用でマウントされているかどうかを調べるために、ファイルシステムを照会するためのエレガントで/サポートされている方法は何ですか?

ファイルシステムにファイルを書き込もうとすると、他の理由で失敗する可能性があります。また、ファイルシステムに書き込む必要がないため、ファイルシステムに書き込む必要がないためです。

私のプログラムはfopen("/proc/mounts", "r")で、それが生成するテキスト行(私のパーティションに対応する行の "rw"トークンのためのグロッピング)を解析することができます。私はそうしなければなりませんが、 (あまりにもスクリーンスクレイピングに似ていて、テキスト形式が変わっても壊れやすい)。

Linuxシステムコールを軽量で目的に合わせて使用​​すると、特定のファイルシステムマウントポイント(「/ dev/sda1」など)が現在読み取り専用でマウントされているかどうかを知ることができますか? stat()のように見えるかもしれませんが、どうやって見ることができません。

+6

['statvfs()'または 'fstatvfs()'](http://man7.org/linux/man-pages/man3/statvfs.3.html)でもこれを行うPOSIX.1関数があります。 )を任意のファイルに作成します。 '.f_flag&ST_RDONLY'は、読み取り専用でマウントされます。 –

+0

愚かな解決策は、['access()'](https://linux.die.net/man/2/access)を使うことです。 – Stargateur

+1

_サイドノート:_ 'statvfs'のマニュアルページを見ると[as Nominal Animalが提案したように、 'statvfs'の_older_バージョンは'/proc/mounts'を解析してフラグを集めたので注意してください。マニュアルページでは、 'statvfs'がLinuxのシステムコール' statfs'を呼び出してこの情報を取得するようになっています。 –

答えて

3

getmntent() familyは、お客様のニーズを満たす必要があります。

NAME

はgetmntent、setmntent、addmntent、endmntent、hasmntopt、getmntent_r - GETファイルシステム記述ファイルのエントリ

SYNOPSIS

#include <stdio.h> 
    #include <mntent.h> 

    FILE *setmntent(const char *filename, const char *type); 

    struct mntent *getmntent(FILE *stream); 

    int addmntent(FILE *stream, const struct mntent *mnt); 

    int endmntent(FILE *streamp); 

    char *hasmntopt(const struct mntent *mnt, const char *opt); 

    /* GNU extension */ 
    #include <mntent.h> 

    struct mntent *getmntent_r(FILE *streamp, struct mntent *mntbuf, 
           char *buf, int buflen); 

DESCRIPTIONこれらのルーチンは、ファイルシステム記述ファイル /etc/fstabおよびマウントされたファイルシステム記述ファイル/ etc/mtabにアクセスするために使用されます。

setmntent()関数は、ファイルシステム記述ファイル を開き、getmntent()で使用できるファイルポインタを返します。 引数型は必要なアクセスの型であり、同じ の値をfopen(3)のmode引数として取ることができます。

getmntent()関数は、ファイルシステム 記述ファイルの次の行をストリームから読み込み、ファイル内の行から区切られたフィールドを含む構造体 へのポインタを返します。ポインタ は、後で getmntent()を呼び出すことによって上書きされるメモリの静的領域を指します。

addmntent()関数は、オープンストリーム の末尾にmntent構造体mntを追加します。

endmntent()関数は、ファイルシステム記述ファイル に関連付けられたストリームを閉じます。

hasmntopt()関数は、 のmntent構造体mntのmnt_optsフィールド(以下を参照)を走査し、optと一致する部分文字列を探します。有効なマウントオプションについては、 およびmount(8)を参照してください。

リエントラントgetmntent_r()関数は、()はgetmntentと同様であるが、 記憶構造体を提供* mntbufにマウントし が 大きさbuflenのbufに設けられたアレイにその構造体のエントリによって指し示された文字列を格納します。

mntent構造は以下のように定義されています

 struct mntent { 
      char *mnt_fsname; /* name of mounted filesystem */ 
      char *mnt_dir;  /* filesystem path prefix */ 
      char *mnt_type;  /* mount type (see mntent.h) */ 
      char *mnt_opts;  /* mount options (see mntent.h) */ 
      int mnt_freq;  /* dump frequency in days */ 
      int mnt_passno; /* pass number on parallel fsck */ 
     }; 

...

+0

これは/ etc/fstabの内容に関する情報を私に与えてくれるように思えますが、ファイルシステムがディスクエラーのために読み取り専用として再マウントされた場合、マウントされたファイルシステムの現在の状態と必ずしも同じではないかもしれません(?) –

+0

@JeremyFriesner書き込みしようとした以外のディスクエラーのために、ファイルシステムが読み取り専用で再マウントされたかどうかをプログラムで判断する簡単な方法はわかりません。それがあなたが会わなければならない要件であれば、おそらく何とかそれをテストするべきです。運が良ければ、表示されるマウントオプションが変わります。または、別の質問をすることができます。後続の質問 - 誰かがすでに知っているかもしれません。 –

1

最も簡単な方法を書き込み用にオープンされたファイルのファイルシステムは読み取り専用でマウントさとなっていることを確認しますEROFSのエラーのerrno変数をチェックしてください。

ファイルシステムに書き込み可能なディレクトリやファイルが存在しない可能性がある場合は、ファイルシステムが読み取り専用になっているかどうかをポータブルにチェックすることはできません(デバイスエラーのために、

もう1つの方法は、管理者に/proc/mountsファイルを確認してもらうか、または自分で試してみることです。しかし、これはLinux固有のものです。

関連する問題