Apakah masih ada antarmuka kernel Linux untuk mendapatkan tanggal pembuatan file?


21

Untuk waktu yang lama, Linux tidak peduli dengan tanggal pembuatan file karena tidak ada sistem file yang biasa digunakan mendukungnya. Namun sekarang, 2 sistem file yang umum digunakan (NTFS dan ext4) merekam tanggal pembuatan file.

The statperintah, bagaimanapun, masih output Birth: -pada sistem file ext4, meskipun kita dapat melihat bahwa ext4 telah disimpan file ini membuat tanggal dengan menggunakan debugfs -R 'stat <inode_number>' /dev/file_device.

Ketika saya melihat mengapa hal ini terjadi, saya melihat bahwa orang lain baru-baru ini mengajukan laporan bug tentang hal itu, dan tanggapannya menghubungkan ke masalah hulu yang hanya menyatakan "tidak ada antarmuka kernel Linux saat ini untuk mendapatkan info [file tersebut] tanggal pembuatan] ". Tampaknya luar biasa bagi saya bahwa ini tampaknya masih terjadi, karena orang telah meminta untuk statmenampilkan informasi ini selama bertahun-tahun (dan statapakah menampilkan Birthbidang, meskipun itu tampaknya belum mendukungnya! Apakah mereka menambahkannya sebagai antisipasi?)

Jadi apakah masih benar bahwa tidak ada antarmuka kernel Linux saat ini untuk mendapatkan tanggal pembuatan file? Apakah pernah ada rencana untuk mengimplementasikan ini?


1
Lihat superuser.com/a/703927/38062 untuk beberapa latar belakang. Dan nikmati unix.stackexchange.com/a/304245/5132 saat Anda menggunakan debugfs.
JdeBP

1
Yay! Hanya 6 tahun bagi Linus untuk menyetujui :-)
Jez

ZFSjuga merekam waktu pembuatan file dan memungkinkannya untuk diambil melalui atribut yang diperluas.
schily

Jawaban:


15

EDIT: Kabar baik, statx()telah digabungkan sehingga harus tersedia dalam rilis 4.11.


Pekerjaan xstat (), saat ini statx (), direvisi pada tahun 2016.

Prosesnya sedikit lebih disiplin kali ini (kurang bikeshedding, kesepakatan untuk menghilangkan atribut kontroversial karena mereka selalu dapat ditambahkan kemudian). Sayangnya masih ada keberatan dengan antarmuka yang tepat dan saya belum melihat referensi yang lebih baru.


Artikel yang Anda tautkan tidak tersedia tanpa berlangganan. Apakah ini email ini? lkml.org/lkml/2017/3/5/149 Jika demikian tautkan dengan itu, gratis.
Jez

@ Jo memperbaiki. Tautan LWN akan tersedia 7 hari kemudian.
sourcejedi

Saya menjalankan kernel 4.11.2 pada Xubuntu 17.04 dengan coreutils terbaru (8.27.37-02b65a-dirty) dikompilasi dari sumber git. stat masih melaporkan waktu lahir kosong. Apa yang salah?
shrx

4

karena tidak ada sistem file yang biasa digunakan mendukungnya

Dari apa yang dapat saya katakan (maaf banyak tautan, memori, dan googlage, tidak ada yang cukup kohesif untuk dicantumkan di sini sebagai referensi), itu tidak pernah terjadi karena sistem garis bawah tidak mendukung atribut waktu pembuatan, tetapi karena tidak satupun dari mereka bahkan dapat setuju bahwa itu adalah fitur yang bermanfaat.

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

POSIX menjabarkan tiga prangko waktu. Tak satu pun dari mereka adalah waktu pembuatan.

Jika saya ingat dengan benar, argumennya seperti:

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

Sekarang banyak dari ini adalah memori dan membaca beberapa milis lama. Aku juga tidak terlalu menyukai argumen. Saya berada di milis karena beberapa pekerjaan off-shoot di driver gemuk untuk sistem Linux tertanam. Saya menyebutkan bahwa karena pasti ada sumber yang lebih otoritatif maka ingatan saya tentang sesuatu yang hanya saya pedulikan.

Saya ingat masalah besar adalah kombinasi dari fakta bahwa tidak ada yang bisa datang dengan kasus penggunaan yang baik, tidak ada yang bisa sepakat tentang bagaimana menangani bidang untuk 40 sistem file yang biasa digunakan lainnya yang tidak mendukung waktu pembuatan, dan bahkan muncul dengan nama untuk lapangan berubah menjadi perdebatan besar.


2
Perlu diingat bahwa waktu pembuatan dalam sistem file yang mendukungnya selalu dapat diakses sebagai stat tambahan. Hanya saja implementasi untuk mendapatkan statistik yang diperluas itu sedikit berbeda, jadi tidak ada alat seperti ls atau find. Alasannya adalah bahwa ls harus mengetahui rincian sistem file untuk mendapatkan info dan bukan itu yang dimaksud dengan ls.
coteyr

1
menggunakan sesuatu seperti debugfsmembaca bidang dari disk image tidak banyak antarmuka , dan itu akan memerlukan akses istimewa.
ilkkachu

Sepertinya argumen itu karena tempat untuk benar-benar mengubah ini sebelum hukuman harus dipertimbangkan adalah dalam POSIX itu sendiri. :)
Jesse Adelman

2

Waktu kelahiran dalam beberapa sistem file asli Linux, tidak hanya ext4.

Sejak versi 4.11 dari kernel Linux (April 2017), ada statx()panggilan sistem baru untuk mengambilnya. Namun, fungsi pembungkus yang sesuai belum ditambahkan ke GNU libc belum (sebagai dari 2018/06/26. 2019 mengedit sekarang ditambahkan di 2,28), dan alat-alat seperti GNU stat, ls, findbelum diperbarui untuk menggunakannya ( 2019-08- 22 edit GNU statpada sistem GNU / Linux dengan glibc 2.28 atau lebih tinggi mendukungnya sejak coreutils 8.31)

Anda bisa melakukannya perldengan sesuatu seperti:

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"

Jika Anda syscall.phtidak memilikinya SYS_statx, Anda dapat meng-hardcode-nya juga. Ini 332 pada arsitektur amd64. Atau coba:

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

Sekarang waktu kelahiran jarang berguna. Ini bukan usia data dalam file (data ditulis ke file setelah mereka dibuat), juga tidak perlu waktu file muncul dengan nama itu di direktori (itu bisa dibuat sebagai nama yang berbeda dan diganti nama atau ditautkan di sana dan konten atau atribut telah diubah beberapa kali di antaranya).


Jika Linux benar-benar mendukungnya, NFSv4ia perlu mendukung atribut yang diperluas dan ada kemungkinan entri crtimedalam atribut yang diperluas. Periksa misalnya ls.csumber Solaris yang mencetak waktu pembuatan file ls -l -% crtime.
schily

@schily, Linux telah menambah atribut dan ntfs-3g seperti yang biasanya digunakan pada OS opensource seperti Linux memang mengekspos waktu pembuatan NTFS sebagai atribut tambahan, meskipun sejak 4.11, saya berharap itu juga tersedia melalui statx(). Tidak ada utilitas standar yang antarmuka untuk statx()di Linux, tetapi mengambil atribut yang diperluas telah didukung selama beberapa dekade. Lihat Bagaimana cara mendapatkan tanggal pembuatan file pada volume logis NTFS?
Stéphane Chazelas

Atribut extended Linux dimodelkan setelah konsep POSIX yang telah ditarik pada tahun 1997. NFSv4 mendefinisikan sistem atribut diperluas modern, yang memungkinkan untuk mendukung stream file NTFS sebagai subset dan yang diakses melalui direktori atribut file yang dibuka melalui openat(fd, ".", O_RDONLY|O_XATTR).
schily

@ mungkin, Anda bingung dengan ACL di sini. Memang, Linux tidak memiliki dukungan untuk NFSv4 ACL namun kecuali dengan tambalan tidak resmi tetapi itu tidak ada hubungannya dengan atribut tambahan (kecuali bahwa ACL biasanya akan disimpan sebagai atribut diperluas). Linux memang mendukung atribut yang diperluas, yang memang digunakan untuk ACL tipe POSIX, dan untuk sejumlah hal lainnya. Dan API untuk mengambil atribut tersebut juga digunakan oleh ntfs-3g untuk mengekspos crtime, saya kira dengan cara yang sama seperti pada Solaris.
Stéphane Chazelas

Dengan menggunakan situs kami, Anda mengakui telah membaca dan memahami Kebijakan Cookie dan Kebijakan Privasi kami.
Licensed under cc by-sa 3.0 with attribution required.