Dosya oluşturma tarihini almak için hala Linux çekirdek arayüzü yok mu?


21

Linux uzun süredir dosya oluşturma tarihleriyle uğraşmadı çünkü yaygın olarak kullandığı dosya sistemlerinden hiçbiri onları desteklemiyordu. Ancak şimdi, yaygın olarak kullanılan 2 dosya sistemi (NTFS ve ext4) her ikisi de dosya oluşturma tarihlerini kaydeder.

Ancak statkomut, Birth: -ext4'ün dosyanın oluşturma tarihini kullanarak kaydettiğini görmemize rağmen, bir ext4 dosya sisteminde çıktı veriyor.debugfs -R 'stat <inode_number>' /dev/file_device .

Bunun neden olduğunu araştırdığımda, başkasının yakın zamanda bir hata raporu hazırladığını ve yanıtın , şu anda bu bilgiyi almak için şu anda Linux çekirdeği arayüzü olmadığını belirten bir yukarı akış konusuna bağlandığını gördüm. oluşturulma tarihi]". İnsanlar bu bilgiyi yıllardır görüntülemeyi talep ettikleri için , bu durum hala görünüşte hala geçerli gibi görünüyor stat(ve statçıktı birBirth görünüşe göre henüz desteklemese bile, alan yapıyorlar mı?) .

Öyleyse, şu anda dosya oluşturma tarihini almak için Linux çekirdek arayüzü olmadığı doğru mudur? Bunu şimdiye kadar uygulamak için bir plan var mı?


1
Bazı arka plan için superuser.com/a/703927/38062 adresine bakın . Ve kullanırken unix.stackexchange.com/a/304245/5132 adresinin keyfini çıkarın debugfs.
JdeBP

1
Yuppi! Linus'un :-) onaylaması için sadece 6 yıl
Jez

ZFSayrıca dosya oluşturma zamanını kaydeder ve genişletilmiş özniteliklerle alınmalarına izin verir.
schily

Yanıtlar:


15

EDIT: İyi haberler statx()birleştirildi, bu yüzden 4.11 sürümünde hazır bulunmalı.


xstat () çalışması, şu anda statx (), 2016 yılında revize edilmiştir.

Süreç bu sefer biraz daha disiplinliydi (daha az bisiklet sürmek, tartışmalı özellikleri düşürmek için her zaman daha sonra eklenebilecekleri şekilde anlaşma). Ne yazık ki, tam arabirime hala itirazlar vardı ve daha yeni referanslar görmedim.


Bağlandığınız makale bir abonelik olmadan kullanılamaz. Bu e-posta mı? lkml.org/lkml/2017/3/5/149 Öyle ise link, ücretsizdir.
Jez,

@Jez düzeltildi. LWN bağlantısı 7 gün sonra açılacaktır.
sourcejedi

Git kaynağından derlenmiş en son coreutils (8.27.37-02b65a-dirty) ile Xubuntu 17.04'te 4.11.2 çekirdeği kullanıyorum. stat hala boş doğum saatlerini rapor ediyor. Sorun nedir?
shrx

4

yaygın olarak kullanılan dosya sistemlerinin hiçbiri onları desteklediğinden

Söyleyebileceklerimden (üzgünüm bir sürü bağlantı, bellek ve googlage, burada referans olarak listelenecek kadar uyumlu bir şey yok), hiçbir zaman, altta yatan sistemlerin yaratma zamanı özelliklerini desteklemediği için değildi; yararlı bir özellik olduğuna katılıyorum.

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

POSIX, üç zaman damgası düzenler. Hiçbiri yaratma zamanı değil.

Doğru hatırlıyorsam, argüman şöyle bir şey oldu:

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

Şimdi bunun çoğu hafıza ve bazı eski posta listelerini okumak. Ben de tartışmaların merkezinde oturmadım. Gömülü bir Linux sistemi için yağsız bir sürücüdeki bazı çekimler nedeniyle bir posta listesine girdim. Bundan bahsettiğim için kesinlikle daha yetkili kaynaklar var, çünkü sadece değer verdiğim bir şeyle ilgili hafızam.

Hiç kimsenin iyi bir kullanım davası açamayacağı gerçeğinin bir birleşimi olduğunu hatırlıyorum, hiç kimse yaratma zamanını desteklemeyen diğer 40 yaygın dosya sistemi için bu alanın nasıl ele alınacağına karar veremedi. ve hatta alan için bir isim bulmak bile büyük bir tartışmaya dönüştü.


2
Onu destekleyen dosya sistemlerinde yaratma zamanının her zaman genişletilmiş bir stat olarak erişilebilir olduğunu unutmayın . Bu, genişletilmiş istatistikleri almak için yapılan uygulamaların biraz değişmesi nedeniyle, ls veya find gibi araçlarda yoktur. Argüman şu ki, ls'nin bilgi almak için dosya sisteminin ayrıntılarını bilmek zorunda kalacağı ve bunun ne olduğu hakkında olmadığı.
coteyr

1
debugfsalanını disk görüntüsünden okumak gibi bir şey kullanmak bir arayüzden ibaret değildir ve yine de ayrıcalıklı erişime ihtiyacı olacaktır.
ilkkachu

Argümanlara benziyor gibiydi, çünkü uygulamanın dikkate alınmadan önce bunu gerçekten değiştirebileceği yer POSIX'in kendisindedir. :)
Jesse Adelman

2

Doğum zamanı sadece ext4 değil, birçok Linux yerel dosya sistemindedir.

Linux çekirdeğinin 4.11 sürümünden (Nisan 2017) beri onu almak için yeni bir statx()sistem çağrısı var. Ancak, karşılık gelen sarıcı işlevi henüz libc GNU eklendi edilmemiştir (2018/06/26. İtibarıyla 2019 düzenlemek ve GNU gibi araçlar artık 2.28 eklenen) stat, ls, find(kullanmak güncellenmemiş 2019-08- 22 GNU düzenleme GNU stat/ Linux sistemlerinde glibc 2.28 veya üstü ile çekirdek çekirdeklerden beri bunu destekler 8.31)

Böyle bir perlşey olsa da yapabilirsin :

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"

Eğer syscall.phsahip değilse SYS_statx, onu da kodlayabilirsiniz. Amd64 mimarisinde 332. Veya Dene:

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

Şimdi bu doğum zamanı nadiren kullanışlıdır. Dosyadaki verilerin yaşı (veriler oluşturulduktan sonra dosyalara yazılır ) veya dosyanın bir dizinde bu adla göründüğü zaman (farklı bir ad olarak oluşturulmuş ve yeniden adlandırılmış veya bağlanmış olabilir) orada ve içerik veya öznitelik arasında birkaç kez değiştirildi).


Eğer Linux tam NFSv4olarak destekleseydi, genişletilmiş öznitelikleri desteklemesi gerekir ve genişletilmiş özniteliklerde olası bir giriş crtimevardır. Örneğin, ls.cdosya oluşturma zamanını basan Solaris kaynağını kontrol edin ls -l -% crtime.
schily

@schily, Linux özniteliklerini genişletti ve Linux gibi açık kaynaklı işletim sistemlerinde kullanılan ntfs-3g, aslında NTFS oluşturma süresini uzatılmış bir öznitelik olarak gösterse de, 4.11'den beri de kullanılabilir olmasını beklerdim statx(). statx()Henüz Linux'ta arayüz sağlayan standart bir yardımcı program yoktur ancak genişletilmiş özniteliklerin alınması on yıllardır desteklenmektedir. Bkz Ben NTFS mantıksal birimdeki bir dosyanın oluşturulma tarihi nasıl alabilirim?
Stéphane Chazelas

Well Linux genişletilmiş öznitelikleri, 1997'de çekilen bir POSIX taslağından sonra modellenmiştir. NFSv4, NTFS dosya akışlarını alt küme olarak desteklemeye izin veren ve dosyanın öznitelik dizini aracılığıyla erişilen modern bir genişletilmiş öznitelik sistemi tanımlar openat(fd, ".", O_RDONLY|O_XATTR).
schily

@schily, burada ACL'lerle karıştırıyorsunuz. Aslında, Linux'un resmi olmayan bir düzeltme eki dışında NFSv4 ACL'leri için desteği yoktur, ancak genişletilmiş özniteliklerle ilgisi yoktur (ACL'lerin genel olarak genişletilmiş öznitelikler olarak depolanması dışında). Linux, POSIX-taslak tipi ACL'ler ve gerçekten de başka pek çok şey için kullandığı genişletilmiş özellikleri desteklemektedir. Ve bu öznitelikleri elde etmek için kullanılan API, crtime'yi göstermek için ntfs-3g tarafından da kullanılıyor, sanırım Solaris'teki gibi.
Stéphane Chazelas

@schily, bu konuda Wikipedia'ya yanlış bilgi eklenmiş gibi görünüyorsun . Lütfen düzelt.
Stéphane Chazelas
Sitemizi kullandığınızda şunları okuyup anladığınızı kabul etmiş olursunuz: Çerez Politikası ve Gizlilik Politikası.
Licensed under cc by-sa 3.0 with attribution required.