ยังไม่มีอินเทอร์เฟซเคอร์เนล Linux เพื่อรับวันที่สร้างไฟล์หรือไม่


21

เป็นเวลานานที่ Linux ไม่ได้ใส่ใจกับวันที่สร้างไฟล์เพราะไม่มีระบบไฟล์ที่ใช้กันทั่วไป อย่างไรก็ตามตอนนี้ระบบไฟล์ 2 ระบบที่ใช้กันทั่วไป (NTFS และ ext4) ทั้งวันที่สร้างไฟล์บันทึก

statคำสั่ง แต่ยังคงเอาท์พุทBirth: -บนระบบไฟล์ ext4 แม้ว่าเราจะเห็น ext4 debugfs -R 'stat <inode_number>' /dev/file_deviceที่ได้เก็บไว้เป็นไฟล์สร้างวันที่ใช้

เมื่อฉันดูสาเหตุของเรื่องนี้ฉันเห็นว่ามีคนอื่นได้ยื่นรายงานข้อผิดพลาดไปแล้วเมื่อเร็ว ๆ นี้และลิงก์การตอบกลับผ่านไปยังปัญหาต้นน้ำที่ระบุว่า "ไม่มี Linux kernel อินเตอร์เฟสในปัจจุบันเพื่อรับข้อมูลนั้น [ไฟล์ วันที่สร้าง]". มันน่าทึ่งสำหรับฉันที่เห็นได้ชัดว่านี่ยังคงเป็นกรณีที่ผู้คนได้รับการร้องขอที่statแสดงข้อมูลนี้มานานหลายปี (และstatเอาท์พุทBirthเขตข้อมูลแม้ว่ามันจะไม่เห็นได้ชัดว่ามันยังไม่สนับสนุน!

ดังนั้นยังคงเป็นความจริงหรือที่ว่าไม่มีเคอร์เนลอินเตอร์เฟส Linux ในปัจจุบันเพื่อรับวันที่สร้างไฟล์ มีแผนที่จะใช้สิ่งนี้ตลอดไปหรือไม่?


1
ดูsuperuser.com/a/703927/38062สำหรับพื้นหลังบางอย่าง และเพลิดเพลินไปกับunix.stackexchange.com/a/304245/5132debugfsเมื่อคุณกำลังใช้
JdeBP

1
เย้! เพียง 6 ปีสำหรับไลนัสเพื่อขออนุมัติ :-)
Jez

ZFSยังบันทึกเวลาการสร้างไฟล์และช่วยให้สามารถดึงข้อมูลได้ผ่านคุณสมบัติเพิ่มเติม
schily

คำตอบ:


15

แก้ไข: ข่าวดีstatx()มีการรวมเข้าด้วยกันดังนั้นจึงควรมีวางจำหน่ายในรุ่น 4.11


xstat () งานปัจจุบัน statx () ได้รับการแก้ไขในปี 2559

กระบวนการนี้มีระเบียบวินัยเพิ่มขึ้นเล็กน้อยในเวลานี้ (น้อยกว่า bikeshedding ข้อตกลงที่จะทิ้งคุณสมบัติการโต้เถียงเนื่องจากพวกเขาสามารถเพิ่มได้ในภายหลัง) น่าเสียดายที่ยังคงมีการคัดค้านอินเทอร์เฟซที่แน่นอนและฉันไม่ได้เห็นการอ้างอิงล่าสุดอีก


บทความที่คุณลิงก์ไปยังไม่พร้อมใช้งานหากไม่มีการสมัครสมาชิก นี่คืออีเมลนี้หรือไม่ lkml.org/lkml/2017/3/5/149 หากเชื่อมโยงกับลิงก์นั้นฟรี
Jez

@Jez แก้ไขแล้ว ลิงค์ LWN จะสามารถใช้งานได้ในอีก 7 วันต่อมา
sourcejedi

ฉันใช้เคอร์เนล 4.11.2 บน Xubuntu 17.04 กับ coreutils ล่าสุด (8.27.37-02b65a- สกปรก) ที่คอมไพล์จากแหล่ง git สถิติยังคงรายงานเวลาเกิดที่ว่างเปล่า เกิดอะไรขึ้น
shrx

4

เนื่องจากไม่มีระบบไฟล์ที่ใช้กันทั่วไปจึงสนับสนุน

จากสิ่งที่ฉันสามารถบอกได้ (ขออภัยกลุ่มลิงก์หน่วยความจำและ googlage ไม่มีอะไรที่เหนียวแน่นพอที่จะแสดงไว้ที่นี่เพื่อเป็นข้อมูลอ้างอิง) มันไม่เคยเกิดขึ้นเพราะระบบที่ขีดเส้นใต้ไม่รองรับคุณสมบัติเวลาในการสร้าง ยอมรับว่ามันเป็นคุณสมบัติที่มีประโยชน์

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

ตอนนี้ส่วนใหญ่เป็นหน่วยความจำและอ่านรายชื่อผู้รับจดหมายเก่า ๆ ฉันไม่ได้นั่งเป็นศูนย์กลางในการโต้แย้งเช่นกัน ฉันอยู่ในรายชื่อผู้รับจดหมายเพราะมีบางคนที่ทำงานแบบปิดในไดรเวอร์อ้วนสำหรับระบบ Linux ที่ฝังอยู่ ฉันพูดถึงว่าเพราะมีแหล่งข้อมูลที่เชื่อถือได้มากกว่าแน่นอนดังนั้นความทรงจำเกี่ยวกับสิ่งที่ฉันสนใจ

ฉันจำได้ว่าเรื่องใหญ่คือการรวมกันของความจริงที่ว่าไม่มีใครสามารถเกิดขึ้นกับกรณีการใช้งานที่ดีไม่มีใครสามารถตกลงเกี่ยวกับวิธีการจัดการสนามสำหรับ 40 ระบบไฟล์ที่ใช้กันทั่วไปอื่น ๆ ที่ไม่สนับสนุนการสร้างเวลา และแม้แต่ชื่อของสนามก็กลายเป็นการถกเถียงกันอย่างมาก


2
โปรดทราบว่าเวลาการสร้างในระบบไฟล์ที่สนับสนุนนั้นสามารถเข้าถึงได้ตลอดเวลาเป็นสถิติเพิ่มเติม เป็นเพียงการนำไปปฏิบัติเพื่อให้ได้สถิติที่เพิ่มขึ้นนั้นแตกต่างกันไปเล็กน้อยดังนั้นจึงไม่มีเครื่องมือเช่น ls หรือ find การโต้แย้งคือ ls จะต้องรู้รายละเอียดของระบบไฟล์เพื่อรับข้อมูลและนั่นไม่ใช่สิ่งที่ ls เกี่ยวข้อง
coteyr

1
การใช้บางอย่างที่ชอบdebugfsอ่านฟิลด์นอกอิมเมจของดิสก์นั้นไม่ได้เป็นอินเทอร์เฟซมากนักและมันก็ต้องการการเข้าถึงแบบพิเศษด้วย
ilkkachu

ดูเหมือนว่าข้อโต้แย้งนั้นเป็นเพราะสถานที่ที่จะเปลี่ยนแปลงสิ่งนี้จริง ๆ ก่อนที่จะมีการพิจารณาเรื่องการฝังตัวอยู่ใน POSIX เอง :)
Jesse Adelman

2

เวลาเกิดอยู่ในหลายระบบไฟล์เนทีฟ Linux, ไม่เพียง แต่ ext4

ตั้งแต่เวอร์ชัน 4.11 ของเคอร์เนล Linux (เมษายน 2017) มีการstatx()เรียกระบบใหม่เพื่อดึงข้อมูล แต่ฟังก์ชั่นเสื้อคลุมที่เกี่ยวข้องยังไม่ได้รับการเพิ่ม GNU libc เลย ( ณ วันที่ 2018/06/26. 2019 แก้ไขในขณะนี้เพิ่มขึ้นใน 2.28) และเครื่องมือเช่น GNU stat, ls, findไม่ได้รับการปรับปรุงเพื่อใช้มัน ( 2019-08- 22 แก้ไข GNU statบนระบบ GNU / Linux ที่มี glibc 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คุณคุณสามารถ hardcode เช่นกัน มันคือ 332 บนสถาปัตยกรรม amd64 หรือลอง:

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

ตอนนี้เวลาเกิดนั้นไม่ค่อยมีประโยชน์ ไม่ใช่อายุของข้อมูลในไฟล์ (ข้อมูลถูกเขียนลงในไฟล์หลังจากที่สร้างขึ้น) และไม่จำเป็นว่าเวลาที่ไฟล์จะปรากฏโดยชื่อนั้นในไดเรกทอรี (อาจถูกสร้างเป็นชื่ออื่นและเปลี่ยนชื่อหรือเชื่อมโยง ที่นั่นและเนื้อหาหรือแอตทริบิวต์มีการเปลี่ยนแปลงหลายครั้งในระหว่าง)


ถ้าลีนุกซ์สนับสนุนอย่างเต็มที่NFSv4มันจะต้องสนับสนุนแอ็ตทริบิวต์ส่วนขยายและมีรายการที่เป็นไปได้crtimeในแอ็ตทริบิวต์ส่วนขยาย ตรวจสอบเช่น Solaris แหล่งที่พิมพ์เวลาการสร้างไฟล์ที่มีls.c ls -l -% crtime
schily

@schily, Linux มีคุณสมบัติการขยายและ NTFS-3G ที่ใช้โดยทั่วไปในระบบปฏิบัติการลินุกซ์ opensource เหมือนไม่แน่นอนเปิดเผยเวลาการสร้าง NTFS เป็นแอตทริบิวต์ขยายแม้ว่าตั้งแต่ 4.11, statx()ฉันคาดหวังก็ยังสามารถใช้ได้ผ่าน ไม่มียูทิลิตี้มาตรฐานที่อินเตอร์เฟสstatx()ยังอยู่บน Linux แต่การดึงคุณสมบัติเพิ่มเติมได้รับการสนับสนุนมานานหลายทศวรรษ ดูฉันจะรับวันที่สร้างไฟล์บนโลจิคัลวอลุ่ม NTFS ได้อย่างไร
Stéphane Chazelas

ดีลินุกซ์ขยายคุณลักษณะที่ได้รับถ่ายแบบร่าง POSIX ที่ได้รับการถอนตัวออกมาในปี 1997 NFSv4 กำหนดระบบแอตทริบิวต์ที่ทันสมัยขยายที่ช่วยให้การสนับสนุน NTFS openat(fd, ".", O_RDONLY|O_XATTR)ลำธารไฟล์เป็นส่วนหนึ่งและที่มีการเข้าถึงผ่านทางไดเรกทอรีแอตทริบิวต์ของไฟล์ที่เปิดผ่าน
schily

@schily คุณกำลังสับสนกับ ACL ที่นี่ อันที่จริง, Linux ยังไม่รองรับ NFSv4 ACLs ยกเว้นด้วย patch ที่ไม่เป็นทางการ แต่มีน้อยที่จะทำกับแอ็ตทริบิวต์ส่วนขยาย (ยกเว้นว่า ACL จะถูกเก็บไว้เป็นคุณสมบัติแบบขยาย) ลีนุกซ์รองรับคุณสมบัติเพิ่มเติม, ซึ่งใช้กับ POSIX-draft-type ACLs, และอีกหลายอย่าง. และ API เพื่อเรียกคืนแอ็ตทริบิวต์เหล่านั้นยังใช้โดย ntfs-3g เพื่อเปิดเผย crtime ฉันคิดว่าคล้ายกันกับ Solaris
Stéphane Chazelas

@schily ดูเหมือนว่าคุณได้เพิ่มข้อมูลที่ผิดไปยัง Wikipedia ไว้แล้ว กรุณาแก้ไข
Stéphane Chazelas
โดยการใช้ไซต์ของเรา หมายความว่าคุณได้อ่านและทำความเข้าใจนโยบายคุกกี้และนโยบายความเป็นส่วนตัวของเราแล้ว
Licensed under cc by-sa 3.0 with attribution required.