![]() |
VOOZH | about |
文件系統的特性
磁碟分區完畢後需要進行格式化,作業系統才能使用這個分區。
不同作業系統能夠使用的文件系統是不同的,例如:Windows98以前使用FAT/FAT16文件系統,Windows2000以後使用NTFS文件系統,Linux使用Ext2文件系統。在分區完成之後,要使得作業系統能夠識別文件系統,就需要進行格式化,把分區格式化成某一個作業系統能夠識別的文件系統。
一般來說,一個分區中裝一個文件系統,但是現在技術發展了,一個分區可以裝多個文件系統,也能將多個分區合併成一個文件系統。一個文件系統可以掛載到作業系統上。
一個文件由許多的屬性和文件本身的數據組成,文件系統會把同一個文件的兩種數據分別存放在inode和block中。此外,整個文件系統還有個super block,用於記錄整個文件系統的整體信息。
要訪問一個文件時,首先找到這個文件的inode,根據inode中的權限查看當前用戶是否有權力讀取這個文件;然後查看inode中block的位置,最後找到block,讀出數據。這種文件系統就叫做索引式文件系統,所以Linux的ext2文件系統就是索引式文件系統。
| block大小 | 1KB | 2KB | 4KB |
|---|---|---|---|
| 最大單一文件容量 | 16GB | 256GB | 2T |
一個block只能存放一個文件的數據,如果文件太大,則使用多個block存放,如果一個block放不滿,則剩下的就空著。
當我們在Linux的ext2下創建一個目錄時,文件系統會給我們分配一個inode和一個block。
其中,inode記錄該目錄的相關權限與屬性,並記錄該block的號碼。
而block中記錄的是這個目錄的名字、這個目錄下所有的文件名、以及這些文件所占用的inode號碼。
//通過增加-i參數,可以查看文件所占用的inode號碼//PS:最前面的數字就是inode號碼ls -li total24606624drwx------+ 8 chaibozhou staff 272 4 28 08:31
Desktop606608drwx------+ 15 chaibozhou staff 510 4 26 20:14 Documents606610drwx------+ 60 chaibozhou staff 2040 4 29 20:37
Downloads606612drwx------@ 52 chaibozhou staff 1768 4 30 12:38 Libraryinode與文件的關係
當我們創建一個文件時,文件系統會分配一個inode和相對於文件大小的一些block。例如一個block為4KB,我們創建了一個100KB的文件,那麼需要分配一個inode和25個block;但Linux的ext2文件系統只有12個直接索引,所以還需要一個間接索引的block來存放該文件block的號碼。
文件的讀取過程假設讀取/etc/passwd這個文件:
當一個文件很大,需要很多的block,而這些block又存放的比較離散,這時磁碟讀寫性能就很低了。
如果由於文件系統的空閒block較為離散,即使是存一些小文件,仍然需要磁頭大量的移動,這時候就考慮將所有數據拷出來,然後格式化整個文件系統,再將數據拷回去。
文件的創建過程
a)首先判斷該用戶對於新文件所在的目錄是否具有w和x權限,若有的話才能創建。
PS:因為目錄的w權限代表能夠創建、刪除、重命名、移動文件;x權限代表能夠cd到目錄中去。
b)根據inode bitmap找到沒有使用的inode號碼,把文件的屬性寫進去;
c)根據block bitmap找到沒有使用的block,將文件的數據寫進去,並更新inode,將block的號碼寫進去;
d)更新inode bitmap和block bitmap,更新super block。(更新中間數據)
數據的不一致性
inode和block被稱為數據的存放區域,super block、block bitmap、inode bitmap稱為中間數據(metadata)。如果在文件創建的過程中,因不明原因導致中斷,數據已經寫入inode和data block,但是更新中間數據的工作還沒有做完,此時就會出現meta data和實際數據存放區產生了不一致。
解決數據的不一致的方法——日誌文件系統
a)預備:當要寫入一個文件時,先在日誌文件中記錄某個文件準備要寫入的信息;
b)實際寫入:開始寫入文件的權限、屬性和數據;然後更新中間meta data。
c)結束:完成數據記錄與meta data更新之後,在日誌記錄塊中完成對該文件的記錄。
有了日誌文件的記錄,萬一哪個文件在創建過程中發生異常,那麼系統直接查看日誌文件,看看哪一個文件有預備記錄,但沒有結束記錄,然後僅對有問題的文件進行一致性檢查即可,無需對整個文件系統進行檢查,這樣就能夠實現快速恢復文件系統了。
要處理一個文件,必須要把它全部放到內存中;那麼當處理一個很大的文件的時候,如果頻繁地要求作業系統將文件保存到外存,那麼我們系統會出現卡頓,等待文件寫入外存。為了避免寫入外存時候的等待,我們就引入了異步處理方式。
一個文件在內存中,如果沒有對他進行修改,那麼它的狀態是clean,系統不會把它寫入外存;若我們對文件進行了修改,那麼它的狀態就變成了dirty,此時我們繼續對文件進行操作,只不過系統會在後台不定時地將dirty狀態的文件寫入外存;也就是說,我們的操作和文件寫入外存是並行的,去除了我們的等待時間。
每個文件系統都有獨立的inode、block、super block等信息,每個文件系統都必須連接到系統的目錄樹上才能夠被使用。我們將文件系統連接到目錄樹上的動作叫做掛載,就好像果子掛到樹上去。
PS:掛載點一定得是目錄,這個目錄是進入這個文件系統的入口。
舉例來說:假設有三個掛載點/、/boot、/home,他們對應的設備文件分別是:/dev/hdc2,/dev/hdc1,/dev/hdc3,那麼查看這三個目錄的inode號碼可以發現:
2drwxr-xr-x23root
wheel312232222:18/2drwxr-xr-x4root
wheel142232422:18/boot2drwxr-xr-x6root
wheel12232522:18/home
他們的inode號碼都是2,說明他們都是文件系統的根目錄,但是它們的其他數據都是不一樣的,說明他們不是同一個文件,所以他們三個人來自三個不同的文件系統。
如果inode號碼一致,並且其他屬性都相同,則可以判斷他們是同一個文件,就像/,/.,/..
df//不添加參數,顯示所有的文件系統,以1KB為單位Filesystem512-blocksUsed Available Capacity iused ifree%iused
Mountedon/dev/disk197438924810823781686563943212%1359372510820492911%/devfs3633630100%6280100%/devmap-hosts000100%00100%/netmapauto_home000100%00100%/home
Mounted on:掛載點的名字,也就是磁碟掛載的目錄
PS:df主要是針對整個文件系統,因此讀取的是super block中的數據,所以它顯示的非常快。
PS:我們需要特別留意根目錄的剩餘量,因為所有的數據都是從根目錄衍生而來的,因此當根目錄的剩餘量為0時,那你的系統問題就很大了。
b)du:獲取某個目錄的容量
du [option] 文件/目錄
-a:列出所有的目錄和文件的容量,要是不寫這個參數默認只是列出文件的容量而已。-n:以人們較為容易的格式顯示容量-s:列出目標目錄的總容量,而不列出個別的目錄容量-S:列出目錄總容量,但不包括子目錄-k:容量以KB顯示-m:容量以MB顯示//PS:若這個命令不帶任何參數則列出當前目錄的容量,單位是1KB。
連接文件 ln
Linux下的連接文件有兩種,一種是類似於Windows下的快捷方式,稱為符號連接;另一種稱為硬連接。
a)硬連接(實際連接)
我們知道,目錄的block中存放的是這個目錄下的所有文件名和他們的inode號碼,也就是說,文件名只與目錄有關,而文件的內容是通過目錄block中記錄的inode號碼來找到的。
硬連接就是新建一個文件名,連接到某inode號碼。就是兩個不同的文件名,但是指向同一個inode。
經過了硬連接的文件,如果刪除其中一個文件,那麼還有另外一個文件名指向這個文件,這個文件的block仍然是存在的。此外,不論通過哪個文件名修改文件,由於兩個文件名都是指向同一個文件內容,所以兩個文件的內容都會發生變化。
使用硬連接設置文件連接時,磁碟空間的inode和block的數目都不會發生變化。只是某個目錄的block下多了一個連接文件名的inode號碼而已。
硬連接不能跨文件系統。
硬連接只能連接兩個文件,而不能連接兩個目錄。
b)符號連接(快捷方式)
再新建一個文件,只不過這個新文件會讓數據的讀取指向它連接的那個文件名。由於只是利用了文件的內容作為指向的操作,所以當原文件被刪除之後,再打開連接文件酒會提示「文件無法打開「。
由於符號文件會創建一個新的獨立的文件,所以它會用掉inode和block。
由於硬連接無法連接到目錄,所以一般是符號連接比較常用。
符號文件的一個顯著特性:
//表示chai是一個符號連接文件,它指向/home/shixv,而硬連接是不會有->這個符號的。/chai->/home/shixv//將目標文件指向原文件ln [option] 原文件 目標文件
-s:不加參數就是硬連接,加了s就是符號連接-f:force模式,如果目標文件存在,直接把它覆蓋//權限後面的數字就代表連接到這個inode上的連接文件個數drwxr-xr-x31root
wheel112232122:18.drwxr-xr-x31root
wheel112232122:18..