我一直在使用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