Eu estava lendo a Birth
seção stat
e parece que o ext4 deve suportá-lo, mas mesmo um arquivo que eu criei o deixa vazio.
~ % touch test slave-iv
~ % stat test.pl slave-iv
File: ‘test.pl’
Size: 173 Blocks: 8 IO Block: 4096 regular file
Device: 903h/2307d Inode: 41943086 Links: 1
Access: (0600/-rw-------) Uid: ( 1000/xenoterracide) Gid: ( 100/ users)
Access: 2012-09-22 18:22:16.924634497 -0500
Modify: 2012-09-22 18:22:16.924634497 -0500
Change: 2012-09-22 18:22:16.947967935 -0500
Birth: -
~ % sudo tune2fs -l /dev/md3 | psp4 slave-iv
tune2fs 1.42.5 (29-Jul-2012)
Filesystem volume name: home
Last mounted on: /home
Filesystem UUID: ab2e39fb-acdd-416a-9e10-b501498056de
Filesystem magic number: 0xEF53
Filesystem revision #: 1 (dynamic)
Filesystem features: has_journal ext_attr resize_inode dir_index filetype needs_recovery extent flex_bg sparse_super large_file huge_file uninit_bg dir_nlink extra_isize
Filesystem flags: signed_directory_hash
Default mount options: journal_data
Filesystem state: clean
Errors behavior: Continue
Filesystem OS type: Linux
Inode count: 59736064
Block count: 238920960
Reserved block count: 11946048
Free blocks: 34486248
Free inodes: 59610013
First block: 0
Block size: 4096
Fragment size: 4096
Reserved GDT blocks: 967
Blocks per group: 32768
Fragments per group: 32768
Inodes per group: 8192
Inode blocks per group: 512
RAID stride: 128
RAID stripe width: 256
Flex block group size: 16
Filesystem created: Mon May 31 20:36:30 2010
Last mount time: Sat Oct 6 11:01:01 2012
Last write time: Sat Oct 6 11:01:01 2012
Mount count: 14
Maximum mount count: 34
Last checked: Tue Jul 10 08:26:37 2012
Check interval: 15552000 (6 months)
Next check after: Sun Jan 6 07:26:37 2013
Lifetime writes: 7255 GB
Reserved blocks uid: 0 (user root)
Reserved blocks gid: 0 (group root)
First inode: 11
Inode size: 256
Required extra isize: 28
Desired extra isize: 28
Journal inode: 8
First orphan inode: 55313243
Default directory hash: half_md4
Directory Hash Seed: 442c66e8-8b67-4a8c-92a6-2e2d0c220044
Journal backup: inode blocks
Por que minha ext4
partição não preenche esse campo?
filesystems
ext4
stat
xenoterracida
fonte
fonte
/home/user/path/to/file
porque/home
estava em uma partição separada. Nesse caso, o caminho fornecidostat
deve ser relativo a/home
. Exemplo:sudo debugfs -R 'stat user/path/to/file' /dev/sda2
. Para se livrar da manipulação caminho, nós podemos fornecer parastat
o número inode em vez do caminho:sudo debugfs -R "stat <$(stat -c %i /home/user/path/to/file)>" /dev/sda5
<
e>
o valor do inode são necessários. Eles são frequentemente usados em exemplos para envolver uma variável que deve ser ajustada, mas, neste caso, eles devem ser inseridos literalmente. Sem eles, o número do inode é tratado como um caminho e você recebe umFile not found by ext2_lookup
erro.Eu combinei isso em uma função shell simples:
Você pode executá-lo com
fonte
A
xstat
função nunca foi mesclada na linha principal. No entanto, uma novastatx
chamada foi proposta posteriormente e foi mesclada no Linux 4.11 . A novastatx(2)
chamada do sistema inclui um horário de criação em sua estrutura de retorno. Um wrapper parastatx(2)
foi adicionado ao glibc apenas em 2.28 (versão agosto de 2018) . E o suporte ao uso deste wrapper foi adicionado no GNU coreutils 8.31 (lançado em março de 2019):A seguir, é apresentada uma demonstração de
statx
onde a área de usuários ainda não foi atualizada (glibc ou coreutils). Não é fácil fazer chamadas do sistema diretamente em um programa C. Normalmente, a glibc fornece um wrapper que facilita o trabalho, mas felizmente, o @whotwagner escreveu um programa C de amostra que mostra como usar astatx(2)
chamada do sistema nos sistemas x86 e x86-64. Sua saída é do mesmo formato questat
o padrão, sem nenhuma opção de formatação, mas é simples modificá-la para imprimir apenas a hora do nascimento. (Se você tiver um glibc novo o suficiente, não precisará disso - poderá usá-lostatx
diretamente conforme descrito emman 2 statx
).Primeiro, clone-o:
Você pode compilar o
statx.c
código ou, se desejar apenas a hora do nascimento, criar umbirth.c
no diretório clonado com o seguinte código (que é uma versão mínima dastatx.c
impressão apenas do carimbo de data / hora da criação, incluindo precisão de nanossegundos):Então:
Em teoria, isso deve tornar o tempo de criação acessível em mais sistemas de arquivos do que apenas nos ext * (
debugfs
é uma ferramenta para sistemas de arquivos ext2 / 3/4 e inutilizável em outros). Funcionou para um sistema XFS, mas não para NTFS e exfat. Eu acho que os sistemas de arquivos FUSE para aqueles não incluíram o tempo de criação.fonte
Há outro caso em que o tempo de nascimento será vazio / zero / hífen: o tamanho do Inode do Ext4 deve ter pelo menos 256 bytes para armazenar
crtime
. O problema ocorre se você criou inicialmente o sistema de arquivos menor que 512 MB (o tamanho padrão do Inode será 128 bytes, consulte/etc/mke2fs.conf
e página demkfs.ext4
manual).e / ou
Agora verifique o inode do sistema de arquivos (é grande o suficiente para armazenar
crtime
?):Informações técnicas: Na página Layout do disco Ext4 , observe que alguns atributos das tabelas de inode estão além de 0x80 (128).
fonte
mke2fs.c
linha 1275Pelo que vale a pena, eu estava me sentindo pedante, então escrevi um wrapper bash em torno do stat para silenciosamente suportar o crtime usando o debugfs para buscá-lo em um sistema de arquivos ext4 subjacente, se disponível. Espero que seja robusto. Encontre aqui .
Observe que uma correção está ostensivamente na lista de tarefas do Linux, conforme documentado nesse script. Portanto, esse invólucro tem uma vida útil nominal apenas até que isso seja feito e é mais um exercício do que é possível.
fonte
xstat()
, eventualmente, foi adicionado ao Linux, portanto, é apenas uma questão de tempo até o GNU libc efind
adiciona suporte a ele.