Itu tidak disimpan di berkas itu. Itu disimpan dalam sistem file, dan semua parameter disalin secara manual satu per satu (walaupun beberapa tidak dapat disalin sama sekali).
Artinya, sebagian besar sistem operasi tidak benar-benar memiliki panggilan "salin file dengan metadata". Program salin file baru saja membuat file baru bernama foobar.py
, salin seluruh 0 byte data, lalu gunakan utime() atau SetFileTime() agar waktu modifikasinya terlihat sama dengan waktu aslinya. Demikian pula, izin file akan "disalin" dengan menyetelnya lagi menggunakan chmod() atau dengan menyalin atribut POSIX ACL.
Beberapa metadata tidak disalin. Menetapkan kepemilikan memerlukan hak akses root, jadi salinan file orang lain menjadi milik Anda dan menempati milik Anda kuota disk. Waktu (waktu perubahan atribut) tidak mungkin diatur secara manual di Unix; btime (waktu lahir/pembuatan) biasanya juga tidak disalin.
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 read(3, "test\n", 131072) = 5 write(4, "test\n", 5) = 5 read(3, "", 131072) = 0 close(4) = 0 close(3) = 0 …
$ strace -v cp -a foo bar … -- original metadata is retrieved 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 is copied open("foo", O_RDONLY|O_NOFOLLOW) = 3 open("bar", O_WRONLY|O_TRUNC) = 4 read(3, "test\n", 131072) = 5 write(4, "test\n", 5) = 5 read(3, "", 131072) = 0 -- modifiction time is copied utimensat(4, NULL, [{tv_sec=1482909419, tv_nsec=879714332}, {tv_sec=1482909415, tv_nsec=816363098}], 0) = 0 -- ownership is copied (only with 'sudo [strace] cp') fchown(4, 1000, 1000) = 0 -- extended attributes are copied (xdg.origin.url is set by browsers, 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 are not present, so a basic ACL is built from st_mode -- (in this case, a simple fchmod() would work as well) fgetxattr(3, "system.posix_acl_access", 0x7ffc87a50be0, 132) = -1 ENODATA (No data available) fsetxattr(4, "system.posix_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 close(4) = 0 close(3) = 0 …
Ini umumnya berbeda dari sistem file ke sistem file tempat metadata disimpan. Pada keluarga sistem file ext2, metadata yang Anda sebutkan (pemilik, grup, izin, waktu) disimpan di inode. Inode juga menyimpan (menunjuk ke) blok yang ditempati file pada disk. Inode tidak menyimpan nama file.
Anda dapat mengakses data ini dengan stat
panggilan sistem (man 2 stat
), dan gunakan stat
alat untuk mencetaknya (man stat
). Penjelasan rinci tentang bidang inode dapat ditemukan di linux/include/linux/fs.h
di sumber kernel.
Ada jenis metadata lain (mis. izin ACL) yang disimpan di tempat 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 cp
untuk juga menyalin metadata, dengan membaca metadata lama dengan stat
dan memodifikasi metadata baru yang sesuai.
Bergantung pada sistem file, area dicadangkan (semi-)statis atau dinamis untuk menampung metadata seperti izin, ukuran, dan lainnya (terkadang juga nama file).
Di Unix, metadata disimpan di inode mengontrol area data tempat file berada (sementara nama file dan nomor inode terkait disimpan dalam entri direktori).
Dalam beberapa entri direktori sistem file adalah file seperti yang lain, tetapi tersembunyi dari tampilan. FAT dan FAT32 adalah sistem file semacam itu (direktori root FAT adalah "khusus"). Saat Anda membuat file, Anda menambahkan/mengedit entri dalam file yang menjelaskan folder tempat file berada. Setiap entri cukup besar untuk menyimpan ukuran file, nama dan tanggal, dan tidak ada yang lain (nama panjang yang menempati banyak entri; ukuran entri default 32 byte dapat menampung satu nama dalam format karakter 8+3 yang lama. Semua ini, tentu saja , dengan asumsi ingatan saya berfungsi). Sistem ext serupa, tetapi entri direktori berukuran dinamis dan hanya menyimpan nama dan penunjuk inode; semua informasi lainnya ada di inode. Dengan cara ini, dua entri mungkin mengarah ke file yang sama, yang berguna untuk mengelola file duplikat.
Di beberapa sistem file, inode bisa cukup besar untuk menampung sejumlah kecil data selain metadata, sehingga jika file bisa muat di sana, 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.
Di sistem file lain, ada sistem file "hantu" di sepanjang sistem file utama, yang menyimpan atribut tambahan ini. Tidak hanya informasi file tetapi mungkin juga ikon file.
Beberapa sistem memiliki keduanya:NTFS memiliki metadata direktori lengkap yang berfungsi seperti inode, dan kemungkinan untuk membuat aliran data alternatif memegang informasi lebih lanjut yang tidak (tampaknya) mengubah apa pun di file "utama".