Di mana metadata pergi ketika Anda menyimpan file?

28

Katakanlah Johnny membuat file KOSONG. Ini disebut foobar.py. Ketika Johnny membiarkannya dieksekusi, ia berlari chmod 755 foobar.py. File sekarang memiliki metadata

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

Di mana semua metadata disimpan dalam file itu? Ukuran file adalah 0, jadi bagaimana cara menjaga metadata ketika ditransfer ke drive lain?

juniorRubyist
sumber
1
Saya bukan ahli tetapi saya kira jawaban umum adalah bahwa ketika Anda memiliki hard disk dan Anda membuat 1+ partisi, maka Anda memformat partisi dengan sistem file, misalnya windows cenderung menggunakan ntfs dan linux mungkin menggunakan ex2, maka sebagian besar partisi itu untuk konten file, tetapi sebagian kecilnya disediakan untuk hal-hal lain termasuk metadata.
barlop
@barlop pada dasarnya benar. Kedua sistem menggunakan beberapa ruang untuk merekam tempat file disimpan; di NTFS "tabel file master" menyimpan metadata, dalam ext2 + itu dalam "inodes".
pjc50
@ pjc50 terima kasih. dan selain metadata, apa nama untuk hal yang ada di luar partisi? Saya kira itu tergantung apakah masalahnya MBR atau GPT .. Dalam MBR hal itu disebut MBR .. Apa namanya dalam GPT? (Saya mengerti GPT memiliki MBR warisan tetapi apakah ia memiliki hal sendiri juga, di luar semua partisi?)
barlop
Terkait: (pada dasarnya hal yang sama, tetapi pertanyaan khusus tentang Windows) Bagaimana metadata file disimpan di Windows?
gronostaj
2
"chmod 755 ... File sekarang memiliki metadata dari ... -rw-r - r-- ..." maksudmu -rwxr-xr-x.
JoL

Jawaban:

42

Itu tidak disimpan dalam file itu. Ini disimpan dalam sistem file, dan semua parameter disalin secara manual satu-per-satu (meskipun beberapa tidak dapat disalin sama sekali).

Artinya, sebagian besar sistem operasi tidak benar-benar memiliki panggilan "salin file dengan metadata". Program file-copy hanya membuat file baru bernama foobar.py, menyalin seluruh 0 byte data, kemudian menggunakan utime () atau SetFileTime () untuk membuat waktu modifikasinya terlihat sama seperti aslinya. Demikian juga, izin file akan "disalin" dengan menetapkannya lagi menggunakan chmod () atau dengan menyalin atribut POSIX ACL.

Beberapa metadata tidak disalin. Mengatur kepemilikan memerlukan hak akses root, sehingga salinan file orang lain milik Anda dan menempati kuota disk Anda . Waktu (atribut perubahan waktu) tidak mungkin untuk diatur secara manual di Unix; btime (waktu kelahiran / penciptaan) biasanya tidak disalin juga.

Bandingkan cp -a foo bar(yang menyalin metadata) dan cp foo bar(yang tidak):

$ strace -v cp foo bar
...
open ("foo", O_RDONLY) = 3
open ("bar", O_WRONLY | O_TRUNC) = 4
baca (3, "test \ n", 131072) = 5
write (4, "test \ n", 5) = 5
baca (3, "", 131072) = 0
tutup (4) = 0
tutup (3) = 0
...
$ strace -v cp -a foo bar
...
 - metadata asli diambil
lstat ("foo", {st_dev = makedev (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
 - data disalin
open ("foo", O_RDONLY | O_NOFOLLOW) = 3
open ("bar", O_WRONLY | O_TRUNC) = 4
baca (3, "test \ n", 131072) = 5
write (4, "test \ n", 5) = 5
baca (3, "", 131072) = 0
 - waktu modifikasi disalin
utimensat (4, NULL, [{tv_sec = 1482909419, tv_nsec = 879714332},
                    {tv_sec = 1482909415, tv_nsec = 816363098}], 0) = 0
 - kepemilikan disalin (hanya dengan 'sudo [strace] cp')
fchown (4, 1000, 1000) = 0
 - atribut diperluas disalin (xdg.origin.url diatur oleh browser, 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 ACL tidak ada, jadi ACL dasar dibangun dari st_mode
 - (dalam hal ini, fchmod sederhana () akan bekerja dengan baik)
fgetxattr (3, "system.posix_acl_access", 0x7ffc87a50be0, 132) = -1 ENODATA (Tidak ada data tersedia)
fsetxattr (4, "system.posix_acl_access", "\ 2 \ 0 \ 0 \ 0 \ 1 \ 0 \ 377 \ 377 \ 377 \ 377 \ 377 \ 4 \ 0 \ 4 \ 0 \ 377 \ 377 \ 377 \ 377 \ 0 \ 4 \ 0 \ 377 \ 377 \ 377 \ 377 ", 28, 0) = 0
tutup (4) = 0
tutup (3) = 0
...
grawity
sumber
3
untuk melengkapi jawaban ini Anda harus menyebutkan: - saat menyalin ke drive lain: metadata dibaca dari sumber, dan direproduksi pada target jika pengaturan yang sesuai (atau opsi) (misalnya: pertahankan tanggal, pertahankan hak, atau bahkan pertahankan " semuanya ") digunakan (seperti yang Anda sebutkan). 2) Alternatifnya adalah pertama-tama melakukan arsip (.zip, .tar, dll) dari file, dan ekstrak dari arsip ini pada target, sekali lagi memberikan program beberapa tempat (dalam format arsip) untuk menemukan metadata, dan opsi / pengaturan khusus memungkinkan seseorang menyimpan (atau tidak) metadata tersebut.
Olivier Dulac
Ke paragraf kedua: Bagaimana dengan stat (2)?
kucing
Terima kasih telah memberikan saya jawaban terperinci untuk satu pertanyaan yang telah saya renungkan.
juniorRubyist
11

Biasanya berbeda dari sistem file ke sistem file tempat metadata disimpan. Pada keluarga ext2 sistem file, metadata yang Anda sebutkan (pemilik, grup, izin, waktu) disimpan dalam inode . Inode juga menyimpan (pointer ke) blok file yang ditempati pada disk. Inode tidak menyimpan nama file.

Anda dapat mengakses data ini dengan statsystem call ( man 2 stat), dan menggunakan statalat ini untuk mencetaknya ( man stat). Deskripsi terperinci dari bidang inode dapat ditemukan di linux/include/linux/fs.hdalam sumber kernel.

Ada jenis metadata lain (misalnya izin ACL ) yang disimpan di tempat yang berbeda.

Metadata tidak disalin secara default saat Anda menyalin file. Sebaliknya, file baru dengan nilai metadata default dibuat. Ada berbagai opsi untuk cp( -p, --preserve) yang menginstruksikan cpjuga menyalin metadata, dengan membaca metadata lama dengan statdan memodifikasi metadata baru yang sesuai.

dirkt
sumber
4

Bergantung pada sistem file, area dicadangkan baik (semi-) statis atau dinamis untuk menyimpan metadata seperti izin, ukuran, dan lainnya (kadang-kadang nama file juga).

Di Unix, metadata disimpan di inode yang mengendalikan area data tempat file berada ( sementara nama file dan nomor inode terkait disimpan dalam entri direktori ).

Dalam beberapa direktori, entri direktori adalah file seperti yang lainnya, tetapi tersembunyi dari pandangan. FAT dan FAT32 adalah filesystem tersebut (direktori root FAT adalah "spesial"). Saat Anda membuat file, Anda menambahkan / mengedit entri dalam file yang menjelaskan folder tempat file itu berada. Setiap entri cukup besar untuk menyimpan ukuran file, nama dan tanggal, dan tidak ada yang lain (nama panjang yang menempati beberapa entri; ukuran entri default 32 byte dapat menampung satu nama dalam format karakter 8 + 3. lama. Semua ini, tentu saja , dengan asumsi ingatanku berfungsi). Sistem ext mirip, tetapi entri direktori berukuran dinamis dan hanya menyimpan nama dan penunjuk inode; semua informasi lain ada di inode. Dengan cara ini, dua entri dapat menunjuk ke file yang sama, yang berguna untuk mengelola file duplikat.

Dalam beberapa sistem file, inode bisa cukup besar untuk menampung sejumlah kecil data selain metadata, sehingga jika file tersebut dapat masuk ke sana, ia tidak menempati ruang disk tambahan. Anda membuat file 45-byte dan ruang disk kosong tidak berubah sama sekali; byte tersebut disimpan di dalam inode. Saya pikir keluarga ext * mendukung ini (dan NTFS juga). Ini membantu mengelola sejumlah besar file yang sangat kecil.

Dalam sistem file lain, ada apa yang berarti sistem file "phantom" di sepanjang yang utama, yang menyimpan atribut tambahan ini. Bukan hanya informasi file tetapi mungkin file ikon juga.

Beberapa sistem memiliki keduanya: NTFS memiliki metadata direktori lengkap yang bekerja dengan cara seperti inode, dan kemungkinan untuk membuat aliran data alternatif yang menyimpan informasi lebih lanjut yang tidak (tampaknya) mengubah apa pun dalam file "utama".

LSerni
sumber
2
Nama file tidak disimpan dengan file, itu bagian dari inode direktori. Itu sebabnya tautan keras berfungsi
Sobrique
jawaban ini bertentangan dengan dirkt tentang di mana nama file disimpan, saya ingin tahu mana yang benar
cat
Maaf, saya mencampuradukkan banyak hal, dan @dirkt berhak melakukannya . Memperbaiki jawaban.
LSerni
Mereka adalah bagian dari direktori , tetapi biasanya bukan bagian dari inode direktori. Ini khusus FS, tetapi jika Anda menganggap direktori sebagai file khusus, maka isinya akan menjadi daftar file (nama dan inode mereka).
grawity