파일을 저장할 때 메타 데이터는 어디에 있습니까?


28

Johnny가 EMPTY 파일을 작성한다고 가정하십시오. 이라고 foobar.py합니다. Johnny가 실행을 허용하면 실행됩니다 chmod 755 foobar.py. 이제 파일의 메타 데이터가

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

해당 메타 데이터는 모두 해당 파일에 어디에 저장되어 있습니까? 파일 크기는 0이므로 다른 드라이브로 전송할 때 메타 데이터를 어떻게 유지합니까?


1
나는 전문가가 아니지만 일반적인 대답은 하드 디스크가 있고 1 + 파티션을 만들 때 파일 시스템으로 파티션을 포맷하면 Windows는 ntfs를 사용하는 경향이 있고 Linux는 ex2를 사용할 수 있다는 것입니다. 해당 파티션의 대부분은 파일 내용을위한 것이지만 일부는 메타 데이터를 포함한 다른 것들을 위해 예약되어 있습니다.
barlop

@ barlop은 본질적으로 정확합니다. 두 시스템 모두 파일이 저장된 위치를 기록하는 데 약간의 공간을 사용합니다. NTFS에서 "마스터 파일 테이블"은 메타 데이터를 저장하고 ext2 +는 "inodes"에 있습니다.
pjc50

@ pjc50 감사합니다. 메타 데이터와 별도로, 파티션 외부에있는 것의 이름은 무엇입니까? MBR인지 GPT인지에 달려 있다고 생각합니다. MBR에서는 MBR이라고합니다. GPT에서는 무엇입니까? (GPT에 기존 MBR이 있지만 모든 파티션 외부에 자체 MBR도 있다는 것을 알고 있습니다.)
barlop

관련 : (기본적으로 똑같지 만 질문은 Windows에 관한 것입니다) 파일 메타 데이터는 Windows에 어떻게 저장됩니까?
gronostaj

2
"chmod 755 ... 파일의 메타 데이터는 이제 -rw-r--r-- ..."입니다. -rwxr-xr-x를 의미합니다.
JoL

답변:


42

그것은 저장되지 것 해당 파일. 파일 시스템에 저장되며 모든 매개 변수는 하나씩 수동으로 복사됩니다 (일부는 복사 할 수 없지만).

즉, 대부분의 운영 체제에는 실제로 "메타 데이터가있는 파일 복사"호출이 없습니다. 파일 복사 프로그램은이라는 이름의 새 파일을 만들고 foobar.py전체 0 바이트의 데이터를 복사 한 다음 utime () 또는 SetFileTime () 을 사용하여 수정 시간을 원본과 동일하게 만듭니다. 마찬가지로 chmod ()를 사용하여 새로 설정하거나 POSIX ACL 속성을 복사하여 파일 권한을 "복사"합니다.

일부 메타 데이터는 복사되지 않습니다. 소유권을 설정하려면 루트 권한이 필요하므로 다른 사람의 파일 사본이 귀하의 소유이며 디스크 할당량을 차지 합니다 . ctime (속성 변경 시간)은 Unixes에서 수동으로 설정할 수 없습니다. btime (출생 / 생성 시간)도 대개 복사되지 않습니다.

cp -a foo bar메타 데이터를 복사하는 것과 비교 cp foo bar하지 않는 것을 비교하십시오 .

$ strace -v cp foo 바
…
open ( "foo", O_RDONLY) = 3
open ( "bar", O_WRONLY | O_TRUNC) = 4
읽기 (3, "test \ n", 131072) = 5
쓰기 (4, "test \ n", 5) = 5
읽기 (3, "", 131072) = 0
닫기 (4) = 0
닫기 (3) = 0
…
$ strace -v cp -a foo 바
…
 -원본 메타 데이터가 검색됩니다
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
읽기 (3, "test \ n", 131072) = 5
쓰기 (4, "test \ n", 5) = 5
읽기 (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
닫기 (4) = 0
닫기 (3) = 0
…

3
이 답변을 보완하려면 다음 사항을 언급해야합니다.-다른 드라이브에 복사 할 때 : 메타 데이터가 소스에서 읽혀지고 적절한 설정 (또는 옵션) (예 : 날짜 유지, 권한 유지 또는 " "")가 사용되었습니다. 2) 대안은 먼저 파일의 아카이브 (.zip, .tar 등)를 수행하고 대상에서이 아카이브에서 추출하여 메타 데이터를 찾을 수있는 위치 (아카이브 형식)를 프로그램에 다시 제공하는 것입니다. 특정 옵션 / 설정을 통해 메타 데이터를 유지할 수 있습니다.
Olivier Dulac

두 번째 단락 : stat (2)는 어떻습니까?
cat

제가 생각한이 한 가지 질문에 대한 자세한 답변을 주셔서 감사합니다.
juniorRubyist

11

일반적으로 메타 데이터가 저장된 파일 시스템과 파일 시스템이 다릅니다. 파일 시스템의 ext2 제품군에서 언급 한 메타 데이터 (소유자, 그룹, 권한, 시간)가 inode에 저장됩니다 . 또한 inode는 파일이 디스크에서 차지하는 블록을 저장 (포인터)합니다. inode는 파일 이름을 저장 하지 않습니다 .

stat시스템 호출 ( man 2 stat) 으로이 데이터에 액세스 하고 stat도구를 사용하여 인쇄 할 수 있습니다 ( man stat). inode 필드에 대한 자세한 설명은 linux/include/linux/fs.h커널 소스에서 찾을 수 있습니다 .

다른 곳에 저장된 다른 종류의 메타 데이터 (예 : ACL 권한 )가 있습니다.

파일을 복사 할 때 메타 데이터는 기본적으로 복사되지 않습니다. 대신 기본 메타 데이터 값을 가진 새 파일이 생성됩니다. cp( -p, --preserve) cp에는 이전 메타 데이터를 읽고 stat새 메타 데이터를 적절히 수정하여 메타 데이터를 복사 하도록 지시 하는 다양한 옵션이 있습니다 .


4

파일 시스템에 따라 권한, 크기 및 기타와 같은 메타 데이터를 보유하기 위해 영역이 (반) 정적으로 또는 동적으로 예약됩니다 (때로는 파일 이름도).

Unix에서 메타 데이터는 파일이있는 데이터 영역을 제어 하는 inode에 저장됩니다 ( 파일 이름 및 관련 inode 번호는 디렉토리 항목에 저장 됨 ).

일부 파일 시스템에서 디렉토리 항목은 다른 파일과 유사하지만보기에서 숨겨져 있습니다. FAT와 FAT32는 그러한 파일 시스템입니다 (FAT의 루트 디렉토리는 "특별"). 파일을 만들 때 파일이있는 폴더를 설명하는 항목을 파일에 추가 / 편집합니다. 각 항목은 파일 크기, 이름 및 날짜 및 기타 항목을 저장할 수있을만큼 큽니다 (여러 항목을 차지하는 긴 이름; 기본 항목 크기 32 바이트는 이전 8 + 3 문자 형식의 단일 이름을 보유 할 수 있음). 내 메모리가 작동한다고 가정합니다). Ext 시스템은 비슷하지만 디렉토리 항목의 크기는 동적이며 이름과 inode 포인터 만 보유합니다. 다른 모든 정보는 inode에 있습니다. 이 방법으로 두 항목이 동일한 파일을 가리킬 수 있으며 이는 중복 파일을 관리하는 데 유용합니다.

일부 파일 시스템에서, inode는 메타 데이터와 함께 소량의 데이터를 보유 할 수있을만큼 충분히 클 수 있으므로 파일이 적합 할 경우 추가 디스크 공간을 차지하지 않습니다. 45 바이트 파일을 작성하면 사용 가능한 디스크 공간이 전혀 변경되지 않습니다. 이러한 바이트는 inode 내부 에 저장됩니다 . ext * 제품군이이를 지원한다고 생각합니다 (및 NTFS도). 이를 통해 많은 수의 매우 작은 파일을 관리 할 수 ​​있습니다.

또 다른 파일 시스템에는 이러한 추가 속성을 저장하는 기본 파일 시스템에 "팬텀"파일 시스템이 있습니다. 뿐만 아니라 파일 정보 그러나 가능 파일 아이콘 뿐만 아니라.

NTFS에는 전체 디렉토리 메타 데이터가 inode와 유사한 방식으로 작동 하며 "주"파일의 내용을 변경하지 않는 추가 정보를 보유하는 대체 데이터 스트림 을 생성 할 수 있습니다 .


2
파일 이름은 파일과 함께 저장되지 않으며 디렉토리 inode의 일부입니다. 그래서 하드 링크가 작동하는 이유
Sobrique

이 답변은 파일 이름이 저장된 위치에 대한 dirkt와 충돌합니다. 어느 것이 올바른지 궁금합니다
cat

미안, 나는 것들을 섞어서 @dirkt가 그 권리를 가지고 있습니다. 고정 답변.
LSerni

그들은의 일부가있어 디렉토리 일반적으로,하지만 하지 디렉토리의 아이 노드의 부분. FS 전용이지만 디렉토리를 특수 파일로 생각하면 그 내용 은 파일 목록 (이름과 inode)이됩니다.
grawity
당사 사이트를 사용함과 동시에 당사의 쿠키 정책개인정보 보호정책을 읽고 이해하였음을 인정하는 것으로 간주합니다.
Licensed under cc by-sa 3.0 with attribution required.