Estaba leyendo la Birth
sección de stat
y parece que ext4 debería admitirlo, pero incluso un archivo que acabo de crear lo deja vacío.
~ % 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 qué mi ext4
partición no llena este campo?
filesystems
ext4
stat
xenoterracida
fuente
fuente
/home/user/path/to/file
porque/home
estaba en una partición separada. En ese caso, la ruta proporcionadastat
debe ser relativa a/home
. Ejemplo:sudo debugfs -R 'stat user/path/to/file' /dev/sda2
. Para deshacernos del manejo de la ruta, podemos proporcionarstat
el número de inodo en lugar de la ruta:sudo debugfs -R "stat <$(stat -c %i /home/user/path/to/file)>" /dev/sda5
<
y>
alrededor del número de inodo. A menudo se usan en ejemplos para rodear una variable que debe ajustarse, pero en este caso deben ingresarse literalmente. Sin ellos, el número de inodo se trata como una ruta y obtiene unFile not found by ext2_lookup
error.Combiné esto en una función de shell simple:
Luego puedes ejecutarlo con
fuente
La
xstat
función nunca se fusionó con la línea principal. Sin embargo,statx
más adelante se propuso una nueva llamada , que se fusionó en Linux 4.11 . La nuevastatx(2)
llamada del sistema incluye un tiempo de creación en su estructura de retorno. Sestatx(2)
agregó un contenedor para glibc solo en 2.28 (lanzamiento en agosto de 2018) . Y se agregó soporte para usar este contenedor en GNU coreutils 8.31 (lanzado en marzo de 2019):Lo que sigue es una demostración de
statx
donde userland aún tiene que ponerse al día (glibc o coreutils más antiguos). No es fácil llamar a las llamadas del sistema directamente en un programa en C. Por lo general, glibc proporciona un contenedor que facilita el trabajo, pero Afortunadamente, @whotwagner escribió un programa C de muestra que muestra cómo usar lastatx(2)
llamada del sistema en sistemas x86 y x86-64. Su salida es el mismo formato questat
el predeterminado, sin ninguna opción de formato, pero es simple modificarlo para imprimir solo la hora de nacimiento. (Si tiene un glibc lo suficientemente nuevo, no lo necesitará; puede usarlostatx
directamente como se describe enman 2 statx
).Primero, clónalo:
Puede compilar el
statx.c
código, o, si lo que desea el momento del nacimiento, crear unabirth.c
en el directorio clonado con el siguiente código (que es una versión mínima destatx.c
impresión sólo la fecha y hora de creación incluyendo la precisión de nanosegundos):Entonces:
En teoría, esto debería hacer que el tiempo de creación sea accesible en más sistemas de archivos que solo los ext * (
debugfs
es una herramienta para sistemas de archivos ext2 / 3/4, e inutilizable en otros). Funcionó para un sistema XFS, pero no para NTFS y exfat. Supongo que los sistemas de archivos FUSE para aquellos no incluyeron el tiempo de creación.fuente
Hay otro caso en el que el tiempo de nacimiento estará vacío / cero / guión: el tamaño del Inode de Ext4 debe ser de al menos 256bytes para almacenar
crtime
. El problema se produce si inicialmente creó el sistema de archivos de menos de 512 MB (el tamaño predeterminado de Inode será de 128 bytes, ver/etc/mke2fs.conf
y página demkfs.ext4
manual).y / o
Ahora verifique el inodo del sistema de archivos (¿es lo suficientemente grande como para almacenarlo
crtime
?):Información técnica: en la página Diseño de disco Ext4 , tenga en cuenta que algunos atributos de las tablas de inodo están más allá de 0x80 (128).
fuente
mke2fs.c
línea 1275Por lo que vale, me sentía pedante, así que escribí un contenedor de bash alrededor de stat para admitir silenciosamente crtime usando debugfs para recuperarlo de un sistema de archivos ext4 subyacente si está disponible. Espero que sea robusto. Encuéntralo aquí .
Tenga en cuenta que una solución está aparentemente en la lista de tareas pendientes para Linux como se documenta en ese script. Por lo tanto, esta envoltura tiene una vida útil nominal solo hasta que se hace y es más un ejercicio de lo que se puede hacer.
fuente
xstat()
finalmente se ha agregado a Linux, por lo que es solo cuestión de tiempo antes de la libc de GNU yfind
agregue soporte para ella.