軟體介紹 Unix系統的產生和流行推動了作業系統的革命,它的設計思想和在發展過程中積累的豐富經驗及教訓仍可為人們借鑑。檔案系統負責系統內檔案信息的管理,在整個系統中起著至關重要的作用,檔案系統是Unix成功的關鍵。Unix系統採用樹形檔案結構、核心與外核的結合、設備與檔案一樣的管理機制和使用方法等技術和措施,使得Unix檔案系統成為當代非常優秀的系統。
管理結構 Unix檔案系統是通過“磁碟索引i節點”、“目錄項”來進行管理的,在檔案被打開或被引用後還需要“記憶體索引i節點”、“用戶檔案描述表”、“檔案表”。檔案系統磁碟結構如圖。管理塊主要管理磁碟結構中各部分區域的大小及資源(i節點,磁碟塊)的使用情況與管理方式。i節點區用於存放該檔案系統全部磁碟i節點結構,磁碟索引節點包含檔案的重要信息如下:檔案所有者標識符;檔案類型;檔案存取許可權;檔案聯結數目;檔案存取時間;檔案長度;檔案地址索引表。
Unix的每個目錄項只存放檔案名稱和i節點號,共16個位元組,而檔案中除名字以外的信息都存放到i節點中,優點是系統各級目錄的規模大大減少。在Unix檔案系統中,為了提高系統效率,減少記憶體空間的占用,當打開一個檔案時,只是將與該檔案相聯繫的目錄項和磁碟i節點拷貝到主存中,為了對打開的檔案進行管理,因此又設定了打開檔案管理機構,它又由下列三部分組成:
1、活動i節點(記憶體i節點)。作用是反映檔案當前活動的情況,因此它添加了一些項目:記憶體索引節點狀態、設備號、索引節點號、記憶體索引節點的訪問計數。
2、打開檔案表。i節點中只包含有檔案的靜態信息,但當一個檔案被同一進程或不同進程、用同一或不同路徑名、相同的或互異操作同時打開時,僅靠i節點就不能滿足要求,因此,打開檔案表記錄了打開檔案所需的一些附加信息:讀寫狀態、引用計數、指向記憶體索引點的指針、讀/寫位置指針。
3、用戶檔案描述符表。每個用戶進程有一個用戶檔案描述符表,每一個表項就是一個指針,並指向打開檔案表的一個表項,這個表的作用就是保證每個進程能夠打開多個檔案,或者對同一個檔案以不同形式操作打開。假定一個進程執行下列代碼:
fd1= open(”/etc/pad”,O- RDONLY);
fd1= open(”/etc/pad”,O- RDWD);
則這三個表的作用和關係如圖所示。
物理結構 Unix檔案系統採用的是索引檔案結構,在索引節點中建立有13個地址項,如圖。
對於長度不超過10個物理塊的小型檔案,可直接找到該檔案所在的盤塊號;對於中、大型檔案採用一次或兩次間接定址;對超大型檔案採用三次間接定址。索引節點的優點是:索引節點占用的空間小,對小檔案的索引速度快,同時又允許組織大型和超大型檔案。檔案最多可占用的物理塊數可達到10+ 256+256^2+ 256^3個。
Unix的統計數據表明,80%為小檔案,20%為大檔案(其中1%為超大檔案),這組數據就更加說明了Unix檔案系統設計的精妙和科學。為了提高磁碟空間的利用率,允許檔案在磁碟上不連續存放,且其定址方式最多可達到三次。它的缺點是造成訪問檔案的尋道時間延長和多次訪問磁碟。在非實時場合是可行的,但在實時場合,它的這一缺點就很突出。例如:假設磁碟的平均尋道時間為15ms,每個磁碟塊的大小為512位元組,某檔案大小為3kB,如果連續存放,尋道時間只需15ms;如果不連續存放,它要占用6個分散的磁碟塊,可能位於不同的磁軌,因此尋道時間需90ms,比連續存放多浪費75ms。
空閒磁碟塊 Unix檔案系統通過管理塊來實現空閒塊管理。管理塊的數據結構如下:
struct filsys{ int s- isize; /*i節點區總塊數*/ int s- fsize; /*檔案卷總塊數*/ int s- nfree; /*直接管理的空閒塊數*/ int s- free[100] ; /*空閒塊號棧*/ int s- ninode; /*直接管理的空閒i節點數*/ int s- inode[100] ;/*空閒i節點號棧*/… …} 空閒塊的管理方法是:將空閒塊從後向前,若干個空閒塊(如100個)分為一組(最後一組為99塊),每組最後一塊作為索引表,用來登記下一組100的物理塊號和塊數,最前的一組物理塊號和塊數存放在管理塊的s_free[100]和s_nfree中。這種對空閒塊先分組,再把組與組進行連結的管理方法稱為組連結法。對空閒塊的分配和釋放類似於棧,使用後進先出算法。但其管理機構分為兩級,一級常駐記憶體(管理塊的s-nfree和s-free[]),另一級則駐在各組的第一個盤塊上。其優點是常駐記憶體的只有一個組,而不是將所有組的空閒表都調入記憶體,這樣就大大的節省了記憶體空間,同時軟體開銷也小。缺點是可能導致物理塊的利用率不均勻。例如:假設當前的s-nfree= 80,此時某進程釋放一個檔案塊,其占用的物理塊號為300,系統回收它後,s-nfree= 81,s-free[81]= 300。接著某用戶又申請物理空間,檔案系統總是從索引表中取最後一項的值,即s-free[81]出棧,將300號物理塊又立即分配使用。可以想像,300號塊還會面臨再釋放,再分配的可能。300號塊多次被使用,而其它空閒塊卻未被分配使用,即有些物理塊可能長期被使用,而有些物理塊可能長期得不到使用,因此對外存儲器的使用壽命不利。
結構和共享 Unix的檔案系統採用多級樹型目錄結構,其優點是有效的解決了檔案重名問題,又可以很方便地實現檔案共享。基本檔案系統和子檔案系統是可安裝和可拆卸的,但在多用戶環境下,多用戶間共享數據同樣感到不方便,絕對路徑名是檔案的唯一符號名,用戶難以用另外符號名使用已分享檔案,因此Uinx檔案又提供了如下兩種連結機制。
1、硬連結技術。如果想為檔案1.c建立一個硬連結2.c,則只需將2.c的目錄項指針指到檔案1.c的i節點,同時將i節點連結數加1即可。這樣用戶似乎是增加了一個物理拷貝,可實際卻只有一個檔案實體,當刪除連結時,只要刪除一個目錄項和將連結數減1。
2、符號連結技術。如果想為usr/sxk/1.c建立一個符合連結2.c,則Unix通過read link讀出檔案內容,即找到原檔案路徑名,再通過原檔案路徑名去打開檔案。符號連結相當於給檔案增加了一個別名。也可為目錄建立符號連結,並且可以跨檔案系統。Unix檔案連結的優點是用很小的開銷為多用戶已分享檔案提供了有效方式,且能快速定位檔案和目錄;缺點是對多用戶使用檔案不能加以並發控制,易造成數據的不一致性。硬連結只適用於普通檔案,而不適用於目錄檔案和不同檔案系統。
安全性 Unix是多用戶作業系統,且它的各種外圍設備都由相應的檔案表示,因此安全性就很重要,它的安全主要通過磁碟i節點的許可權設定來實現,每個Unix檔案和Unix目錄,都有3個允許的比特位設定,分別定義檔案所有者、分組和其他人的使用許可權,如:允許讀、允許寫、允許執行、允許SUID、允許SGID等,系統對檔案保護的支持是比較充分的,只要正確設定檔案和目錄的許可權,檔案安全是有保障的。但需要注意的是,許可權為SGID和SUID的執行檔。SGID(SUID)中的S指set,程式在運行時,其進程的EUID(Effective UserID)或EGID(Effective Group ID)會被設成檔案擁有者的UID、GID,從而進程也具有了Owner或OwnerGroup的許可權。因此,如果使用不當,SGID和SUID程式會給系統安全性帶來極大的危害。另外,在Unix系統中還應當留意設備檔案,謹防它成為不安全的後門。例如,如果某個用戶擁有/dev/lmem的讀寫許可權,他就可以使用debugger(或其它程式)修改優先權或其它屬性,也可以讀取系統緩衝區的數據。Unix中的日誌檔案能夠記錄作業系統的使用狀況,通過分析日誌檔案可以發現攻擊跡象。