Vẫn không có giao diện nhân Linux để lấy ngày tạo tập tin?


21

Trong một thời gian dài, Linux đã không bận tâm đến ngày tạo tệp vì không có hệ thống tệp nào mà nó thường sử dụng hỗ trợ chúng. Tuy nhiên, hiện nay, cả hai hệ thống tệp thường được sử dụng (NTFS và ext4) đều ghi ngày tạo tệp.

Các statlệnh, tuy nhiên, vẫn còn kết quả đầu ra Birth: -trên một hệ thống tập tin ext4, mặc dù chúng ta có thể thấy ext4 đã lưu trữ các tập tin của tạo ngày sử dụng debugfs -R 'stat <inode_number>' /dev/file_device.

Khi tôi tìm hiểu lý do tại sao, tôi thấy rằng một người khác gần đây đã nộp báo cáo lỗi về nó và phản hồi liên quan đến một vấn đề ngược dòng chỉ đơn giản là "hiện tại không có giao diện nhân Linux để lấy thông tin đó [tệp Ngày thành lập]". Có vẻ đáng chú ý với tôi rằng đây rõ ràng vẫn là trường hợp, vì mọi người đã yêu cầu stathiển thị thông tin này trong nhiều năm (và statcó xuất ra một Birthtrường, mặc dù rõ ràng là nó không hỗ trợ nó! Họ đã thêm nó vào dự đoán chưa?)

Vì vậy, hiện tại vẫn chưa có giao diện nhân Linux để lấy ngày tạo tệp? Có một kế hoạch để thực hiện điều này bao giờ?


1
Xem superuser.com/a/703927/38062 để biết một số nền tảng. Và tận hưởng unix.stackexchange.com/a/304245/5132 khi bạn đang sử dụng debugfs.
JdeBP

1
Yay! Chỉ 6 năm để Linus chấp thuận :-)
Jez

ZFScũng ghi lại thời gian tạo tập tin và cho phép chúng được lấy thông qua các thuộc tính mở rộng.
schily

Câu trả lời:


15

EDIT: Tin tốt, statx()đã được hợp nhất vì vậy nó sẽ có sẵn trong phiên bản 4.11.


công việc xstat (), hiện statx (), đã được sửa đổi vào năm 2016.

Quá trình này có kỷ luật hơn một chút trong lần này (ít đi xe đạp hơn, đồng ý bỏ các thuộc tính gây tranh cãi vì chúng luôn có thể được thêm vào sau này). Thật không may, vẫn có sự phản đối đối với giao diện chính xác và tôi không thấy bất kỳ tài liệu tham khảo nào gần đây.


Bài viết bạn liên kết đến không có sẵn mà không cần đăng ký. Đây có phải là email không? lkml.org/lkml/2017/3/5/149 Nếu liên kết đến đó, nó miễn phí.
Jez

@Jez cố định. Liên kết LWN sẽ có sẵn 7 ngày sau.
sourcejedi

Tôi đang chạy kernel 4.11.2 trên Xubfox 17.04 với coreutils mới nhất (8.27.37-02b65a-bẩn) được biên dịch từ nguồn git. stat vẫn báo cáo thời gian sinh trống. Chuyện gì vậy?
shrx

4

bởi vì không có hệ thống tập tin nào nó thường sử dụng hỗ trợ chúng

Từ những gì tôi có thể nói (xin lỗi rất nhiều liên kết, bộ nhớ và nhân viên, không có gì đủ gắn kết để liệt kê ở đây làm tài liệu tham khảo), không bao giờ vì các hệ thống gạch chân không hỗ trợ các thuộc tính thời gian tạo, nhưng vì không ai trong số chúng có thể đồng ý rằng đó là một tính năng hữu ích.

Xem http://www.pathname.com/fhs/pub/fhs-2.3.html

POSIX đặt ra ba tem thời gian. Không ai trong số họ là thời gian sáng tạo.

Nếu tôi nhớ chính xác, cuộc tranh luận đã diễn ra như sau:

> 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.

Bây giờ rất nhiều trong số này là bộ nhớ và đọc một số danh sách gửi thư cũ. Tôi cũng không thực sự ngồi trung tâm để tranh luận. Tôi đã ở trong một danh sách gửi thư vì một số công việc bị bắn trong một trình điều khiển béo cho một hệ thống nhúng Linux. Tôi đề cập đến điều đó bởi vì chắc chắn có nhiều nguồn có thẩm quyền hơn nên trí nhớ của tôi về một thứ mà tôi chỉ quan tâm.

Tôi nhớ rằng vấn đề lớn là sự kết hợp của thực tế là không ai có thể đưa ra một trường hợp sử dụng tốt, không ai có thể đồng ý về cách xử lý trường cho 40 hệ thống tệp thường được sử dụng khác không hỗ trợ thời gian tạo, và thậm chí đưa ra một tên cho lĩnh vực này đã trở thành một cuộc tranh luận lớn.


2
Hãy nhớ rằng thời gian tạo trong các hệ thống tệp hỗ trợ nó luôn có thể truy cập được dưới dạng chỉ số mở rộng. Chỉ là việc triển khai để có được các số liệu thống kê mở rộng khác nhau khá nhiều, vì vậy không có trong các công cụ như ls hoặc find. Đối số là ls sẽ phải biết chi tiết về hệ thống tập tin để có được thông tin và đó không phải là những gì ls nói về.
coteyr

1
sử dụng một cái gì đó như debugfsđể đọc trường ra khỏi hình ảnh đĩa không phải là nhiều giao diện , và dù sao nó cũng sẽ cần quyền truy cập đặc quyền.
ilkkachu

Có vẻ như các đối số là vì nơi thực sự thay đổi điều này trước khi bắt chước nên được xem xét là trong chính POSIX. :)
Jesse Adelman

2

Thời gian sinh là trong một số hệ thống tệp gốc Linux, không chỉ ext4.

Kể từ phiên bản 4.11 của nhân Linux (tháng 4 năm 2017), có một statx()cuộc gọi hệ thống mới để lấy nó. Tuy nhiên, chức năng wrapper tương ứng chưa được bổ sung vào GNU libc chưa (tính đến 2018/06/26. 2019 chỉnh sửa tại được thêm vào trong 2,28), và các công cụ như GNU stat, ls, findchưa được cập nhật để sử dụng nó ( 2019-08- 22 chỉnh sửa GNU stattrên các hệ thống GNU / Linux với glibc 2.28 trở lên hỗ trợ nó kể từ coreutils 8.31)

Bạn có thể làm điều đó perlmặc dù với một cái gì đó như:

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"

Nếu bạn syscall.phkhông có SYS_statx, bạn cũng có thể mã hóa nó. Đó là 332 trên kiến ​​trúc amd64. Hay là thử:

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

Bây giờ thời gian sinh hiếm khi hữu ích. Đó không phải là tuổi của dữ liệu trong tệp (dữ liệu được ghi vào tệp sau khi chúng được tạo), cũng không nhất thiết là thời gian tệp xuất hiện bởi tên đó trong một thư mục (nó có thể được tạo thành một tên khác và được đổi tên hoặc liên kết ở đó và nội dung hoặc thuộc tính đã được thay đổi nhiều lần ở giữa).


Nếu Linux đã hỗ trợ đầy đủ, NFSv4nó sẽ cần hỗ trợ các thuộc tính mở rộng và có một mục có thể có crtimetrong các thuộc tính mở rộng. Kiểm tra ví dụ ls.cnguồn Solaris in thời gian tạo tệp với ls -l -% crtime.
schily

@schily, Linux đã mở rộng các thuộc tính và ntfs-3g như thường được sử dụng trên các HĐH mã nguồn mở như Linux thực sự phơi bày thời gian tạo NTFS như một thuộc tính mở rộng, mặc dù kể từ 4.11, tôi hy vọng nó cũng có sẵn thông qua statx(). Không có tiện ích tiêu chuẩn nào có giao diện statx()trên Linux, nhưng việc truy xuất các thuộc tính mở rộng đã được hỗ trợ trong nhiều thập kỷ. Xem Làm cách nào để có được ngày tạo của tệp trên ổ đĩa logic NTFS?
Stéphane Chazelas

Các thuộc tính mở rộng của Linux cũng được mô hình hóa sau khi bản nháp POSIX bị rút vào năm 1997. NFSv4 định nghĩa một hệ thống thuộc tính mở rộng hiện đại, cho phép hỗ trợ các luồng tệp NTFS dưới dạng tập hợp con và được truy cập thông qua thư mục thuộc tính của tệp được mở thông qua openat(fd, ".", O_RDONLY|O_XATTR).
schily

@schily, bạn đang nhầm lẫn với ACL ở đây. Thật vậy, Linux chưa hỗ trợ cho các ACL NFSv4 ngoại trừ một bản vá không chính thức nhưng điều đó ít liên quan đến các thuộc tính mở rộng (ngoại trừ các ACL thường được lưu trữ dưới dạng các thuộc tính mở rộng). Linux không hỗ trợ các thuộc tính mở rộng, mà nó thực sự sử dụng cho các ACL kiểu bản nháp POSIX đó và cho một số thứ khác. Và API để truy xuất các thuộc tính đó cũng được ntfs-3g sử dụng để phơi bày thời gian hoạt động, tôi cho rằng theo cách tương tự như trên Solaris.
Stéphane Chazelas

Khi sử dụng trang web của chúng tôi, bạn xác nhận rằng bạn đã đọc và hiểu Chính sách cookieChính sách bảo mật của chúng tôi.
Licensed under cc by-sa 3.0 with attribution required.