【问题标题】:File timestamps precision - ext3 with nanoseconds, ext4 with milliseconds文件时间戳精度 - ext3 纳秒,ext4 毫秒
【发布时间】:2023-03-17 19:35:01
【问题描述】:

据说ext3支持文件时间戳精度可达秒,ext4可达纳秒...

发生的情况是,我运行 Ubuntu 12.04 和 ext3 文件系统的旧 VPS 始终(据我记忆)非常好地支持纳秒,如下所示:

  File: `auth.log'
  Size: 147744      Blocks: 304        IO Block: 4096   regular file
Device: 800h/2048d  Inode: 32019       Links: 1
Access: (0640/-rw-r-----)  Uid: (  101/  syslog)   Gid: (    4/     adm)
Access: 2020-03-20 00:18:33.634687690 -0300
Modify: 2020-03-24 05:12:48.777610222 -0300
Change: 2020-03-24 05:12:48.777610222 -0300
 Birth: -

mount摘录:

/dev/sda on / type ext3 (rw,noatime,errors=remount-ro)

stat -f:

  File: "auth.log"
    ID: 5483af2794a91010 Namelen: 255     Type: ext2/ext3
Block size: 4096       Fundamental block size: 4096
Blocks: Total: 3870084    Free: 272230     Available: 75643
Inodes: Total: 923520     Free: 829980
root@mail:~# df -mT
Filesystem     Type     1M-blocks  Used Available Use% Mounted on
/dev/sda       ext3         15118 14055       296  98% /
devtmpfs       devtmpfs      1973     1      1973   1% /dev
none           tmpfs          395     1       395   1% /run
none           tmpfs            5     0         5   0% /run/lock
none           tmpfs         1973     0      1973   0% /run/shm

现在,我买了一个新的 VPS,将它更新到 Ubuntu 20.04(pre-beta),它的文件系统挂载为 ext4...

  File: auth.log
  Size: 723967      Blocks: 1424       IO Block: 4096   regular file
Device: ca03h/51715d    Inode: 398412      Links: 1
Access: (0640/-rw-r-----)  Uid: (  104/  syslog)   Gid: (    4/     adm)
Access: 2020-03-24 00:00:05.676000000 -0300
Modify: 2020-03-24 05:14:56.644000000 -0300
Change: 2020-03-24 05:14:56.644000000 -0300
 Birth: -

mount摘录:

/dev/xvda3 on / type ext4 (rw,noatime,nobarrier,errors=remount-ro,stripe=32564)

但奇怪的是stat -f 说是ext3:

  File: "auth.log"
    ID: 7e8a03105e52b018 Namelen: 255     Type: ext2/ext3
Block size: 4096       Fundamental block size: 4096
Blocks: Total: 9857995    Free: 7434726    Available: 7007355
Inodes: Total: 2505120    Free: 2403794
root@mailnew:~# df -mT
Filesystem     Type     1M-blocks  Used Available Use% Mounted on
udev           devtmpfs       430     0       430   0% /dev
tmpfs          tmpfs           95     2        94   2% /run
/dev/xvda3     ext4         38508  9466     27373  26% /
tmpfs          tmpfs          473     0       473   0% /dev/shm
tmpfs          tmpfs            5     0         5   0% /run/lock
tmpfs          tmpfs          473     0       473   0% /sys/fs/cgroup
/dev/loop0     squashfs        54    54         0 100% /snap/lxd/11348
/dev/loop1     squashfs        92    92         0 100% /snap/core/8689
/dev/xvda1     ext4           727   183       502  27% /boot
tmpfs          tmpfs           95     0        95   0% /run/user/0

最后,我的问题是

  1. 为什么我的旧 ext3 系统支持纳秒精度?

  2. 为什么新的 ext4 被限制为毫秒?它实际上是格式化为 ext3 吗?

  3. 如何找出问题所在并在新的纳秒中启用纳秒?

【问题讨论】:

    标签: timestamp filesystems ext4 ext3


    【解决方案1】:

    您所看到的是几个实现细节的结果,所以请振作起来,让我们从一些背景开始。

    stat

    首先,stat -f 的工作方式是调用类似statfs() 的东西,并使用f_type 确定文件系统类型,FS Magic numbers 之一。

    如果您查看magic.hstatfs(2) man page,您会看到:

    EXT2_SUPER_MAGIC 0xEF53
    EXT3_SUPER_MAGIC 0xEF53
    EXT4_SUPER_MAGIC 0xEF53
    

    它们都具有相同的魔力,因此stat 无法真正区分它们,因此它通常对所有 ext 文件系统都表示“类型:ext2/ext3”。

    mount

    接下来是mount的输出。

    mount 通过转到/proc/self/mountinfo 工作,内核提供的那里的信息不包含实际的文件系统类型。相反,它包含mount 命令用来挂载文件系统的filesystem type。 ext4 registers 3 such types、ext2、ext3 和 ext4。

    也就是说,ext4 驱动程序可以处理所有 3 个文件系统,如果内核被配置为只使用 ext4 驱动程序,那就是要使用的驱动程序。

    实际的磁盘文件系统

    那么您如何知道磁盘上实际拥有的文件系统类型?

    你没有。 ext的架构不是基于版本,而是基于features

    您可以按如下方式查询文件系统的功能:

    # dumpe2fs /dev/sda  | grep -e 'Filesystem features:' -e 'Inode size:'
    dumpe2fs 1.42.9 (28-Dec-2013)
    Filesystem features: has_journal ext_attr resize_inode dir_index filetype needs_recovery sparse_super
    Inode size:          256
    

    您可以使用tune2fs(8) 修改文件系统的功能。所有这些程序都是e2fsprogs 包的一部分。

    这些特征的初始值是在mkfs(8)时设置的。

    纳秒的实现

    ext3 无法实现纳秒精度时间戳的原因是 inode - 表示文件元数据的文件系统数据结构was originally only 128 bytes。只是没有足够的空间来提高精度。

    随着时间的推移,默认值为 256,不是为了纳秒,而是为了扩展属性。

    另一方面,ext4 从一个更大的 inode 开始,它有空间容纳纳秒级精度的时间戳。

    这一切是如何结合在一起的

    现在我们可以回答问题了。

    1. 为什么我的旧 ext3 系统支持纳秒精度?

    Ubuntu 12.04 的 mkfs 将文件系统的 inode 设置为 256 字节。

    然后它使用 ext3 挂载它,但 ext3 文件系统类型被配置为由 ext4 驱动程序处理。

    但是在挂载之后,ext4 并不关心 - 任何时间戳修改都会看到它有 256 个字节可以使用,并写入纳秒。

    1. 为什么新的 ext4 被限制为毫秒?它实际上是格式化为 ext3 吗?

    ext3 和 ext4 都不能以毫秒为单位。

    可能是你的时钟没有纳秒分辨率,你可以通过运行来检查

    date +%s.%N
    
    1. 如何找出问题所在并在新版本中启用纳秒?

    假设您的时钟具有纳秒分辨率,您可以使用上述工具dumpe2fstune2fs 来修复文件系统。

    此外,e2fsprogs' mkfs 实际上会查看/etc/mke2fs.conf,因此您可能还想在下次需要创建文件系统时检查那里的设置。

    【讨论】:

    • 感谢您的好回答 :) 日期分辨率还可以:# date +%s.%N 1585131622.550162572 文件系统似乎也可以(我认为“extra_isize”可以帮助标记精度,对吧?):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 Inode size: 256 文件戳独有的这种限制是否与主机正在使用的虚拟化有关?
    • 这个答案你应该得到更多的掌声。这是我的:)
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2014-03-20
    • 2020-03-18
    • 2011-12-30
    • 2019-08-01
    • 2017-04-22
    • 2014-10-21
    • 2015-11-06
    相关资源
    最近更新 更多