歡迎來到Linux教程網
Linux教程網
Linux教程網
Linux教程網
Linux教程網 >> Linux基礎 >> Linux技術 >> Linux初體驗(六)

Linux初體驗(六)

日期:2017/3/3 11:01:47   编辑:Linux技術

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命令用來將一個或多個文件或目錄復制到目標文件或目錄,可以將單個文件復制成一個指定文件名的文件或某個已經存在的目錄下;當一次復制多個文件時,目標文件參數必須是一個已經存在的目錄,否則報錯。常用參數--preserv[=ALLR_LIST]
mode:權限
ownership: 屬主屬組
timestamps
links
xattr
contextall
-d: --no dereference --preserv=links 不復制原文件,只復制鏈接名。 當復制符號鏈接時,把目標文件或目錄也建立為符號鏈接,並指向與源文件或目錄連接的原始文件或目錄
-p: 保留原文件或目錄的屬性,相當於--preserv=mode,ownership,timestamp
-R/r: 遞歸處理,將指定目錄下的所有文件與子目錄一並處理
-a: 歸檔,相當於 -dR --preserv=all
-f: --force, 強行復制文件或目錄,不論目標文件或目錄是否已存在
-i: 覆蓋既有文件或目錄之前先詢問用戶
-s: 對源文件建立符號鏈接,而非復制文件
-b: 覆蓋已存在的文件目標前將目標文件備份
-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 命令之前須謹慎,故一旦刪除便無法恢復。常用參數-i: --interactive, 交互式,刪除目錄或文件前先詢問用戶
-f: 強制刪除文件或目錄
-r/-R: --recursive 遞歸處理,將指定目錄下的所有文件與子目錄一並處理
-v: --verbose, 顯示詳細執行過程
--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到目錄;前者在同一目錄下相當於重命令,在不同目錄下當然就是移動了。後者不管是同一目錄還是目錄,都是移動或者覆蓋(同名則覆蓋)。常用參數--backup[=CONTROL]: 備份模式,當覆蓋文件時則先備份
-b: 覆蓋前為其創建備份
-f: 強行移動或覆蓋
-i: 交互式模式,"y"表示覆蓋,"n"表示取消當前操作
-S: --suffix=SUFFIX, 為備份文件指定後綴
--strip-trailing-slashes: 刪除源文件中的斜槓"/"
-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命令的常用參數吧!常用參數--backup: --backup[=CONTROL],開啟備份模式
-b: 類似於--backup,但不接受參數
-d,-F: --directory, 建立目錄的硬鏈接
-f: --force, 強行建立文件或目錄的鏈接,不論目標文件或目錄是否存在
-i: --interactiv, 交互式
-n: --no-dereference, 把軟鏈接的目標目錄視為一般文件
-s: --symbolic, 創建軟鏈接
-S: --suffix=SUFFIX,為備份文件指定後綴(與mv 的 -S選項一個意思)
-v: --verbose, 顯示指令執行過程
--help: 在線幫助
--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,改變時間
常用參數-a: change only the access time
-c: --no-create, do not create any files
-d: --date=STRING , 使用指定的日期時間,而非當前時間
-m: change only the modification time
-r: --reference=FILE, use this file’s times instead of current time.把指定文件或目錄的日期時間設成參考文件的日期時間。
-t: STAMP,use [[CC]YY]MMDDhhmm[.ss] instead of current time,使用指定的日期時間
--help: 在線幫助
--version 版本信息

stat

主要用途狀態信息
stat - display file or file system status
 stat [OPTION]... FILE...
stat命令主要用來顯示文件或文件系統的狀態信息,要比ls 更為詳細。常用參數-L: follow links, 顯示符號鏈接的狀態信息,否則顯示的是被符號鏈接的文件信息
-f: --file-system, display file system status instead of file status,顯示文件系統的狀態信息而非文件的狀態信息
--help
--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
Copyright © Linux教程網 All Rights Reserved