linux的文件系統及節點表


linux的文件系統及節點表  

一  linux的文件系統
1 我們都知道當我們安裝linux時會首先給系統分區,然后我們會把分區格式化成EXT3格式的文件系統。那么在linux系統中還有沒有其他的文件系統呢,下面我們就簡單的介紹一下linux系統中常見的幾種文件系統。
(1)EXT3文件系統:ext3(第三級擴展linux文件系統,third extended linux filesystem)。跟EXT2文件不同之處就是增加了日志功能。
(2)EXT2和MSDOS:一般用於軟盤
(3)ISO9660:光盤的文件系統
(4)GFS和GFS2:主要用於集群服務器的文件系統(SAN)
二 linux文件系統的節點(Inodes)
1 Inode(index node )索引節點
2 首先我們要清楚地是:一個文件其實是由兩部分組成:節點表和數據區。Inodes table (節點表)包含了ext2和ext3文件系統的所有屬性。節點表里面主要存放文件的類型,權限,UID,GID,Link count,大小和時間戳,數據存放在磁盤的什么位置。數據區里面就是存放真正的數據。

3 一個inodes(節點號)的大小大概為128B,一個文件至少要占有1個inodes。通過tune2fs
-l /dev/sda7 可以查看這個分區的inode size,inode count,block count。

 

我們知道,計算機在識別一個用戶是通過UID來識別的,識別一個進程是通過進程號來識別的,那么,同樣,計算機識別一個文件是通過一個inode number來識別文件的。而文件名只是給人的識別的。

 

4 查看節點號的方法:#ls
-li

 

[root@localhost ~]# ls -li

 

total 56

 

533587 -rw------- 1 root root
1050
Mar
6 02:15 anaconda-ks.cfg

 

919063 drwxr-xr-x 2 root root 4096
Mar
6 02:43 Desktop

 

524290 -rw-r--r-- 1 root root
29302
Mar
6 02:15 install.log

 

524291 -rw-r--r-- 1 root root
3738
Mar
6 02:15 install.log.syslog

 

前面的一串數字就是文件的節點號,

 

其實我們的節點號是在分區創建的時候就已經分配好了的。

 

5 下面我們來學習復制,剪切,刪除對文件inode的影響

 


(1)復制對文件inode的影響

 

[root@localhost ~]# cd /boot/

 

[root@localhost boot]# ls -li file

 

6030 -rw-r--r-- 1 root root 0 Mar
6 13:26 file

 

a   可以看到,這個文件的節點號是6030,現在我們將它復制到另外一個分區

 

[root@localhost boot]# cp file /var/

 

[root@localhost boot]# cd /var/

 

[root@localhost var]# ls -li file

 

2115361 -rw-r--r-- 1 root root 0 Mar
6 13:27 file

 

將這個文件復制到/var分區下面后,這個文件的inode number就改變了。

 

當一個文件從一個分區復制到另外一個分區的時候,系統就分配了另外一個inode給這個文件。

 

b     那么在同一個分區復制文件節點號會有什么改變呢

 

[root@localhost boot]# ls -li file

 

6030 -rw-r--r-- 1 root root 0 Mar
6 13:26 file

 

[root@localhost boot]# cp file /boot/grub/

 

[root@localhost boot]# cd grub/

 

[root@localhost grub]# ls -li file

 

22091 -rw-r--r-- 1 root root 0 Mar
6 13:29 file

 

可以看到,剛才這個文件的節點號是6030,現在就變成了22091了。

 

在同一個分區里面復制文件,這個文件的節點號也是會發生改變的。因為在這個分區有兩份相同的文件,只是文件的內容相同,但是文件的inode屬性卻是不一樣的。

 

2. 剪切對文件inode的影響

 

a 同一分區的剪切

 

[root@localhost ~]# cd /boot/

 

[root@localhost boot]# ls -li file

 

6030 -rw-r--r-- 1 root root 0 Mar
6 13:26 file

 

可以看到,這個文件的節點號是6030,現在我們將這個文件在同個分區里剪切一份。

 

[root@localhost boot]# mv file /boot/test/

 

[root@localhost test]# ls -li file

 

6030 -rw-r--r-- 1 root root 0 Mar
6 13:26 file

 

可以看到,這個文件節點號是沒有改變的。

 

當在同一個分區里面移到文件,文件的節點號沒有發生改變。

 

b 不同的分區剪切

 

[root@localhost ~]# cd /boot/test/

 

[root@localhost test]# ls -li file

 

6030 -rw-r--r-- 1 root

 

[root@localhost test]# mv /boot/test/file /var/ftp/pub/

 

[root@localhost test]# cd /var/ftp/pub/

 

[root@localhost pub]# ls -li file

 

325584 -rw-r--r-- 1 root root 0 Mar
6 13:26 file

 

可以看到,這個文件的節點號是肯定會變的。

 

3 刪除對inode的影響

 

[root@localhost ~]# cd /boot/

 

[root@localhost boot]# ls -li file

 

6030 -rw-r--r-- 1 root root 0 Mar
6 13:44 file

 

[root@localhost boot]# rm -rf file

 

現在我們把file這個文件給刪除了,其實我們只是將file這個文件的節點表給刪除了,其實我們的數據都還在。這也就是為什么當我們刪除一個文件,這個文件還可以被找回來的原因。當然如果我們在到這個分區里面寫入數據,那么原來的數據就會被覆蓋。

 

[root@localhost boot]# touch file1

 

[root@localhost boot]# ls -li file1

 

6030 -rw-r--r-- 1 root root 0 Mar
6 13:49 file1

 

現在我們又新建了一個文件file1,這個文件的節點號也是6030,它就已經覆蓋了以前的數據的節點號。那么以前的數據就找不回來了。

 

 

 


4 總結

 

復制:在同一個分區,節點號改變。

 


在不同的分區,節點號改變。

 

剪切:在同一個分區,節點號不變。

 


在不同的分區,節點號改變。

 

刪除:只是刪除了文件的節點表,數據沒有被真正刪除,只有當往這個分區在寫入數據的時候,才會覆蓋原來的數據。

 

 

 

 

 

2:inode - linux文件系統的關鍵  

 

[命令基礎]
$ ls -li
 427333 drwx------      2 abao abao 4096 2009-08-12 20:19 amsn_received
 989840 -rwxrwxrwx    1 abao abao  144 2009-10-22 22:19 chroot-lfs.sh
1038353 drwxr-xr-x   13 abao abao 4096 2009-11-04 21:42 data
[注釋: 上面的例子中,紅色的就是inode number,藍色的是當前文件的link count。]

 

inode是理解linux文件系統的核心概念。iNode的意思就是index node,就是索引的意思。linux中目錄也被被看成是廣義的文件,而理解inode正是理解這個廣義文件的最好的辦法。每個文件和目錄都對應着一個inode,inode在一個分區內是唯一的。
對於文件而言,它的信息可以人為的看成三個部分,文件名,文件屬性和文件內容。文件名就是我們通常使用的名字,文件屬性則包括文件大小,權限設置,修改時間等。文件內容就是我們用cat命令能看到的東西。文件屬性是全部保存在文件對應的inode當中的,文件內容在物理上和inode並不是存放在一起,而是放在稍微靠后的磁盤區,也可以稱為數據區。在inode里面有指向數據區的指針。
對於目錄而言,目錄的存儲也分成三個部分,也是目錄名稱,目錄屬性和目錄內容這里提到的目錄內容其實就是目錄中包含的所有文件/子目錄的對應關系(文件名-inode-關系表)。目錄屬性也存儲在inode中,而目錄內容就存儲在inode所對應的數據區當中。
你可能會問,那么名字呢?文件和目錄的名字跑到哪里去了呢?其實,這個名字就存儲在它的父目錄的內容當中。 舉個例子如下。
/tmp包含了兩個文件file1和file2。
那么在系統中就會有三個inode,比如說他們的inode number分別是1000(/tmp), 10001(/tmp/file1), 10002(/tmp/file2)。
那么1000#號inode中,保存了/tmp中所有的下屬文件的inode和名字,已經目錄自身的屬性。
10001#號inode中,保存了/tmp/file1自己的文件屬性,以及指向數據區的指針。
10002#號inode中,保存了/tmp/file2自己的文件屬性,以及指向數據區的指針。
而/tmp這個目錄名字,則是由它的父目錄(也就是/)來負責管理的。
從上面的例子可以看到,名字,屬性和內容,后兩者是聯系在一起的,名字則是歸父目錄去管理。當有兩個目錄都指向同一個inode的時候,就會出現同樣的屬性+內容,出現在兩個不同的目錄中。甚至可以以不同的名字出現在相同的目錄中。這就是連接的概念,有多少個目錄指向當前這個文件(或當前這個目錄),這個數字就是link count。在連接中,inode number是父目錄識別子體的關鍵信息。
注意到,每個分區(partition)都會有自己的inode列表,也就是每個分區的inode系統是獨立的。那么當我們把一個分區設備裝載到當前使用的分區時,兩個inode系統就會重疊在一起。比如我的linux是mount在/dev/sda1上作為root的,然后我把/dev/sda2裝載到/home上。就會發現/home和/的inode number都是2。這是兩個分區inode表重疊在一起的表現。
如果你明白了以上的這個例子,就會能夠回答如下的一些看上去很難的問題。

 


在上面的例子里面為什么我不能ln /home/abc/d  /file呢?因為這樣去做相當於讓一個/dev/sda1中的目錄去連接/dev/sda2中的一個文件,這是inode系統所不允許的。
能夠讓ln作用在一個目錄上呢?也就是ln <dir1> <dir2>呢?這樣也不行,因為這樣會出現<dir1>有兩個父目錄的情況,從直觀上講,這就是不合理的。
我用ls -li 命令,為什么看到空目錄的inode link count是2呢?這是linux的系統就是這么設計的。當一個目錄創建出來,它的"文件名-inode-關系表"里面就有兩個元素,其一是".",表示指向自身,其二是".."指向它的父目錄。而我們看到的這個2,一個是自身指向自身的link,另一個是它的父目錄指向它的link(想想看"文件名-inode-關系表")。這里還有一個有意思的現象,就是這個新目錄指向它的父目錄,它的父目錄也指向它,這種連接是雙向的。
為什么我在目錄里面增加一個文件,這個文件的link count是1,而它的父目錄的link count卻不變呢?由於一個文件可以被多次link的特性,暗示了文件不會記錄它的父目錄的inode,這樣目錄和它的子文件之間的關聯是單向的。所以就會出現這樣的情況。
ln -s的本質是什么?從編程的角度來看,symbolic link(符號連接)和連接從根本上不是一回事,符號連接其實就是名字的快捷方式,和windows中的快捷方式很類似。符號連接是從屬於原始文件的,而連接創造出來的文件和原來文件是等同的。
ln -s的用處是什么呢?ln -s有三種主要的特性,一來它可以進行跨分區的操作,二來可以作用在目錄上,三來是許多linux的腳本運行機制需要這樣的符號連接。
/的inode是多少呢?我觀察了幾個系統,/目錄的inode是2,但是目前我還沒有不太了解原因。/proc /sys的inode是1,等我以后再來解釋,現在我還不太明白。
如何知道一個系統能使用多少個inode呢?用如下的命令 tune2fs -l /dev/sda1,這個命令在e2fsprogs工具里面。
如果inode之間的連接出現問題,應該怎么解決?這是一個復雜的問題,簡單的說,可以用e2fsck工具來進行檢修,那些沒有被link的inode會被掛到/lost+found目錄下。


免責聲明!

本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



 
粵ICP備18138465號   © 2018-2025 CODEPRJ.COM