[Suggestions for Improvement] 保留文件创建时间'crtimes',LINUX核心级别问题有待解决
Tofloor
poster avatar
深圳市耀影科技有限公司
deepin
2023-11-09 06:15
Author

就像以下链接所说,这是一个影响很多人的一个核心问题,DEEPING团队是否能解决?

你好,谢谢你的帮助。

我正在尝试从Windows-7转移到Debian测试。

从Windows XP复制到Linux EXT4时,如何保留“crtime”(创建/出生时间)?

我试图将文件从Windows-7 XP计算机复制到Debian/testing/Buster EXT 4计算机(内核版本4.14)。
不幸的是,原始的“创建/出生时间”在此复制过程中丢失。
相反,复制文件的“创建/出生时间”被更改为复制时间。

下面是我尝试过的:​在Windows-7计算机上,将文件(包括创建/出生时间,“crtime”)复制到U盘:

<插件USB盘,E:驱动器>
<格式化USB记忆棒到USB>
robocopy C:\TEST E:\TEST /MIR /COPYALL /DCOPY:T /SECFIX /TIMFIX
<使用“Windows资源管理器”验证NTRF USB记忆棒上的正确文件创建时间(“crtime”)>
<在>

Debian/testing/Buster计算机上,从U盘复制文件(包括创建/出生时间,“crtime”):

<插入式USB记忆棒>
rsync -avzhHEA --/TEST ~

使用rsync检查从NTFS复制到EXT4的文件上的“crtime”:

sudo debugfs -R 'stat /home/user/TEST/file'设备>

“debugfs”报告“crtime”(创建/出生时间)、“ctime”和“atime”在复制到EXT4时都已更改。它们不是Windows XP的值。
只有“mtime”(上次修改时间)是正确的Windows时间值。

所以这个程序无法复制原始的“crtime”。
相反,它将“crtime”更改为将文件复制到EXT4的时间。(此外,当复制到EXT 4时,“ctime”和“atime”也发生了变化。只保留了“mtime”。)

进一步调查:
我把“rsync”替换成了“cp -p”。“cp -p”也不能保存“crtime”。所以这个问题并不是“rsync”独有的。

接下来,我查看了文件系统。这两个&EXT4文件系统都支持“创建时间戳”(https://en.wikipedia.org/wiki/Compare. f_file_systems)。
所以文件系统不是问题所在。

接下来,我查看了内核:
2010年:关于将“crtime”添加到kernel/stat的讨论被搁置了5年,直到2015年(http://lists.gnu.org/archive/html/co.../ msg00047.html)。
2016年:“crtime”(创建/出生时间)添加到内核/stat版本4.11(https://git.kernel.org/pub/scm/linux. 3e1bd296c8493f)。
所以内核应该在2018年的今天处理“crtime”。

总结:
读取“crtime”的功能于2016年添加到内核版本4.11中。
现在是2018年,我使用的是内核版本4.14。
因此,访问“crtime”的能力应该存在于内核中。
这两个文件系统(EXT 3和EXT4)都支持“crtime”。
我已经验证了“crtime”存在并且正确的文件包含在USB闪存盘上。
我已经指示“rsync”和“cp”将所有文件参数复制到EXT4 Linux计算机。
然而,复制到EXT 4的文件无法保留其原始创建/出生时间(crtime)。

我做错了什么?
是否有需要安装的内核模块或软件包?
如何在从EXT4复制到EXT4时保留“crtime”(创建/出生时间)?

谢谢你的帮助

https://www.linux.org/threads/ls-l-command-timestamps.36027/#post-131498

https://www.linuxquestions.org/questions/linux-newbie-8/how-do-i-preserve-crtime-creation-birth-time-when-copying-from-windows-ntfs-to-linux-ext4-4175625229/

https://github.com/WayneD/rsync/issues/166

https://unix.stackexchange.com/questions/591384/copying-or-restoring-crtime-for-files-directories-on-ext4fs-filesystem

https://unix.stackexchange.com/questions/636160/why-rsync-on-linux-does-not-preserve-all-timestamps-creation-time#

Reply Favorite View the author
All Replies
深圳市耀影科技有限公司
deepin
2023-11-09 06:17
#1

https://github.com/WayneD/rsync/issues/166#issuecomment-812968810

rsync

rsync does not support --crtimes (-N) 是一个保留创建时间的参数,但是支持 MAC WINDOWS,由于LINUX内核问题,不支持

Reply View the author
核桃
deepin
2023-11-09 06:44
#2

Linux文件系统没有create time这个概念,

$ sudo stat 123
File: 123
Size: 0 Blocks: 0 IO Block: 4096 regular empty file
Device: 259,5 Inode: 1310790 Links: 1
Access: (0644/-rw-r--r--) Uid: ( 0/ root) Gid: ( 0/ root)
Access: 2023-11-08 22:38:47.265222159 +0800
Modify: 2023-11-08 22:38:47.265222159 +0800
Change: 2023-11-08 22:43:19.161030698 +0800
Birth: 2023-11-08 22:38:47.265222159 +0800

如果你想保留windows的文件的create time,那么可以考虑使用扩展属性的方式进行保留

$ sudo attr -s ctime -V 20231108 123

Attribute "ctime" set to a 8 byte value for 123: 20231108

$ sudo attr -g ctime 123
Attribute "ctime" had a 8 byte value for 123:
20231108

Reply View the author
深圳市耀影科技有限公司
deepin
2023-11-09 06:58
#3
核桃

Linux文件系统没有create time这个概念,

$ sudo stat 123
File: 123
Size: 0 Blocks: 0 IO Block: 4096 regular empty file
Device: 259,5 Inode: 1310790 Links: 1
Access: (0644/-rw-r--r--) Uid: ( 0/ root) Gid: ( 0/ root)
Access: 2023-11-08 22:38:47.265222159 +0800
Modify: 2023-11-08 22:38:47.265222159 +0800
Change: 2023-11-08 22:43:19.161030698 +0800
Birth: 2023-11-08 22:38:47.265222159 +0800

如果你想保留windows的文件的create time,那么可以考虑使用扩展属性的方式进行保留

$ sudo attr -s ctime -V 20231108 123

Attribute "ctime" set to a 8 byte value for 123: 20231108

$ sudo attr -g ctime 123
Attribute "ctime" had a 8 byte value for 123:
20231108

但是EXT4文件系统他有一个创建时间,与文件系统有关

这是一个特定文件的“诞生”时间-它在文件系统上创建的时刻。此属性是ext4中的新属性,也称为crtime或btime

https://unix.stackexchange.com/questions/50177/birth-is-empty-on-ext4

  • EXT4文件系统支持“创建时间戳”(https://en.wikipedia.org/wiki/Compare. f_file_systems)。
  • 所以文件系统不是问题所在。
  • 内核:2010年:关于将“crtime”添加到kernel/stat的讨论被搁置了5年,直到2015年(http://lists.gnu.org/archive/html/co.../ msg00047.html)。2016年:“crtime”(创建/出生时间)添加到内核/stat版本4.11(https://git.kernel.org/pub/scm/linux. 3e1bd296c8493f)。所以内核应该在2018年处理“crtime”。

图片.png

Reply View the author
核桃
deepin
2023-11-09 07:21
#4

你说的是birth time这个吧, 文件系统有birth time, 但是默认并不会是用户带进去的, 我记得这个参数是没法由用户来控制的。我可以查一下内核ext4的源码看看,还有看看能否设置birth time的方式
Screenshot_select-area_20231108230946.png

Reply View the author
核桃
deepin
2023-11-09 07:26
#5

https://unix.stackexchange.com/questions/556040/change-file-birth-date-for-ext4-files

birth time其实并不属于stat标准的语义需求里面的,也就是可以默认不实现。同时根据目前的源码来看,就是文件系统也没有提供对外可以修改birth time信息的。

Reply View the author
深圳市耀影科技有限公司
deepin
2023-11-09 07:31
#6
核桃

https://unix.stackexchange.com/questions/556040/change-file-birth-date-for-ext4-files

birth time其实并不属于stat标准的语义需求里面的,也就是可以默认不实现。同时根据目前的源码来看,就是文件系统也没有提供对外可以修改birth time信息的。

  • 所以希望DEEPIN能从LINUX内核解决这个问题,合并到上游,以下Ext4磁盘的结构信息。
  • 现在文件系统支持,内核也支持,只是系统层面没有标准提供一个接口。

图片.png

inode结构的低128字节中记录了四个时间戳-- inode更改时间(ctime)、访问时间(atime)、数据修改时间(mtime)和删除时间(dtime)。 这四个字段是32位有符号整数,表示自Unix纪元(1970-01-01 00:00:00 GMT)以来的秒数,这意味着这些字段将在2038年1月溢出。 对于未从任何目录链接但仍处于打开状态的inode(孤立inode),dtime字段将被重载以用于孤立列表。 超级块字段s_last_orphan指向孤儿列表中的第一个inode; dtime则是下一个孤儿inode的编号,如果没有更多的孤儿,则为零。

如果索引节点结构大小sb->s_inode_size大于128字节并且i_inode_extra字段大到足以包含相应的i_[cma]time_extra字段,则ctime、atime和mtime索引节点字段被加宽到64位。 在这个“额外的”32位字段中,低两位用于将32位秒字段扩展为34位宽;高30位用于提供纳秒时间戳精度。 因此,时间戳在2446年5月之前不会溢出。 dtime没有加宽。 还有第五个时间戳记录inode创建时间(crtime);这个字段是64位宽的,并以与64位[cma]时间相同的方式进行解码。

Reply View the author
核桃
deepin
2023-11-09 07:37
#7
深圳市耀影科技有限公司
  • 所以希望DEEPIN能从LINUX内核解决这个问题,合并到上游,以下Ext4磁盘的结构信息。
  • 现在文件系统支持,内核也支持,只是系统层面没有标准提供一个接口。

图片.png

inode结构的低128字节中记录了四个时间戳-- inode更改时间(ctime)、访问时间(atime)、数据修改时间(mtime)和删除时间(dtime)。 这四个字段是32位有符号整数,表示自Unix纪元(1970-01-01 00:00:00 GMT)以来的秒数,这意味着这些字段将在2038年1月溢出。 对于未从任何目录链接但仍处于打开状态的inode(孤立inode),dtime字段将被重载以用于孤立列表。 超级块字段s_last_orphan指向孤儿列表中的第一个inode; dtime则是下一个孤儿inode的编号,如果没有更多的孤儿,则为零。

如果索引节点结构大小sb->s_inode_size大于128字节并且i_inode_extra字段大到足以包含相应的i_[cma]time_extra字段,则ctime、atime和mtime索引节点字段被加宽到64位。 在这个“额外的”32位字段中,低两位用于将32位秒字段扩展为34位宽;高30位用于提供纳秒时间戳精度。 因此,时间戳在2446年5月之前不会溢出。 dtime没有加宽。 还有第五个时间戳记录inode创建时间(crtime);这个字段是64位宽的,并以与64位[cma]时间相同的方式进行解码。

这几乎很难,因为文件系统的接口修改很难通过审核的,而且不符合语义。 对于这种问题,任何一个操作系统,不管是ubuntu还是 deepin这些都是无法解决的。

如果真的想搞,那就自定义文件系统的,就是用rust自研一套单机引擎来适配,但是为了这样一个问题去自研引擎成本太大而且不值得。

Reply View the author
核桃
deepin
2023-11-09 07:38
#8

另外我也很好奇,目前什么场景下,会因为ctime这个导致系统有问题的? 因为开源的分布式系统中,基本上也很少有去读取ctime信息的。如果是系统迁移的话,感觉问题不大。

当然最苯的方法之一,可以考虑写 一个脚本读取出windows文件的ctime,然后这linux的文件扩展属性中添加上。

Reply View the author
深圳市耀影科技有限公司
deepin
2023-11-09 07:59
#9
核桃

另外我也很好奇,目前什么场景下,会因为ctime这个导致系统有问题的? 因为开源的分布式系统中,基本上也很少有去读取ctime信息的。如果是系统迁移的话,感觉问题不大。

当然最苯的方法之一,可以考虑写 一个脚本读取出windows文件的ctime,然后这linux的文件扩展属性中添加上。

  • crtime和dtime都不能通过常规的stat()接口访问,尽管debugfs会报告它们。
  • 也许很难通过,但是这不是搁置很久啦吗,现在Linux用户量也大大提升,提交代码,上游不合并,我们也可以国产化特色,完全实现社区根。
  • 创建时间会记录你 原始时间戳,丢失我所有的crtimes就像告诉考古学家所有的日期记录都要被删除

在之前的 内核和文件系统 Linux确实没有这个概念,但是目前都加进去啦,却没有提供接口

图片.png

图片.png

Reply View the author
核桃
deepin
2023-11-09 22:19
#10
深圳市耀影科技有限公司
  • crtime和dtime都不能通过常规的stat()接口访问,尽管debugfs会报告它们。
  • 也许很难通过,但是这不是搁置很久啦吗,现在Linux用户量也大大提升,提交代码,上游不合并,我们也可以国产化特色,完全实现社区根。
  • 创建时间会记录你 原始时间戳,丢失我所有的crtimes就像告诉考古学家所有的日期记录都要被删除

在之前的 内核和文件系统 Linux确实没有这个概念,但是目前都加进去啦,却没有提供接口

图片.png

图片.png

首先这并不是一个标准的需求,因为birth time这个实现,目前Linux系统中有nfs, xfs, btrfs等文件系统,因此只是部分文件系统实现了该功能,不代表其他的都有,因此如果提交代码到上游,需要所有文件系统都有一个这样的接口实现,目前来看应该很难。

如果真的想做,我更加建议从ext4的生态工具入手,我记得ext4有一些如ext4 slower这样的小工具的,不作为主线分支的功能进行实现。

另外从你的描述来看,实际生产中真的没有强需求要实现那样的特性。而且从其他角度来看,如果可以修改birth time,那么就容易被篡改信息,反而造成更混乱的情况出现。

Reply View the author
核桃
deepin
2023-11-09 22:22
#11

对了,有一种做法或许可以满足你,我记得类似xfs文件系统中,可以通过xdb来绕过文件系统的检查来修改文件元数据信息的,如果你真的想弄,可以从这方面入手,但是会很危险,个人也并不提议这样处理。

总的来说,这样一个问题会破坏掉向前兼容,而且实际生产暂时没有需求的情况下,并不会太担心这些问题。

Reply View the author
核桃
deepin
2023-11-09 22:25
#12

此外分享一下,我本人是分布式存储研发,做自研单机存储引擎的,目前很多自研的存储系统中,甚至都不会实现标准的时间格式,例如有些会去掉atime时间,更别提会记录birth time时间了。当然birth time也可能会隐藏到内部字段实现不暴露。所以对于这些时间格式的要求,真的不是大问题。

Reply View the author
深圳市耀影科技有限公司
deepin
2023-11-09 23:22
#13
核桃

此外分享一下,我本人是分布式存储研发,做自研单机存储引擎的,目前很多自研的存储系统中,甚至都不会实现标准的时间格式,例如有些会去掉atime时间,更别提会记录birth time时间了。当然birth time也可能会隐藏到内部字段实现不暴露。所以对于这些时间格式的要求,真的不是大问题。

https://unix.stackexchange.com/questions/50177/birth-is-empty-on-ext4

- 请注意,xstat()最终已经被添加到Linux中,所以GNU libc和找到对它的添加支持只是时间问题。

**有这么一个工具 **

    • 作者原话: 提的是,我觉得有点学究气,所以写了一个bash包装器围绕stat,使用debugfs从底层的ext4文件系统(如果可用的话)获取crtime,以静默地支持crtime。我希望它是健壮的。在这里找到它

请注意,修复表面上是在Linux的todo列表中,如该脚本中所记录的那样。因此,这个包装器只有一个名义上的生命周期,直到完成这一点,更多的是一个练习,在什么是可行的。

stat现在在文件系统支持时打印文件创建时间, 在glibc = 2.28和kernel = 4.11的GNU Linux系统上。

% stat --version
stat (GNU coreutils) 8.31
Copyright (C) 2019 Free Software Foundation, Inc.
License GPLv3+: GNU GPL version 3 or later .
This is free software: you are free to change and redistribute it.
There is NO WARRANTY, to the extent permitted by law.

Written by Michael Meskes.
% stat /
  File: /
  Size: 4096            Blocks: 8          IO Block: 4096   directory
Device: b302h/45826d    Inode: 2           Links: 17
Access: (0755/drwxr-xr-x)  Uid: (    0/    root)   Gid: (    0/    root)
Access: 2019-06-06 20:03:12.898725626 +0900
Modify: 2019-05-28 05:15:44.452651395 +0900
Change: 2019-05-28 05:15:44.452651395 +0900
 Birth: 2018-06-07 20:35:54.000000000 +0900


下面是 statx的演示,其中userland还没有赶上(旧的glibc或coreutils)。在C程序中直接调用系统调用并不容易。通常glibc提供了一个包装器,使这项工作变得容易,但幸运的是,@whotwagner编写了一个示例C程序,展示了如何在x86和x86-64系统上使用 statx(2)系统调用。它的输出格式与 stat的默认格式相同,没有任何格式选项,但可以简单地修改它以仅打印出生时间。(If如果你有一个足够新的glibc,你就不需要这个了-你可以直接使用 statx,如man 2 statx中所述)。

First, clone it:首先,克隆它:

git clone https://github.com/whotwagner/statx-fun

您可以编译 statx.c代码,或者,如果您只想要出生时间,请使用以下代码在克隆目录中创建 birth.c(这是 statx.c的最小版本,仅打印创建时间戳,包括纳秒精度):

#define _GNU_SOURCE
#define _ATFILE_SOURCE
#include 
#include 
#include 
#include 
#include 
#include "statx.h"
#include 
#include 
#include 

// does not (yet) provide a wrapper for the statx() system call
#include 

/* this code works ony with x86 and x86_64 */
#if __x86_64__
#define __NR_statx 332
#else
#define __NR_statx 383
#endif

#define statx(a,b,c,d,e) syscall(__NR_statx,(a),(b),(c),(d),(e))

int main(int argc, char *argv[])
{
    int dirfd = AT_FDCWD;
    int flags = AT_SYMLINK_NOFOLLOW;
    unsigned int mask = STATX_ALL;
    struct statx stxbuf;
    long ret = 0;

    int opt = 0;

    while(( opt = getopt(argc, argv, "alfd")) != -1)
    {
        switch(opt) {
            case 'a':
                flags |= AT_NO_AUTOMOUNT;
                break;
            case 'l':
                flags &= ~AT_SYMLINK_NOFOLLOW;
                break;
            case 'f':
                flags &= ~AT_STATX_SYNC_TYPE;
                flags |= AT_STATX_FORCE_SYNC;
                break;
            case 'd':
                flags &= ~AT_STATX_SYNC_TYPE;
                flags |= AT_STATX_DONT_SYNC;
                break;
            default:
                exit(EXIT_SUCCESS);
                break;
        }
    }

    if (optind >= argc) {
        exit(EXIT_FAILURE);
    }

    for (; optind < argc; optind++) {
        memset(&stxbuf, 0xbf, sizeof(stxbuf));
        ret = statx(dirfd, argv[optind], flags, mask, &stxbuf);
        if( ret < 0)
        {
            perror("statx");
            return EXIT_FAILURE;
        }
        printf("%lld.%u\n", *&stxbuf.stx_btime.tv_sec, *&stxbuf.stx_btime.tv_nsec);
    }
    return EXIT_SUCCESS;
} 

Then:然后又道:

$ make birth
$ ./birth ./birth.c
1511793291.254337149
$ ./birth ./birth.c | xargs -I {} date -d @{}
Mon Nov 27 14:34:51 UTC 2017

从理论上讲,这应该可以在更多的文件系统上访问创建时间,而不仅仅是ext* 文件系统(debugfs是一个用于ext 2/3/4文件系统的工具,在其他文件系统上无法使用)。它确实适用于XFS系统,但不适用于XFS和exfat。我猜FUSE文件系统不包括创建时间。

Reply View the author
深圳市耀影科技有限公司
deepin
2023-11-09 23:24
#14
核桃

对了,有一种做法或许可以满足你,我记得类似xfs文件系统中,可以通过xdb来绕过文件系统的检查来修改文件元数据信息的,如果你真的想弄,可以从这方面入手,但是会很危险,个人也并不提议这样处理。

总的来说,这样一个问题会破坏掉向前兼容,而且实际生产暂时没有需求的情况下,并不会太担心这些问题。

从GNU coreutils的8.31版本开始,stat>“现在在glibc = 2.28和kernel = 4.11的GNU Linux系统上,在文件系统支持时打印文件创建时间。>”

我的操作系统(Ubuntu 20.04,带有Linux内核5.4.0-28和GLIBC 2.31)只带有GNU coreutils 8.30,所以我必须从源代码编译GNU coreutils 8.32版本来验证。

输出 ls -l --time=birth --time-style=full-iso --no-group:
`

$ ls -l --time=birth --time-style=full-iso --no-group
total 13477610
-rwxr--r-- 1 systemd-coredump 13801071714 2017-06-30 04:53:33.211517792 -0400  file

btrfs文件系统上的stat输出:

$ stat file
  File: /mnt/btrfs/file
  Size: 13801071714 Blocks: 26955224   IO Block: 4096   regular file
Device: 33h/51d Inode: 4998        Links: 1
Access: (0744/-rwxr--r--)  Uid: (  999/systemd-coredump)   Gid: (  999/systemd-coredump)
Access: 2020-05-04 12:21:51.640487614 -0400
Modify: 2016-01-19 10:32:19.272000000 -0500
Change: 2017-06-30 04:55:14.910839537 -0400
 Birth: 2017-06-30 04:53:33.211517792 -0400

(奇怪的是,我无法使用虚拟ext4文件系统在Arch Linux上显示任何出生时间,尽管它满足了所有上述要求。


旧答案:

从GNU coreutils的8.32版(稳定版)开始,statls都使用statx调用。

ls will show the creation/birth time.​ls将显示创建/出生时间。

** New Features** 新功能

ls now supports the --time=birth option to display and sort by
file creation time, where available.
ls现在支持--time=birth选项来显示和排序
文件创建时间(如果可用)。

And presumably, stat will too.
stat

改进

stat和ls现在使用statx()系统调用, 可以 通过仅检索请求, 美德.先知-愿

它是全新的,刚刚在2020年3月5日发布,所以它可能需要一段时间才能滴下来,除非你使用的是像Arch Linux这样的前沿发行版。(Arch Linux于2020年4月1日获得了coreutils软件包的8.32-1版本)。

Reply View the author
深圳市耀影科技有限公司
deepin
2023-11-09 23:51
#15

LINUX为ext4 fs文件系统上的文件/目录恢复crtime(文件创建时间)

我想知道是否有方法在2020年为Linux中的inodes/文件/目录复制或恢复crtime(创建时间)。我不小心删除了一个文件夹,而我仍然有一个完整的磁盘备份,但无论是cp -a,还是rsync可以恢复/复制文件/目录crtimes。

我已经找到了一种方法来实现它使用debugfs,但它是超级复杂的,我需要自动化它(我有数百个删除的文件/目录)。

对于源磁盘,请执行以下操作:

# debugfs /dev/sdXX
# stat /path
Inode: 432772   Type: directory    Mode:  0700   Flags: 0x80000
Generation: 3810862225    Version: 0x00000000:00000006
User:  1000   Group:  1000   Project:     0   Size: 4096
File ACL: 0
Links: 5   Blockcount: 8
Fragment:  Address: 0    Number: 0    Size: 0
 ctime: 0x5db96479:184bb16c -- Wed Oct 30 15:22:49 2019
 atime: 0x5b687c70:ee4dff18 -- Mon Aug  6 21:50:56 2018
 mtime: 0x5db96479:184bb16c -- Wed Oct 30 15:22:49 2019
crtime: 0x5b687c70:d35d1348 -- Mon Aug  6 21:50:56 2018
Size of extra inode fields: 32
Extended attributes:
  security.selinux (40)
EXTENTS:
(0):1737229

记住crtime,这是两个字段,crtime_lo(是的,第一个)和crtime_hi(第二个)

然后,对于目标磁盘,您执行以下操作:

# debugfs -w /dev/sdYY
# set_inode_field /path crtime_lo 0x${1st_value_from_earlier}
# set_inode_field /path crtime_hi 0x${2nd_value_from_earlier}

也许在调试手册中我还缺少一些东西,可以帮助我做到这一点,所以如果有人能帮助我,我会很高兴。

-f cmd_file当然似乎是一个很好的开始方式,但对我来说仍然有点太难了。

Reply View the author
深圳市耀影科技有限公司
deepin
2023-11-10 00:01
#16
核桃

首先这并不是一个标准的需求,因为birth time这个实现,目前Linux系统中有nfs, xfs, btrfs等文件系统,因此只是部分文件系统实现了该功能,不代表其他的都有,因此如果提交代码到上游,需要所有文件系统都有一个这样的接口实现,目前来看应该很难。

如果真的想做,我更加建议从ext4的生态工具入手,我记得ext4有一些如ext4 slower这样的小工具的,不作为主线分支的功能进行实现。

另外从你的描述来看,实际生产中真的没有强需求要实现那样的特性。而且从其他角度来看,如果可以修改birth time,那么就容易被篡改信息,反而造成更混乱的情况出现。

参考:https://unix.stackexchange.com/questions/7562/what-file-systems-on-linux-store-the-creation-time

  • 有几个文件系统存储文件创建时间,尽管该字段没有标准名称:
  • ufs2 → st_birthtime
  • zfs → crtime
  • ext4 → crtime
  • btrfs → otime
  • jfs → di_otime
  • XFS v5 → di_ctime https://git.kernel.org/pub/scm/fs/xfs/xfs-documentation.git/tree/design/XFS_Filesystem_Structure/ondisk_inode.asciidoc
Reply View the author
深圳市耀影科技有限公司
deepin
2024-03-01 11:13
#17

在Windows中,我们使用https://github.com/mart-wu/Ext3Fsd挂载ext4分区。然后,ext分区就像本地分区一样安装在windows系统上,并像windows一样正常访问,

这时候我们可以使用windows下的一些软件,比如:rsync、SyncToy、UrBackup等可以保留文件创建时间的软件在windows下,我们将ntfs文件同步到EXT4,比较它们的创建时间,然后挂载到ext4中的deeping Linux系统,比较它们的创建时间,已经保持同步。

Windows可以通过github mart-wu/Ext 3Fsd保存创建时间,但Linux不能。

ext 2fsd仍然是实验性的,可能会导致数据丢失/fs损坏,它不支持现代ext4功能,需要安装Windows。还有一个更新的版本,尽管它没有签名,需要禁用安全靴子和驱动程序签名验证:https://github.com/bobranten/Ext4Fsd

  • 它不支持启用64位ext4,只需关闭它。到目前为止,Linux内核还没有添加一个接口来修改创建时间,只有一个访问接口,但这是目前发现的唯一一个快速解决方案,可以保持ext4迁移和备份的创建(ext 到ext4,Windows到 Linux)
Reply View the author