ข้อมูลเมตาจะไปที่ไหนเมื่อคุณบันทึกไฟล์


28

Say Johnny สร้างไฟล์เปล่า ๆ foobar.pyมันถูกเรียกว่า chmod 755 foobar.pyเมื่อจอห์นนี่ช่วยให้สามารถดำเนินการเขาวิ่ง ไฟล์นี้มีข้อมูลเมตาของ

-rw-r--r-- 1 johnny staff    0 Dec 27 22:53 foobar.py

ข้อมูลเมตาทั้งหมดที่เก็บไว้ในไฟล์นั้นอยู่ที่ไหน ขนาดของไฟล์คือ 0 ดังนั้นมันจะเก็บข้อมูลเมตาเมื่อมันถูกโอนไปยังไดรฟ์อื่นได้อย่างไร


1
ฉันไม่มีผู้เชี่ยวชาญ แต่ฉันเดาคำตอบทั่วไปคือเมื่อคุณมีฮาร์ดดิสก์และคุณสร้างพาร์ติชัน 1+ จากนั้นคุณจัดรูปแบบพาร์ติชันด้วยระบบไฟล์เช่น windows มีแนวโน้มที่จะใช้ ntfs และ linux อาจใช้ ex2 แล้ว กลุ่มของพาร์ติชันนั้นมีไว้สำหรับเนื้อหาของไฟล์ แต่มีบางส่วนที่สงวนไว้สำหรับสิ่งอื่น ๆ รวมถึงข้อมูลเมตา
barlop

@barlop ถูกต้องเป็นหลัก ทั้งสองระบบใช้พื้นที่ในการบันทึกที่จัดเก็บไฟล์ ใน NTFS "ตารางไฟล์หลัก" จะเก็บข้อมูลเมตาใน ext2 + จะอยู่ใน "inodes"
pjc50

@ pjc50 ขอบคุณ และเมตาดาต้ากันชื่อของสิ่งที่อยู่นอกพาร์ทิชันคืออะไร? ฉันคิดว่ามันขึ้นอยู่กับว่าสิ่งที่เป็น MBR หรือ GPT .. ใน MBR สิ่งที่เรียกว่า MBR .. สิ่งที่เรียกว่าใน GPT? (ผมเข้าใจ GPT มีมรดก MBR แต่ไม่ได้มีสิ่งของตัวเองเกินไปด้านนอกของพาร์ติชันทั้งหมด?)
barlop

ที่เกี่ยวข้อง: (โดยทั่วไปคือสิ่งเดียวกัน แต่คำถามเกี่ยวกับ Windows โดยเฉพาะ) ข้อมูลเมตาของไฟล์ถูกเก็บไว้ใน Windows อย่างไร
gronostaj

2
"chmod 755 ... ไฟล์นี้มีข้อมูลเมตาของ ... -rw-r - r-- ... " คุณหมายถึง -rwxr-xr-x
JoL

คำตอบ:


42

มันไม่ได้เก็บไว้ในไฟล์นั้น มันถูกเก็บไว้ในระบบไฟล์และพารามิเตอร์ทั้งหมดจะถูกคัดลอกด้วยตนเองแบบหนึ่งต่อหนึ่ง (แม้ว่าบางอันจะไม่สามารถคัดลอกได้เลย)

นั่นคือระบบปฏิบัติการส่วนใหญ่ไม่มีการเรียก "คัดลอกไฟล์พร้อมเมทาดาทา" จริงๆ โปรแกรมคัดลอกไฟล์เพิ่งสร้างไฟล์ใหม่ชื่อfoobar.pyคัดลอกทั้ง 0 ไบต์ของข้อมูลจากนั้นใช้utime ()หรือSetFileTime ()เพื่อทำให้เวลาในการแก้ไขดูเหมือนกับของเดิม ในทำนองเดียวกันการอนุญาตไฟล์จะถูก "คัดลอก" โดยการตั้งค่าใหม่โดยใช้ chmod () หรือโดยการคัดลอกแอตทริบิวต์ POSIX ACL

ข้อมูลเมตาบางส่วนไม่ถูกคัดลอก การตั้งค่าความเป็นเจ้าของต้องใช้สิทธิ์ root ดังนั้นสำเนาของคนอื่นเป็นไฟล์ที่เป็นของคุณและครอบครองของคุณโควต้าดิสก์ ctime (เวลาเปลี่ยนคุณลักษณะ) ไม่สามารถตั้งค่าด้วยตนเองบน Unixes โดยทั่วไปจะไม่คัดลอก btime (เวลาเกิด / เวลาสร้าง)

เปรียบเทียบcp -a foo bar(ซึ่งคัดลอกข้อมูลเมตา) และcp foo bar(ซึ่งไม่ได้):

$ strace -v cp foo bar
...
open ("foo", O_RDONLY) = 3
open ("bar", O_WRONLY | O_TRUNC) = 4
read (3, "test \ n", 131072) = 5
เขียน (4, "test \ n", 5) = 5
read (3, "", 131072) = 0
ปิด (4) = 0
ปิด (3) = 0
...
$ strace -v cp -a foo bar
...
 - มีการดึงข้อมูลเมตาดั้งเดิม
lstat ("foo", {st_dev = makedev (254, 0), st_ino = 60569468, st_mode = S_IFREG | 0644,
             st_nlink = 1, st_uid = 1000, st_gid = 1,000, st_blksize = 4096, st_blocks = 8,
             st_size = 5, st_atime = 2016-12-28T09: 16: 59 + 0200.879714332,
             st_mtime = 2016-12-28T09: 16: 55 + 0,200.816363098,
             st_ctime = 2016-12-28T09: 16: 55 + 0200.816363098}) = 0
 - คัดลอกข้อมูล
เปิด ("foo", O_RDONLY | O_NOFOLLOW) = 3
open ("bar", O_WRONLY | O_TRUNC) = 4
read (3, "test \ n", 131072) = 5
เขียน (4, "test \ n", 5) = 5
read (3, "", 131072) = 0
 - เวลาดัดแปลงจะถูกคัดลอก
utimensat (4, NULL, [{tv_sec = 1482909419, tv_nsec = 879714332},
                    {tv_sec = 1482909415, tv_nsec = 816363098}], 0) = 0
 - การคัดลอกความเป็นเจ้าของ (เฉพาะกับ 'sudo [strace] cp')
fchown (4, 1,000, 1,000) = 0
 - แอตทริบิวต์เพิ่มเติมถูกคัดลอก (xdg.origin.url ถูกตั้งค่าโดยเบราว์เซอร์ wget)
flistxattr (3, NULL, 0) = 0
flistxattr (3, "user.xdg.origin.url \ 0", 20) = 20
fgetxattr (3, "user.xdg.origin.url", "https://superuser.com/", 22) = 22
fsetxattr (4, "user.xdg.origin.url", "https://superuser.com/", 22, 0) = 0
 - POSIX ACLs ไม่มีอยู่ดังนั้น ACL พื้นฐานจะถูกสร้างขึ้นจาก st_mode
 - (ในกรณีนี้ fchmod ง่าย ๆ () ก็ใช้ได้เช่นกัน)
fgetxattr (3, "system.posix_acl_access", 0x7ffc87a50be0, 132) = -1 ENODATA (ไม่มีข้อมูล)
fsetxattr (4, "system.posix_acl_access", "\ 2 \ 0 \ 0 \ 0 \ 1 \ 0 \ 6 \ 0 \ 377 \ 377 \ 377 \ 377 \ 377 \ 4 \ 0 \ 377 \ 377 \ 377 \ 377 \ 0 \ 4 \ 0 \ 377 \ 377 \ 377 \ 377 ", 28, 0) = 0
ปิด (4) = 0
ปิด (3) = 0
...

3
เพื่อเติมเต็มคำตอบนี้คุณควรพูดถึง: - เมื่อคัดลอกไปยังไดรฟ์อื่น: เมตาดาต้าจะถูกอ่านจากแหล่งที่มาและทำซ้ำในเป้าหมายหากการตั้งค่าที่เหมาะสม (หรือตัวเลือก) (เช่น: เก็บวันที่รักษาสิทธิ์หรือแม้กระทั่ง " ทุกอย่าง ") ถูกใช้ (ตามที่คุณกล่าวถึง) 2) อีกทางเลือกหนึ่งคือทำการเก็บถาวร (.zip, .tar, ฯลฯ ) ของไฟล์และแยกจากไฟล์เก็บถาวรนี้บนเป้าหมายอีกครั้งให้โปรแกรมบางโปรแกรม (ในรูปแบบไฟล์เก็บถาวร) เพื่อค้นหาข้อมูลเมตา และตัวเลือก / การตั้งค่าเฉพาะทำให้สามารถเก็บเมตาดาต้าเหล่านั้นได้ (หรือไม่)
Olivier Dulac

ถึงย่อหน้าที่สอง: แล้วสถิติ (2) ล่ะ?
แมว

ขอบคุณที่ให้คำตอบโดยละเอียดกับคำถามนี้ที่ฉันได้ไตร่ตรอง
juniorRubyist

11

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

คุณสามารถเข้าถึงข้อมูลนี้ด้วยการstatโทรของระบบ ( man 2 stat) และใช้statเครื่องมือเพื่อพิมพ์ ( man stat) คำอธิบายโดยละเอียดของฟิลด์ inode สามารถพบได้ในlinux/include/linux/fs.hแหล่งเคอร์เนล

มีข้อมูลเมตาประเภทอื่น ๆ (เช่นสิทธิ์ ACL ) ที่จัดเก็บในที่ต่าง ๆ

ข้อมูลเมตาจะไม่ถูกคัดลอกตามค่าเริ่มต้นเมื่อคุณคัดลอกไฟล์ ไฟล์ใหม่ที่มีค่าเมตะดาต้าเริ่มต้นจะถูกสร้างขึ้นแทน มีตัวเลือกต่างๆให้กับcp( -p, --preserve) ซึ่งแนะนำcpให้คัดลอกข้อมูลเมตาด้วยการอ่านข้อมูลเมตาเก่าด้วยstatและแก้ไขข้อมูลเมตาใหม่ตามลำดับ


4

ขึ้นอยู่กับระบบไฟล์พื้นที่ถูกสงวนไว้ (กึ่ง -) แบบคงที่หรือแบบไดนามิกเพื่อเก็บข้อมูลเมตาเช่นการอนุญาตขนาดและอื่น ๆ (บางครั้งชื่อไฟล์ด้วย)

ใน Unix ข้อมูลเมตาจะถูกเก็บไว้ในไอโหนดควบคุมพื้นที่ข้อมูลที่ไฟล์นั้นอยู่ ( ในขณะที่ชื่อไฟล์และหมายเลข inode ที่เกี่ยวข้องจะถูกเก็บไว้ในรายการไดเรกทอรี )

ในรายการไดเร็กทอรีของระบบไฟล์บางไฟล์เป็นไฟล์อื่น ๆ แต่ซ่อนไว้จากมุมมอง FAT และ FAT32 เป็นระบบไฟล์ดังกล่าว (ไดเรกทอรีรากของ FAT คือ "พิเศษ" แม้ว่า) เมื่อคุณสร้างไฟล์คุณจะเพิ่ม / แก้ไขรายการในไฟล์ที่อธิบายถึงโฟลเดอร์ที่ไฟล์นั้นอยู่ แต่ละรายการมีขนาดใหญ่พอที่จะเก็บขนาดไฟล์ชื่อและวันที่และไม่มีอะไรอื่น (ชื่อยาวที่มีหลายรายการขนาดเริ่มต้นที่ 32 ไบต์สามารถเก็บชื่อเดียวในรูปแบบอักขระ 8 + 3 เก่าทั้งหมดนี้แน่นอน สมมติว่าหน่วยความจำของฉันใช้งานได้) ระบบ Ext คล้ายกัน แต่รายการไดเรคทอรี่มีการปรับขนาดแบบไดนามิกและเก็บเฉพาะชื่อและตัวชี้ไอโหนด ข้อมูลอื่น ๆ ทั้งหมดอยู่ในไอโหนด ด้วยวิธีนี้สองรายการอาจชี้ไปที่ไฟล์เดียวกันซึ่งมีประโยชน์ในการจัดการไฟล์ที่ซ้ำกัน

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

ในระบบไฟล์อื่น ๆ ระบบไฟล์มี "phantom" ตามจำนวนหลักที่เก็บแอตทริบิวต์พิเศษเหล่านี้ ข้อมูลไฟล์ไม่เพียงแต่อาจเป็นไอคอนไฟล์เช่นกัน

บางระบบมีทั้งสองอย่าง: NTFS มีข้อมูลเมตาไดเร็กทอรีแบบเต็มทำงานในรูปแบบคล้าย inode และความเป็นไปได้ในการสร้างสตรีมข้อมูลทางเลือกที่เก็บข้อมูลเพิ่มเติมซึ่งไม่ได้เปลี่ยนแปลงอะไรเลยในไฟล์ "main"


2
ชื่อไฟล์จะไม่ถูกจัดเก็บพร้อมไฟล์ซึ่งเป็นส่วนหนึ่งของไดเรกทอรี inode นั่นเป็นเหตุผลว่าทำไมฮาร์ดลิงก์จึงใช้งานได้
Sobrique

คำตอบนี้ขัดแย้งกับ dirkt เกี่ยวกับที่เก็บชื่อไฟล์ฉันสงสัยว่าถูกต้อง
cat

ขอโทษนะฉันผสมขึ้นสิ่งและ@dirkt มีสิทธิของมัน กำลังแก้ไขคำตอบ
LSerni

พวกเขาเป็นส่วนหนึ่งของไดเรกทอรีแต่มักจะไม่ได้เป็นส่วนหนึ่งของ inode ของไดเรกทอรี เป็นไฟล์เฉพาะของ FS แต่ถ้าคุณคิดว่าไดเรกทอรีเป็นไฟล์พิเศษเนื้อหาของมันจะเป็นรายการของไฟล์ (ชื่อและ inodes)
grawity
โดยการใช้ไซต์ของเรา หมายความว่าคุณได้อ่านและทำความเข้าใจนโยบายคุกกี้และนโยบายความเป็นส่วนตัวของเราแล้ว
Licensed under cc by-sa 3.0 with attribution required.