Siêu dữ liệu đi đâu khi bạn lưu một tệp?


28

Nói Johnny làm một tập tin EMPTY. Nó được gọi là foobar.py. Khi Johnny cho phép nó được thực thi, anh ta chạy chmod 755 foobar.py. Tệp hiện có siêu dữ liệu của

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

Đâu là tất cả các siêu dữ liệu được lưu trữ trong tập tin đó? Kích thước của tệp là 0, vậy làm thế nào để giữ siêu dữ liệu khi nó được chuyển sang ổ đĩa khác?


1
Tôi không phải là chuyên gia nhưng tôi đoán câu trả lời chung là khi bạn có đĩa cứng và bạn tạo 1+ phân vùng, sau đó bạn định dạng phân vùng bằng hệ thống tệp, ví dụ: windows có xu hướng sử dụng ntfs và linux có thể sử dụng ex2, sau đó phần lớn phân vùng đó dành cho nội dung tệp, nhưng một số lượng nhỏ phân vùng được dành riêng cho các nội dung khác bao gồm siêu dữ liệu.
barlop

@barlop về cơ bản là chính xác. Cả hai hệ thống sử dụng một số không gian để ghi lại nơi lưu trữ tệp; trong NTFS, "bảng tệp chính" lưu trữ siêu dữ liệu, trong ext2 + nó ở dạng "inodes".
pjc50

@ pjc50 cảm ơn. và siêu dữ liệu sang một bên, tên của thứ nằm ngoài phân vùng là gì? Tôi cho rằng nó phụ thuộc vào việc thứ đó là MBR hay GPT .. Trong MBR, thứ được gọi là MBR .. Nó được gọi là gì trong GPT? (Tôi hiểu GPT có MBR kế thừa nhưng nó cũng có thứ riêng của nó, bên ngoài tất cả các phân vùng phải không?)
barlop

Liên quan: (về cơ bản là giống nhau, nhưng câu hỏi cụ thể là về Windows) Siêu dữ liệu tệp được lưu trữ trong Windows như thế nào?
gronostaj

2
"chmod 755 ... Tập tin hiện có siêu dữ liệu của ... -rw-r - r-- ..." ý bạn là -rwxr-xr-x.
JoL

Câu trả lời:


42

Nó không được lưu trong tập tin đó. Nó được lưu trữ trong hệ thống tập tin và tất cả các tham số được sao chép thủ công từng cái một (mặc dù một số không thể được sao chép).

Đó là, hầu hết các hệ điều hành không thực sự có lệnh gọi "sao chép tệp với siêu dữ liệu". Chương trình sao chép tệp chỉ tạo một tệp mới có tên foobar.py, sao chép toàn bộ 0 byte dữ liệu, sau đó sử dụng utime () hoặc SetFileTime () để làm cho thời gian sửa đổi của nó trông giống như thời gian ban đầu. Tương tự, quyền của tệp sẽ được "sao chép" bằng cách đặt lại chúng bằng chmod () hoặc bằng cách sao chép thuộc tính POSIX ACL.

Một số siêu dữ liệu không được sao chép. Đặt quyền sở hữu yêu cầu quyền root, vì vậy các bản sao của tệp của người khác thuộc về bạn và chiếm dung lượng đĩa của bạn . Không thể đặt ctime (thời gian thay đổi thuộc tính) theo cách thủ công trên Unix; btime (thời gian sinh / sáng tạo) thường không được sao chép.

So sánh cp -a foo bar(sao chép siêu dữ liệu) và cp foo bar(không sao chép ):

$ strace -v cp foo thanh
Giáo dục
mở ("foo", O_RDONLY) = 3
mở ("thanh", O_WRONLY | O_TRUNC) = 4
đọc (3, "kiểm tra \ n", 131072) = 5
viết (4, "kiểm tra \ n", 5) = 5
đọc (3, "", 131072) = 0
đóng (4) = 0
đóng (3) = 0
Giáo dục
$ strace -v cp -a thanh foo
Giáo dục
 - siêu dữ liệu gốc được lấy
lstat ("foo", {st_dev = makenev (254, 0), st_ino = 60569468, st_mode = S_IFREG | 0644,
             st_nlink = 1, st_uid = 1000, st_gid = 1000, 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 + 0200.816363098,
             st_ctime = 2016-12-28T09: 16: 55 + 0200.816363098}) = 0
 - dữ liệu được sao chép
mở ("foo", O_RDONLY | O_NOFOLLOW) = 3
mở ("thanh", O_WRONLY | O_TRUNC) = 4
đọc (3, "kiểm tra \ n", 131072) = 5
viết (4, "kiểm tra \ n", 5) = 5
đọc (3, "", 131072) = 0
 - thời gian sửa đổi được sao chép
utplesat (4, NULL, [{tv_sec = 1482909419, tv_nsec = 879714332},
                    {tv_sec = 1482909415, tv_nsec = 816363098}], 0) = 0
 - quyền sở hữu được sao chép (chỉ với 'sudo [strace] cp')
fchown (4, 1000, 1000) = 0
 - các thuộc tính mở rộng được sao chép (xdg.origin.url được đặt bởi trình duyệt, wget)
flistxattr (3, NULL, 0) = 0
flistxattr (3, "người dùng.xdg.origin.url \ 0", 20) = 20
fgetxattr (3, "người dùng.xdg.origin.url", "https://superuser.com/", 22) = 22
fsetxattr (4, "người dùng.xdg.origin.url", "https://superuser.com/", 22, 0) = 0
 - Không có ACL POSIX, vì vậy ACL cơ bản được xây dựng từ st_mode
 - (trong trường hợp này, một fchmod () đơn giản cũng sẽ hoạt động)
fgetxattr (3, "system.poseix_acl_access", 0x7ffc87a50be0, 132) = -1 ENODATA (Không có sẵn dữ liệu)
fsetxattr (4, "system.poseix_acl_access", "\ 2 \ 0 \ 0 \ 0 \ 1 \ 0 \ 6 \ 0 \ 377 \ 377 \ 377 \ 377 \ 4 \ 0 \ 4 \ 0 \ 377 \ 377 \ 377 \ 377 \ 0 \ 4 \ 0 \ 377 \ 377 \ 377 \ 377 ", 28, 0) = 0
đóng (4) = 0
đóng (3) = 0
Giáo dục

3
để bổ sung cho câu trả lời này, bạn nên đề cập: - khi sao chép sang ổ đĩa khác: siêu dữ liệu được đọc từ nguồn và được sao chép trên mục tiêu nếu cài đặt phê duyệt (hoặc tùy chọn) (ví dụ: giữ ngày, giữ quyền hoặc thậm chí giữ " tất cả mọi thứ ") đã được sử dụng (như bạn đã đề cập). 2) Một cách khác là trước tiên thực hiện lưu trữ (.zip, .tar, v.v.) của các tệp và trích xuất từ ​​kho lưu trữ này trên mục tiêu, một lần nữa cung cấp cho chương trình một số vị trí (ở định dạng lưu trữ) để tìm siêu dữ liệu, và các tùy chọn / cài đặt cụ thể cho phép một người giữ (hoặc không) các metadatas đó.
Olivier Dulac

Đến đoạn thứ hai: Thế còn stat (2)?
con mèo

Cảm ơn đã cho tôi một câu trả lời chi tiết cho câu hỏi này tôi đã suy nghĩ về.
juniorRubyist

11

Nó thường khác với hệ thống tập tin đến hệ thống tập tin nơi siêu dữ liệu được lưu trữ. Trên ext2 gia đình của hệ thống tập tin, các siêu dữ liệu mà bạn đề cập (chủ sở hữu, nhóm, điều khoản, thời gian) được lưu trữ trong các inode . Inode cũng lưu trữ (con trỏ tới) các khối tệp chiếm trên đĩa. Inode không lưu tên tệp.

Bạn có thể truy cập dữ liệu này bằng lệnh statgọi hệ thống ( man 2 stat) và sử dụng statcông cụ để in nó ( man stat). Một mô tả chi tiết về các trường inode có thể được tìm thấy trong linux/include/linux/fs.hnguồn kernel.

Có các loại siêu dữ liệu khác (ví dụ: quyền ACL ) được lưu trữ ở những nơi khác nhau.

Siêu dữ liệu không được sao chép theo mặc định khi bạn sao chép tệp. Thay vào đó, một tệp mới với các giá trị siêu dữ liệu mặc định được tạo. Có nhiều tùy chọn khác nhau để cp( -p, --preserve) hướng dẫn cpcũng sao chép siêu dữ liệu, bằng cách đọc siêu dữ liệu cũ statvà sửa đổi siêu dữ liệu mới cho phù hợp.


4

Tùy thuộc vào hệ thống tệp, các khu vực được dành riêng (bán) tĩnh hoặc động để giữ siêu dữ liệu, chẳng hạn như quyền, kích thước và các vùng khác (đôi khi cả tên tệp cũng vậy).

Trong Unix, siêu dữ liệu được lưu trữ trong inode kiểm soát khu vực dữ liệu nơi cư trú của tập tin ( trong khi tên tập tin và số inode có liên quan được lưu trữ trong một entry thư mục ).

Trong một số mục thư mục hệ thống tập tin là các tập tin như bất kỳ khác, nhưng ẩn khỏi xem. FAT và FAT32 là các hệ thống tập tin như vậy (thư mục gốc của FAT là "đặc biệt"). Khi bạn tạo một tệp, bạn thêm / chỉnh sửa một mục trong tệp mô tả thư mục chứa tệp. Mỗi mục đủ lớn để lưu trữ kích thước tệp, tên và ngày, và không có gì khác (tên dài chiếm nhiều mục; kích thước mục nhập mặc định là 32 byte có thể chứa một tên theo định dạng 8 + 3 cũ. , giả sử bộ nhớ của tôi đang làm việc). Hệ thống Ext tương tự, nhưng mục nhập thư mục có kích thước động và chỉ giữ tên và con trỏ inode; tất cả các thông tin khác là trong inode. Bằng cách này, hai mục nhập có thể trỏ đến cùng một tệp, rất hữu ích để quản lý các tệp trùng lặp.

Trong một số hệ thống tệp, các nút có thể đủ lớn để chứa một lượng nhỏ dữ liệu ngoài siêu dữ liệu, do đó, nếu tệp có thể vừa ở đó, nó không chiếm thêm dung lượng đĩa. Bạn tạo một tệp 45 byte và không gian đĩa trống hoàn toàn không thay đổi; những byte được lưu trữ bên trong inode. Tôi nghĩ rằng gia đình ext * hỗ trợ điều này (và cả NTFS nữa). Điều này giúp quản lý số lượng lớn các tệp rất nhỏ.

Trong các hệ thống tệp khác, có những gì tương đương với hệ thống tệp "ảo" dọc theo hệ thống tệp chính, lưu trữ các thuộc tính bổ sung này. Không chỉ thông tin tập tin mà còn có thể là biểu tượng tập tin .

Một số hệ thống có cả hai: NTFS có siêu dữ liệu thư mục đầy đủ hoạt động theo kiểu inode và khả năng tạo các luồng dữ liệu thay thế chứa thông tin khác mà không (dường như) thay đổi bất cứ điều gì trong tệp "chính".


2
Tên tệp không được lưu trữ cùng với tệp, chúng là một phần của thư mục inode. Đó là lý do tại sao các liên kết cứng hoạt động
Sobrique

câu trả lời này mâu thuẫn với dirkt về nơi lưu trữ tên tệp, tôi tự hỏi cái nào đúng
con mèo

Xin lỗi, tôi đã trộn lẫn mọi thứ và @dirkt có quyền của nó . Sửa câu trả lời.
LSerni

Chúng là một phần của thư mục , nhưng thường không phải là một phần của nút của thư mục. Nó đặc trưng cho FS, nhưng nếu bạn nghĩ rằng một thư mục là một tệp đặc biệt, thì nội dung của nó sẽ là danh sách các tệp (tên và các nút của chúng).
grawity
Khi sử dụng trang web của chúng tôi, bạn xác nhận rằng bạn đã đọc và hiểu Chính sách cookieChính sách bảo mật của chúng tôi.
Licensed under cc by-sa 3.0 with attribution required.