une2fs:创建日期是在哪个时区?是否可以更改?

une2fs:创建日期是在哪个时区?是否可以更改?

我一直在使用une2fs来确定我的Linux发行版安装的年龄,但不知道时区,其中的日期不太有用。我使用的确切命令来自这里,这里只是为了清楚起见:

sudo tune2fs -l /dev/sda3 | grep created | sed 's/.*created\:\s*//g'

但输出的形式为:

Fri Jun 23 23:59:22 2017

请注意没有提到时区。但date返回以下形式的输出:

Sun Jul 23 17:58:18 AEST 2017

请注意如何提及 AEST 时区。我已经阅读了手册页tune2fs。我使用网络浏览器的查找实用程序在其中搜索了“日期”、“创建”、“时间”,但没有找到任何提及日期格式时区的内容,或者是否有手动设置的方法它。我已经运行 DuckDuckGo 搜索“tune2fs date”和“tune2fs timezone”,我查看了前五个结果,但找不到任何相关内容。

答案1

该时间存储为 Unix 纪元时间(请s_mkfs_time参阅超级块),而不是日历日期,因此它与时区无关。

显示它时,tune2fs将其转换为日历/人类日期,以便在您所在的时区为您提供对您有意义的表示形式。

要获取 UTC 时间,请运行以下命令:

TZ=UTC0 LC_ALL=C tune2fs -l /dev/sda3 |
  sed -n 's/^Filesystem created: *//p'

这表明tune2fs您的时区是 UTC(与 UTC 的偏移量为 0)。

我添加了 LC_ALL=C 以确保以英语返回,并且无论用户的区域设置如何(以防将来国际化),Filesystem created日期仍以美国英语样式显示。e2fsprogs

由于S_mkfs_time位于超级块中的偏移量 0x108 处,并且超级块从块设备内的偏移量 0x400 处开始,因此您还可以手动检索该纪元时间:

od -vAn -j 0x508 -N4 < /dev/sda3

并将其转换为您喜欢的格式:

$ date --iso-8601=s -d "@$(od -An -j0x508 -N4 -tu4 < /some/device)"
2017-07-23T12:20:22+01:00
$ date -u --iso-8601=s -d "@$(od -An -j0x508 -N4 -tu4 < /some/device)"
2017-07-23T11:20:22+00:00

答案2

该日期似乎显示在创建时的本地系统时区中。

例如,我的 /boot 分区是 raid-1 (/dev/md0) 上的 ext4,是我去年用 4 个 SSD 替换引导驱动器并在 ZFS 上转换为 root 时创建的。我保留了 /boot ext4 分区以备不时之需。

# tune2fs -l /dev/md0 | sed -n -e 's/.*created\:\s*//gp'
Sat Oct  8 16:38:45 2016

# TZ=UTC tune2fs -l /dev/md0 | sed -n -e 's/.*created\:\s*//gp'
Sat Oct  8 05:38:45 2016

我也在澳大利亚东海岸(墨尔本),16:38 和 05:38 之间的差异是 11 小时,这对于 AEDT 来说是正确的(对于那些遵守夏令时的州来说,夏令时从 10 月开始)


顺便说一句,几乎不需要将 grep 的输出通过管道传输到 sed 或 awk 中。两者都可以进行正则表达式模式匹配。 awk 的示例可能如下所示:

# tune2fs -l /dev/md0 | awk -F': +' '/created/ {print $2}'
Sat Oct  8 16:38:45 2016

相关内容