Dove vanno i metadati quando si salva un file?


28

Di 'che Johnny crea un file VUOTO. Si chiama foobar.py. Quando Johnny gli permette di essere eseguito, corre chmod 755 foobar.py. Il file ora ha i metadati di

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

Dove sono archiviati tutti quei metadati in quel file? La dimensione del file è 0, quindi come mantiene i metadati quando viene trasferito su un'altra unità?


1
non sono un esperto, ma suppongo che la risposta generale sia che quando si dispone di un disco rigido e si creano più di 1 partizione, si formatta la partizione con un file system, ad esempio Windows tende a usare ntfs e Linux potrebbe usare ex2, quindi il gran parte di quella partizione è per il contenuto dei file, ma una piccola parte di essa è riservata ad altre cose, inclusi i metadati.
barlop il

@barlop essenzialmente corretto. Entrambi i sistemi utilizzano dello spazio per la registrazione in cui sono memorizzati i file; in NTFS la "tabella dei file master" memorizza i metadati, in ext2 + è in "inode".
pjc50,

@pjc50 grazie. e metadati a parte, qual è il nome della cosa che è al di fuori delle partizioni? Suppongo che dipenda dal fatto che si tratti di MBR o GPT .. In MBR la cosa si chiama MBR .. Come si chiama in GPT? (Capisco che GPT abbia un MBR legacy ma ha anche le sue cose, al di fuori di tutte le partizioni?)
barlop

Correlati: (sostanzialmente la stessa cosa, ma la domanda riguarda specificamente Windows) Come vengono archiviati i metadati dei file in Windows?
gronostaj,

2
"chmod 755 ... Il file ora ha i metadati di ... -rw-r - r-- ..." intendi -rwxr-xr-x.
JoL

Risposte:


42

Non è memorizzato in quel file. È memorizzato nel filesystem e tutti i parametri vengono copiati manualmente uno per uno (anche se alcuni non possono essere copiati).

Cioè, la maggior parte dei sistemi operativi non ha una chiamata "copia file con metadati". Il programma di copia file crea semplicemente un nuovo file chiamato foobar.py, copia tutti 0 byte di dati, quindi usa utime () o SetFileTime () per rendere il suo tempo di modifica uguale a quello dell'originale. Allo stesso modo, i permessi sui file sarebbero "copiati" impostandoli nuovamente usando chmod () o copiando l'attributo POSIX ACL.

Alcuni metadati non vengono copiati. L'impostazione della proprietà richiede i privilegi di root, quindi le copie dei file di qualcun altro appartengono a te e occupano la tua quota del disco. Il tempo (cambio tempo attributo) è impossibile da impostare manualmente su Unix; btime (tempo di nascita / creazione) di solito non viene nemmeno copiato.

Confronta cp -a foo bar(che copia i metadati) e cp foo bar(che non lo fa):

$ 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
chiudi (4) = 0
chiudi (3) = 0
...
$ strace -v cp -a foo bar
...
 - vengono recuperati i metadati originali
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 = 28-12-2016T09: 16: 59 + 0200.879714332,
             st_mtime = 2016-12-28T09: 16: 55 + 0.200,816,363098 millions,
             st_ctime = 2016-12-28T09: 16: 55 + 0200.816363098}) = 0
 - i dati vengono copiati
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
 - il tempo di modifica viene copiato
utimensat (4, NULL, [{tv_sec = 1482909419, tv_nsec = 879714332},
                    {tv_sec = 1482909415, tv_nsec = 816363098}], 0) = 0
 - la proprietà viene copiata (solo con 'sudo [strace] cp')
fchown (4, 1000, 1000) = 0
 - gli attributi estesi vengono copiati (xdg.origin.url è impostato dai 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
 - Gli ACL POSIX non sono presenti, quindi viene creato un ACL di base da st_mode
 - (in questo caso, funzionerebbe anche un semplice fchmod ())
fgetxattr (3, "system.posix_acl_access", 0x7ffc87a50be0, 132) = -1 ENODATA (Nessun dato disponibile)
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
chiudi (4) = 0
chiudi (3) = 0
...

3
a complemento di questa risposta è necessario menzionare: - quando si copia su un'altra unità: i metadati vengono letti dalla fonte e riprodotti sulla destinazione se le impostazioni (o le opzioni) appropriate (ad es. mantenere la data, conservare i diritti o persino mantenere " tutto ") sono stati usati (come hai detto tu). 2) Un'alternativa è prima fare un archivio (.zip, .tar, ecc.) Dei file, ed estrarre da questo archivio sulla destinazione, dando ancora una volta al programma un posto (nel formato archivio) per trovare i metadati, e opzioni / impostazioni specifiche consentono di conservare (o meno) quelle metadate.
Olivier Dulac,

Al secondo paragrafo: che dire di stat (2)?
gatto,

Grazie per avermi dato una risposta dettagliata a questa domanda su cui ho riflettuto.
juniorRubyist,

11

In genere differisce dal filesystem al filesystem in cui sono archiviati i metadati. Sulla famiglia di filesystem ext2, i metadati che hai citato (proprietario, gruppo, permessi, ora) sono memorizzati nell'inode . L'inode memorizza anche (puntatori a) i blocchi che il file occupa sul disco. L'inode non memorizza il nome file.

È possibile accedere a questi dati con la statchiamata di sistema ( man 2 stat) e utilizzare lo statstrumento per stamparli ( man stat). Una descrizione dettagliata dei campi inode è disponibile nel linux/include/linux/fs.hsorgente del kernel.

Esistono altri tipi di metadati (ad es. Autorizzazioni ACL ) che vengono archiviati in luoghi diversi.

I metadati non vengono copiati per impostazione predefinita quando si copia il file. Invece, viene creato un nuovo file con valori di metadati predefiniti. Esistono varie opzioni per cp( -p, --preserve) che indicano cpdi copiare anche i metadati, leggendo i vecchi metadati state modificando i nuovi metadati di conseguenza.


4

A seconda del file system, le aree sono riservate (semi) staticamente o dinamicamente per contenere metadati come permessi, dimensioni e altro (a volte anche il nome del file).

In Unix, i metadati sono archiviati nell'inode che controlla l'area dei dati in cui risiede il file ( mentre i nomi dei file e i relativi numeri di inode sono memorizzati in una voce della directory ).

In alcuni filesystem le voci della directory sono file come qualsiasi altro, ma nascoste alla vista. FAT e FAT32 sono tali filesystem (la directory root di FAT è "speciale"). Quando si crea un file, si aggiunge / modifica una voce nel file che descrive la cartella in cui risiede il file. Ogni voce è abbastanza grande da contenere dimensione del file, nome e data e nient'altro (nomi lunghi che occupano più voci; la dimensione della voce predefinita di 32 byte può contenere un singolo nome nel vecchio formato di caratteri 8 + 3. Tutto questo, ovviamente , supponendo che la mia memoria funzioni). Il sistema ext è simile, ma la voce della directory ha dimensioni dinamiche e contiene solo il nome e il puntatore dell'inode; tutte le altre informazioni sono nell'inode. In questo modo, due voci possono puntare allo stesso file, utile per gestire file duplicati.

In alcuni filesystem, gli inode possono essere abbastanza grandi da contenere una piccola quantità di dati oltre ai metadati, in modo che se il file può adattarsi lì, non occupa spazio su disco aggiuntivo. Si crea un file a 45 byte e lo spazio libero su disco non cambia affatto; quei byte sono memorizzati all'interno dell'inode. Penso che la famiglia ext * supporti questo (e anche NTFS). Questo aiuta a gestire un gran numero di file molto piccoli.

In altri file system, c'è quello che equivale a un file system "fantasma" lungo quello principale, che memorizza questi attributi extra. Non solo informazioni sui file, ma anche icone dei file .

Alcuni sistemi hanno entrambi: NTFS ha i metadati della directory completa che funzionano in maniera simile agli inode e la possibilità di creare flussi di dati alternativi che contengono ulteriori informazioni che (apparentemente) non cambiano nulla nel file "principale".


2
I nomi dei file non sono memorizzati con il file, fanno parte dell'inode della directory. Ecco perché funzionano gli hard link
Sobrique,

questa risposta è in conflitto con Dirkt su dove sono memorizzati i nomi dei file, mi chiedo quale sia corretto
cat

Mi dispiace, ho confuso le cose e @dirkt ne ha il diritto . Risolvere la risposta.
LSerni,

Fanno parte della directory , ma di solito non fanno parte dell'inode della directory. È specifico di FS, ma se si considera una directory come un file speciale, il suo contenuto sarebbe l'elenco dei file (nomi e i loro inode).
Grawity,
Utilizzando il nostro sito, riconosci di aver letto e compreso le nostre Informativa sui cookie e Informativa sulla privacy.
Licensed under cc by-sa 3.0 with attribution required.