确实,两者都没有fsdb
nor debugfs
可能适合与 ZFS 一起使用。您可能需要做的是找到一种能够保存的存档格式crtime
可能已为文件服务器上的文件设置的字段。如果有一个版本pax或您系统的其他归档工具也许可以做到这一点(cf. the -pe
“保护一切”标志pax
在当前版本中似乎是这样not保留“一切”——viz.它不保留crtime
/出生时间)。您可能会更成功地找到“crtime
意识到”,而不是尝试通过使用可能是基本工具的基于 ZFS 的 FreeBSD 系统进行黑客攻击来设置创建时间。
您也许可以找到更高级的工具开放Solaris基于系统,如Illumos or SmartOS (e.g. mdb)。是否可以将您的数据传输到这些平台之一上的 ZFS 数据集,然后将他们拥有的工具与其他工具相结合,例如:dtrace为了重写crtime
场更多的是一个理论问题。如果它有效,那么您可以将池及其数据集导出到 FreeBSD - 导出池似乎确实保留了crtime
时间戳。如果你are能够保存crtime
将 ext4 文件系统转储到ZFSonLinux数据集在同一主机上 (nb:我还没有测试过这个)你可以使用zfs send
将整个文件系统传输到您的 NAS。
This 核心实用程序错误报告可能会揭示 Linux 上用户和操作系统级工具的状态。可以说是文件系统级别crtime
索引节点的字段should很难改变。而ZFS在 FreeBSD 上“支持”crtime
,FreeBSD 上的低级文件系统调试工具的状态可能无法跟上早期版本的步伐(cf. the zdb手册页)。您确定要“设置”(或重置)inode 创建时间吗?或者您想在将它们设置在已经支持它们的系统上后保留它们吗?
在 FreeBSD 系统上,如果您stat
存储在 ZFS 数据集上的文件您经常会注意到crtime
文件的字段设置为与ctime
场地。这可能是因为写入文件的应用程序无权访问设置所需的库和内核函数crtime
当文件“诞生”并且其索引节点条目被创建时。有一些尝试保留的应用程序/库的示例crtime
在应用程序级别,例如libarchive(3)(也可以看看:archive_entry_atime(3)),如果存档在不支持的文件系统上恢复,则可以优雅地处理 inode 创建crtime
场地。但这可能与您的情况无关。
正如您可能想象的那样,有很多应用程序将文件写入文件系统......尤其是“一切都是文件”的 Unix/POSIX 系统。我不确定旧的应用程序是否需要修改或重新编译以支持这些字段,或者它们是否会从主机系统的 C 库中透明地获取它们。例如,在旧版 FreeBSD 版本或没有 ext4 的 Linux 系统上使用的应用程序可以在最新操作系统上以兼容模式运行,但它们是否能够正确处理时间字段是一个很好的问题。
对我来说运行这个小脚本sh birthtime_test
确认文件创建时间在我的 FreeBSD 系统上“打开”(所有系统都使用 ZFS postv28
i.e.带功能标志):
#!/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
Output:
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
(注:chmod
操作“更改”但不“修改”文件内容 - 这就是echo
命令通过向文件添加内容来完成。请参阅touch
手册页的解释-m
and -a
标志)。
这是我目前可以访问的最古老的 FreeBSD 版本。我很想知道 FreeBSD 在发布周期的多久之前能够处理这个问题(在 ZFS 或 UFS2 文件系统上)。我很确定这个功能已经存在很长一段时间了。还有 OSX 和 Linux 版本的 ZFS,了解此功能会很有用。
还有一件事 ...
Here is an especially nice feature for simple "forensics". Say we want to send our new_born
file back to when time began, back to the leap second that never happened and when - in a moment of timeless time - Unix was born ... :-) 1. We can just change the date using touch -d
and everyone will think new_born
is old and wise, right?
Nope:
~/ % 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
实际情况总是更真实be和你看起来一样年轻:-)
时间和 Unix - 一个既实用又富有诗意的主题:毕竟,什么是“变化”; “修改”或“创建”某物是什么意思?感谢西尔维奥(Silvio)的精彩帖子 - 我希望它继续存在并收集有用的答案。
如果您可以更具体地了解文件时间戳字段的保存、设置和归档的要求,您可以改进和概括您的问题。不要误会我的意思:这是一个非常好的问题,并且将在很长一段时间内继续获得投票。
你可以看看 Dylan Leigh 的演讲ZFS 的取证时间戳分析甚至联系 Dylan 获取有关如何访问的线索crftime
信息。
也可以看看:扩展 Sleuth Kit 及其底层模型以进行池存储文件系统取证分析
[1] 有一个传说,一开始就声称,很久以前(SSL)的秒数从来不小于date -u -j -f "%Y-%m-%d:%T" "1970-01-01:00:00:01" "+%s"
因为闰秒...