Gdzie idą metadane podczas zapisywania pliku?

28

Powiedz, że Johnny tworzy PUSTY plik. To się nazywa foobar.py. Kiedy Johnny pozwala na wykonanie, biegnie chmod 755 foobar.py. Plik ma teraz metadane

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

Gdzie są przechowywane wszystkie metadane w tym pliku? Rozmiar pliku wynosi 0, więc jak zachowuje metadane, gdy jest przenoszony na inny dysk?

juniorRubyist
źródło
1
Nie jestem ekspertem, ale myślę, że ogólna odpowiedź brzmi: jeśli masz dysk twardy i tworzysz partycje 1+, to formatujesz partycję za pomocą systemu plików, np. Windows zwykle używa NTFS, a Linux może używać ex2, a następnie większość tej partycji przeznaczona jest na zawartość pliku, ale niewielka jej część jest zarezerwowana na inne rzeczy, w tym metadane.
barlop
@barlop zasadniczo poprawny. Oba systemy wykorzystują trochę miejsca do nagrywania, w którym przechowywane są pliki; w NTFS „główna tabela plików” przechowuje metadane, w ext2 + jest w „i-węzłach”.
pjc50,
@ pjc50 dzięki. pomijając metadane, jak nazywa się to, co znajduje się poza partycjami? Przypuszczam, że zależy to od tego, czy chodzi o MBR, czy GPT. W MBR rzecz nazywa się MBR .. Jak to się nazywa w GPT? (Rozumiem, że GPT ma
starszą wersję
Powiązane: (zasadniczo to samo, ale pytanie dotyczy konkretnie systemu Windows) Jak metadane plików są przechowywane w systemie Windows?
gronostaj
2
„chmod 755 ... Plik ma teraz metadane ... -rw-r - r-- ...” masz na myśli -rwxr-xr-x.
JoL

Odpowiedzi:

42

Nie jest przechowywany w tym pliku. Jest przechowywany w systemie plików, a wszystkie parametry są kopiowane ręcznie jeden po drugim (choć niektórych nie można w ogóle skopiować).

Oznacza to, że większość systemów operacyjnych tak naprawdę nie ma wywołania „kopiuj plik z metadanymi”. Program do kopiowania plików po prostu tworzy nowy plik o nazwie foobar.py, kopiuje całe 0 bajtów danych, a następnie używa utime () lub SetFileTime (), aby czas modyfikacji wyglądał tak samo jak oryginał. Podobnie uprawnienia do plików byłyby „kopiowane” przez ich ponowne ustawienie za pomocą chmod () lub przez skopiowanie atrybutu POSIX ACL.

Niektóre metadane nie są kopiowane. Ustawienie własności wymaga uprawnień roota, więc kopie plików innych osób należą do ciebie i zajmują miejsce na dysku. Czas ctime (czas zmiany atrybutu) jest niemożliwy do ręcznego ustawienia na Uniksach; btime (czas urodzenia / utworzenia) zwykle również nie jest kopiowany.

Porównaj cp -a foo bar(które kopie metadanych) icp foo bar (które nie):

$ 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
odczyt (3, „”, 131072) = 0
close (4) = 0
close (3) = 0
…
$ strace -v cp -a pasek foo
…
 - pobierane są oryginalne metadane
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
 - dane są kopiowane
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
odczyt (3, „”, 131072) = 0
 - czas modyfikacji jest kopiowany
utimensat (4, NULL, [{tv_sec = 1482909419, tv_nsec = 879714332},
                    {tv_sec = 1482909415, tv_nsec = 816363098}], 0) = 0
 - własność jest kopiowana (tylko z „sudo [strace] cp”)
fchown (4, 1000, 1000) = 0
 - kopiowane są rozszerzone atrybuty (xdg.origin.url jest ustawiany przez przeglądarki, 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
 - Listy ACL POSIX nie są obecne, więc podstawowa lista ACL jest budowana z trybu st_mode
 - (w tym przypadku działałaby również prosta fchmod ())
fgetxattr (3, "system.posix_acl_access", 0x7ffc87a50be0, 132) = -1 ENODATA (Brak danych)
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
…
grawitacja
źródło
3
w celu uzupełnienia tej odpowiedzi należy wspomnieć: - podczas kopiowania na inny dysk: metadane są odczytywane ze źródła i odtwarzane na obiekcie docelowym, jeśli są odpowiednie ustawienia (lub opcje) (np. zachowaj datę, zachowaj prawa lub nawet zachowaj „ wszystko ”) zostały użyte (jak wspomniałeś). 2) Alternatywą jest najpierw wykonać archiwum (.zip, .tar itp.) Plików i wypakować je z tego archiwum w celu, ponownie dając programowi miejsce (w formacie archiwum) na znalezienie metadanych, a określone opcje / ustawienia pozwalają zachować (lub nie) te metadaty.
Olivier Dulac
Do drugiego akapitu: A co ze stat (2)?
kot
Dzięki za udzielenie mi szczegółowej odpowiedzi na to jedno pytanie, nad którym się zastanawiałem.
juniorRubyist
11

Zasadniczo różni się w zależności od systemu plików, w którym przechowywane są metadane. W systemach plików z rodziny ext2 wspomniane metadane (właściciel, grupa, uprawnienia, czas) są przechowywane w i- węzle . I-węzeł przechowuje również (wskaźniki) bloki zajmowane przez plik na dysku. I-węzeł nie przechowuje nazwy pliku.

Możesz uzyskać dostęp do tych danych za pomocą statwywołania systemowego ( man 2 stat) i użyć statnarzędzia, aby je wydrukować ( man stat). Szczegółowy opis pól i-węzłów można znaleźć w linux/include/linux/fs.hźródle jądra.

Istnieją inne rodzaje metadanych (np. Uprawnienia ACL ), które są przechowywane w różnych miejscach.

Metadane nie są domyślnie kopiowane podczas kopiowania pliku. Zamiast tego tworzony jest nowy plik z domyślnymi wartościami metadanych. Istnieją różne opcje cp( -p, --preserve), które nakazują cprównież kopiować metadane, czytając stare metadane stati odpowiednio modyfikując nowe metadane.

reż
źródło
4

W zależności od systemu plików obszary są rezerwowane (pół-) statycznie lub dynamicznie, aby przechowywać metadane, takie jak uprawnienia, rozmiar i inne (czasem także nazwa pliku).

W Uniksie metadane są przechowywane w i- węźle kontrolującym obszar danych, w którym znajduje się plik ( podczas gdy nazwy plików i powiązane numery i-węzłów są przechowywane we wpisie katalogu ).

W niektórych systemach plików wpisy katalogu to pliki jak każdy inny, ale niewidoczne. FAT i FAT32 to takie systemy plików (katalog główny FAT jest jednak „specjalny”). Podczas tworzenia pliku dodajesz / edytujesz w pliku pozycję opisującą folder, w którym plik się znajduje. Każdy wpis jest wystarczająco duży, aby przechowywać rozmiar pliku, nazwę i datę i nic więcej (długie nazwy zajmujące wiele wpisów; domyślny rozmiar 32 bajtów może zawierać jedną nazwę w starym formacie 8 + 3). Wszystko to oczywiście , zakładając, że moja pamięć działa). System Ext jest podobny, ale pozycja katalogu jest dynamicznie zmieniana i zawiera tylko nazwę i wskaźnik i-węzła; wszystkie inne informacje są w i-węzle. W ten sposób dwa wpisy mogą wskazywać na ten sam plik, co jest przydatne do zarządzania zduplikowanymi plikami.

W niektórych systemach plików i-węzły mogą być wystarczająco duże, aby pomieścić niewielką ilość danych oprócz metadanych, tak że jeśli plik może się tam zmieścić, nie zajmuje dodatkowego miejsca na dysku. Tworzysz plik 45-bajtowy, a wolne miejsce na dysku w ogóle się nie zmienia; bajty te są przechowywane wewnątrz i-węzła. Myślę, że rodzina ext * obsługuje to (i NTFS też). Pomaga to zarządzać dużą liczbą bardzo małych plików.

W jeszcze innych systemach plików obok głównego systemu znajduje się „fantomowy” system plików, który przechowuje te dodatkowe atrybuty. Nie tylko informacje o pliku, ale prawdopodobnie także ikony pliku .

Niektóre systemy mają jedno i drugie: NTFS ma pełne metadane katalogu działające w stylu i-węzłowym oraz możliwość tworzenia alternatywnych strumieni danych zawierających dalsze informacje, które (najwyraźniej) niczego nie zmieniają w „głównym” pliku.

LSerni
źródło
2
Nazwy plików nie są przechowywane w pliku, są częścią i-węzła katalogu. Właśnie dlatego działają twarde linki
Sobrique
ta odpowiedź jest sprzeczna z pytaniami o to, gdzie przechowywane są nazwy plików, zastanawiam się, co jest poprawne
cat
Przepraszam, pomieszałem rzeczy i @dirkt ma rację . Naprawianie odpowiedzi.
LSerni
Są częścią katalogu , ale zwykle nie są częścią i-węzła katalogu. Jest on specyficzny dla FS, ale jeśli uważasz katalog za specjalny plik, jego zawartością będzie lista plików (nazw i ich i-węzłów).
grawity