linux inode详解
在Linux文件系統中,很多人對Inode都不太明白,今天我就和大家一起來分享一下我對Inode的認識,如果有理解錯誤的地方,請大家多多批評指點。
在上一篇一天一點學習Linux之認識文件系統中,在最后給出了一張EXT3文件系統結構圖,里面已經涉及到了Inode的相關信息——圖的左下角部分,今天,我們就專門對這一部分進行一下詳解,希望通過今天的內容,能幫助大家更清楚的了解Inode。
?
先看看Inode的結構圖
再來了解一下文件系統如何存取文件的
1、根據文件名,通過Directory里的對應關系,找到文件對應的Inode number
2、再根據Inode number讀取到文件的Inode table
3、再根據Inode table中的Pointer讀取到相應的Blocks
這里有一個重要的內容,就是Directory,他不是我們通常說的目錄,而是一個列表,記錄了一個文件/目錄名稱對應的Inode number。如下圖
Directory:
A directory is a mapping between the human name for the file and the computer's inode number.
所以說,這個Directory不是文件,我們可以看作是文件系統中的一個屬性,只是用來關鍵文件名與Inode number。這個一定要理解好,否則后面關于硬鏈接的內容,就不容易理解了。
我在一天一點學習Linux之文件與目錄權限的基本概念中講到
第二欄表示的是有多少文件連接到inode
如果是一個文件,此時這一字段表示這個文件所具有的硬鏈接數,?
如果是一個目錄,則此字段表示該目錄所含子目錄的個數。
現在是不是容易理解了?如果你還不是很明白,那么下面我們就再通過實例讓大家明白。
我們以RHEL6系統為例
在根目錄下創建一個test目錄,我們進入此目錄,進行操作。
[root@yufei test]# pwd
/test
[root@yufei test]# touch testfile
[root@yufei test]# mkdir testdir
創建實驗文件和目錄
[root@yufei test]# ls -li
total 4
977 drwxr-xr-x. 2 root root 4096 Apr? 5 16:48 testdir
976 -rw-r--r--. 1 root root??? 0 Apr? 5 16:47 testfile
查看到文件與目錄的Inode和inode count分別為
977 <-----> 2 <-----> testdir
976 <-----> 1 <-----> testfile
現 在目錄的鏈接數為2,文件的鏈接數為1。為什么會這樣呢?其實很好理解。對于目錄而言,每個目錄里面肯定會有兩個特殊目錄,那就是.和..這兩個目錄,我 們前面的課程中也講到,.表示當前的目錄,而..則是表示上層目錄。我們也知道,在Linux系統中,是從根來開始查找的,要想找到某個目錄,必需要先找 到他的上層目錄,所以說,空目錄(嚴格的來說,不能叫空目錄)是有兩個鏈接到相應的Inode number的。作為文件很明顯,他只有一個鏈接到相應的Inode number。也不用多說,
下面我們就來看看這個鏈接數是如何改變的。
繼續上面的操作
[root@yufei test]# ln testfile testfile.hard
[root@yufei test]# ln -s testfile testfile.soft
對testfile建立一個硬鏈接和一個軟鏈接
[root@yufei test]# ls -il
total 4
977 drwxr-xr-x. 2 root root 4096 Apr? 5 16:48 testdir
976 -rw-r--r--. 2 root root??? 0 Apr? 5 16:47 testfile
976 -rw-r--r--. 2 root root??? 0 Apr? 5 16:47 testfile.hard
978 lrwxrwxrwx. 1 root root??? 8 Apr? 5 17:03 testfile.soft -> testfile
再 查看文件和目錄的屬性,我們就發現:創建一個硬鏈接后,testfile的inode count增加了一個。而且testfile和testfile.hard這兩個的Inode number是一樣的。這個硬鏈接就是重新創建了一個文件名對應到原文件的Inode。實質就是在Directory中增加了一個新的對應關系。通過這個 例子,你是不是更清楚了,這個Inode count的含義了。他就是指,一個Inode對應了多少個文件名。
下面我們再來看看硬鏈接的其他特點
[root@yufei ~]# watch -n 1 "df -i;df"
Every 1.0s: df -i;df??????????????????????????? Tue Apr? 5 21:52:53 2011
Filesystem??????????? Inodes?? IUsed?? IFree IUse% Mounted on
/dev/sda1???????????? 960992? 105415? 855577?? 11% /
tmpfs????????????????? 63946?????? 1?? 63945??? 1% /dev/shm
Filesystem?????????? 1K-blocks????? Used Available Use% Mounted on
/dev/sda1???????????? 15118728?? 2747612? 11603116? 20% /
tmpfs?????????????????? 255784???????? 0??? 255784?? 0% /dev/shm
用上面的命令可以實時查看系統中所剩的block和inode的變化數量。
建 議大家不要用deumpe2fs和tune2fs這兩個命令,如果使用他們來查看的話,將會很郁悶——你會發現,你無論怎么創建文件或對文件寫入內 容,Inode和block的值都不會變,除非你每操作一次,重新啟動一次系統,而用了上面的命令,就是第秒鐘監視他們的變化情況。關于df的命令使用, 大家可以自行查看幫助進行學習。當然還有du這個命令,他們都和文件系統有關。
我們再來創建一個硬鏈接
[root@yufei test]# ls -li
total 4
977 drwxr-xr-x. 2 root root 4096 Apr? 5 16:48 testdir
976 -rw-r--r--. 2 root root??? 0 Apr? 5 16:47 testfile
976 -rw-r--r--. 2 root root??? 0 Apr? 5 16:47 testfile.hard
978 lrwxrwxrwx. 1 root root??? 8 Apr? 5 17:03 testfile.soft -> testfile
[root@yufei test]# ln testfile testfile.hard1
[root@yufei test]# ls -li
total 4
977 drwxr-xr-x. 2 root root 4096 Apr? 5 16:48 testdir
976 -rw-r--r--. 3 root root??? 0 Apr? 5 16:47 testfile
976 -rw-r--r--. 3 root root??? 0 Apr? 5 16:47 testfile.hard
976 -rw-r--r--. 3 root root??? 0 Apr? 5 16:47 testfile.hard1
978 lrwxrwxrwx. 1 root root??? 8 Apr? 5 17:03 testfile.soft -> testfile
可以再觀察一下Inode count和Inode number的對應關系。
下面再看看inodes和blocks的變化
[root@yufei ~]# watch -n 1 "df -i;df"
Every 1.0s: df -i;df??????????????????????????? Tue Apr? 5 21:53:38 2011
Filesystem??????????? Inodes?? IUsed?? IFree IUse% Mounted on
/dev/sda1???????????? 960992? 105415? 855577?? 11% /
tmpfs????????????????? 63946?????? 1?? 63945??? 1% /dev/shm
Filesystem?????????? 1K-blocks????? Used Available Use% Mounted on
/dev/sda1???????????? 15118728?? 2747612? 11603116? 20% /
tmpfs?????????????????? 255784???????? 0??? 255784?? 0% /dev/shm
我們發現,inodes和blocks是沒有減少的,所以說,硬鏈接是不會占用磁盤的空間的。
如果說刪除硬鏈接的話,就會改變Inode count的數量。硬鏈接還有其他的兩個特性:不能跨Filesystem也不能link目錄。
下面再來看看這個軟鏈接
[root@yufei test]# ls -il testfile.soft testfile
976 -rw-r--r--. 3 root root 0 Apr? 5 21:50 testfile
978 lrwxrwxrwx. 1 root root 8 Apr? 5 21:52 testfile.soft -> testfile
他 的Inode number和原文件不一樣。而且大小也發生了變化。可見,這個軟鏈接是重新建立了一個文件,而文件是指向到原文件,而不是指向原Inode。當然他會占 用掉 inode 與 block。當我們刪除了源文件后,鏈接文件不能獨立存在,雖然仍保留文件名,但我們卻不能查看軟鏈接文件的內容了。但軟鏈接是可以跨文件系統,而且是可 以鏈接目錄。他就相當于windows系統下的快捷方式一樣。通過這個特性,我們可以通過軟鏈接解決某個分區inode conut不足的問題(軟鏈接到另一個inode count足夠多的分區)。
接下來,我們再來分析一下復制文件、移動文件和刪除文件對inode的影響
[root@yufei ~]# watch -n 1 "df -i;df"
Every 1.0s: df -i;df??????????????????????????? Tue Apr? 5 21:57:38 2011
Filesystem??????????? Inodes?? IUsed?? IFree IUse% Mounted on
/dev/sda1???????????? 960992? 105415? 855577?? 11% /
tmpfs????????????????? 63946?????? 1?? 63945??? 1% /dev/shm
Filesystem?????????? 1K-blocks????? Used Available Use% Mounted on
/dev/sda1???????????? 15118728?? 2747612? 11603116? 20% /
tmpfs?????????????????? 255784???????? 0??? 255784?? 0% /dev/shm
[root@yufei test]# ls -li
total 4
977 drwxr-xr-x. 2 root root 4096 Apr? 5 16:48 testdir
976 -rw-r--r--. 3 root root??? 0 Apr? 5 18:54 testfile
976 -rw-r--r--. 3 root root??? 0 Apr? 5 18:54 testfile.hard
976 -rw-r--r--. 3 root root??? 0 Apr? 5 18:54 testfile.hard1
978 lrwxrwxrwx. 1 root root??? 8 Apr? 5 17:03 testfile.soft -> testfile
我們先記錄以上的信息
先看復制文件的情況
[root@yufei test]# cp testfile testfile.cp
[root@yufei test]# ls -li
976 -rw-r--r--. 3 root root??? 0 Apr? 5 21:50 testfile
979 -rw-r--r--. 1 root root??? 0 Apr? 5 21:58 testfile.cp
我們只對比這兩個文件,發現Inode number不一樣,我們再來看看inodes和blocks的剩余情況
Every 1.0s: df -i;df??????????????????????????? Tue Apr? 5 22:02:49 2011
Filesystem??????????? Inodes?? IUsed?? IFree IUse% Mounted on
/dev/sda1???????????? 960992? 105416? 855576?? 11% /
tmpfs????????????????? 63946?????? 1?? 63945??? 1% /dev/shm
Filesystem?????????? 1K-blocks????? Used Available Use% Mounted on
/dev/sda1???????????? 15118728?? 2747620? 11603108? 20% /
tmpfs?????????????????? 255784???????? 0??? 255784?? 0% /dev/shm
發現inodes減少了一個,而blocks也少了,這就說明,復制文件是創建文件,并占Inode和Block的。
文件創建過程是:先查找一個空的Inode,寫入新的Inode table,創建Directory,對應文件名,向block中寫入文件內容
關于移動文件和刪除文件的實驗,大家可以自己動手來實踐吧。我直接給出相應的說明。
移動文件,他分兩種情況:
在同一個文件系統中移動文件時
創建一個新的文件名和Inode的對應關系(也就是在Directory中寫入信息),然后在Directory中刪除舊的信息,更新CTIME,其他的信息如Inode等等均無任何影響
在不同文件系統移動文件時
先查找一個空的Inode,寫入新的Inode table,創建Directory中的對應關系,向block中寫入文件內容,同時還會更改CTIME。
刪除文件
他實質上就是減少link count,當link count為0時,就表示這個Inode可以使用,并把Block標記為可以寫,但并沒有清除Block里面數據,除非是有新的數據需要用到這個block。
最后我們來做個總結:
1、一個Inode對應一個文件,而一個文件根據其大小,會占用多塊blocks。
2、更為準確的來說,一個文件只對應一個Inode。因為硬鏈接其實不是創建新文件,只是在Directory中寫入了新的對應關系而已。
3、當我們刪除文件的時候,只是把Inode標記為可用,文件在block中的內容是沒有被清除的,只有在有新的文件需要占用block的時候,才會被覆蓋
總結
以上是生活随笔為你收集整理的linux inode详解的全部內容,希望文章能夠幫你解決所遇到的問題。
- 上一篇: print输出字体特效
- 下一篇: Fedora 安装