文件系統(File system)
1. 文件
首先要說文件的定義,文件是進程創建的信息邏輯單元。
由於磁帶和光盤的性能較低,磁盤使用的較多。這里討論文件儲存在磁盤中的情況。磁盤可被認為是固定塊兒大小的線性序列。
在操作系統看來,文件就是一個個字節流,操作系統不管這個文件的內容(不管它是.mp3音頻文件,或者.jpg圖片文件,在應用程序看來才有這種區分)。文件在操作系統眼中只有3種:普通文件、目錄文件、特殊文件。
文件的命名:
在Linux中,文件名大小寫敏感;目錄分隔符“/”絕對不能出現在文件名中。
在Windows中,文件名大小寫不敏感;盤符“:”絕對不能出現在文件名中(其實還有很多符號不能出現在文件名中...Linux不清楚其他限制)。
應用程序識別文件類型:
Windows:擴展名;
Linux:文件頭部。
2. inode
文件系統中,有一個叫inode的結構,它與真實的文件一一對應,用來記錄這個文件的各種屬性:權限、所有者、創建時間、最近修改時間等等。
2.1 inode的作用
已經提過inode用來記錄文件屬性,更用來記錄文件在磁盤中的位置,要找到文件必須通過它的inode。每一個inode都有唯一的編號。目錄文件的內容就是文件名和其對應的inode。沒錯,文件名是儲存在它的上層目錄中的,所以對文件夾有寫權限的用戶可以任意刪除此文件夾中的內容,即使這個用戶對被刪除的文件沒有任何權限。
inode中還保存着文件的大小,以及文件在系統中的儲存位置,那么它怎么儲存文件在磁盤上的位置呢?進一步看inode的結構。
2.2 inode的結構
一個文件的可能會占一個、多個或很多很多的塊兒。在ext2文件系統中,一個磁盤塊兒的大小為1K,一個inode占用128Bytes,其中60個字節用來存指針,指向文件在磁盤中的位置。每個指針需要4個字節,共15個指針。文件可能占用很多很多的塊兒,15個指針被設計為:
前12個指針:直接指針,指向文件在磁盤中的位置,可表示最大12K的文件;
第13個指針:間接指針,指向一個磁盤塊,這個內存塊中儲存着1024 / 4 = 256個直接指針,容量256K;
第14個指針:二級間接指針,指向一個磁盤塊,這個內存塊中儲存着1024 / 4 = 256個間接指針,容量256 * 256K = 64M;
第15個指針:三級間接指針,指向一個磁盤塊,這個內存塊中儲存着1024 / 4 = 256個二級間接指針,容量256 * 256 * 256K = 16G;
故ext2文件系統最大支持12K + 256K + 64M + 16G ≈ 16G的文件。
3. 硬連接(Hard links)和軟連接(Soft links)
連接用於文件共享。連接分為硬連接和軟連接。
硬連接,多個文件名對應同一個inode。當一個inode對應的文件名個數為0時,這個inode和對應的文件才會被真正刪除。即若文件a和b指向同一個inode,這時刪除文件a,這個文件並不會被真正刪除,因為還有文件名b指向這個inode。硬鏈接不能跨磁盤,不能跨文件系統。
軟連接,又叫符號連接(symbolic link),創建一個文件,這個文件包含了另一個文件的路徑名,這個文件對應一個inode。即文件a指向一個inode,創建一個軟連接b指向a。這時刪除a,文件會被真正刪除。b依然存在,但是已經失效。符號連接只是一個引用,或者一個快捷方式。符號連接可以跨磁盤,可以跨文件系統。