14 agosto 2011

Ma veramente!? - Cronaca del crtime su sistemi Linux

Ok, non scrivo da un bel po' su questo blog, ma questa cosa vorrei condividerla.

LA PREMESSA
Non voglio dire di essere un grande esperto, ma ho comunque anni e anni di esperienza su sistemi Linux che rendono la questione ancora più interessante...e questo ha contribuito ancora di più a farmi sentire un pirla nella "scoperta" che ho fatto :)

IL FATTO
A lavoro per diverse ragioni dovevo risalire alla data di creazione di un file.
Bene, così per abitudine:

$ ls -l

mmh no vero, non c'è.

$ man ls

mmmh niente di utile.

$ stat

mmh Access, Modify e Change, ma niente Create o Creation.

$ man stat

[...]
%x Time of last access

%X Time of last access as seconds since Epoch

%y Time of last modification

%Y Time of last modification as seconds since Epoch

%z Time of last change

%Z Time of last change as seconds since Epoch
[..]
mmh niente da fare. Iniziano i primi FORTI dubbi. Al che per togliersene un bel po'

$ man 2 fstat

[..]
struct stat {
dev_t st_dev; /* ID of device containing file */
ino_t st_ino; /* inode number */
mode_t st_mode; /* protection */
nlink_t st_nlink; /* number of hard links */
uid_t st_uid; /* user ID of owner */
gid_t st_gid; /* group ID of owner */
dev_t st_rdev; /* device ID (if special file) */
off_t st_size; /* total size, in bytes */
blksize_t st_blksize; /* blocksize for file system I/O */
blkcnt_t st_blocks; /* number of 512B blocks allocated */
time_t st_atime; /* time of last access */
time_t st_mtime; /* time of last modification */
time_t st_ctime; /* time of last status change */
};
[..]
ma...ma...NON C'È!

LA "SCOPERTA"
Finalmente è stato introdotto con l'arrivo di ext4.
In aggiunta ai campi tradizionali (access,modification,change) sono stati aggiunti il crtime(creation) e dtime(deletion) legati all'inode.
Al momento sembra mancare negli strumenti tradizionali (stat, find, ls) la possibilità di ottenere informazioni dal filesystem ext4 maggiori rispetto a quanto possibile per ext2 o ext3.
Per ottenere queste informazioni:

# debugfs -R 'stat /percorso/file' /dev/sda1

dove /dev/sda1 è il dispositivo su cui è montato il filesystem dove risiede il file di cui vogliamo vedere queste informazioni.

Inode: 524360 Type: regular Mode: 0644 Flags: 0x80000
Generation: 1374299388 Version: 0x00000000:00000001
User: 0 Group: 0 Size: 515
File ACL: 0 Directory ACL: 0
Links: 1 Blockcount: 8
Fragment: Address: 0 Number: 0 Size: 0
ctime: 0x4d62a41b:29f0e708 -- Mon Feb 21 18:42:51 2011
atime: 0x4e44d538:d129cbbc -- Fri Aug 12 09:24:40 2011
mtime: 0x4d62a41b:1d8b1d3c -- Mon Feb 21 18:42:51 2011
crtime: 0x4d62a41b:1d8b1d3c -- Mon Feb 21 18:42:51 2011
Size of extra inode fields: 28
EXTENTS:
(0):2167296

CONCLUSIONI
Le conclusioni in questa storia sono:
  1. non si finisce mai di imparare...;
  2. è terribile quando sei straconvinto di una cosa per anni e accorgersi che era completamente sbagliata;
  3. La maggior parte di chi legge aveva la mia stessa convinzione ma non lo dirà mai, anzi dirà che lo sapeva perfettamente;
  4. Non so che gli costava aggiungere questo campo anche prima.

Ogni altra aggiunta e spiegazione su questo fatto sono ben voluti.