FAT32パーティション内のファイルのアクセス許可が「ls」コマンドに表示されるのはなぜですか?


40

FAT32ファイルシステムはファイルのアクセス許可をサポートしていないと思いますls -lが、FAT32パーティションで実行するls -lと、ファイルにアクセス許可があることが示されます。

-rw-r--r-- 1 john john 11 Mar 20 15:43 file1.txt
-rw-r--r-- 1 john john 5 Mar 20 15:49 file2.txt

ls -lファイルの許可を表示するのはなぜですか?


良い質問!ようこそ
0xSheepdog

回答:


71

ディスクに保存されているファイルシステムはファイルのアクセス許可を保存しませんが、ファイルシステムドライバーはオペレーティングシステムにそれらを提供する必要があります。これらはUnixファイルシステムの概念の不可欠な部分であり、システムコールインターフェイスにはアクセス許可があることを示す方法がないためです行方不明。

また、ファイルに許可ビットがまったくなかった場合はどうなるのかを検討してください。それは0777、つまりすべてへのアクセスと同じでしょうか。またはと同じ0000、つまり、誰にもアクセスできませんか?しかし、どちらファイルのアクセス許可なので、表示しないのはなぜですか?または、もっと便利なことをして、賢明な許可を設定する方法があります。

そのため、ドライバーはすべてのファイルに同じアクセス許可を偽装します。パーミッションは、ファイルの所有者とグループとともに、マウント時に設定可能です。これらは、mount(8)manページの「fatのマウントオプション」で説明されています

fatのマウントオプション
(注:fatは個別のファイルシステムではなく、msdos、umsdos、vfatファイルシステムの共通部分です。)

uid=valueそしてgid=value
、すべてのファイルの所有者とグループを設定します。(デフォルト:現在のプロセスのUIDおよびGID。)

umask=value
umask(存在しないアクセス許可のビットマスク)を設定します。デフォルトは、現在のプロセスのumaskです。値は8進数で指定されます。

dmask=value
ディレクトリにのみ適用されるumaskを設定します。デフォルトは、現在のプロセスのumaskです。値は8進数で指定されます。

fmask=value
通常のファイルにのみ適用されるumaskを設定します。デフォルトは、現在のプロセスのumaskです。値は8進数で指定されます。

許可はマスクとして提示されるため、最終的な許可はマスクの否定であることに注意してください。fmask=0133アクセス権を持つすべてのファイルにつながる0644、またはrw-r--r--

また、デフォルトはを呼び出しているプロセスから継承されるmount()ためmount、コマンドラインから呼び出すと、シェルumaskが適用されます。


7
そして、それが許可を偽造する理由は、そうでなければls、およびファイル許可を調べた他のプログラム(ファイルを読み取ろうとしているコードだけでも)が組み込まれているすべての異なるファイルシステム組織を処理するロジックを持たなければならないということです
jamesqf

4
@jamesqf、はい、そしてシステムコールインターフェースでさえ、「パーミッションを持たない」オプションはありません。パーミッションは常にそこにあるからです。(それが「統合部分」だと書いたとき、私はそれを考えていました。)したがって、許可も常に存在し、ACLのようなものは、それらを意味のあるものに保つために作成されます。
イルカチュウ

2
私は通常、FATファイルシステム(少なくとも古いドライバーのFAT16)のすべてのファイルに対してモード777を見てきました。
フォレスト

2
umaskマウントオプションに依存する@forest。デフォルト値はmountプロセスのumaskです(この回答にリンクされているmanページを参照)。
ルスラン

ただし、FATに、Unixに正確にマッピングされない場合でも、いくつかのアクセス許可/属性(読み取り専用、非表示、システムなど)保存されます。chmod ugo-wファイルで読み取り専用属性をオンにします。fmask=0133例のようにオプションを使用しても、すべてのファイルに0644権限が付与されるわけではありません。FATが絶対に保存しないのは、各ファイルのuidとgidです。どうか明らかにしてください; 現状の答えは非常に誤解を招くものです。
mosvy

22

ただし、ファイルには権限があります。ユーザーjohnにはRWアクセスがありますが、一部のランダムユーザーには読み取りアクセスのみがあります。これらの許可はファイルシステム自体からではなく、マウントオプション(-o uid / gid / umask)からのものでした。

複数のvfatパーティションを異なるオプションでマウントし、lsを使用してそれらのオプションが何であるかを判断できます。mount --bindを使用して、単一のディレクトリに異なるvfatパーティションからのファイルを含めることもでき、lsは各ファイルに指定されたパーミッションを正しく表示します。


15

lsFAT32については知らず、POSIX open/ readdir/ statシステムコールでカーネルによって公開される仮想ファイルシステム(VFS)インターフェイスについてのみ知っています。

Linuxは、ユーザー/グループ/その他の許可ビットを持たないファイルの概念をサポートしていません。システムコールを行うときにカーネルが入力する必要struct statがあるmode_t st_mode;メンバー(およびuid、gidメンバー)を含むだけです。ls -lstat(2)

これらのフィールドのいずれにも「使用不可」または「適用外」を意味する特別なコードはないため、カーネルのvfatドライバー何かを構成する必要があります。FAT16 / FAT32には読み取り専用フラグがありますが、そうでない場合は所有者/グループはマウントオプションに由来し、umaskも同様です。

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