Bir dosyayı kaydettiğinizde meta veriler nereye gider?


28

Johnny'nin boş bir dosya yaptığını söyle. Denir foobar.py. Johnny idam edilmesine izin verdiğinde kaçar chmod 755 foobar.py. Dosya şimdi meta verisine sahip

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

Tüm bu meta veriler bu dosyada nerede saklanıyor? Dosyanın boyutu 0'dır, başka bir sürücüye aktarıldığında meta verileri nasıl tutar?


1
uzman değilim ama genel cevabım bir sabit diskiniz olduğunda ve 1+ bölümler oluşturduğunuzda, bölümü bir dosya sistemiyle biçimlendirdiğiniz zamanlar olur, örneğin windows ntfs kullanma eğilimindedir ve linux ex2 kullanabilir. bu bölümün büyük kısmı dosya içerikleri içindir, ancak küçük bir kısmı meta veriler dahil diğer şeyler için ayrılmıştır.
barlop

@ barlop esasen doğru. Her iki sistem de dosyaların depolandığı yerleri kaydetmek için biraz boşluk kullanır; NTFS'de "ana dosya tablosu" meta verileri depolar, ext2 + 'da "inodes" içinde.
pjc50

@ pjc50 teşekkürler. ve meta veri bir yana, bölümlerin dışında kalan şeyin adı nedir? Sanırım bir şeyin MBR mi yoksa GPT mi olduğuna bağlı. (Anladığım GPT eski MBR var ama o da tüm bölümleri dışında kendi şey var mı?)
barlop

İlgili: (temelde aynı, ancak soru özellikle Windows ile ilgili) Meta dosya
gronostaj,

2
"chmod 755 ... Dosya şimdi ... -rw-r - r-- ..." meta verisine sahip. -rwxr-xr-x.
JoL,

Yanıtlar:


42

Bu saklı değil de o dosyaya. Dosya sisteminde saklanır ve tüm parametreler tek tek elle kopyalanır (bazıları kopyalanamıyor).

Yani, çoğu işletim sistemi gerçekten "meta veri içeren bir kopya dosyası" çağrısı yapmaz. Dosya kopyalama programı sadece adında yeni bir dosya oluşturur foobar.py, tüm 0 bayt veriyi kopyalar, daha sonra değişiklik zamanının orijinalininkiyle aynı görünmesini sağlamak için utime () veya SetFileTime () kullanır . Benzer şekilde, dosya izinleri chmod () kullanılarak yeniden ayarlanarak veya POSIX ACL özniteliği kopyalanarak "kopyalanır".

Bazı meta veriler kopyalanmadı. Birinin kopyaları başka dosyalar size ait ve işgal yüzden sahipliğini ayarlama, kök ayrıcalıkları gerektirir sizin disk kotasını. Ctime (öznitelik değiştirme zamanı), Unix'lerde manuel olarak ayarlanamaz; btime (doğum / yaratma zamanı) da genellikle kopyalanmaz.

Karşılaştır cp -a foo bar(hangisi meta verileri kopyalar) ve cp foo bar(hangileri yoktur):

$ strace -v cp foo çubuğu
...
açık ("foo", O_RDONLY) = 3
açık ("bar", O_WRONLY | O_TRUNC) = 4
oku (3, "test \ n", 131072) = 5
yaz (4, "test \ n", 5) = 5
oku (3, "", 131072) = 0
yakın (4) = 0
yakın (3) = 0
...
$ strace -v cp - bir foo
...
 - orijinal meta veriler alındı
İstat ("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 + 0.200,816363098,
             st_ctime = 2016-12-28T09: 16: 55 + 0200.816363098}) = 0
 - veri kopyalandı
açık ("foo", O_RDONLY | O_NOFOLLOW) = 3
açık ("bar", O_WRONLY | O_TRUNC) = 4
oku (3, "test \ n", 131072) = 5
yaz (4, "test \ n", 5) = 5
oku (3, "", 131072) = 0
 - değişiklik süresi kopyalandı
utimensat (4, NULL, [{tv_sec = 1482909419, tv_nsec = 879714332},
                    {tv_sec = 1482909415, tv_nsec = 816363098}], 0) = 0
 - mülkiyet kopyalandı (yalnızca 'sudo [strace] cp' ile)
fchown (4, 1000, 1000) = 0
 - genişletilmiş öznitelikler kopyalandı (xdg.origin.url tarayıcılar tarafından ayarlandı, 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'leri yok, bu yüzden st_mode'dan temel bir ACL oluşturuldu
 - (Bu durumda, basit bir fchmod () de işe yarar)
fgetxattr (3, "system.posix_acl_access", 0x7ffc87a50be0, 132) = -1 ENODATA (Veri yok)
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 \ 4 \ 0 \ 4 \ 0 \ 377 \ 377 \ 377 \ 377 \ 0 \ 4 \ 0 \ 377 \ 377 \ 377 \ 377 ", 28, 0) = 0
yakın (4) = 0
yakın (3) = 0
...

3
Bu cevabı tamamlamak için şunu söylemelisiniz: - başka bir sürücüye kopyalarken: meta veriler kaynaktan okunur ve uygun ayarlar (veya seçenekler) ise (örneğin: tarihi koruyun, hakları koruyun, hatta saklayın ") her şey ") (bahsettiğiniz gibi) kullanıldı. 2) Alternatif olarak, önce dosyaları arşivlemek (.zip, .tar, vb.) Yapmak ve hedefte bu arşivden çıkarmak, bir kez daha meta verilerini bulmak için programa bir yer vererek (arşiv biçiminde), ve belirli seçenekler / ayarlar birinin bu meta verileri tutmasına (koymamasına) izin verir.
Olivier Dulac

İkinci paragrafa: Peki ya stat (2)?
kedi

Düşündüğüm bu soruya ayrıntılı bir cevap verdiğin için teşekkür ederim.
juniorRubyist

11

Genellikle dosya sisteminden meta verilerin depolandığı dosya sistemine göre değişir. Dosya sistemlerinin ext2 ailesinde, bahsettiğiniz meta veriler (sahip, grup, izinler, zaman) inode'da saklanır . Inode ayrıca, dosyanın diskte kapladığı blokları da saklar (işaretçiler). İnode yok değil dosya adını depolar.

Bu verilere statsistem çağrısı ( man 2 stat) ile erişebilir ve statyazdırmak için aracı kullanabilirsiniz ( man stat). İnode alanlarının ayrıntılı bir açıklaması linux/include/linux/fs.hçekirdek kaynağında bulunabilir.

Farklı yerlerde depolanan başka tür meta veriler (örneğin, ACL izinleri ) vardır.

Dosyayı kopyaladığınızda meta veriler varsayılan olarak kopyalanmaz. Bunun yerine, varsayılan meta veri değerlerine sahip yeni bir dosya oluşturulur. Eski meta verileri okuyarak ve yeni meta verileri buna göre değiştirerek, meta verileri de kopyalamayı söyleyen cp( -p, --preserve) için çeşitli seçenekler vardır .cpstat


4

Dosya sistemine bağlı olarak, izinler, boyut ve diğerleri gibi meta verileri tutmak için alanlar (yarı) veya statik veya dinamik olarak ayrılmıştır (bazen dosya adı da).

Unix'te, meta veriler, dosyanın bulunduğu veri alanını kontrol eden inode'da saklanır ( dosya adları ve ilgili inode numaraları bir dizin girişinde saklanırken ).

Bazı dosya sistemlerinde, dizin girişleri diğerleri gibi dosyalardır ancak görünümden gizlenmiştir. FAT ve FAT32 böyle bir dosya sistemidir (FAT'in kök dizini olsa da "özel" dir). Bir dosya oluşturduğunuzda, dosyanın bulunduğu klasörü tanımlayan dosyaya bir girdi ekler / düzenlersiniz. Her giriş dosya boyutunu, adını ve tarihini depolayacak kadar büyüktür ve başka hiçbir şey (birden çok giriş içeren uzun isimler; 32 girişin varsayılan giriş boyutu eski 8 + 3 karakter biçiminde tek bir ad tutabilir.) (hafızamın çalıştığını varsayarsak). Ext sistemi benzer, ancak dizin girişi dinamik olarak boyutlandırılmıştır ve yalnızca adı ve inode işaretçisini tutar; diğer tüm bilgiler inode'dadır. Bu şekilde, iki giriş aynı dosyayı gösterebilir ve bu da çift dosyaları yönetmek için kullanışlıdır.

Bazı dosya sistemlerinde, inode'lar meta verilere ek olarak küçük bir miktar veriyi tutacak kadar büyük olabilir, böylece dosya buraya sığabilirse, fazladan disk alanı kaplamaz. 45 bayt bir dosya oluşturun ve boş disk alanı hiç değişmez; bu baytlar inode içinde saklanır . Ext * ailesinin bunu (ve NTFS'yi de) desteklediğini düşünüyorum. Bu, çok sayıda çok küçük dosyayı yönetmeye yardımcı olur.

Yine de diğer dosya sistemlerinde, ana sistem boyunca bir "hayalet" dosya sistemi var ve bu ekstra özellikleri saklıyor. Sadece dosya bilgisi değil, muhtemelen dosya simgeleri de.

Bazı sistemler her ikisine de sahiptir: NTFS, inode benzeri bir biçimde çalışan tam dizin meta verilerine sahiptir ve "ana" dosyadaki herhangi bir şeyi değiştirmeyecek (görünüşte) hiçbir şeyi değiştirmeyen daha fazla bilgi içeren alternatif veri akışları oluşturma imkanı sunar .


2
Dosya adları dosyada saklanmadı, bunlar dizin inode'unun bir parçası. Bu yüzden hard linkler çalışıyor
Sobrique

dosya adları depolandığı hakkında dirkt en ile bu yanıt çatışmalar, i doğru olan acaba
kedi

Üzgünüm, işleri karıştırdım ve @ dirkt de buna hakkı vardı . Cevap düzeltildi.
LSerni,

Bunlar rehberin bir parçası , ancak genellikle müdürün kararının bir parçası değil . FS'ye özgüdür, ancak bir dizini özel bir dosya olarak düşünüyorsanız, içeriği dosya listesidir (adlar ve düğümleri).
Yerçekimi
Sitemizi kullandığınızda şunları okuyup anladığınızı kabul etmiş olursunuz: Çerez Politikası ve Gizlilik Politikası.
Licensed under cc by-sa 3.0 with attribution required.