首页 > 系统相关 >Linux中atime,ctime与mtime的细节疑问总结

Linux中atime,ctime与mtime的细节疑问总结

时间:2024-04-29 23:12:18浏览次数:27  
标签:ctime 04 Linux mtime 29 2024 mysql atime log

在Linux文件系统中,每一个文件都有三个时间属性,它们分别是atime,mtime,ctime,一般来说,atime比较好理解,但是很多时候,我们往往会混淆mtime和ctime这两个时间属性,或者搞不清楚两者的区别。在展开介绍之前,我们先来看看如何查看文件的atime,mtime,ctime属性。 下面简单介绍一下:

查看atime属性

$ ls -lu

查看mtime属性

$ ls -l

查看ctime属性

$ ls -lc

具体可以查看命令ls的帮助手册(man ls)

-c     with -lt: sort by, and show, ctime (time of last modification of file status information); with -l: show ctime and
              sort by name; otherwise: sort by ctime, newest first

-u     with  -lt:  sort  by, and show, access time; with -l: show access time and sort by name; otherwise: sort by access
              time, newest first

使用stat命令查看文件的atime/mtime/ctime属性

$ stat filename

下面是是一个构造的例子,如下所示:

[mysql@dbtest04 kerry]$ stat test.log
  File: test.log
  Size: 5               Blocks: 8          IO Block: 4096   regular file
Device: fd05h/64773d    Inode: 1193621     Links: 1
Access: (0777/-rwxrwxrwx)  Uid: (  801/   mysql)   Gid: (  800/   mysql)
Access: 2024-04-29 11:03:21.616417230 +0800
Modify: 2024-04-29 11:01:56.599421770 +0800
Change: 2024-04-29 11:34:16.385318171 +0800
 Birth: 2024-04-29 11:00:02.907427842 +0800
[mysql@dbtest04 kerry]$ ls -l test.log
-rwxrwxrwx 1 mysql mysql 5 Apr 29 11:01 test.log
[mysql@dbtest04 kerry]$ ls -lu test.log
-rwxrwxrwx 1 mysql mysql 5 Apr 29 11:03 test.log
[mysql@dbtest04 kerry]$ ls -lc test.log
-rwxrwxrwx 1 mysql mysql 5 Apr 29 11:34 test.log

那么接下来,我们来看看atime/mtime/ctime三者的定义吧。

那么我们接下来看看ctime与mtime的区别,一般来说,如果修改了文件的权限,属主等属性时,ctime会变化(mtime不会变化),修改文件的内容时,mtime & ctime都会变化,也就是说如果mtime变化了的话,ctime一定会变化,而ctime变化,mtime不一定变化。 其实ctime表示最近一次metadata修改时间,这里的修改有两层意思:

  • 1 修改文件/文件夹的metadata, 例如,文件的访问权限(chmod)或文件属主。

  • 2 修改文件内容

如果简单一点的描述,就是mtime就是ctime的一个子集,ctime包含mtime,如果mtime变化了,ctime一定会变化。如下测试所示(这里我们用root账号来测试,方便修改文件的属主以及权限。)

[root@dbtest04 ~]# touch test.log
[root@dbtest04 ~]# stat test.log
  File: test.log
  Size: 0               Blocks: 0          IO Block: 4096   regular empty file
Device: fd00h/64768d    Inode: 2837        Links: 1
Access: (0644/-rw-r--r--)  Uid: (    0/    root)   Gid: (    0/    root)
Access: 2024-04-29 12:03:01.741226024 +0800
Modify: 2024-04-29 12:03:01.741226024 +0800
Change: 2024-04-29 12:03:01.741226024 +0800
 Birth: 2024-04-29 12:03:01.741226024 +0800
[root@dbtest04 ~]# chown mysql:mysql test.log
[root@dbtest04 ~]# stat test.log
  File: test.log
  Size: 0               Blocks: 0          IO Block: 4096   regular empty file
Device: fd00h/64768d    Inode: 2837        Links: 1
Access: (0644/-rw-r--r--)  Uid: (  801/   mysql)   Gid: (  800/   mysql)
Access: 2024-04-29 12:03:01.741226024 +0800
Modify: 2024-04-29 12:03:01.741226024 +0800
Change: 2024-04-29 12:03:48.956223503 +0800
 Birth: 2024-04-29 12:03:01.741226024 +0800
[root@dbtest04 ~]# chmod 755 test.log
[root@dbtest04 ~]# stat test.log
  File: test.log
  Size: 0               Blocks: 0          IO Block: 4096   regular empty file
Device: fd00h/64768d    Inode: 2837        Links: 1
Access: (0755/-rwxr-xr-x)  Uid: (  801/   mysql)   Gid: (  800/   mysql)
Access: 2024-04-29 12:03:01.741226024 +0800
Modify: 2024-04-29 12:03:01.741226024 +0800
Change: 2024-04-29 12:04:22.778221696 +0800
 Birth: 2024-04-29 12:03:01.741226024 +0800
[root@dbtest04 ~]# echo "it is test" > test.log
[root@dbtest04 ~]# stat test.log
  File: test.log
  Size: 11              Blocks: 8          IO Block: 4096   regular file
Device: fd00h/64768d    Inode: 2837        Links: 1
Access: (0755/-rwxr-xr-x)  Uid: (  801/   mysql)   Gid: (  800/   mysql)
Access: 2024-04-29 12:03:01.741226024 +0800
Modify: 2024-04-29 12:04:57.245219856 +0800
Change: 2024-04-29 12:04:57.245219856 +0800
 Birth: 2024-04-29 12:03:01.741226024 +0800

不知道你注意到没有,往文件写入内容的时候,atime居然没有变化,这里为了验证,我们再做一次测试,如下截图所示

如上截图所示,我们往文件中写入内容,atime居然没有变化,其实你使用more、cat命令访问文件,文件的atime也没有变化,Why?Why?Why?直到我看到这篇文章"文件atime未变问题的研究"[1](下面部分内容来自这篇文章):

在kernel版本2.6.30之前,Linux的核心开发人员针对Ext3/Ext4文件系统的性能进行了讨论,其中包括atime。在Ksernel 2.6.30之前,文件系统中默认会及时的更新atime,这样会带来两个问题:

  1. 系统中大量的文件访问,将atime写入到磁盘中,消耗时间,从而降低性能

  2. 这样的操作也会消耗电能

在Linux上运行的,很少的应用程序需要获取精确的atime时间,并且Linux核心开发人员从Ext3/Ext4文件系统的性能角度出发,决定在2.6.30版本的内核中修改atime的更新方式,只有在以下三种情况之一才会更新atime:

  • (1) 如果将分区mount的挂载的时候指定采用非relatime方式(默认采用relatime方式),如strictatime.

补充:在OS启动的时候,将各个分区挂载到不同的目录,在挂载(mount)的参数中采用strictatime,表明及时更新atime。在2.6.30之后mount添加了”relatime”和”strictatime”两个选项,详细的可以通过”man mount”查看。

  • (2) atime小于ctime或者小于mtime的时候

  • (3) 本次的access time和上次的atime超过24个小时

这种做法避免了频繁的更新atime,提高了文件系统的性能。果然做Linux内核的大牛无不从每一个细节抓起呢,敬佩。

更多的详细信息,我们可以参考这篇文章[2],这里额外展开一下,ls 和 stat命令并不会修改文件的atime属性,如下测试所示

[mysql@dbtest04 kerry]$ rm kerry.log
[mysql@dbtest04 kerry]$ touch kerry.log
[mysql@dbtest04 kerry]$ stat kerry.log
  File: kerry.log
  Size: 0               Blocks: 0          IO Block: 4096   regular empty file
Device: fd05h/64773d    Inode: 1193622     Links: 1
Access: (0644/-rw-r--r--)  Uid: (  801/   mysql)   Gid: (  800/   mysql)
Access: 2024-04-29 15:35:58.084543673 +0800
Modify: 2024-04-29 15:35:58.084543673 +0800
Change: 2024-04-29 15:35:58.084543673 +0800
 Birth: 2024-04-29 15:35:58.084543673 +0800
[mysql@dbtest04 kerry]$ ls kerry.log
kerry.log
[mysql@dbtest04 kerry]$ stat kerry.log 
  File: kerry.log
  Size: 0               Blocks: 0          IO Block: 4096   regular empty file
Device: fd05h/64773d    Inode: 1193622     Links: 1
Access: (0644/-rw-r--r--)  Uid: (  801/   mysql)   Gid: (  800/   mysql)
Access: 2024-04-29 15:35:58.084543673 +0800
Modify: 2024-04-29 15:35:58.084543673 +0800
Change: 2024-04-29 15:35:58.084543673 +0800
 Birth: 2024-04-29 15:35:58.084543673 +0800

参考资料

[1]

1: https://blog.csdn.net/cjf_iceking/article/details/11988525

[2]

2: http://www.h-online.com/open/news/item/Kernel-Log-What-s-coming-in-2-6-30-File-systems-New-and-revamped-file-systems-741319.html

标签:ctime,04,Linux,mtime,29,2024,mysql,atime,log
From: https://www.cnblogs.com/kerrycode/p/18166799

相关文章

  • Linux 初始化 init 系统
    目录Linux操作系统的启动流程:BIOS(或UEFI)启动:当计算机加电时,BIOS(基本输入输出系统)或更现代的UEFI(统一可扩展固件接口)会执行一系列的自检(POST,Power-OnSelfTest),以确保硬件正常工作。随后,BIOS/UEFI会根据用户设置的启动顺序来定位并加载引导设备(如硬盘、USB驱动器或网络)上的主......
  • Linux日志工具---journalctl
    目录确实如此,Linux系统中的日志系统是维护系统健康、安全和性能的关键组成部分。自从systemd成为众多Linux发行版的默认初始化系统以来,journalctl成为了管理和查询这些系统日志的主要工具。journalctl是与systemd-journald日志系统配套的命令行实用程序。systemd-journald......
  • 在Linux系统下用命令行编译调试C++
    在Linux系统下用命令行编译调试C++目录在Linux系统下用命令行编译调试C++一、编译1.单文件编译2.多文件编译3.链接第三方动态库二、调试1.启动和退出2.查看源代码:list/l3.断点:breakpoint/br、watchpoint4.单步、步入、跳出5.计算表达式命令:expression/expr、p、po6.操作......
  • Linux基础之权限管理
    目录通用权限的管理扩展权限的管理特殊权限的管理权限掩码在Linux中,权限管理是通过文件系统中的权限位来实现的。通用权限的管理每个文件或目录都有一个所有者、一个用户组和其他用户的权限设置。主要的权限包括读取、写入和执行。文件权限包括读、写和执行权限:读权限(r):允许......
  • windows使用samba共享linux文件服务
    一、服务结构服务端:linux服务器192.168.2.251客户端:windows服务器192.168.2.252二、linux部署samba服务端1.安装samba~]#yum-yinstallsamba2.创建共享文件夹~]#mkdir/mnt/svr33.创建samba用户~]#smbpasswdwyg或者~]#pdbedit-a-utest密码:wyg.1234.编......
  • 在 ArchLinux 上完美使用高漫 M6 数位板
    没想到这个问题还能产生第三篇博客。前言2022年和2023年我针对这个问题写了两篇博客(见此处和此处),非常高兴能够看到博客帮到了一些网友。那个时候我的系统是Kubuntu22.04。今年换到Arch之后,发现原先使用的digimenddkmsdriver的fork(https://github.com/inochisa......
  • 稳扎稳打 部署丝滑 开源即时通讯(IM)项目OpenIM源码部署流程(linux windows mac)
    背景OpenIM包含多个关键组件,每个都是系统功能必不可少的一部分。具体来说,MongoDB用于持久化存储;Redis用作缓存;Kafka用于消息队列;Zookeeper用于服务发现;Minio用于对象存储。这些组件的众多可能会增加部署的复杂性。此外,系统包含多个微服务模块,这要求有效管理进程的启动、停止......
  • linux网络DNS域名解析服务
    DNS概述1.DNS系统DNS(DomainNameSystem),使用应用层协议,是互联网的一项服务。它作为将域名和IP地址相互映射的一个分布式数据库,能够使人更方便地访问互联网。简单来说就是:把域名转换成网络可以识别的IP地址,在通过IP地址访问主机。这种由文字组成的名称,显而易见要更容易记忆。每......
  • Linux中ssh
    ssh原理SSH(SecureShell)是一种用于安全访问远程计算机的网络协议。SSH使用加密技术来确保通信的安全性,其中包括使用公钥加密和私钥解密的方法。下面是SSH公钥传输的基本原理:生成密钥对:在使用SSH进行通信之前,首先需要在客户端生成一对密钥,包括公钥和私钥。通常使用RSA或DSA算法......
  • Linux手动安装JD详细教程
    1、下载JDK下载网址:https://www.oracle.com/technetwork/java/javase/downloads/index.html下拉,找到jdk8 2、手动安装2.1先新建一个文件夹,目录是/usr/local/java 进入安装目录。输入命令:cd/usr/local/java 2.2安装JDK1.新建一个存放安装包的文件夹命令:mkdir......