파일 생성 날짜를 얻을 수있는 Linux 커널 인터페이스가 아직 없습니까?


21

오랫동안 리눅스는 일반적으로 파일 시스템을 지원하지 않았기 때문에 파일 생성 날짜를 신경 쓰지 않았습니다. 그러나 이제는 일반적으로 사용되는 2 개의 파일 시스템 (NTFS 및 ext4)이 레코드 파일 작성 날짜를 기록합니다.

stat명령은, 그러나, 여전히 출력 Birth: -우리가 ext4가가의 사용 날짜를 만들고 파일을 저장하고 볼 수 있습니다 되었더라도 ext4 파일 시스템 debugfs -R 'stat <inode_number>' /dev/file_device.

이것이 왜 그런지 조사했을 때, 다른 누군가가 최근 에 그에 대한 버그 보고서를 제출 한 것을 보았고 , 응답 은 단순히 "현재 해당 정보를 얻을 수있는 Linux 커널 인터페이스가 없다"고 말하는 업스트림 문제로 연결 됩니다. 생산 일자]". 이 분명히 있음을 나에게 놀라운 보인다 여전히 사람들이 그 요청되었습니다 같은 경우, stat디스플레이를 년 동안이 정보를 (그리고 stat출력에게 수행 Birth은 분명히 그들이 기대에 추가나요! 아직 지원하지 않는 경우에도, 필드?)

파일 작성 날짜를 얻기 위해 현재 Linux 커널 인터페이스가없는 것이 사실입니까? 이것을 구현할 계획이 있습니까?


1
일부 배경 은 superuser.com/a/703927/38062 를 참조하십시오 . 그리고 사용할unix.stackexchange.com/a/304245/5132를 즐기 십시오debugfs .
JdeBP

1
예이! Linus가 승인하는 데 단 6 년 :-)
Jez

ZFS또한 파일 작성 시간을 기록하고 확장 된 속성을 통해 파일을 검색 할 수 있습니다.
schily

답변:


15

편집 : 좋은 소식 statx()이 병합되어 릴리스 4.11에서 사용할 수 있습니다.


현재 statx () 인 xstat () 작업은 2016 년에 개정되었습니다.

이 과정은 이번에 조금 더 규율되었습니다 (자전거 흘림, 논란의 여지가있는 속성을 나중에 추가 할 수 있기 때문에 동의하지 않음). 불행히도 여전히 정확한 인터페이스에 대한 반대 의견이 있었으며 더 이상 최근 참조를 보지 못했습니다.


구독 한 링크가없는 기사를 사용할 수 없습니다. 이 이메일인가요? lkml.org/lkml/2017/3/5/149 링크가 있으면 무료입니다.
Jez

@Jez가 수정되었습니다. LWN 링크는 7 일 후에 제공됩니다.
sourcejedi

Xubuntu 17.04에서 git 소스에서 컴파일 된 최신 coreutils (8.27.37-02b65a-dirty)로 커널 4.11.2를 실행하고 있습니다. 통계는 여전히 빈 출생 시간을보고합니다. 뭐가 문제 야?
shrx

4

일반적으로 사용하는 파일 시스템 중 어느 것도 지원하지 않았기 때문에

내가 말할 수있는 것 (여러 링크, 메모리 및 googlage, 여기에 참조로 나열하기에 충분한 응집력이 없음)에서 밑줄을 긋는 시스템이 생성 시간 속성을 지원하지 않았기 때문에 결코 그럴 수 없었습니다. 유용한 기능이라는 데 동의합니다.

http://www.pathname.com/fhs/pub/fhs-2.3.html을 참조 하십시오

POSIX는 3 개의 타임 스탬프를 배치합니다. 그들 중 어느 것도 창조 시간이 아닙니다.

내가 올바르게 기억한다면 논쟁은 다음과 같이 갔다.

> Give me a use case where we can't already do that using what we already have.
< Some examples were submitted
> All of these are convoluted beyond usefulness. 
> Ok, Ok, *maybe* a couple of these don't suck. 
> Now how do you see handling file systems that don't track this?
< several ideas that were not the same. 
< Basically everyone had a special case that would work, but not 
< one that always works. Fight about fallbacks and other special handling. 
> Ok, lets table that for now. What should we call this field
< At least 6 different answers emerged.
> So, you want to break POSIX standards, 
> you can't really come up with a good reason why, 
> you can't come up with a good fall back, and 
> you can't even come up with a name. 
> Sounds like it's specific to the file system to me, and that 
> should be "extended data" accessible by tools and not as 
> a core stat in the Kernel.

이제이 중 많은 부분이 기억과 오래된 메일 링리스트를 읽는 것입니다. 나는 또한 논쟁의 중심에 앉아 있지 않았다. 임베디드 리눅스 시스템의 뚱뚱한 드라이버에서 오프 촬영 작업으로 인해 메일 링리스트에있었습니다. 나는 확실히 더 많은 권위있는 출처가 있기 때문에 내가 관심이있는 것에 대한 나의 기억을 언급합니다.

아무도 좋은 유스 케이스를 만들 수 없다는 사실과, 생성 시간을 지원하지 않는 일반적으로 사용되는 다른 40 개의 파일 시스템에 대해 필드를 처리하는 방법에 대해 아무도 동의 할 수 없다는 사실을 잘 기억하고 있습니다. 심지어 그 분야의 이름을 내놓는 것은 엄청난 논쟁으로 바뀌었다.


2
이를 지원하는 파일 시스템에서의 생성 시간은 항상 확장 된 통계로 액세스 할 수 있음을 명심하십시오 . 확장 된 통계를 얻는 구현은 상당히 다양하므로 ls 또는 find와 같은 도구에는 없습니다. 논증은 ls가 정보를 얻기 위해 파일 시스템의 세부 사항을 알아야한다는 것입니다. 그리고 그것이 ls에 관한 것이 아닙니다.
coteyr

1
debugfs디스크 이미지에서 필드를 읽는 것과 같은 것을 사용하는 것은 많은 인터페이스 가 아니며 어쨌든 특권 액세스가 필요합니다.
ilkkachu

묵시가 고려되기 전에 실제로 이것을 변경할 장소가 POSIX 자체이기 때문에 논쟁이 된 것 같습니다. :)
Jesse Adelman

2

출생 시간은 ext4뿐만 아니라 여러 Linux 기본 파일 시스템에 있습니다.

Linux 커널 버전 4.11 (2017 년 4 월) 부터는이를 검색하기 위한 새로운 statx()시스템 호출 이 있습니다. 그러나, 해당 래퍼 함수가 아직적인 libc GNU에 추가되지 않은 (2018년 6월 26일. 현재로 2019, 편집 , 그리고 GNU와 같은 도구 지금 2.28에서 추가) stat, ls, find(그것을 사용하도록 업데이트되지 않은 2019-08- 22 편집 GNU stat의 glibc 2.28 또는 지원 위의 GNU / Linux 시스템에로 coreutils 8.31부터)

당신은 그것을 할 수있는 perl같은과 생각 :

perl -MPOSIX -e '
  require "syscall.ph";
  $buf = "\0" x 0x100; # enough space for a struct statx
  for (@ARGV) {
    # hardcode: AT_FDCWD == -100
    #           AT_SYMLINK_NOFOLLOW = 0x100 (lstat()-like)
    #           STATX_BTIME = 0x800 for the mask
    #           80: offset of the btime in the struct
    syscall(&SYS_statx, -100, $_, 0x100, 0x800, $buf) == 0
      or die "$_: $!\n";
    ($t, $n) = unpack("x80QQ", $buf);
    $n = sprintf("%09d", $n);
    print strftime("%F %T.$n %z\n", localtime $t)
  }' -- "$file"

syscall.ph이없는 경우 SYS_statx하드 코딩 할 수도 있습니다. amd64 아키텍처에서는 332입니다. 또는 시도하십시오 :

printf '#include <syscall.h>\n__NR_statx\n' | gcc -E -xc - | tail -n 1

이제 그 출생 시간은 거의 유용하지 않습니다. 파일의 데이터 수명이 아니거나 (데이터가 작성된 파일에 데이터가 기록됨 ) 반드시 파일이 디렉토리에 해당 이름으로 표시된 시간 (다른 이름으로 작성되어 이름을 바꾸거나 링크했을 수 있음) 거기에 내용과 속성이 여러 번 변경되었습니다).


Linux가 완전히 지원 한 NFSv4경우 확장 된 속성을 지원해야하며 확장 된 속성에 항목이있을 수 있습니다 crtime. 예를 들어 ls.c파일 생성 시간을 인쇄 하는 Solaris 소스를 확인하십시오 ls -l -% crtime.
schily

@schily, Linux는 확장 속성을 가지고 있으며 Linux와 같은 오픈 소스 OS에서 일반적으로 사용되는 ntfs-3g는 NTFS 생성 시간을 확장 속성으로 실제로 노출하지만 4.11 이후부터는 사용할 수도 있습니다 statx(). statx()Linux에서 아직 인터페이스하는 표준 유틸리티 는 없지만 수십 년 동안 확장 된 속성 검색이 지원되었습니다. 참조 내가 NTFS 논리 볼륨에있는 파일의 생성 날짜를 어떻게합니까?
Stéphane Chazelas

Well Linux 확장 속성은 1997 년에 철회 된 POSIX 초안을 모델링 한 것입니다. NFSv4는 NTFS 파일 스트림을 서브 세트로 지원하고 파일 속성 디렉토리를 통해 액세스 할 수있는 최신 확장 속성 시스템을 정의합니다 openat(fd, ".", O_RDONLY|O_XATTR).
schily

@schily, 여기 ACL과 혼동됩니다. 실제로 Linux는 비공식 패치를 제외하고는 아직 NFSv4 ACL을 지원하지 않지만 확장 속성과는 거의 관련이 없습니다 (ACL이 일반적으로 확장 속성으로 저장되는 경우는 제외). 리눅스는 확장 된 속성을 지원하는데,이 속성은 실제로 POSIX-draft-type ACL과 다른 많은 것들에 사용됩니다. 그리고 이러한 속성을 검색하는 API는 ntfs-3g에서도 crtime을 노출하는 데 사용되며 Solaris와 비슷한 방식으로 가정합니다.
Stéphane Chazelas

@schily, Wikipedia에 잘못된 정보를 추가 한 것 같습니다 . 수정하십시오.
Stéphane Chazelas
당사 사이트를 사용함과 동시에 당사의 쿠키 정책개인정보 보호정책을 읽고 이해하였음을 인정하는 것으로 간주합니다.
Licensed under cc by-sa 3.0 with attribution required.