【问题标题】:How do ext2/3/4 filesystems deal with 64 bit time_t?ext2/3/4 文件系统如何处理 64 位 time_t?
【发布时间】:2020-06-01 08:29:24
【问题描述】:

我正在开发小型 ext2 文件系统映像操作工具(例如列出目录、添加和提取文件而无需挂载它)。 我刚刚遇到了 Unix 时间戳字段的问题。它们在 ext 文件系统中都是 32 位的。众所周知,32 位 Unix 时间戳在 2038 年后将不再起作用。大多数软件只需将 time_t 的定义更改为 64 位即可轻松解决此问题。但是对于文件系统来说并不是那么容易。它们需要与现有实现兼容,但需要不时更新。 ext 文件系统究竟是如何做到这一点的?特别是s_mtimes_wtimes_lastchecki_atimei_ctimei_mtimei_dtime 等字段。

【问题讨论】:

    标签: filesystems unix-timestamp ext2 year2038


    【解决方案1】:

    如果您查看ext4's inode structure,您会看到:

    struct ext4_inode {
        ...
        __le32  i_ctime;    /* Inode Change time */
        ...
        __le32  i_ctime_extra;  /* extra Change time      (nsec << 2 | epoch) */
        ...
    };
    

    你不会发现 i_ctime_extra 正在被使用 (*sigh*)。相反,你会find:

    #define EXT4_INODE_GET_XTIME(xtime, inode, raw_inode)               \
    do {                                        \
        (inode)->xtime.tv_sec = (signed)le32_to_cpu((raw_inode)->xtime);    \
        if (EXT4_FITS_IN_INODE(raw_inode, EXT4_I(inode), xtime ## _extra)) {    \
            ext4_decode_extra_time(&(inode)->xtime,             \
                           raw_inode->xtime ## _extra);     \
            }                               \
        else                                    \
            (inode)->xtime.tv_nsec = 0;                 \
    } while (0)
    
    
    #define EXT4_EINODE_GET_XTIME(xtime, einode, raw_inode)                \
    do {                                           \
        if (EXT4_FITS_IN_INODE(raw_inode, einode, xtime))              \
            (einode)->xtime.tv_sec =                       \
                (signed)le32_to_cpu((raw_inode)->xtime);           \
        else                                       \
            (einode)->xtime.tv_sec = 0;                    \
        if (EXT4_FITS_IN_INODE(raw_inode, einode, xtime ## _extra))        \
            ext4_decode_extra_time(&(einode)->xtime,               \
                           raw_inode->xtime ## _extra);        \
        else                                       \
            (einode)->xtime.tv_nsec = 0;                       \
    } while (0)
    

    如果你看一下用法,你会发现在内存中,使用了一个 64 位整数,分隔只存在于磁盘上。

    【讨论】:

    • 所以基本上他们没有使用完整的 64 位整数(在磁盘上),而是在 inode 中使用 34 位秒和 30 位纳秒。在超级块中计算 40 位秒,没有纳秒。相当混乱,但会完成这项工作(直到 2446 年)。似乎 ext2 和 ext3 被 32 位时间卡住了。
    猜你喜欢
    • 2015-07-07
    • 2021-01-10
    • 2011-01-28
    • 1970-01-01
    • 2017-08-20
    • 2016-03-19
    • 2012-04-14
    • 2012-06-28
    • 1970-01-01
    相关资源
    最近更新 更多