Filesystems 如何在ZFS中设置文件创建时间?

Filesystems 如何在ZFS中设置文件创建时间?,filesystems,timestamp,freebsd,inode,zfs,Filesystems,Timestamp,Freebsd,Inode,Zfs,我刚刚有一个运行ZFS的NAS,我想在向其中传输文件时保留创建时间。linux/ext4(数据现在所在的位置)和zfs都存储创建时间或出生时间。对于zfs,它甚至由stat命令报告。但我还没有弄清楚如何设置文件的创建时间,使其反映原始文件系统中的创建时间。与ext4->ext4传输不同,在ext4传输中,我可以为debugfs提供一个脚本来设置文件创建时间 是否有类似于用于ZFS的debugfs的工具 附:为了更好地解释: 我有一个USB驱动器连接到Ubuntu 14.04笔记本电脑。它包含一

我刚刚有一个运行ZFS的NAS,我想在向其中传输文件时保留创建时间。linux/ext4(数据现在所在的位置)和zfs都存储创建时间或出生时间。对于zfs,它甚至由stat命令报告。但我还没有弄清楚如何设置文件的创建时间,使其反映原始文件系统中的创建时间。与ext4->ext4传输不同,在ext4传输中,我可以为debugfs提供一个脚本来设置文件创建时间

是否有类似于用于ZFS的debugfs的工具

附:为了更好地解释:

  • 我有一个USB驱动器连接到Ubuntu 14.04笔记本电脑。它包含一个文件系统,我关心单个文件的创建日期(出生日期)。我经常使用基于debugfs的脚本查看这些创建时间戳,该脚本将其报告为crtime

  • 我想将数据移动到运行ZFS的NAS盒中,但我知道的方法(scp-p-r、rsync-a和tar,以及我尝试过的其他方法)保留了修改时间,而不是创建时间

  • 如果我转移到另一个ext4文件系统,我会使用奇妙的工具
    debugfs
    来解决这个问题。具体地说,我可以在源fs(文件系统)上列出(filename,crtime)对,然后在目标fs上使用
    debugfs-w
    读取带有表单行的脚本

    set\u inode\u字段文件名crtime

我已经测试过了,效果很好

  • 但是我的目标fs不是ext4,而是ZFS,尽管
    debugfs
    在目标机器上运行,但它在那里完全没有用处。它甚至不认识fs。另一个可以通过直接编辑inode来更改时间戳的调试工具是fsdb;它也在目标机器上运行,但我似乎无法让它识别ZFS文件系统

  • 卖给我NAS盒的人告诉我,debugfs和fsdb不适用于ZFS文件系统,但他们还没有找到一个等价物。所以,在谷歌搜索和尝试了很多东西之后,我终于决定今天在这里发布一个问题,希望有人能找到答案


我很惊讶这是多么困难。从存档的角度来看,如何复制数据集以使所有时间戳都相同的问题似乎很自然。

事实上,无论是
fsdb
还是
debugfs
都不可能适合与ZFS一起使用。您可能需要做的是找到一种存档格式,该格式将保留
crtime
字段,该字段可能已经为文件服务器上的文件设置好了。如果您的系统有一个版本或另一个存档工具,它可能能够做到这一点(参见
-pe
“保存所有内容”标志,在当前版本中,它似乎不保存“所有内容”即不保存
crtime
/birth\u time)。您可能会更成功地找到一个“
crtime
aware”的归档应用程序,而不是尝试使用可能是基本工具的工具在基于ZFS的FreeBSD系统上进行黑客攻击来设置创建时间

您可能会在基于或(例如)的系统上找到更高级的工具。是否可以将您的数据传输到其中一个平台上的ZFS数据集,然后将它们拥有的工具结合起来,例如,以重写
crtime
字段,这更多是一个理论问题。如果成功,那么您可以将池及其数据集导出到FreeBSD-导出池似乎保留了
crtime
时间戳。如果您能够在将ext4文件系统转储到同一主机上的数据集时保留
crtime
(注意:我没有测试过这一点),那么您可以使用
zfs send
将整个文件系统传输到NAS

这可能有助于了解Linux上用户和操作系统级工具的状态。可以说,inode的文件系统级别
crtime
字段应该很难更改。虽然FreeBSD上的ZFS支持“
crtime
,但FreeBSD上的低级文件系统调试工具的状态可能跟不上早期版本(参见手册页)。是否确实要“设置”(或重置)索引节点创建时间?或者,在已支持它们的系统上设置它们之后,是否要保留它们

在FreeBSD系统上,如果您
stat
存储在ZFS数据集上的文件,您通常会注意到文件的
crtime
字段设置为与
ctime
字段相同的时间。这可能是因为编写文件的应用程序在文件“出生”并创建其inode条目时,没有访问设置
crtime
所需的库函数和内核函数。有一些应用程序/库尝试在应用程序级别保留
crtime
,例如(另请参见:)并在不支持
crtime
字段的文件系统上还原存档时优雅地处理inode创建。但这可能与你的情况无关

正如您可能想象的那样,有很多应用程序将文件写入文件系统。。。尤其是在Unix/POSIX系统中,“一切都是文件”。我不确定旧的应用程序是否需要修改或重新编译以支持这些字段,或者它们是否会从主机系统的C库中透明地获取这些字段。例如,在较旧的FreeBSD版本上或在没有ext4的Linux系统上使用的应用程序可以在最新的操作系统上以兼容模式运行,但它们是否能够正确处理时间字段是一个好问题

对于我来说,以
sh birthdime\u test
的身份运行这个小脚本可以确认在我的FreeBSD系统(所有系统都使用ZFS post
v28#!/bin/sh
#birthtime_test
uname -r 
if [ -f new_born ] ; then rm -f new_born ; fi

touch new_born 
sleep 3 
touch -a new_born
sleep 3 
echo "Hello from new_born at:" >> new_born 
echo `date` >> new_born
sleep 3 
chmod o+w new_born

stat -f "Name:%t%N
Born:%t%SB
Access:%t%Sa
Modify:%t%Sm 
Change:%t%Sc" new_born

cat new_born
9.2-RELEASE-p10
Name:   new_born
Born:   May  7 12:38:35 2015
Access: May  7 12:38:38 2015
Modify: May  7 12:38:41 2015 
Change: May  7 12:38:44 2015
Hello from new_born at:
Thu May 7 12:38:41 EDT 2015
~/ % touch -d "1970-01-01T00:00:01" new_born                
~/ % stat -f "Name:%t%N   
Born:%t%SB
Access:%t%Sa
Modify:%t%Sm
Change:%t%Sc" new_born
Name:   new_born
Born:   May  7 12:38:35 2015
Access: Jan  1 00:00:01 1970
Modify: Jan  1 00:00:01 1970 
Change: May  7 13:29:37 2015