码迷,mamicode.com
首页 > 系统相关 > 详细

Linux初体验(六)

时间:2016-07-31 16:04:43      阅读:360      评论:0      收藏:0      [点我收藏+]

标签:  inode     cp     mv     rm     ln     时间戳(touch、stat)

Linux初体验(六)


  • inode

  • cp

  • mv

  • rm

  • ln

  • 时间戳(touch、stat)

环境: CentOS 6.8

inode

用途说明

索引节点,存放文件的元数据

一个索引节点就是一个表项,包含了文件的元数据信息,包括:

- 文件类型,权限,UID, GID- 链接数(指向文件名路径名称的个数)
- 文件的大小与时间戳- 指向磁盘上文件的数据块指针 
- 有关文件的其他数据

inode 本质上是一种数据结构,包含了文件系统中各个文件的元数据;inode表就是一份包含了对应文件系统中的所有inode号;注意inode是一种数据结构,inode号只是文件相关信息中的一项重要内容。在Linux系统上,当用户访问一个文件时,系统通过inode表查找inode号,在找到对应的inode号之后,方可访问该文件。

一般inode表会占用文件系统磁盘空间的1%,文件引用一个inode号,用户通过文件名来引用这个文件;而目录是目录下的文件名与文件inode号之间的映射。下图结构可简单表示一个inode表结构。

.
└── inode
    ├── Mode
    ├── Ownerinfo
    ├── Size
    └── Timestamps
    ├── Direct-Pointers
    │   ├── data1
    │   └── data2
    ├── Indirect-pointer
    │   └── Pointer-file-nextblock
    │       ├── data1
    │       └── data2
    ├── Double-indirect-pointer
    │   └── Pointer-file-nextblock
    │       └── Pointer-file-nextblock
    │           ├── data1
    │           └── data2
    └── Triple-indirect-pointer
注: Direct-Pointers: 直接指针
    Indirect-pointer: 间接指针    
    Double-indirect-pointer:双重间接指针
    Triple-indirect-pointer:三重间接指针    
    Pointer-file-nextblock:指向下一个文件块的指针

所谓指针,实质上就是一个地址指向,通过指针能够找见所需的变量单元,即找到以它为地址的内存单元。在Linux文件系统中,通俗地讲,指针就是指向文件地址的索引,是元数据的重要组成部分。

每个指针的大小为4Byte, 一个数据块大小为4K,我们以此为基础,简单梳理下32位Linux系统中直接指针与间接指针的基本情况:

直接指针:编号为1-12,所谓直接指针,就是指针直接指向数据块,中间无其它环节,因为一个指针指向一个数据块,且一个指针的大小为4Byte,一个数据块的大小为4K, 所以,直接指针所以指向的数据大小为 12*4K=48K。

间接指针:所谓间接指针,就是指针不直接指向数据块,而是中间要经过一个 指针数据块, 这个指针数据块的大小为4K,双因为一个指针大小为4Byte, 所以4K容量的指针数据块共有1024个指针(4Byte*1024=4K),故而间接指针所能指向的数据大小为 1024*4K=4096K=4M。

双重间接指针:所谓双重间接指针,就是其在指向数据的过程中经过了两个指针数据块,根据间接指针的论述,我们不难得出双重间接指针所能够指向的数据大小为 102410244K=4G

三重间接指针:你懂得!

除了指针,在inode表中,还有很多重要信息,如开头提到的文件类型、权限、时间戳、用户标识等,这些内容对我们理解inode影响不太,此外暂不作详解。

简单小结下指针,指针就是一个指向数据的地址,这个地址占用4Byte,而4个字节就是32位(4B * 8=32bit), 这就是我们平常所说的32位系统。对于64位系统而言,地址是8Byte的,即8Byte * 8=64bits.

下面,我们从cp命令、mv命令、rm命令、ln命令和时间戳这些角度来继续加深对inode的理解。


cp

用途说明

复制

cp - copy files and directories

cp [OPTION]... [-T] SOURCE DEST
cp [OPTION]... SOURCE... DIRECTORY

cp命令用来将一个或多个文件或目录复制到目标文件或目录,可以将单个文件复制成一个指定文件名的文件或某个已经存在的目录下;当一次复制多个文件时,目标文件参数必须是一个已经存在的目录,否则报错。

常用参数

  1. --preserv[=ALLR_LIST]

mode:权限
ownership: 属主属组
timestamps
links
xattr
contextall
  1. -d: --no dereference --preserv=links 不复制原文件,只复制链接名。 当复制符号链接时,把目标文件或目录也建立为符号链接,并指向与源文件或目录连接的原始文件或目录

  2. -p: 保留原文件或目录的属性,相当于--preserv=mode,ownership,timestamp

  3. -R/r: 递归处理,将指定目录下的所有文件与子目录一并处理

  4. -a: 归档,相当于 -dR --preserv=all

  5. -f: --force, 强行复制文件或目录,不论目标文件或目录是否已存在

  6. -i: 覆盖既有文件或目录之前先询问用户

  7. -s: 对源文件建立符号链接,而非复制文件

  8. -b: 覆盖已存在的文件目标前将目标文件备份

  9. -v: --berbose, 详细显示命令执行的过程

使用示例

1、复制一个经典的符号链接文件

[root@centos6 ~]# ls -ld /etc/redhat-release    
lrwxrwxrwx. 1 root root 14 Jul 20 17:00 /etc/redhat-release -> centos-release
[root@centos6 ~]# cp -d /etc/redhat-release /testdir/centosrelease
[root@centos6 ~]# ll /testdir/centosrelease
lrwxrwxrwx. 1 root root 14 Jul 30 13:14 /testdir/centosrelease -> centos-release  # 结果为闪烁的红色,表示cp出错了!
[root@centos6 ~]# touch /testdir/centosrelease   # 因为在/testdir/目录下缺少了相应的文件
[root@centos6 ~]# ll /testdir/centosrelease   
lrwxrwxrwx. 1 root root 14 Jul 30 13:14 /testdir/centosrelease -> centos-release  # 正常显示
[root@centos6 ~]#

技术分享

2、保留三个基本的属性(权限,属主属组,时间戳)

[root@centos6 ~]# cp f1 ~liansir/f11
[root@centos6 ~]# ll f1-rw-r--r--. 1 root root 8 Jul 30 09:14 f1
[root@centos6 ~]#
[liansir@centos6 ~]$ ll f11
-rw-r--r--. 1 root root 8 Jul 30 13:37 f11      # 时间戳已改变
[root@centos6 ~]# cp -p f1 ~liansir/f11 cp: overwrite `/home/liansir/f11‘? y
[root@centos6 ~]# ll f1-rw-r--r--. 1 root root 8 Jul 30 09:14 f1
[root@centos6 ~]#
[liansir@centos6 ~]$ ll f11
-rw-r--r--. 1 root root 8 Jul 30 09:14 f11     # 时间戳示变
[liansir@centos6 ~]$ 

[liansir@centos6 ~]$ date
Sat Jul 30 13:43:49 CST 2016[liansir@centos6 ~]$

3、对源文件建立符号链接(并不复制文件)

[root@centos6 ~]# cp -s f2 /testdir/f22   # /testdir是个独立分区
cp: `/testdir/f22‘: can make relative symbolic links only in current directory
[root@centos6 ~]# cp -s f2 /usr/f22       # /usr是个普通目录
cp: `/usr/f22‘: can make relative symbolic links only in current directory
[root@centos6 ~]# cp -s f2 f22
[root@centos6 ~]# ll f22lrwxrwxrwx. 1 root root 2 Jul 30 13:48 f22 -> f2
[root@centos6 ~]#

由此可见,cp -s 命令只能在当前目录下对源文件建立符号链接。

4、安全复制

[root@centos6 ~]# lsf3  f33
[root@centos6 ~]# cat f3liansir
hello
[root@centos6 ~]# cat f33liansir

[root@centos6 ~]# cp -vb f3 f33
cp: overwrite `f33‘? y
`f3‘ -> `f33‘ (backup: `f33~‘)
[root@centos6 ~]# ls
f3  f33  f33~                   # 备份f33为f33~
[root@centos6 ~]# cat f33liansir
hello                           # 成功复制
[root@centos6 ~]# cat f33~liansir            # 成功备份
[root@centos6 ~]#

5、复制目录与目录下的文件

[root@centos6 /]# cp /dev /testdir/devv     # 把一个目录复制到另一个目录
cp: omitting directory `/dev‘

[root@centos6 /]# cp -r /dev /testdir/devv  # 复制目录时要加-r
[root@centos6 /]# rm -rf /testdir/devv
[root@centos6 /]# cp -r /dev/* /testdir/devv   # 复制目录下的所有文件到一个不存在的目录
cp: target `/testdir/devv‘ is not a directory

[root@centos6 /]# mkdir /testdir/devv       # 在复制多个文件到一个目录时先创建这个目录 
[root@centos6 /]# cp -r /dev/* /testdir/devv
[root@centos6 /]#

6、利用 --preserv 参数灵活复制文件

# 要求文件的时间戳不变 

[root@centos6 ~]# cp f1 ~liansir/f1
[root@centos6 ~]# ll f1-rw-r--r--. 1 root root 0 Jul 30 14:34 f1
[root@centos6 ~]# ls -i f1    # 查看inode号2752514 f1
[root@centos6 ~]# 

[liansir@centos6 ~]$ ll 
total 0-rw-r--r--. 1 root root 0 Jul 30 14:39 f1     # 时间戳已改变
[liansir@centos6 ~]$ ls -i    
1572875 f1
[liansir@centos6 ~]$

[root@centos6 ~]# cp --preserv=timestamps f1 ~liansir/f1
cp: overwrite `/home/liansir/f1‘? y
[root@centos6 ~]# ll f1-rw-r--r--. 1 root root 0 Jul 30 14:34 f1
[root@centos6 ~]# ll ~liansir/
total 0-rw-r--r--. 1 root root 0 Jul 30 14:34 f1     # 时间戳未改变
[root@centos6 ~]#
# 要求文件的属主属组不变 

[liansir@centos6 ~]$ touch f2
[liansir@centos6 ~]$ ll f2
-rw-rw-r--. 1 liansir liansir 0 Jul 30 14:46 f2
[liansir@centos6 ~]$ ls -i 
f21572876 f2
[liansir@centos6 ~]$

[root@centos6 ~]# cp ~liansir/f2 f2
[root@centos6 ~]# ll f2-rw-r--r--. 1 root root 0 Jul 30 14:46 f2    # 文件属主属组已变
[root@centos6 ~]# ls -i 
f22752539 f2
[root@centos6 ~]# 
[root@centos6 ~]# cp --preserv=ownership ~liansir/f2 
f2cp: overwrite `f2‘? y
[root@centos6 ~]# ll 
f2-rw-r--r--. 1 liansir liansir 0 Jul 30 14:48 f2   # 文件属主属组未变
[root@centos6 ~]#
# 要求文件的权限不变 

[liansir@centos6 ~]$ ll f2
-rw-rw-r--. 1 liansir liansir 0 Jul 30 14:46 f2
[liansir@centos6 ~]$ 

[root@centos6 ~]# cp ~liansir/f2 f22
[root@centos6 ~]# ll f22-rw-r--r--. 1 root root 0 Jul 30 14:59 f22    # 权限已变
[root@centos6 ~]# 
[root@centos6 ~]# cp --preserv=mode ~liansir/f2 f222
[root@centos6 ~]# ll 
f222-rw-rw-r--. 1 root root 0 Jul 30 15:02 f222   # 权限未变
[root@centos6 ~]#

CP和inode

[root@centos6 ~]# ls -i 
2752752 f1   2752775 f2   2752748 f222  2752514 f332752764 f11  2752734 f22 
2752539 f3    2752691 f33~
[root@centos6 ~]#

开篇说到inode其实是一种数据结构,inode号是inode对系统文件的一个编号,在cp 时,系统首先会分配一个inode号,在inode表中生成新条目,在目录中创建一个目录项 ,将名称与inode号关联,拷贝数据生成新的文件。


rm

用途说明

删除

rm - remove files or directories
rm [OPTION]... FILE...

rm命令可以删除一个或多个文件或目录,包括目录下面的文件或子目录;对于链接文件,删除的只是链接而非原文件。使用rm 命令之前须谨慎,故一旦删除便无法恢复

常用参数

  1. -i: --interactive, 交互式,删除目录或文件前先询问用户

  2. -f: 强制删除文件或目录

  3. -r/-R: --recursive 递归处理,将指定目录下的所有文件与子目录一并处理

  4. -v: --verbose, 显示详细执行过程

  5. --preserve-root: do not remove ‘/‘ (default)

使用示例

如果在掌握cp命令的基础之上,再看下面的mv、rm应该是小case了!

# 交互式操作

[root@centos6 ~]# rm -i f1 f2 f3
rm: remove regular empty file `f1‘? y
rm: remove regular empty file `f2‘? n
rm: remove regular empty file `f3‘? n
[root@centos6 ~]# ls
f2  f3
[root@centos6 ~]#

rm与inode

在执行rm命令时,链接数递减,从而释放inode号;把数据块放在空闲列表中;删除目录项;实据实际上不会马上被删除,但当另一个文件使用数据块时将被覆盖。

勿越雷区:rm -r * 与 rm -rf /*

勿越雷区:rm -r * 与 rm -rf /*

勿越雷区:rm -r * 与 rm -rf /*


mv

用途说明

移动与重命名

mv - move (rename) files
mv [OPTION]... [-T] SOURCE DEST
mv [OPTION]... SOURCE... DIRECTORY

mv 命令可将文件从一个目录移动至另一个目录,或者对文件进行重命名,但只能在同一目录下; 如果将某个文件移至一个已经存在的目录下,则会完成一个覆盖动作。

mv 的用法似,无非也就是把文件mv到文件,或者把文件mv到目录;前者在同一目录下相当于重命令,在不同目录下当然就是移动了。后者不管是同一目录还是目录,都是移动或者覆盖(同名则覆盖)。

常用参数

  1. --backup[=CONTROL]: 备份模式,当覆盖文件时则先备份

  2. -b: 覆盖前为其创建备份

  3. -f: 强行移动或覆盖

  4. -i: 交互式模式,"y"表示覆盖,"n"表示取消当前操作

  5. -S: --suffix=SUFFIX, 为备份文件指定后缀

  6. --strip-trailing-slashes: 删除源文件中的斜杠"/"

  7. -u: --update, 更新,当源文件比目标文件新或者目标文件不存时移动

使用示例

开启备份模式

[root@centos6 ~]# cat f1 f2
1
2
[root@centos6 ~]#

[liansir@centos6 ~]$ cat f1 f2
11
22
[liansir@centos6 ~]$

[root@centos6 ~]# mv --backup f1 f2 ~liansir/
mv: overwrite `/home/liansir/f1‘? y
mv: overwrite `/home/liansir/f2‘? y
[root@centos6 ~]# 

[liansir@centos6 ~]$ ls
f1  f1~  f2  f2~                # 成功备份
[liansir@centos6 ~]$ cat f1 f1~ f2 f2~    
1
11
2
22
[liansir@centos6 ~]$

为备份文件指定后缀,默认为~

[root@centos6 ~]# mv -S ".back" -b history.log /testdir/history.log
mv: overwrite `/testdir/history.log‘? y
[root@centos6 ~]# ll /testdir/
total 12
drwxr-xr-x. 17 root root 4096 Jul 30 14:15 devv
-rw-------.  1 root root 7781 Jul 30 17:39 history.log
-rw-r--r--.  1 root root    0 Jul 30 19:20 history.log.back   # 成功备份文件的指定后缀
[root@centos6 ~]#

mv与inode

如果mv命令的目标和源在相同的文件系统,则:用新的文件名创建新的目录项;删除旧目录条目对应的旧的文件名;不影响inode表(除了时间戳)或磁盘上的数据位置:没有数据被移动。如果目标和源在不同的文件系统,mv则相当于cp和rm.

rm命令会减少链接数。一个文件除非链接数为0,否则不会从文件系统中被物理性删除。


ln

用途说明

创建硬链接和软链接

ln - make links between files
ln [OPTION]... [-T] TARGET LINK_NAME   (1st form)
ln [OPTION]... TARGET                  (2nd form)
ln [OPTION]... TARGET... DIRECTORY     (3rd form)

ln命令默认创建的是硬链接,-s 选项可创建软链接;其中,源文件是指被连接的文件,目标文件是指对源文件作的链接文件。

为了深入了解ln命令,我们还须对 硬链接  软链接 作一个基本的认知与对比。首先还是看一个ln命令的常用参数吧!

常用参数

  1. --backup: --backup[=CONTROL],开启备份模式

  2. -b: 类似于--backup,但不接受参数

  3. -d,-F: --directory, 建立目录的硬链接

  4. -f: --force, 强行建立文件或目录的链接,不论目标文件或目录是否存在

  5. -i: --interactiv, 交互式

  6. -n: --no-dereference, 把软链接的目标目录视为一般文件

  7. -s: --symbolic, 创建软链接

  8. -S: --suffix=SUFFIX,为备份文件指定后缀(与mv 的 -S选项一个意思)

  9. -v: --verbose, 显示指令执行过程

  10. --help: 在线帮助

  11. --version: 显示版本信息

链接

所谓链接,就是一个文件多个名称。有了链接,我们在备份数据时,可避免在硬盘上为同样的数据重复备份。另外,如果源文件与被链接的文件是在同一目录下,则必须要使用不同的文件名;如果是在不同的目录下,则无此约束,可同名,链接同名的好处是只要对一个目录下的文件进行修改,就可完成对所有目录下同名链接文件的修改

硬链接

硬链接就是同一个物理文件,多个名,故硬链接的inode号是相同的。硬链接直接使用ln命令创建,格式为 ln filename linkname, 硬链接一般放在不同的目录下,但不能跨分区创建,即硬链接要在同一文件系统下创建;不能对目录文件创建硬链接。

创建硬链接时,会在本目录与目标目录中增加额外的目录项以引用文件,创建时链接数递增。

软链接

软链接也叫做符号链接,本质是将一个路径名链接到一个文件,类似于Windows中的快捷方式。从定义中可知软链接是一个独立的文件,具有自己的inode号,其内容是它引用文件的名称。

软链接接使用ln -s 创建,格式为 ln -s filename linkname,其指向的是另一个文件的路径,其大小是指向路径字符串的长度;软链接不增加或减少目标文件inode的引用计数;

软链接路径的相对性:原始文件相对路径:相对于软链接文件的路径,而不是相对于当前工作目录的路径,或者直接写绝对路径。可以对目录创建软链接。

软链接要注意路径的相对性,不然软链接会认为是在当前目录下又创建了一个软链接,无意义,且显示为闪烁的红色。一般情况下,相对路径是相对于当前工作目录的,而在软链接看来,相对路径是相对于软链接文件的。


使用示例

创建一个硬链接:

[root@centos6 ~]# touch redhat
[root@centos6 ~]# ll
total 0
-rw-r--r--. 1 root root 0 Jul 31 10:35 redhat
[root@centos6 ~]# ln redhat centos  # 为了方便对比,在同一目录下创建了硬链接
[root@centos6 ~]# ll
total 0
-rw-r--r--. 2 root root 0 Jul 31 10:35 centos    # 硬链接数增加
-rw-r--r--. 2 root root 0 Jul 31 10:35 redhat
[root@centos6 ~]#

创建一个软链接:

[root@centos6 ~]# ln -s redhat blackhat
[root@centos6 ~]# ll
total 0
lrwxrwxrwx. 1 root root 6 Jul 31 10:39 blackhat -> redhat  # 文件类型为l
-rw-r--r--. 2 root root 0 Jul 31 10:35 centos       # 硬链接数未增加
-rw-r--r--. 2 root root 0 Jul 31 10:35 redhat
[root@centos6 ~]#

链接与inode:

[root@centos6 ~]# ls -i
2752691 blackhat  2752514 centos  2752514 redhat  
# 硬链接的inode号为同一个,软链接的inode号独立存在
[root@centos6 ~]#

绝对路径与相对路径:

[root@centos6 ~]# ln -s /root/f1 ~liansir/f2     # 绝对路径
[root@centos6 ~]# ln -s ../root/f1 ~liansir/f2   # 相对路径

时间戳

主要用途

标识时间

时间戳就是一个字符序列,能唯一地标识任何一刻的时间。涉及到的常用命令有 touch、stat.

touch

touch - change file timestampstouch [OPTION]... FILE...

touch命令,两个功能:修改文件的时间戳为当前系统的时间(默认);创建空文件。 一个文件的时间戳通常有三个:

atime:Access,访问时间
mtime:Modify,修改时间
ctime:Change,改变时间

常用参数

  1. -a: change only the access time

  2. -c: --no-create, do not create any files

  3. -d: --date=STRING , 使用指定的日期时间,而非当前时间

  4. -m: change only the modification time

  5. -r: --reference=FILE, use this file’s times instead of current time.把指定文件或目录的日期时间设成参考文件的日期时间。

  6. -t: STAMP,use [[CC]YY]MMDDhhmm[.ss] instead of current time,使用指定的日期时间

  7. --help: 在线帮助

  8. --version 版本信息

stat

主要用途

状态信息

stat - display file or file system status
 stat [OPTION]... FILE...

stat命令主要用来显示文件或文件系统的状态信息,要比ls 更为详细。

常用参数

  1. -L: follow links, 显示符号链接的状态信息,否则显示的是被符号链接的文件信息

  2. -f: --file-system, display file system status instead of file status,显示文件系统的状态信息而非文件的状态信息

  3. --help

  4. --version

使用示例

[root@centos6 ~]# touch redhat    
[root@centos6 ~]# ll        # 显示的是mtime
total 0-rw-r--r--. 1 root root 0 Jul 31 11:13 redhat   # 创建了一个空文件
[root@centos6 ~]# stat redhat   
  File: `redhat‘
  Size: 0               Blocks: 0          IO Block: 4096   regular empty file
Device: 802h/2050d      Inode: 2752514     Links: 1Access: (0644/-rw-r--r--)  Uid: (    0/    root)   Gid: (    0/    root)
Access: 2016-07-31 11:13:10.676039727 +0800    # 时间戳
Modify: 2016-07-31 11:13:09.654042488 +0800
Change: 2016-07-31 11:13:09.654042488 +0800
[root@centos6 ~]#
[root@centos6 ~]# touch redhat   # 因为redhat已被创建,故为更新时间戳
[root@centos6 ~]# stat redhat
  File: `redhat‘
  Size: 0               Blocks: 0          IO Block: 4096   regular empty file
Device: 802h/2050d      Inode: 2752514     Links: 1Access: (0644/-rw-r--r--)  Uid: (    0/    root)   Gid: (    0/    root)
Access: 2016-07-31 11:15:02.985042385 +0800   # 时间戳已变 
Modify: 2016-07-31 11:15:01.966042649 +0800
Change: 2016-07-31 11:15:01.966042649 +0800
[root@centos6 ~]#

显示任意时间戳:

--time=atime
--time=ctime
[root@centos6 ~]# date
Sun Jul 31 12:33:06 CST 2016
[root@centos6 ~]# touch redhat
[root@centos6 ~]# ll --time=atime redhat 
-rw-r--r--. 1 root root 0 Jul 31 12:33 redhat
[root@centos6 ~]# ll --time=ctime redhat
-rw-r--r--. 1 root root 0 Jul 31 12:33 redhat
[root@centos6 ~]#

[root@centos6 ~]# stat redhat 
  File: `redhat‘
  Size: 0               Blocks: 0          IO Block: 4096   regular empty file
Device: 802h/2050d      Inode: 2752514     Links: 1Access: (0644/-rw-r--r--)  Uid: (    0/    root)   Gid: (    0/    root)
Access: 2016-07-31 12:33:16.230018565 +0800     # atime最新
Modify: 2016-07-31 12:33:15.215018960 +0800
Change: 2016-07-31 12:33:15.215018960 +0800
[root@centos6 ~]# 

# 现在我们cat下redhat

[root@centos6 ~]# date
Sun Jul 31 12:36:40 CST 2016
[root@centos6 ~]# cat redhat 
[root@centos6 ~]# stat redhat
  File: `redhat‘
  Size: 0               Blocks: 0          IO Block: 4096   regular empty file
Device: 802h/2050d      Inode: 2752514     Links: 1Access: (0644/-rw-r--r--)  Uid: (    0/    root)   Gid: (    0/    root)
Access: 2016-07-31 12:33:16.230018565 +0800    # atime怎么没变?
Modify: 2016-07-31 12:33:15.215018960 +0800
Change: 2016-07-31 12:33:15.215018960 +0800
[root@centos6 ~]# 

# 现在我们编辑下redhat

[root@centos6 ~]# vim redhat 
redhat123
~          
"redhat" 1L, 10C written                                                     
[root@centos6 ~]# 

[root@centos6 ~]# stat redhat 
  File: `redhat‘
  Size: 10              Blocks: 8          IO Block: 4096   regular file
Device: 802h/2050d      Inode: 2752764     Links: 1Access: (0644/-rw-r--r--)  Uid: (    0/    root)   Gid: (    0/    root)
Access: 2016-07-31 12:37:58.609016467 +0800     # 时间戳已变
Modify: 2016-07-31 12:37:57.583017266 +0800
Change: 2016-07-31 12:37:57.592017739 +0800
[root@centos6 ~]# 

# 我们再次cat一下redhat

[root@centos6 ~]# date 
Sun Jul 31 12:41:51 CST 2016
[root@centos6 ~]# cat redhat 
redhat123
[root@centos6 ~]# stat redhat
  File: `redhat‘
  Size: 10              Blocks: 8          IO Block: 4096   regular file
Device: 802h/2050d      Inode: 2752764     Links: 1Access: (0644/-rw-r--r--)  Uid: (    0/    root)   Gid: (    0/    root)
Access: 2016-07-31 12:37:58.609016467 +0800    # 时间戳未变
Modify: 2016-07-31 12:37:57.583017266 +0800
Change: 2016-07-31 12:37:57.592017739 +0800
[root@centos6 ~]#

通过试验,我们发布,在创建文件与修改文件后,atime是最新的,并且修改文件之后时间戳会整体刷新,但在访问文件之后时间戳是不会改变的,而atime应该是要改变的,可怕的是atime竟然没改变,这。。。大白天的。。。见了鬼了。。。

注意,我们的实验是在CentOS 6.8上进行的,在CentOS 5及以前版本,当访问一个文件后atime一定是会改变的,但在CentOS 6及之后版本,引入了delay time机制,从而使得在访问文件时atime没发生变化。那么为什么要引入这个机制呢?

因为一读文件,而使得atime变化,即元数据发生变化,必然会对磁盘进行写操作,无形中增加了系统的IO,从而服务器的负载变大,最终影响服务器的性能。所以,在一定的条件下,读文件没必要改变atime.

那问题来了,文件被访问时(不是被修改或touch)atime会在什么样的情况下改变呢?

如果atime的时间已经大于一天,则atime变;atime的时间比mtime的时间要旧,则atime变。两个条件满足一个就会触发atime的更改。

明白了吧,通过上面实验得知,touch一个已有文件时时间戳会变,修改一个文件后时间戳也会变,但我们的还有更高的需求,如果我想修改一个文件,但不想让它的atime改变,这能实现吗?

[root@centos6 ~]# date 
Sun Jul 31 13:01:18 CST 2016
[root@centos6 ~]# stat f1
  File: `f1‘
  Size: 0               Blocks: 0          IO Block: 4096   regular empty file
Device: 802h/2050d      Inode: 2752537     Links: 1Access: (0644/-rw-r--r--)  Uid: (    0/    root)   Gid: (    0/    root)
Access: 2016-07-31 11:22:13.167042548 +0800
Modify: 2016-07-31 11:22:12.148041845 +0800
Change: 2016-07-31 11:22:12.148041845 +0800
[root@centos6 ~]# echo liansir >> f1     # 用echo修改原文件
[root@centos6 ~]# stat f1
  File: `f1‘
  Size: 8               Blocks: 8          IO Block: 4096   regular file
Device: 802h/2050d      Inode: 2752537     Links: 1Access: (0644/-rw-r--r--)  Uid: (    0/    root)   Gid: (    0/    root)
Access: 2016-07-31 13:01:48.923016664 +0800     # 时间戳还是会变 
Modify: 2016-07-31 13:01:47.908016948 +0800
Change: 2016-07-31 13:01:47.908016948 +0800
[root@centos6 ~]#

我们的需求在CentOS 6.8上没有实现,白忙活一场!!!

想起那个夜晚对妹子吹牛说自己的可以修改某一个文件而不让它的atime改变...

转战CentOS 7.2

[root@localhost ~]# date
Sun Jul 31 01:46:16 EDT 2016       # 01:46:16
[root@localhost ~]# stat f1
  File: ‘f1’
  Size: 0               Blocks: 0          IO Block: 4096   regular empty file
Device: fd00h/64768d    Inode: 404648679   Links: 1Access: (0644/-rw-r--r--)  Uid: (    0/    root)   Gid: (    0/    root)
Context: unconfined_u:object_r:admin_home_t:s0
Access: 2016-07-31 01:44:37.752168526 -0400    # atime=01:44:37
Modify: 2016-07-31 01:44:37.752168526 -0400
Change: 2016-07-31 01:44:37.752168526 -0400
 Birth: -
[root@localhost ~]# echo liansir >> f1    # 用echo修改原文件
[root@localhost ~]# stat f1
  File: ‘f1’
  Size: 8               Blocks: 8          IO Block: 4096   regular file
Device: fd00h/64768d    Inode: 404648679   Links: 1Access: (0644/-rw-r--r--)  Uid: (    0/    root)   Gid: (    0/    root)
Context: unconfined_u:object_r:admin_home_t:s0
Access: 2016-07-31 01:44:37.752168526 -0400   # atime=01:44:37,atime未变
Modify: 2016-07-31 01:46:44.486366696 -0400   # mtime=01:46:44
Change: 2016-07-31 01:46:44.486366696 -0400   # ctime=01:46:44
 Birth: -
[root@localhost ~]#

修改原文件后,成功”保留“了atime!

哈哈,把妹子定格在了atime!

如果你想把妹子永远定格在第一次见面的atime, 教你一招!

强行锁定atime:

强行锁定atime:
[root@localhost ~]# chattr +A f1


[root@centos6 ~]# chattr +A f1
[root@centos6 ~]# echo lian >> f1
[root@centos6 ~]# stat f1
  File: `f1‘
  Size: 18              Blocks: 8          IO Block: 4096   regular file
Device: 802h/2050d      Inode: 2752537     Links: 1Access: (0644/-rw-r--r--)  Uid: (    0/    root)   Gid: (    0/    root)
Access: 2016-07-31 13:47:21.432013563 +0800    # atime 未变
Modify: 2016-07-31 13:58:11.474013781 +0800
Change: 2016-07-31 13:58:11.474013781 +0800
[root@centos6 ~]#

2016.7.31

止战


本文出自 “止战-连Sir” 博客,请务必保留此出处http://liansir.blog.51cto.com/9372908/1832338

Linux初体验(六)

标签:  inode     cp     mv     rm     ln     时间戳(touch、stat)

原文地址:http://liansir.blog.51cto.com/9372908/1832338

(0)
(0)
   
举报
评论 一句话评论(0
登录后才能评论!
© 2014 mamicode.com 版权所有  联系我们:gaon5@hotmail.com
迷上了代码!