ファイルを保存するとき、メタデータはどこに行きますか?


28

ジョニーがEMPTYファイルを作成するとします。と呼ばれfoobar.pyます。ジョニーが実行を許可すると、実行しますchmod 755 foobar.py。ファイルには、次のメタデータが含まれています。

-rw-r--r-- 1 johnny staff    0 Dec 27 22:53 foobar.py

そのすべてのメタデータはそのファイルのどこに保存されていますか?ファイルのサイズは0ですが、別のドライブに転送されるときにメタデータをどのように保持しますか?


1
私は専門家ではありませんが、一般的な答えは、ハードディスクがあり、1 +パーティションを作成する場合、ファイルシステムでパーティションをフォーマットすることです。そのパーティションの大部分はファイルのコンテンツ用ですが、一部の少量はメタデータを含む他のもののために予約されています。
barlop

@barlopは本質的に正しいです。どちらのシステムも、ファイルの保存場所を記録するためにいくらかのスペースを使用します。NTFSでは、「マスターファイルテーブル」にメタデータが格納され、ext2 +では「inodes」に格納されます。
pjc50 16

@ pjc50ありがとう。メタデータは別として、パーティション外にあるものの名​​前は何ですか?モノがMBRであるかGPTであるかによって異なります。MBRでは、モノはMBRと呼ばれます。GPTでは何と呼ばれますか?(GPTにはレガシーMBRがあると理解していますが、すべてのパーティション以外にも独自のものがありますか?)
barlop

関連:(基本的に同じことですが、質問は特にWindowsについてです)ファイルメタデータはどのようにWindowsに保存されますか?
グロノスタジ

2
「chmod 755 ...ファイルのメタデータは... -rw-r--r-- ...」になります。つまり、-rwxr-xr-xです。
JOL

回答:


42

そのファイルには保存さません。ファイルシステムに保存され、すべてのパラメーターは手動で1つずつコピーされます(ただし、一部はまったくコピーできません)。

つまり、ほとんどのオペレーティングシステムには、「メタデータ付きファイルのコピー」呼び出しが実際にはありません。ファイルコピープログラムは、という名前の新しいファイルを作成し、foobar.py0バイトのデータ全体をコピーし、utime()またはSetFileTime()を使用して、変更時刻を元の時刻と同じに見せます。同様に、chmod()を使用して新しく設定するか、POSIX ACL属性をコピーすることにより、ファイルのアクセス権を「コピー」します。

一部のメタデータはコピーされません。所有権を設定するにはルート権限が必要なので、他の人のファイルのコピーがあなたのものでありディスククォータを占有します。UNIXでは、ctime(属性変更時間)を手動で設定することはできません。btime(生年月日/作成時間)も通常はコピーされません。

比較cp -a foo bar(メタデータをコピーする)とcp foo bar(しない):

$ strace -v cp foo bar
…
open( "foo"、O_RDONLY)= 3
open( "bar"、O_WRONLY | O_TRUNC)= 4
read(3、 "test \ n"、131072)= 5
write(4、 "test \ n"、5)= 5
read(3、 ""、131072)= 0
close(4)= 0
close(3)= 0
…
$ strace -v cp -a foo bar
…
 -元のメタデータが取得されます
lstat( "foo"、{st_dev = makedev(254、0)、st_ino = 60569468、st_mode = S_IFREG | 0644、
             st_nlink = 1、st_uid = 1000、st_gid = 1000、st_blksize = 4096、st_blocks = 8、
             st_size = 5、st_atime = 2016-12-28T09:16:59 + 0200.879714332、
             st_mtime = 2016-12-28T09:16:55 + 0200.816363098、
             st_ctime = 2016-12-28T09:16:55 + 0200.816363098})= 0
 -データがコピーされます
open( "foo"、O_RDONLY | O_NOFOLLOW)= 3
open( "bar"、O_WRONLY | O_TRUNC)= 4
read(3、 "test \ n"、131072)= 5
write(4、 "test \ n"、5)= 5
read(3、 ""、131072)= 0
 -変更時刻がコピーされます
utimensat(4、NULL、[{tv_sec = 1482909419、tv_nsec = 879714332}、
                    {tv_sec = 1482909415、tv_nsec = 816363098}]、0)= 0
 -所有権がコピーされます( 'sudo [strace] cpのみ)
fchown(4、1000、1000)= 0
 -拡張属性がコピーされます(xdg.origin.urlはブラウザー、wgetによって設定されます)
flistxattr(3、NULL、0)= 0
flistxattr(3、 "user.xdg.origin.url \ 0"、20)= 20
fgetxattr(3、 "user.xdg.origin.url"、 "https://superuser.com/"、22)= 22
fsetxattr(4、 "user.xdg.origin.url"、 "https://superuser.com/"、22、0)= 0
 -POSIX ACLは存在しないため、基本ACLはst_modeから構築されます
 -(この場合、単純なfchmod()も機能します)
fgetxattr(3、 "system.posix_acl_access"、0x7ffc87a50be0、132)= -1 ENODATA(利用可能なデータなし)
fsetxattr(4、 "system.posix_acl_access"、 "\ 2 \ 0 \ 0 \ 0 \ 1 \ 0 \ 6 \ 0 \ 377 \ 377 \ 377 \ 377 \ 4 \ 0 \ 4 \ 0 \ 377 \ 377 \ 377 \ 377 \ 0 \ 4 \ 0 \ 377 \ 377 \ 377 \ 377 "、28、0)= 0
close(4)= 0
close(3)= 0
…

3
この答えを補完するために、あなたは言及する必要があります:-別のドライブにコピーするとき:メタデータはソースから読み込まれ、適切な設定(またはオプション)の場合はターゲットで再現されます(例:日付を保持、権利を保持、または(すべてあなたが言及したように)使用されました。2)別の方法は、最初にファイルのアーカイブ(.zip、.tarなど)を実行し、ターゲット上のこのアーカイブから抽出し、もう一度(アーカイブ形式の)プログラムにメタデータを検索する場所を与えます。特定のオプション/設定により、それらのメタデータを保持する(または保持しない)ことができます。
オリビエデュラック

2番目の段落へ:stat(2)はどうですか?

私が熟考したこの一つの質問に対する詳細な答えをくれてありがとう。
juniorRubyist 16

11

通常、メタデータが保存されるファイルシステムごとに異なります。ファイルシステムのext2ファミリーでは、あなたが言及したメタデータ(所有者、グループ、許可、時間)はinodeに保存されます。また、iノードは、ファイルがディスク上で占有するブロックを格納(ポインター)します。iノードはファイル名を保存しませ

このデータにアクセスするには、statシステムコール(man 2 stat)を使用し、statツールを使用して印刷します(man stat)。iノードフィールドの詳細な説明はlinux/include/linux/fs.h、カーネルソースにあります。

別の場所に保存されている他の種類のメタデータ(ACL許可など)があります。

ファイルをコピーすると、デフォルトではメタデータはコピーされません。代わりに、デフォルトのメタデータ値を持つ新しいファイルが作成されます。cp-p--preserve)にはさまざまなオプションがありcp、古いメタデータを読み取り、statそれに応じて新しいメタデータを変更することにより、メタデータもコピーするよう指示します。


4

ファイルシステムに応じて、領域は(半)静的または動的に予約され、アクセス許可、サイズなどのメタデータ(ファイル名も含む)を保持します。

Unixでは、メタデータはファイルが存在するデータ領域を制御するiノードに格納されます(ファイル名と関連するiノード番号はディレクトリエントリに格納されます)。

一部のファイルシステムでは、ディレクトリエントリは他のファイルと同様ですが、表示されないファイルです。FATとFAT32はそのようなファイルシステムです(FATのルートディレクトリは「特別」ですが)。ファイルを作成するとき、ファイルが存在するフォルダーを記述するエントリをファイルに追加/編集します。各エントリは、ファイルサイズ、名前、日付などを格納するのに十分な大きさです(複数のエントリを占める長い名前。32バイトのデフォルトエントリサイズは、古い8 + 3文字形式の単一の名前を保持できます。 、私の記憶が働いていると仮定します)。Extシステムも同様ですが、ディレクトリエントリのサイズは動的に変更され、名前とiノードポインタのみが保持されます。他のすべての情報はiノードにあります。この方法では、2つのエントリが同じファイルを指す場合があり、重複ファイルを管理するのに役立ちます。

一部のファイルシステムでは、iノードはメタデータに加えて少量のデータを保持するのに十分な大きさであるため、ファイルがそこに収まる場合、余分なディスク領域を占有しません。45バイトのファイルを作成しても、ディスクの空き容量はまったく変化しません。これらのバイトはiノードに保存されます。ext *ファミリーがこれをサポートしている(そしてNTFSも)と思います。これにより、多数の非常に小さなファイルを管理できます。

さらに他のファイルシステムでは、これらの追加の属性を保存する、メインシステムに沿った「ファントム」ファイルシステムに相当するものがあります。ファイル情報だけでなく、アイコンもファイルする可能性があります

一部のシステムには両方があります。NTFSには、inodeのように動作する完全なディレクトリメタデータがあり、「メイン」ファイルの内容を(明らかに)変更しない追加情報を保持する代替データストリームを作成できます。


2
ファイル名はファイルとともに保存されるのではなく、ディレクトリiノードの一部です。だからこそ、ハードリンクの仕事だ
Sobrique

この答えのファイル名が保存されている場所についてdirktさんとの競合、正確である私の不思議

申し訳ありませんが、私は物事を混乱させ、@ dirktにその権利があります。答えを修正します。
LSerni 16

それらはディレクトリの一部ですが、通常はディレクトリのiノードの一部ではありません。FS固有ですが、ディレクトリを特別なファイルと考えると、その内容はファイルのリスト(名前とそのiノード)になります。
荒廃16
弊社のサイトを使用することにより、あなたは弊社のクッキーポリシーおよびプライバシーポリシーを読み、理解したものとみなされます。
Licensed under cc by-sa 3.0 with attribution required.