Para onde vão os metadados quando você salva um arquivo?

28

Digamos que Johnny crie um arquivo VAZIO. É chamado foobar.py. Quando Johnny permite que seja executado, ele corre chmod 755 foobar.py. O arquivo agora tem os metadados de

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

Onde estão todos os metadados armazenados nesse arquivo? O tamanho do arquivo é 0, então como ele mantém os metadados quando são transferidos para outra unidade?

juniorRubyist
fonte
11
Eu não sou especialista, mas acho que a resposta geral é que, quando você tem um disco rígido e faz 1 ou mais partições, formata a partição com um sistema de arquivos. Por exemplo, o Windows tende a usar NTFS e o Linux pode usar o ex2. grande parte dessa partição é para o conteúdo do arquivo, mas uma pequena quantidade é reservada para outras coisas, incluindo metadados.
barlop
@barlop essencialmente correto. Ambos os sistemas usam algum espaço para gravar onde os arquivos são armazenados; no NTFS, a "tabela de arquivos principais" armazena os metadados, no ext2 + está em "inodes".
Pjc50
@ pjc50 obrigado. e metadados à parte, qual é o nome da coisa que está fora das partições? Suponho que depende se a coisa é MBR ou GPT. Na MBR, a coisa é chamada MBR. Como é chamado na GPT? (Eu entendo GPT tem um legado MBR mas tem sua própria coisa também, fora de todas as partições?)
barlop
Relacionado: (basicamente a mesma coisa, mas a pergunta é especificamente sobre o Windows) Como os metadados do arquivo são armazenados no Windows?
gronostaj
2
"chmod 755 ... O arquivo agora tem os metadados de ... -rw-r - r-- ..." você quer dizer -rwxr-xr-x.
JOL

Respostas:

42

Não é armazenada no arquivo. Ele é armazenado no sistema de arquivos e todos os parâmetros são copiados manualmente, um por um (embora alguns não possam ser copiados).

Ou seja, a maioria dos sistemas operacionais não possui realmente uma chamada "copiar arquivo com metadados". O programa de cópia de arquivo apenas cria um novo arquivo chamado foobar.py, copia todos os 0 bytes de dados e usa utime () ou SetFileTime () para fazer com que o tempo de modificação pareça o mesmo do original. Da mesma forma, as permissões de arquivo seriam "copiadas", definindo-as novamente usando chmod () ou copiando o atributo POSIX ACL.

Alguns metadados não são copiados. A configuração da propriedade requer privilégios de root; portanto, cópias dos arquivos de outra pessoa pertencem a você e ocupam sua cota de disco. É impossível definir o ctime (hora de mudança de atributo) manualmente nos Unixes; btime (hora de nascimento / criação) também não é copiado.

Compare cp -a foo bar(que copia metadados) e cp foo bar(que não):

$ strace -v cp foo bar
...
open ("foo", O_RDONLY) = 3
aberto ("barra", O_WRONLY | O_TRUNC) = 4
read (3, "teste \ n", 131072) = 5
write (4, "teste \ n", 5) = 5
read (3, "", 131072) = 0
fechar (4) = 0
fechar (3) = 0
...
$ strace -v cp -a foo bar
...
 - os metadados originais são recuperados
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 = 28-12-2016T09: 16: 55 + 0200.816363098}) = 0
 - os dados são copiados
open ("foo", O_RDONLY | O_NOFOLLOW) = 3
aberto ("barra", O_WRONLY | O_TRUNC) = 4
read (3, "teste \ n", 131072) = 5
write (4, "teste \ n", 5) = 5
read (3, "", 131072) = 0
 - tempo de modificação é copiado
utimensat (4, NULL, [{tv_sec = 1482909419, tv_nsec = 879714332},
                    {tv_sec = 1482909415, tv_nsec = 816363098}], 0) = 0
 - a propriedade é copiada (apenas com 'sudo [strace] cp')
fchown (4, 1000, 1000) = 0
 - atributos estendidos são copiados (xdg.origin.url é definido pelos navegadores, 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
 - ACLs POSIX não estão presentes, portanto, uma ACL básica é criada a partir de st_mode
 - (neste caso, um simples fchmod () também funcionaria)
fgetxattr (3, "system.posix_acl_access", 0x7ffc87a50be0, 132) = -1 ENODATA (dados não disponíveis)
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
fechar (4) = 0
fechar (3) = 0
...
gravidade
fonte
3
para complementar esta resposta, você deve mencionar: - ao copiar para outra unidade: os metadados são lidos da fonte e reproduzidos no destino se as configurações apropriadas (ou opções) (por exemplo: manter data, manter direitos ou até manter " tudo ") foram usados ​​(como você mencionou). 2) Uma alternativa é primeiro fazer um archive (.zip, .tar, etc) dos arquivos e extraí-lo no destino, dando mais uma vez ao programa algum lugar (no formato de archive) para encontrar os metadados, e opções / configurações específicas permitem manter (ou não) esses metadados.
Olivier Dulac
Para o segundo parágrafo: E o stat (2)?
gato
Obrigado por me dar uma resposta detalhada a essa pergunta sobre a qual eu ponderei.
juniorRubyist
11

Geralmente difere de sistema de arquivos para sistema de arquivos em que os metadados estão armazenados. Na família ext2 de sistemas de arquivos, os metadados que você mencionou (proprietário, grupo, permissões, hora) são armazenados no inode . O inode também armazena (ponteiros para) os blocos que o arquivo ocupa no disco. O inode não armazena o nome do arquivo.

Você pode acessar esses dados com a statchamada do sistema ( man 2 stat) e usar a statferramenta para imprimi-los ( man stat). Uma descrição detalhada dos campos de inode pode ser encontrada na linux/include/linux/fs.hfonte do kernel.

Existem outros tipos de metadados (por exemplo, permissões de ACL ) que são armazenados em locais diferentes.

Os metadados não são copiados por padrão quando você copia o arquivo. Em vez disso, um novo arquivo com valores de metadados padrão é criado. Existem várias opções para cp( -p, --preserve) que cptambém instruem a copiar metadados, lendo os metadados antigos state modificando os novos metadados de acordo.

dirkt
fonte
4

Dependendo do sistema de arquivos, as áreas são reservadas (semi-) estaticamente ou dinamicamente para armazenar metadados como permissões, tamanho e outros (às vezes também o nome do arquivo).

No Unix, os metadados são armazenados no inode, controlando a área de dados em que o arquivo reside ( enquanto os nomes de arquivos e os números de inodes relacionados são armazenados em uma entrada de diretório ).

Em alguns sistemas de arquivos, as entradas do diretório são arquivos como qualquer outro, mas ocultos à vista. FAT e FAT32 são esses sistemas de arquivos (o diretório raiz do FAT é "especial"). Ao criar um arquivo, você adiciona / edita uma entrada no arquivo que descreve a pasta em que o arquivo reside. Cada entrada é grande o suficiente para armazenar tamanho, nome e data de arquivo, e nada mais (nomes longos ocupando várias entradas; o tamanho padrão de entrada de 32 bytes pode conter um único nome no formato antigo de 8 + 3 caracteres. Tudo isso, é claro , supondo que minha memória esteja funcionando). O sistema ext é semelhante, mas a entrada do diretório é dimensionada dinamicamente e contém apenas o nome e o ponteiro do inode; todas as outras informações estão no inode. Dessa forma, duas entradas podem apontar para o mesmo arquivo, o que é útil para gerenciar arquivos duplicados.

Em alguns sistemas de arquivos, os inodes podem ser grandes o suficiente para armazenar uma pequena quantidade de dados, além dos metadados, para que, se o arquivo puder caber nele, ele não ocupará espaço extra em disco. Você cria um arquivo de 45 bytes e o espaço livre em disco não é alterado; esses bytes são armazenados dentro do inode. Eu acho que a família ext * suporta isso (e NTFS também). Isso ajuda a gerenciar um grande número de arquivos muito pequenos.

Em outros sistemas de arquivos, existe o que equivale a um sistema de arquivos "fantasma" ao longo do sistema principal, que armazena esses atributos extras. Não apenas informações de arquivos, mas possivelmente ícones de arquivos também.

Alguns sistemas têm os dois: O NTFS possui os metadados de diretório completos trabalhando de maneira semelhante ao inode, e a possibilidade de criar fluxos de dados alternativos contendo mais informações que (aparentemente) não alteram nada no arquivo "principal".

LSerni
fonte
2
Os nomes dos arquivos não são armazenados no arquivo, eles fazem parte do inode do diretório. É por isso que os hard links funcionam #
Sobrique
Esta resposta conflitos com dirkt é sobre onde nomes de arquivos são armazenados, eu quero saber o que é correto
cat
Desculpe, eu misturei as coisas, e @dirkt tem o direito . Resposta de fixação.
LSerni
Eles fazem parte do diretório , mas geralmente não fazem parte do inode do diretório. É específico do FS, mas se você pensar em um diretório como um arquivo especial, seu conteúdo será a lista de arquivos (nomes e seus inodes).
grawity