解释的Linux文件时间戳:atime、mtime和ctime

什么时候“变”不是“变”呢?当我们谈论Linux文件时间戳时。在本指南中,我们将解释系统如何更新它们,以及如何自行更改它们。

atime、mtime和ctime之间的区别

每个Linux文件都有三个时间戳:*访问时间戳(Atime)、修改后的时间戳(Mtime)和更改后的时间戳(Ctime)。

访问时间戳是上次读取文件的时间。这意味着有人使用程序显示文件内容或从中读取一些值。没有编辑任何内容或将任何内容添加到该文件。数据已被引用,但未更改。

修改时间戳表示上次修改文件内容的时间。编辑或操作文件的程序或进程。“修改”是指文件中的某些内容被修改或删除,或者添加了新的数据。

更改的时间戳不是指对文件内容所做的更改。相反,它是与文件相关的元数据更改的时间。例如,文件权限更改将更新更改的时间戳。

标准的ext4Linux文件系统也在其内部文件系统结构中为文件创建时间戳分配空间,但这还没有实现。有时,此时间戳是填充的,但您不能依赖其中的值。

时间戳的解剖

Linux时间戳保存的是数字,而不是日期和时间。此数字是自Unix时代(即1970年1月1日午夜(00:00:00),以协调世界时(UTC)表示)以来的秒数。Linux时间戳中忽略了闰秒,因此它们与实时不同。

当Linux需要显示时间戳时,它会将秒数转换为日期和时间。这使得人类更容易理解。查看文件的计算机所在的位置和时区将引导将秒数转换为日期和时间。它还确保月份使用正确的语言。

那么,一个时间戳中可以存储多少秒呢?很多-准确地说,是2147,483,647个。这是一个很大的数字,但是足够了吗?如果将其添加到Unix纪元,然后将其转换为日期和时间,则会得到2038年1月19日(星期二)凌晨03:14:07。不过,在此之前,我们需要一个不同的时间戳方案。

查看时间戳

当您将-l(长列表)选项与ls一起使用时,如下所示,您可以看到修改后的时间戳:

ls-l dp.c

如果要查看访问时间戳,请使用-lu(访问时间)选项,如下所示:

ls-lu dp.c

最后,要查看更改时间戳,可以使用-lc(更改时间)选项;键入以下内容:

ls-lc dp.c

上面的时间戳显示文件内容最后一次修改是在2019年4月21日。访问和更改的时间戳是相同的,因为文件是在2020年1月20日从另一台计算机复制到这台计算机上的,而且这两个时间戳都是在那时更新的。

要同时查看所有时间戳,请使用stat命令,如下所示:

stat dp.c

时区列在显示屏的底部。如你所见,它们有一个非常精确的分数秒分量。在每个时间戳的末尾,您还会看到-0500或-0400。

这些是时区偏移。文件系统以UTC记录时间戳,并在STAT显示时将其转换为本地时区。我们用来研究这篇文章的计算机被配置为就像在美国东部标准时间(EST)区一样。

当美国东部夏令时生效时,该时区比UTC晚5小时。然而,当东部夏令时(EDT)生效时,它比UTC晚四个小时。2019年4月,当修改后的时间戳被更改时,EDT生效。这就是为什么其中两个时间戳的偏移量为5小时,而修改后的时间戳的偏移量为4小时。

偏移量和时区不存储在任何地方。既没有索引节点,也没有专门用于保存这些值的文件系统空间。您必须使用时间戳(始终使用UTC时间)、显示文件的计算机的本地时区以及DST是否生效来动态计算这些值。

您还会看到一个“出生”时间戳,该时间戳保留为文件的创建日期。这没有实现,您看到的是连字符“-”,而不是时间戳。

相关:您想知道的关于Linux上的inode的所有信息

更改时间戳

如果需要,您可以更改文件上的时间戳。您可以使用触摸命令来更改访问和/或修改的时间戳:

触摸-a dp.c

要设置新的访问时间戳,可以使用-a(访问时间)选项。此命令将访问时间戳设置为计算机的当前时间:

stat dp.c

访问时间戳如预期般更改。但是,更改后的时间戳也会更新;这是正常的。

要更改修改后的时间戳,可以使用-m(修改时间)选项:

Touch-m dp.c

stat dp.c

这一次,修改和更改的时间戳被更新。

如果您希望同时更改访问时间戳和修改后的时间戳,可以使用-d(日期)选项。您还可以指定时间和日期-您不限于将时间戳更改为当前时间戳。

我们将使用以下命令将访问和修改后的时间戳设置为2020年1月15日10:30:45:

Touch-d“2020-01-15 10:30:45”dp.c

stat dp.c

我们现在已经将访问和修改的时间戳设置为过去的日期。更改的时间戳也更新为计算机的当前时间。

如果要将一个文件的时间戳值设置为另一个文件的时间戳值,还可以使用-r(引用)选项,如下所示:

触摸dp.c-r骰子_words.sl3

stat dp.c

然后,我们差不多又回到了开始的地方,时间戳是-0400和-0500的混合。

让我们做一些只影响更改后的时间戳的事情。我们将使用chmod命令为所有用户授予可执行文件的执行权限:

chmod+x DP

状态DP

更改后的时间戳是唯一更新的时间戳。这是因为文件本身没有更改-它既没有被访问也没有被修改。但是,有关该文件的元数据已更改。

相关:如何在Linux上使用chmod命令

文件系统如何更新时间戳

装载文件系统时,您可以使用一些选项来指定应如何操作或处理该文件系统。这些文件存储在/etc/fstab文件中,在引导时读取和处理该文件。您还可以设置选项来指定它们应该用来更新访问时间戳的方案。

以下是一些最常见的选项:

Structatime(Strict Atime):此选项在每次访问文件时更新文件的访问时间戳。这种方法有一定的开销,但是一些服务器可以从这种方案中受益。它在台式机或笔记本电脑上几乎没有什么优点。 noatime_(No Atime):此选项完全禁止更新文件和目录的访问时间戳。但是,修改后的时间戳仍将更新。 nodiatime(No Dir Atime):此选项启用要更新的文件的访问时间戳,但禁用目录的访问时间戳。 Relatime(Relative Atime):此选项仅在访问时间戳超过24小时,或者前一个时间戳早于当前修改或更改的时间戳时更新访问时间戳。这在访问时间戳更新过频繁或根本不更新之间取得了很好的平衡。

我们来看看这台计算机的/etc/fstab文件,看看设置了哪些选项:

较少/etc/fstab

将为我们显示/etc/fstab文件,如下所示。

以下是不带环绕的文件内容:

#/etc/fstab:静态文件系统信息。 #。 #使用‘blkID’打印一个对象的通用唯一标识符。 #device;这可以与uuid=一起使用,作为一种更可靠的设备命名方式。 即使添加和删除磁盘也可以使用#。请参见fstab(5)。 #。 #<文件系统><挂载点><类型><选项><转储><通过>。 安装期间#/在/dev/sda1上。 uuid=4a143d08-8695-475b-8243-b13b56050fc2/ext4错误=重新挂载-ro 0 1。 /swapfile无交换软件0%0

只有两个条目,其中一个是交换文件,我们可以忽略它。另一个挂载在文件系统(/)的根目录下,安装时位于设备/dev/sda1上。这是第一个硬盘上的第一个分区,它恰好包含一个ext4文件系统。

传递给它的唯一选项是:Errors=remount-ro,它告诉操作系统,如果在尝试将该文件系统作为读写文件系统挂载时出现错误,则将其重新挂载为只读。

因此,没有提到如何处理访问时间戳。让我们更深入地研究一下/proc/mount可以告诉我们什么。我们将通过grep传输/proc/mount的输出。我们的搜索字符串将是“sda”,即硬盘标识符。

我们键入以下内容:

cat/proc/mount|grep“sda”

现在我们看到以下选项:

RW:文件系统将作为读写文件系统挂载。 相对:文件系统将使用“相对相对”方案来更新访问时间戳。

那是从哪来的?嗯,在以下情况下使用的是相对关系方案:

当使用DEFAULTS/etc/fstab选项时。 当使用relatime/etc/fstab选项时。 如果/etc/fstab中没有使用访问时间戳选项,并且您使用的是Linux内核2.6.30或更高版本。

我们为ext4文件系统输入的/etc/fstab条目没有指定任何访问时间戳更新选项,所以Linux做出了明智的选择,并使用了relatime。

相关:如何在Linux上编写fstab文件

时间戳很重要

时间戳为我们提供了一种查看文件何时被访问、修改或更改的简单方法。但是,更重要的是,它们提供了一种备份和同步软件的方法,以确定需要备份哪些文件。

当您需要强制说服程序包含或忽略一个文件或一组文件时,操作时间戳的能力将被证明是有用的。

相关文章