debugfs set_inode_field ctime 以纳秒为单位

debugfs set_inode_field ctime with nanoseconds

我正在使用 debugfs 更改 ext4 文件系统上文件的 ctime(附加到该特定文件 ctime 的程序循环)。

因此使用的命令是:

debugfs -w -R 'set_inode_field foo/bar ctime 20130503145204' /dev/vdb1

但这会导致 ctime als 跟随:

myserver:~ # stat foo/bar 
  File: „foo/bar“
  Size: 1234        Blocks: 24         IO Block: 4096   reguläre Datei
Device: 1234h/1234d Inode: 1234567     Links: 1
Access: (0660/-rw-rw----)  Uid: (  123/ whatever)   Gid: ( 1234/ whatever)
Access: 2021-02-12 21:17:51.146954174 +0100
Modify: 2021-02-12 14:51:32.152323937 +0100
Change: 2013-05-03 16:52:04.991865222 +0200

不符合预期:2013-05-03 16:52:04.000000000 +0200

原因是旧的 ext3 FS 仅以秒分辨率存储 ctime。 ext2/ext3 中的 inode structur size 是 128 字节。使用 ext4,此大小增加到 156 字节(i_extra_isize = 28,请参阅:https://ext4.wiki.kernel.org/index.php/Ext4_Disk_Layout#Inode_Size)导致纳秒分辨率。

如何格式化 debugfs 命令以将 ctime 设置为精确的纳秒?

经过一番挖掘,我设法解决了这个问题。解决办法:看说明书。

debugfs 支持 ctime/atime/mtime/crtime time_extra 字节的设置

set_inode_field foo/bar ctime_extra 0

ctime_extra 字段是一个无符号整数,因此值 0 给出了预期的设置。

dtime 没有加宽因此不支持 dtime_extra