Linux文件时间戳说明:atime,mtime和ctime

时间:2020-01-09 10:41:31  来源:igfitidea点击:

atime,mtime和ctime之间的区别

每个Linux文件都有三个时间戳:访问时间戳(atime),修改后的时间戳(mtime)和更改后的时间戳(ctime)。

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

修改后的时间戳表示上次修改文件内容的时间。程序或者过程编辑或者操纵了文件。修改表示文件中的某些内容已被修改或者删除,或者添加了新数据。

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

标准ext4 Linux文件系统还在其内部文件系统结构中为文件创建时间戳分配了空间,但是尚未实现。有时,会填充此时间戳记,但是我们不能依赖其中的值。

时间戳的剖析

Linux时间戳记包含数字而不是日期和时间。此数字是自Unix纪元(1970年1月1日午夜(00:00:00))以协调世界时(UTC)开始的秒数。在Linux时间戳中,st秒将被忽略,因此它们与实时不相似。

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

那么,时间戳可以存储多少秒?准确地说是很多1,147,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日。访问和更改的时间戳是相同的,因为文件是在2017年1月20日从另一台计算机复制到该计算机的,并且两个时间戳都在那时进行了更新。

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

stat dp.c

时区列在显示屏的底部。如我们所见,它们具有非常精确的小数秒部分。在每个时间戳记的末尾,我们还会看到" -0500"或者" -0400"。

这些是时区偏移量。文件系统以UTC记录时间戳,并在通过stat显示时将其转换为本地时区。我们用来研究本文的计算机被配置为好像位于美国的东部标准时间(EST)区域中。

EST生效时,该时区比UTC落后五个小时。但是,实施美国东部夏令时间(EDT)的时间比世界协调时间晚四个小时。 2019年4月,当修改的时间戳更改时,EDT生效了。这就是为什么两个时间戳都有五个小时的偏移量,而修改后的时间戳有四个小时的偏移量的原因。

偏移量和时区不会存储在任何地方。没有一个inodenor文件系统空间专门用于保存这些值。我们必须使用时间戳(始终使用UTC时间),计算机在显示文件的本地时区以及DST是否生效的情况下即时计算这些值。

我们还将看到"出生"时间戳记,该时间戳记是为文件的创建日期保留的。这尚未实现,我们会看到连字符"-"而不是时间戳。

更改时间戳

如果需要,可以更改文件的时间戳。我们可以使用" touch"命令来更改访问权限或者修改时间戳,或者同时更改两者:

touch -a dp.c

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

stat dp.c

访问时间戳已按预期更改。但是,更改后的时间戳也已更新。这很正常。

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

touch -m dp.c
stat dp.c

这次,修改和更改的时间戳记已更新。

如果要同时更改访问和已修改的时间戳,则可以使用-d(日期)选项。我们还可以指定时间和日期,而不仅限于将时间戳更改为现在。

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

touch -d "2017-01-15 10:30:45" dp.c
stat dp.c

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

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

touch dp.c -r dice_words.sl3
stat dp.c

然后,我们几乎回到了起点,混合了-0400-0500时间戳。

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

chmod +x dp
stat dp

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

文件系统如何更新时间戳

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

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

  • strictatime(严格时间):每次访问文件时,此选项都会更新文件的访问时间戳。这种方法带来了额外的开销,但是某些服务器可以从该方案中受益。它在台式机或者笔记本电脑上没有什么价值。

  • noatime(no atime):此选项完全禁止文件和目录的访问时间戳更新。但是,修改后的时间戳仍将更新。

  • nodiratime(no dir atime):此选项启用文件更新的访问时间戳,但禁用目录。

  • relatime(相对时间):仅当访问时间戳早于24小时或者前一个时间戳早于当前修改或者更改的时间戳时,此选项才会更新。这在访问时间戳更新过于频繁或者根本不更新之间取得了良好的平衡。

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

less /etc/fstab

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

这是不包含换行符的文件内容:

# /etc/fstab: static file system information.
#
# Use 'blkid' to print the universally unique identifier for a
# device; this Jan be used with UUID= as a more robust way to name devices
# that works even if disks are added and removed. See fstab(5).
#
# <file system> <mount point> <type> <options> <dump> <pass>
# / was on /dev/sda1 during installation
UUID=4a143d08-8695-475b-8243-b13b56050fc2 / ext4 errors=remount-ro 0 1
/swapfile none swap sw 0 0

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

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

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

我们输入以下内容:

cat /proc/mounts | grep "sda"

现在我们看到以下选项:

  • rw:文件系统将作为读取和写入文件系统挂载。

  • relatime:文件系统将使用相对atime方案来更新访问时间戳。

那个是从其中来的?好吧,relatime方案用于以下情况:

  • 当使用默认的/ etc / fstab选项时。

  • 使用relatime/ etc / fstab选项时。

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

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