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

2023-11-23

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

ZFS 有类似 debugfs 的工具吗?

附言。为了更好地解释:

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

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

  • 如果我要转移到另一个 ext4 文件系统,我会使用这个很棒的工具来解决问题debugfs。具体来说,我可以在源 fs (文件系统)上创建一个(文件名,crtime)对列表,然后使用debugfs -w在目标文件系统上读取具有以下形式的行的脚本

    set_inode_field filename crtime <value>

我已经测试过这个并且效果很好。

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

  • 卖给我 NAS 盒子的人告诉我,debugfs 和 fsdb 不适用于 ZFS 文件系统,但他们无法提出等效的产品。因此,经过多次谷歌搜索和尝试之后,我终于决定今天在这里发布一个问题,希望有人能找到答案。

我很惊讶这件事变得如此困难。从档案的角度来看,如何复制数据集以使所有时间戳都相同的问题似乎很自然。


确实,两者都没有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"因为闰秒...

本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)

如何在 ZFS 中设置文件创建时间? 的相关文章

  • 根据时间戳间隔创建 csv 文件的数据框

    我相信我的问题非常简单 并且一定有一个非常简单的方法来解决这个问题 但是由于我对Python 特别是pandas很陌生 我无法自己解决它 我有数百个 csv 文件 格式如下 text 2014 02 22 13 00 00 所以格式是str
  • 是否可以用 phongeap 目录中的其他数据库文件替换现有的 sqlite 数据库文件

    我有一个要求用其他数据库文件替换设备数据库 就像备份和存储目录 下载 备份 应用程序名称 或服务器一样 如果我们删除数据或丢失手机 那么我已经从服务器恢复数据并替换为设备数据库文件 我正在尝试使用代码 但仅替换数据库我没有得到 functi
  • 如何在 Sails.js 或 Express.js 中设置本地时区

    当我在帆上创建或更新记录时 它会在 updateAt 处写入 updatedAt 2014 07 06T15 00 00 000Z 但我现在是 GMT 2 小时 在这个季节 更新是在 16 00 执行的 我的模型中声明的所有日期时间字段都有
  • 如何在linux中用c在文件中打洞以擦除数据

    更新 这个FALLOC FL PUNCH HOLE最初不支持3 0 0 17 我想我需要修补它 我知道linux有这个hole功能 我想知道是否可以在现有文件中打一个洞 具体来说 我创建了一个名为hole test通过这些代码 18 inc
  • Unix 时间戳到 FAT 时间戳

    我正在尝试将时间结构转换为 FAT 时间戳 我的代码如下所示 unsigned long Fat tm struct pTime unsigned long FatTime 0 FatTime pTime seconds 2 gt gt 1
  • 在c# Visual Studio中编译协议缓冲区3时间戳类型?

    Visual Studio 2015 C NuGet Packages Google Protobuf v3 0 0 Google Protobuf Tools v3 0 0 消息类型Quake syntax proto3 import g
  • Android 中从时间戳获取日期名称

    我有一个类 当它初始化时 它会使用公共 getter 在私有字段中记录初始化时间 public class TestClass private long mTimestamp public TestClass mTimestamp Syst
  • 将到期日期作为 TIMESTAMP 列的默认值

    有没有办法将列的默认值设置为过期日期 从CURRENT TIMESTAMP 我已经尝试过 ALTER TABLE table ADD COLUMN expire TIMESTAMP NOT NULL DEFAULT TIMESTAMPADD
  • 更改数据的时区值

    我必须导入不带时区信息的数据在其中 但是 我知道我要导入的数据的具体时区 但我需要timestamp with time zone数据库中的格式 一旦我导入它并将时间戳数据类型设置为timestamp with time zone Post
  • 如何从 ext2/ext3 文件系统上的稀疏文件中删除一些块

    当您写入稀疏文件时 ext2 ext3 文件系统会自动分配块 但是当我不再需要其中的某些块时 我发现没有办法做到这一点 感觉就像使用 malloc 而不使用 free 是否可以 释放 稀疏文件的某些块 如果是的话 怎么样 不要告诉我将其复制
  • Docker:内存文件系统

    我有一个 docker 容器 它对磁盘进行大量读 写操作 我想测试当我的整个 docker 文件系统都在内存中时会发生什么 我在这里看到一些答案说这不会是真正的性能改进 但这是为了测试 我想测试的理想解决方案是共享每个图像的公共部分 并在需
  • php 时间戳 UTC

    我有一个 PHP MySQL 查询 它将一些数据插入 MySQL 数据库 并且包含时间戳 目前INSERT查询用途NOW 对于时间戳列 它以以下格式保存在数据库中 2012 07 24 13 13 02 不幸的是 对我来说 服务器不在我的时
  • pandas 从日期时间转换为整数时间戳

    考虑 python 中的 pandas 数据框有一个名为time整数类型 我可以将其转换为datetime按照以下说明进行格式化 df time pandas to datetime df time unit s 所以现在该列有如下条目 2
  • 我们如何获取不同文件系统使用的文件分隔符?

    大家下午好 据我了解 Android 有 至少 2 个文件系统 一个用于 内部 存储 例如 data和 system 另一个用于 外部 存储 例如 mnt sdcard 这意味着当我们将文件保存到 内部 存储时 Context getFil
  • 是否从页面缓存中的脏页面进行文件读取?

    当字节写入文件时 内核不会立即将这些字节写入磁盘 而是将这些字节存储在页缓存中的脏页中 回写缓存 问题是 如果在脏页刷新到磁盘之前发出文件读取 则将从缓存中的脏页提供字节 还是首先将脏页刷新到磁盘 然后进行磁盘读取以提供字节 将它们存储在进
  • 如果 DirectoryInfo.GetFiles().Length 超过 Int32.MaxValue 怎么办?

    由另一个question https stackoverflow com questions 3766540 error on maximum number of files 3767265 3767265关于文件夹中的最大文件数 我注意到
  • ASCII“../”是 PHP 中指示目录遍历的唯一字节序列吗?

    我有一个 PHP 应用程序 它使用 GET参数来选择文件系统上的 JS CSS 文件 如果我拒绝输入字符串包含的所有请求 或者可见 7 位 ASCII 范围之外的字节 当路径传递到 PHP 的底层 基于 C 文件函数时 这是否足以防止父目录
  • Django 模型:默认日期时间未转换为 SQL CURRENT_TIMESTAMP

    我正在使用 Django 模型创建 PostgreSQL DB 我有一个 DateTimeField 我想将当前时间戳设置为默认值 我知道有多个消息来源建议如何做到这一点 但是 当我在 Django 之外检查数据库时 默认时间戳不会显示 我
  • 我可以在没有 Hadoop 的情况下使用 Spark 作为开发环境吗?

    我对大数据和相关领域的概念非常陌生 如果我犯了一些错误或拼写错误 我很抱歉 我想了解阿帕奇火花 http spark apache org 并使用它仅在我的电脑中 在开发 测试环境中 由于Hadoop包含HDFS Hadoop分布式文件系统
  • MySQL 正在将我的时间戳值转换为 0000-00-00

    我是 PHP 新手 目前仍在学习中 我认为我的注册表有问题 username password email全部成功插入MySQL registered and last seen不要 我以为我正在使用getTimestamp 错了 但它呼应

随机推荐

  • C++ unordered_set 向量

    我可以在 C 中创建向量的 unordered set 吗 像这样的东西 std unordered set
  • 如果没有参数,则针对标准输入运行的脚本;否则输入文件=ARGV[0]

    这工作得很好 只是想知道是否有任何改进可以缩短它 if ARGV 0 nil then input lt else input File new ARGV 0 r end Do something with the input here f
  • 如何建立关系模型(类似 GitHub)权限?

    tl dr 我如何实现像 例如 github 的权限模型 更新以尝试解决 philipxy 的一些评论 我计划实现一个类似于 github 的权限模型 users 用户可以分组 用户可以在组织中 团体可以在组织中 a user will b
  • 如何在java中创建代理

    他们如何创建代理class在Java中 他们是根据需要创建代理还是创建代理并永远保留它 您可以通过两种基本方式创建代理 使用JDK机制 通过接口 看一眼java lang reflect Proxy 在具体类上使用一些字节码生成 操作库 看
  • SQL:使用 UNION、ORDER BY 和 LIMIT 进行 SELECT

    我收到的错误是 ORDER by 应该出现在 UNION 之后 但我希望这些查询在合并为 1 之前排序 然后限制为 10 SELECT FROM SELECT time x y z FROM db WHERE time gt now ORD
  • 图像处理中的标准化

    图像处理中归一化的正确含义是什么 我用谷歌搜索了它 但我有不同的定义 我将尝试详细解释每个定义 核矩阵的归一化 如果归一化是指矩阵 例如卷积滤波器的核矩阵 通常将矩阵的每个值除以矩阵的值的总和 以使矩阵的值的总和等于1 如果所有值都大于零
  • 一次性设置所有 UITextField 的样式,而不是在每个 ViewController 中设置样式?

    我正在尝试像这样设置所有文本字段的样式 CGRect frameRect2 lastname field frame frameRect2 size height 30 lastname field font UIFont fontWith
  • 使用 EL 获取列表或数组中的特定元素

    是否可以在 Java EE 页面 Facelets 或 JSP 中使用 EL 获取列表或数组中的特定元素 或者我是否必须创建自定义 EL 方法 您可以使用大括号表示法 其中您指定要检索的元素的 从零开始的 索引 p This is the
  • gradle:更改默认端口 5005

    我想调试一些同时运行的 JVM 实例 我知道我可以使用 gradle 运行 debug jvm这样 JVM 就会等待 直到我启动 IDE 调试器 以便它连接到 JVM 但默认使用端口 5005 这对于调试 JVM 的一个实例来说很好 但是如
  • python中有不小于或不大于的运算吗?

    假设我有这样的代码 a 0 if a 0 or a gt 0 print a 那就是 我想做某事的时候a不是负数 我知道我可以写if a 0 检查是否a不等于0 所以 我尝试使用if a lt 0 遵循类似的逻辑 但是 这显然不受支持 gt
  • 如何根据属性合并两个列表?

    我有两份清单 一份是假的 一份是真实的 例如 BEFORE fake list 1 ID 1 Year 2011 X ID 2 Year 2012 X ID 3 Year 2013 X real list 2 ID 35 Year 2011
  • 操作栏列表导航宽度 - 换行内容

    默认情况下 在操作栏列表中 所选项目的导航宽度与最宽项目一样宽 我想在所选项目中 wrap content 因为它在 google gmail 地图 Android 应用程序中 有人知道要做什么吗 我尝试覆盖导航适配器的 getView 但
  • SQL递归查询

    我有一个表类别 1 Id2 类别名称3 类别大师 数据为 1 电脑 02 软件13 多媒体 14 动画35 健康 06 健康子 5 我创建了递归查询 WITH CategoryTree AS SELECT CAST NULL AS VARC
  • 对 Swift 数组声明感到困惑

    以下有什么区别吗 var array1 OfStrings String var array2 OfStrings String var array3 OfStrings String Playground 中的测试表明 1 和 2 相同
  • Git 无法扩展包含路径“~/.gitcinclude”,致命:/usr/local/git/etc/gitconfig 中的错误配置文件第 49 行

    我曾经在我的 OS X 机器上安装了旧版本的 Git 但后来我将系统升级到 OS X 10 11 并安装了较新版本的 Git 2 6 4 并且通过 Apache 的 Git HTTP 停止工作 我在中遇到了以下错误apache error
  • 测试训练好的 LSTM 模型后如何预测实际的未来值?

    我通过将数据集分为训练和测试来训练我的股价预测模型 我还通过将有效数据与预测数据进行比较来测试预测 并且该模型运行良好 但我想预测actual未来的价值 我需要在下面的代码中更改什么 我如何做出截至特定日期的预测actual future
  • 在 Rmarkdown 中添加内嵌图像

    我找不到在使用 RStudio 生成的 Markdown 文档中插入内联图像的方法 看起来像 RmarkDown 风格备忘单 https www rstudio com wp content uploads 2016 03 rmarkdow
  • 使用 Python 持久更改环境变量

    是否可以使用 Python 3 5 在 Windows 和 Linux 中创建和更新环境变量 以便它们得到持久化 目前我使用这个 import os os environ MY VARIABLE TRUE 然而 这似乎并没有持久地 存储 环
  • 有没有办法将 pandas 数据帧信息 - df.info() 导出到 Excel 文件中?

    我本地有一个 csv 文件 我正在用 pandas 读取文件 我想将 df info 结果移至 Excel 中 看起来 df info to excel 不起作用 因为它不受支持 有什么办法可以做到这一点吗 我尝试过 df info to
  • 如何在 ZFS 中设置文件创建时间?

    我刚刚有一台运行 ZFS 的 NAS 我想在将文件传输到其中时保留创建时间 linux ext4 数据现在所在的位置 和 zfs 都存储创建时间或出生时间 对于 zfs 甚至可以通过 stat 命令来报告 但我一直无法弄清楚如何设置文件的创