क्या फ़ाइल निर्माण तिथि प्राप्त करने के लिए अभी भी कोई लिनक्स कर्नेल इंटरफ़ेस नहीं है?


21

एक लंबे समय के लिए, लिनक्स ने फ़ाइल निर्माण की तारीखों से परेशान नहीं किया है क्योंकि फ़ाइल सिस्टम में से कोई भी आमतौर पर उनका उपयोग नहीं करता है। हालाँकि अब, 2 फ़ाइल सिस्टम आमतौर पर इस्तेमाल किया जाता है (NTFS और ext4) दोनों ही रिकॉर्ड फ़ाइल निर्माण की तारीखें हैं।

statआदेश, हालांकि, अभी भी आउटपुट Birth: -एक ext4 फ़ाइल सिस्टम पर है, भले ही हम देख सकते हैं कि ext4 फ़ाइल की तारीख बनाने का उपयोग करके संग्रहीत किया गया है debugfs -R 'stat <inode_number>' /dev/file_device

जब मैंने देखा कि यह क्यों है, मैंने देखा कि किसी और ने हाल ही में इस पर एक बग रिपोर्ट दर्ज की है, और प्रतिक्रिया एक अपस्ट्रीम मुद्दे के माध्यम से लिंक करती है जो बस कहती है "उस जानकारी को प्राप्त करने के लिए वर्तमान में कोई लिनक्स कर्नेल इंटरफ़ेस नहीं है [फ़ाइल रचना तिथि]"। यह मेरे लिए उल्लेखनीय लगता है कि यह स्पष्ट रूप से अभी भी मामला है, जैसा कि लोग statवर्षों से इस जानकारी को प्रदर्शित करने का अनुरोध कर रहे हैं (और statएक Birthक्षेत्र का उत्पादन भी करता है, हालांकि यह स्पष्ट रूप से अभी तक इसका समर्थन नहीं करता है! क्या उन्होंने इसे प्रत्याशा में जोड़ा है?)

तो क्या यह अभी भी सही है कि फ़ाइल निर्माण की तारीख पाने के लिए वर्तमान में कोई लिनक्स कर्नेल इंटरफ़ेस नहीं है? क्या कभी इसे लागू करने की योजना है?


1
कुछ पृष्ठभूमि के लिए देखें superuser.com/a/703927/38062 और जब आप उपयोग कर रहे हों तो unix.stackexchange.com/a/304245/5132 का आनंद लें debugfs
JdeBP

1
वाह! लाइनस के अनुमोदन के लिए केवल 6 साल :-)
Jez

ZFSफ़ाइल निर्माण समय भी रिकॉर्ड करता है और उन्हें विस्तारित विशेषताओं के माध्यम से पुनर्प्राप्त करने की अनुमति देता है।
12

जवाबों:


15

संपादित करें: अच्छी खबर है, statx()विलय कर दिया गया है तो यह 4.11 रिलीज में उपलब्ध होना चाहिए।


xstat () कार्य, वर्तमान में statx (), 2016 में संशोधित किया गया था।

इस बार प्रक्रिया थोड़ी अधिक अनुशासित थी (कम बिकने वाली, विवादास्पद विशेषताओं को छोड़ने के लिए समझौता, क्योंकि उन्हें हमेशा बाद में जोड़ा जा सकता है)। दुर्भाग्य से सटीक इंटरफ़ेस पर अभी भी आपत्तियां थीं और मैंने हाल के संदर्भों को नहीं देखा है।


आपके द्वारा लिंक किया गया लेख बिना सदस्यता के उपलब्ध नहीं है। क्या यह ईमेल है? lkml.org/lkml/2017/3/5/149 यदि इससे लिंक है, तो यह मुफ़्त है।
Jez

@ जज ने तय किया। LWN लिंक 7 दिन बाद उपलब्ध हो जाएगा।
sourcejedi

मैं Xubuntu 17.04 पर कर्नेल 4.11.2 चला रहा हूं जिसमें नवीनतम कोर्यूटिल्स (8.27.37-02b65a- गंदा) गिट स्रोत से संकलित किया गया है। स्टेट अभी भी खाली जन्म समय की रिपोर्ट करता है। क्या गलत है?
shrx

4

क्योंकि फ़ाइल सिस्टमों में से कोई भी यह आमतौर पर उनका इस्तेमाल नहीं करता था

जो मैं बता सकता हूं (क्षमा करें, लिंक, मेमोरी और गोगल का एक गुच्छा, एक संदर्भ के रूप में यहां सूचीबद्ध करने के लिए पर्याप्त सामंजस्य नहीं है), यह कभी नहीं था क्योंकि अंडरलाइनिंग सिस्टम निर्माण समय विशेषताओं का समर्थन नहीं करता था, लेकिन क्योंकि उनमें से कोई भी नहीं कर सकता था सहमत हूं कि यह एक उपयोगी विशेषता थी।

Http://www.pathname.com/fhs/pub/fhs-2.3.html देखें

POSIX तीन टाइम स्टैम्प देता है। उनमें से कोई भी रचना समय नहीं है।

अगर मुझे सही से याद है तो तर्क कुछ इस तरह था:

> 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 को जानकारी प्राप्त करने के लिए फ़ाइल सिस्टम का विवरण जानना होगा और यह नहीं है कि ls क्या है।
coteyr

1
debugfsडिस्क छवि से फ़ील्ड को पढ़ने के लिए कुछ का उपयोग करना इंटरफ़ेस की तरह नहीं है , और इसे वैसे भी विशेषाधिकार प्राप्त करने की आवश्यकता है।
ilkachachu

तर्क की तरह लगता था क्योंकि निहितार्थ से पहले वास्तव में इसे बदलने के लिए जगह पर विचार किया जाना चाहिए POSIX में ही है। :)
जेसी एडेलमैन

2

जन्म का समय कई लिनक्स देशी फ़ाइल सिस्टम में है, न केवल ext4।

लिनक्स कर्नेल के संस्करण 4.11 (अप्रैल 2017) के बाद से, इसे पुनः प्राप्त करने के लिए एक नया statx()सिस्टम कॉल है। हालांकि, इसी आवरण समारोह अभी तक libc जीएनयू को जोड़ा नहीं किया गया है (2018/06/26। के रूप में 2019 संपादित अब 2.28 में जोड़ा), और जीएनयू उपकरण की तरह stat, ls,find इसका इस्तेमाल करने के लिए अद्यतन नहीं किया गया है ( 2019-08- 22 संपादित जीएनयू statglibc 2.28 के साथ या समर्थन से ऊपर जीएनयू / लिनक्स सिस्टम पर यह 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 , तो आप इसे हार्डकोड भी कर सकते हैं। यह 332 amd64 आर्किटेक्चर पर है। या कोशिश करें:

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

अब वह जन्म समय शायद ही उपयोगी हो। यह फ़ाइल में डेटा की उम्र नहीं है (डेटा उनके द्वारा बनाए जाने के बाद फ़ाइलों को लिखा गया है), और न ही आवश्यक रूप से फ़ाइल उस नाम से एक निर्देशिका में दिखाई देती है (यह एक अलग नाम के रूप में बनाया जा सकता है और नाम बदला या जुड़ा हुआ हो सकता है) वहाँ और सामग्री या विशेषताओं को बीच में कई बार बदला गया है)।


यदि लिनक्स ने पूरी तरह से समर्थन किया है NFSv4तो उसे विस्तारित विशेषताओं का समर्थन करने की आवश्यकता होगी और विस्तारित विशेषताओं में एक संभावित प्रविष्टि crtimeहै। उदाहरण के तौर पर सोलारिस ls.cस्रोत की जाँच करें जो फ़ाइल निर्माण समय के साथ प्रिंट करता है ls -l -% crtime
विद्वान

@ सामान्य रूप से, लिनक्स ने विशेषताओं और एनटीएफएस-3 जी को बढ़ाया है जैसा कि आमतौर पर ओपनसोर्स ओएस पर किया जाता है जैसे कि लिनक्स वास्तव में एनटीएफएस निर्माण समय को एक विस्तारित विशेषता के रूप में उजागर करता है, हालांकि 4.11 के बाद से, मुझे उम्मीद है कि यह भी इसके माध्यम से उपलब्ध होगा statx()statx()लिनक्स पर अभी तक कोई मानक उपयोगिता नहीं है, लेकिन विस्तारित विशेषताओं को पुनर्प्राप्त करना दशकों से समर्थित है। देखें कि मुझे NTFS तार्किक वॉल्यूम पर फ़ाइल की निर्माण तिथि कैसे मिलती है?
स्टीफन चेज़लस

अच्छी तरह से लिनक्स विस्तारित विशेषताओं को POSIX ड्राफ्ट के बाद मॉडल किया गया है जो 1997 में वापस ले लिया गया है। NFSv4 एक आधुनिक विस्तारित विशेषता प्रणाली को परिभाषित करता है, जो एनटीएफएस फ़ाइल धाराओं को एक उपसमुच्चय के रूप में समर्थन करने की अनुमति देता है और जिसे फ़ाइल की निर्देशिका के माध्यम से खोला जाता है openat(fd, ".", O_RDONLY|O_XATTR)
शास्त्री

@ सामान्य रूप से, आप यहां ACL के साथ भ्रमित हो रहे हैं। वास्तव में, लिनक्स के पास NFSv4 ACLs के लिए कोई समर्थन नहीं है, सिवाय एक अनौपचारिक पैच के साथ लेकिन विस्तारित विशेषताओं के साथ ऐसा करने के लिए बहुत कम है (सिवाय इसके कि ACL आमतौर पर विस्तारित विशेषताओं के रूप में संग्रहीत किया जाएगा)। लिनक्स विस्तारित विशेषताओं का समर्थन करता है, जो यह वास्तव में उन POSIX-मसौदा-प्रकार ACL के लिए, और कई अन्य चीजों के लिए उपयोग करता है। और उन विशेषताओं को पुनः प्राप्त करने के लिए एपीआई का उपयोग एनटीएफएस-3 जी द्वारा भी किया जाता है ताकि क्राइम को उजागर किया जा सके, मुझे लगता है कि सोलारिस पर भी इसी तरह से।
स्टीफन चेज़लस

@ सामान्य रूप से, ऐसा लगता है कि आपने उस पर विकिपीडिया को गलत जानकारी दी है । कृपया ठीक करें।
स्टीफन चेज़लस
हमारी साइट का प्रयोग करके, आप स्वीकार करते हैं कि आपने हमारी Cookie Policy और निजता नीति को पढ़ और समझा लिया है।
Licensed under cc by-sa 3.0 with attribution required.