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?
Respostas:
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) ecp foo bar
(que não):fonte
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
stat
chamada do sistema (man 2 stat
) e usar astat
ferramenta para imprimi-los (man stat
). Uma descrição detalhada dos campos de inode pode ser encontrada nalinux/include/linux/fs.h
fonte 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
) quecp
também instruem a copiar metadados, lendo os metadados antigosstat
e modificando os novos metadados de acordo.fonte
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".
fonte