Unix文件系統(tǒng)實驗報告.docx_第1頁
Unix文件系統(tǒng)實驗報告.docx_第2頁
Unix文件系統(tǒng)實驗報告.docx_第3頁
Unix文件系統(tǒng)實驗報告.docx_第4頁
Unix文件系統(tǒng)實驗報告.docx_第5頁
已閱讀5頁,還剩19頁未讀, 繼續(xù)免費閱讀

下載本文檔

版權說明:本文檔由用戶提供并上傳,收益歸屬內(nèi)容提供方,若內(nèi)容存在侵權,請進行舉報或認領

文檔簡介

浙江工業(yè)大學計算機學院模擬Unix文件系統(tǒng)實 驗 報 告姓 名 傅攀 學 號 201426810803 班 級 計自1402 教 師 李波 22目錄一、 實驗介紹1二、 實驗環(huán)境3三、 實驗設計31.文件系統(tǒng)的磁盤結(jié)構的設計32.如何表示目錄33.如何表示文件44.關于超級塊55.空閑盤塊和空閑索引節(jié)點管理5四、 數(shù)據(jù)結(jié)構61.基本數(shù)據(jù)結(jié)構62.超級塊SuperBlock63.索引節(jié)點 DINode74.目錄及目錄項Dentry、DentryTable85.其他數(shù)據(jù)結(jié)構9五、 模塊詳解101.目錄查找模塊102.文件創(chuàng)建模塊113.目錄創(chuàng)建模塊134.文件或目錄刪除模塊135.文件讀取模塊14六、 實驗演示156.實驗完成功能列表157.各功能合并展示15七、 實驗總結(jié)211.問題與解決212.實驗體會22一、 實驗介紹本次實驗要求完成一個 UNIX文件系統(tǒng)的子集的模擬實現(xiàn)。即通過文件模擬磁盤,在該“磁盤”上通過模擬UNIX文件系統(tǒng)創(chuàng)建文件、分配磁盤塊的方式實現(xiàn)一個模擬的UNIX文件系統(tǒng)的子集。它可以完成文件或目錄的創(chuàng)建、拷貝、修改、重命名等一系列操作。主要目的是學習操作系統(tǒng)是如何在磁盤上創(chuàng)建一個文件的,如何控制文件類型及權限的,并學習相關的一些數(shù)據(jù)結(jié)構及其作用,了解掌握成組鏈接法等一些資源相關管理辦法。下面是實驗具體要求與預期功能:(1) 文件卷結(jié)構設計l 盤塊管理采用成組鏈接法。l 0#塊可省略l I節(jié)點棧及空間為20項l 塊大小為512字節(jié)l 卷盤塊數(shù)大于100l I節(jié)點盤塊數(shù)大于10塊(2) I節(jié)點結(jié)構設計l 文件大小l 文件聯(lián)接計數(shù)l 文件地址l 文件擁有者l 文件所屬組l 文件權限及類別l 文件最后修改時間l 其中文件地址為六項:四個直接塊號,一個一次間址,一個兩次間址(3) 目錄結(jié)構l 用16字節(jié)表示,其中14字節(jié)為文件名,2字節(jié)為I節(jié)點號(4) 用戶及組結(jié)構l 用戶信息中包括用戶名、口令,所屬組,用戶打開文件表(文件樹結(jié)構應與用戶相對應:有每個用戶的HOME目錄)組信息中可只包含組名(5) 文件樹結(jié)構l 除(4)要求外,適當考慮UNIX本身文件樹結(jié)構(6) 實現(xiàn)功能l ls顯示文件目錄l chmod改變文件權限l chown改變文件擁有者l chgrp改變文件所屬組l pwd顯示當前目錄l cd改變當前目錄l mkdir創(chuàng)建子目錄l rmdir刪除子目錄l mv改變文件名l cp文件拷貝l rm文件刪除l ln 建立文件聯(lián)接l cat連接顯示文件內(nèi)容l passwd修改用戶口令(7) 可考慮構造一個簡單的編輯器,用于創(chuàng)建文件根據(jù)上述實驗要求明確開發(fā)目標,預期實現(xiàn)上述所有功能,但函數(shù)具體功能與Unix系統(tǒng)功能可能存在差異。爭取完成實驗要求的功能(或簡單或復雜)。由于所給實驗要求較高,所以要實現(xiàn)這樣的功能所需的代碼量肯定很大,邏輯也不簡單,所以在編寫代碼的時候采用整體思路是逐層次編寫,比如先寫最底層的塊分配等操作,最后編寫文件操作等,然后功能逐個添加,包括權限控制等方面。二、 實驗環(huán)境本次實驗的開發(fā)環(huán)境信息如下:l 操作系統(tǒng):Window 10 專業(yè)版 64位操作系統(tǒng)l 開發(fā)環(huán)境:Microsoft Visual Studio Community 2013l 開發(fā)語言:C+l 程序類型:Win32 控制臺應用程序三、 實驗設計1. 文件系統(tǒng)的磁盤結(jié)構的設計現(xiàn)在已知,磁盤的第0塊為系統(tǒng)的引導塊,一般用于系統(tǒng)引導或空閑。第1塊為超級塊,用于存放文件卷的資源管理信息,包括整個文件卷的盤塊數(shù)、磁盤索引結(jié)點的盤塊數(shù)、空閑盤塊號棧和空閑盤塊號棧指針、空閑盤塊號棧鎖、空閑索引結(jié)點棧和空閑索引結(jié)點棧指針、空閑索引結(jié)點棧鎖等。從第2塊起存放磁盤索引結(jié)點,直到第K塊。從第K+1塊起及其以后各塊,都存放文件數(shù)據(jù),直到文件卷的最后一塊。所以磁盤結(jié)構如下:圖1 文件系統(tǒng)磁盤邏輯結(jié)構本次實驗中要通過文件來模擬磁盤,那么對應的文件所需的數(shù)據(jù)結(jié)構宏觀上看可以是連續(xù)的block128。至于詳細的數(shù)據(jù)結(jié)構如何和對應到塊呢,這個只需要使用對應的數(shù)據(jù)結(jié)構的類型指針指向?qū)恢媚敲磧?nèi)部指針自然就對齊了。2. 如何表示目錄提到目錄那么必須清楚兩個概念目錄文件和目錄項。目錄其實對應著一個文件也就是目錄文件,而目錄文件又是有目錄項組成的好比目錄文件是一張表,目錄項是一個一個的表項。而目錄項對應著一個文件,要是這個文件是目錄文件(就是前面提到的那張表)那這個目錄項就是一個目錄,否則它就是文件。這個問題用文字還是比較難以表達的,還是用圖來說明吧。圖2 目錄文件與目錄項可以發(fā)現(xiàn)目錄項與目錄文件存在相互依賴關系,目錄項指向目錄文件,目錄文件又包含目錄項。那么最初的目錄怎么知道呢?所以就需要一個根目錄項“/”,而這個目錄項就應當存儲在超級塊中。3. 如何表示文件如何表示目錄只是抽象的描述了一下目錄的結(jié)構,可以發(fā)現(xiàn)創(chuàng)建目錄的過程其實已經(jīng)包含了創(chuàng)建文件,比如建立一個目錄(或者說是文件夾)A,那么就必須創(chuàng)建一個目錄文件。那么文件又是如何表示的呢?在我們的印象中,文件是由文件名和文件內(nèi)容即文件數(shù)據(jù)組成的。那么在磁盤中文件是如表示、存儲的呢?在圖2中我們可以看到目錄項C指向了一個普通文件,其實僅憑目錄項是無法直接定位出磁盤中的文件數(shù)據(jù)的,但是目錄項C中存儲了文件名和可以指向文件的數(shù)據(jù)信息。依然是用一張圖來說明這個問題。圖3 根據(jù)目錄項取出文件4. 關于超級塊上面抽象的介紹了一些結(jié)構,下面細化介紹一下超級塊內(nèi)的主要數(shù)據(jù)及其功能。首先,對于磁盤這種存儲介質(zhì),我們可以根據(jù)默認約定“第0塊是引導塊,第1塊是超級塊”定位讀取相關信息。但是不同的磁盤大小有所不同,那么索引節(jié)點個數(shù)與空閑盤塊個數(shù)就有所不同,而這些又是文件系統(tǒng)所必須的數(shù)據(jù),還有根目錄信息等。所以這些信息都必須存在于超級塊中。本次實驗中簡化了超級塊的結(jié)構去除了超級塊鎖、設備信息等數(shù)據(jù),保留磁盤塊信息及索引節(jié)點信息。主要是存儲空閑塊棧和空閑索引節(jié)點棧,以及根目錄。這些數(shù)據(jù)或者說空間在文件系統(tǒng)中起著非常重要的作用。5. 空閑盤塊和空閑索引節(jié)點管理下面介紹超級塊中兩棧的管理方式,首先是空閑盤塊棧??臻e盤塊棧的管理方式是成組鏈接法,用于管理磁盤中可用的盤塊包括使用與回收。圖4 成組鏈接法管理空閑盤塊棧上圖是個人對成組鏈接法管理磁盤塊的理解,當棧滿時仍有塊號要壓入時則將當前站內(nèi)所有數(shù)據(jù)拷貝到即將入棧的盤塊號對應的盤塊中,隨后將棧指針重置,塊號入棧。當棧底盤塊號彈出時,則將該盤塊號對應的盤塊中的數(shù)據(jù)取出填入棧中,并將棧指針置于棧頂。當創(chuàng)建或刪除文件時只需要重棧中彈出或向棧中壓入盤塊號即可。空閑索引節(jié)點棧的管理與空閑盤塊的管理有所不同,空閑索引節(jié)點棧在初始化完畢后,一般只有出棧的情況,當??諘r,則從索引節(jié)點區(qū)取出相應個數(shù)的空閑索引節(jié)點號(根據(jù)索引節(jié)點內(nèi)的引用計數(shù)判斷該節(jié)點是否空閑)。四、 數(shù)據(jù)結(jié)構1. 基本數(shù)據(jù)結(jié)構首先介紹一些基本的數(shù)據(jù)結(jié)構:struct BlockBYTE byte512;struct MyFileSystemBlock block128;typedef unsigned short INodeIndex;/i節(jié)點索引號 16位typedef unsigned short BlockIndex;/塊號16位Block代表盤塊由512個字節(jié)組成,而MyFileSystem代表整個磁盤共128塊,所以整個模擬文件占64KB。2. 超級塊SuperBlock超級塊數(shù)據(jù)結(jié)構如下:struct SuperBlockBlockIndex dataBlockIndex;/數(shù)據(jù)區(qū)第一個盤塊號 12 inode占10塊BlockIndex sizeOfBlocks;/盤塊數(shù)INodeIndex stackOfINode20;/空閑INode棧BlockIndex stackOfBlock50;/空閑block棧BYTE blockStackPointer;/block棧指針BYTE iNodeStackPointer;/iNode棧指針BlockIndex freeBlocksNum;/當前空閑block總數(shù)INodeIndex freeINodesNum;/當前空閑Inode總數(shù)Dentry root;/根目錄信息BYTE fill344;/填充至512byte;其中stackOfINode20即空閑索引節(jié)點棧,對應棧指針iNodeStackPointer,棧大小為20。stackOfBlock50即空閑盤塊棧,對應棧指針blockStackPointer,棧大小50。根目錄項Dentry root表示保存根目錄信息。3. 索引節(jié)點 DINode又一個至為重要的結(jié)構索引節(jié)點,起著文件控制的作用,包括文件類型與用戶權限等。其中INode還管理著文件數(shù)據(jù)所在盤塊。/i節(jié)點 64bytestruct DINodeunsigned short mode; /文件類型及訪問權限標志unsigned short owner; / 文件擁有者的用戶標識unsigned short group; / 文件擁有者的組標識unsigned int linkCount;/硬連接計數(shù) 判斷INODE是否空閑unsigned int size;/ 文件大小BlockIndex blockCount; / 文件塊數(shù)unsigned int visitTime;/ 文件最近一次訪問時間unsigned int modifyTime; / 文件最近一次修改時間unsigned int createTime; / 文件創(chuàng)建時間BlockIndex directBlock4;BlockIndex singleIndirect;BlockIndex doubleIndirect;BYTE fill20;/保證iNode區(qū) iNode連續(xù)存放;這里要說明的主要是變量mode文件類型及訪問權限和變量linkCount。mode的作用有二,其一區(qū)分文件類型,是目錄文件還是可執(zhí)行文件或者是普通文件。再者mode保存了用戶的操作權限包括擁有者、同組用戶、其他用戶的讀、寫、執(zhí)行權限。本次實驗中權限設置對應關系如下,與實際Unix系統(tǒng)有所差異,而這次文件類型主要用到目錄類型與普通類型。圖5 mode各位含意然后linkCount,也就是硬鏈接數(shù)。在系統(tǒng)中可以創(chuàng)建多個硬鏈接,也就是多個目錄項對應同一個INode。INode中含有記錄實際數(shù)據(jù)塊的存儲位置的信息,所以通過上述任意一個文件名對INode的指向的數(shù)據(jù)塊進行修改,都會對其他也會生效,因為它們是共享這一個數(shù)據(jù)內(nèi)容的,所以創(chuàng)建新的硬鏈接也不會消耗實際的存儲空間。如果刪除文件,那INode會不會被釋放呢?那就需要看INode的linkCount的值了。當鏈接數(shù)為0時就會被釋放,否則不會。directBlock4,4個直接地址,直接存放文件數(shù)據(jù)所在的磁盤塊號。singleIndirect一次間接地址,存放用于存放磁盤塊號的磁盤塊的塊號,有些繞口。4. 目錄及目錄項Dentry、DentryTable/目錄項 用16字節(jié)表示,其中14字節(jié)為文件名,2字節(jié)為I節(jié)點號struct DentryINodeIndex inodeIndex;char name14;Dentry() inodeIndex = 0;Dentry(INodeIndex _index, string _name) inodeIndex = _index; strcpy(name, _name.c_str(); ;struct DentryTableint count;Dentry* head;DentryTable() count = 0; head = null; DentryTable() if (head != null&count!=0)delete head; ;Dentry即之前提到的目錄項結(jié)構,包含目錄名或文件名以及對應文件的INode的索引號。同時Dentry是文件系統(tǒng)按名存取的關鍵結(jié)構,定位文件的關鍵都是找出Dentry然后定位INode及數(shù)據(jù)。DentryTable這個是抽象出來的目錄文件結(jié)構,當然在存儲的時候head指針對應的數(shù)據(jù)區(qū)會緊跟count(目錄項個數(shù))。5. 其他數(shù)據(jù)結(jié)構然后還有一些其他數(shù)據(jù)結(jié)構,下面簡單介紹一下。/下一組空閑盤塊 大小為一個blockstruct BlockIndexTabBlockIndex blockIndex50;BYTE fill412; ;struct singleIndirectBlockBlockIndex addr256;struct myFileint size;BYTE* head;myFile() size = 0; head = null; myFile() if (head != null&size!=0)deletehead; ;struct Userunsigned short uid;unsigned short ugroup;char name20;char pwd20;void initUser(unsigned short _uid, unsigned short _ugroup, string _name, string _pwd)uid = _uid;ugroup = _ugroup;strcpy(name, _name.c_str();strcpy(pwd, _pwd.c_str();struct UserTabint count;User * user;UserTab() if (user != null&count != 0) delete user; ;其中BlockIndexTab用于成組鏈接法保存一組空閑塊棧內(nèi)容,singleIndirectBlock一次間接地址塊,這些結(jié)構都是為了快速定位或存儲內(nèi)容。然后myFile作為一個起著類似接口作用的數(shù)據(jù)結(jié)構,在進行“磁盤”存儲文件時所有的“文件”都通過函數(shù)轉(zhuǎn)成myFile類型進行數(shù)據(jù)塊分配。從INode獲取文件時的到的也都是myFile類型的文件,隨后轉(zhuǎn)換成對應類型的文件。最后User結(jié)構和UserTab結(jié)構分別表示用戶和用戶表。五、 模塊詳解該部分介紹幾個主要模塊的執(zhí)行流程,其實各個模塊之間的依賴程度還是蠻高的,在各個模塊介紹時需要假定某個功能已經(jīng)實現(xiàn),就是這種情況“目錄查找需要建立在文件讀取功能之上,文件讀取又需要在文件創(chuàng)建之后,而創(chuàng)建文件又需要目錄查找的功能”。1. 目錄查找模塊目錄查找就是操作目錄文件和目錄項,最終目的是定位出目標目錄的目錄項。尋找過程大致如下:獲取尋找目標路徑,比如“/A/B”;判斷是否是絕對路徑,是;將當前尋找目錄設為根目錄/;截取外層目錄“A”,目標路徑變?yōu)椤癇”;在根目錄下查找A目錄項;若找到這將當前尋找目錄設為“A”,繼續(xù)尋找“B”。而在一個目錄中尋找目錄的過程實際上是根據(jù)目錄項A的索引節(jié)點號尋找索引節(jié)點,并加載文件,隨后在文件中查找目標名稱的目錄項“B”。而根據(jù)目錄項對應索引節(jié)點加載文件的過程在后面將詳細描述。而在目錄文件中查找目標目錄項的過程是一個遍歷的過程,從前往后逐個比對名稱,若找到目標目錄項則介紹查找,否則繼續(xù)查找直至最后一個目錄項。隨后返回結(jié)果。下面給出目錄查找流程圖:圖6 目錄查找流程圖2. 文件創(chuàng)建模塊文件創(chuàng)建功能建立在目錄尋找之后,根據(jù)輸入的父級目錄、文件名、文件數(shù)據(jù)分配或修改目錄項、索引節(jié)點、空閑盤塊。比如在A目錄下創(chuàng)建文件C(A目錄下原本沒有C),首先定位到目錄項A,創(chuàng)建新的目錄項C,并分配空閑索引節(jié)點,將索引節(jié)點號寫入目錄項C。根據(jù)目錄項A,載入A對應的目錄文件,修改目錄文件內(nèi)容后重新寫會對應文件,即重新為A對應的INode分配磁盤塊。然后為C對應的索引節(jié)點分配空閑盤塊,隨后將數(shù)據(jù)寫入盤塊。下面是文件創(chuàng)建過程簡單流程圖:圖7 文件創(chuàng)建簡單流程圖3. 目錄創(chuàng)建模塊目錄創(chuàng)建模塊實際上與文件創(chuàng)建過程一樣,只不過創(chuàng)建的文件的數(shù)據(jù)是一個目錄文件。下面描述如何創(chuàng)建一個目錄文件,比如在“/A/”目錄下創(chuàng)建目錄B,首先獲取父級目錄項A,取出其索引節(jié)點號A_index。隨后創(chuàng)建目錄項B并分配空閑索引節(jié)點,節(jié)點號B_index。然后創(chuàng)建另外兩個目錄項“.”,“.”它們的索引號分別為B_index和A_index,隨后將這兩個目錄項組成目錄表文件。最后將目錄項B寫入A的目錄文件中,將B的目錄文件分配到其索引節(jié)點對應的磁盤塊中。4. 文件或目錄刪除模塊文件的刪除過程和目錄的刪除過程可以合并,只不過目錄的刪除過程更為復雜,需要遞歸將其下的目錄或文件刪除。刪除一個文件(硬鏈接為1的)實際上是刪除它所在的父目錄的目錄文件中的目錄項,釋放目錄項對應的索引節(jié)點(重置索引節(jié)點硬鏈接數(shù)),然后釋放索引節(jié)點中指向的數(shù)據(jù)盤塊號(盤塊號入空閑盤塊號棧)。還是舉例說明,刪除“/A/B”(假設存在),獲取父目錄“/A/”及目標名稱“B”,找到“/A/”對應的索引節(jié)點判斷是否有權限操作目錄A,假設有,找到A對應目錄文件中的目錄項B,將其在A目錄文件中除去。判斷目錄項B對應索引節(jié)點硬鏈接數(shù)是否為1,若不是則無需釋放索引節(jié)點,只需將索引節(jié)點中鏈接數(shù)減一即可。若其硬鏈接數(shù)為1,則需釋放索引節(jié)點及其對應的數(shù)據(jù)塊。此外還需判斷B是文件還是目錄,如果B是目錄,那還需要遞歸的向下釋放所有B下的目錄或文件。而目錄的最終直接釋放即遞歸終止條件是目錄對應的目錄文件下只包含“.”、“.”兩個目錄項。下面是刪除文件的大致過程:圖8 刪除文件大致過程5. 文件讀取模塊對于文件讀取,顯然需要先找到對應文件的目錄項,隨后定位其索引節(jié)點,然后根據(jù)索引節(jié)點內(nèi)的信息(文件大小、文件占用盤塊數(shù)、文件對應盤塊號),進行文件數(shù)據(jù)拼接或者叫讀取。六、 實驗演示6. 實驗完成功能列表l 用戶及權限控制l 顯示目錄下文件或目錄l 改變文件權限l 改變文件擁有者或所屬組l 顯示、改變當前目錄l 創(chuàng)建子目錄l 刪除子目錄l 創(chuàng)建文件、修改文件l 改變文件或目錄名l 文件拷貝l 文件刪除l 建立硬鏈接l 顯示文件內(nèi)容l 修改用戶口令7. 各功能合并展示圖9 用戶登錄圖10 顯示當前目錄下的文件、切換當前目錄圖11 通過文件輸入在磁盤中創(chuàng)建文件圖12 文件創(chuàng)建成功、顯示文件內(nèi)容圖12 復制文件圖13 重命名及刪除文件圖14 建立文件硬鏈接圖15 創(chuàng)建子目錄、重名子目錄、修改目錄權限圖16 修改文件內(nèi)容圖17 權限控制圖18 系統(tǒng)所有命令七、 實驗總結(jié)1. 問題與解決a) 去哪找根目錄?回顧一下整個開發(fā)過程中遇到的一些麻煩。從接到具體任務書后,在老師的將解下大致了解了磁盤結(jié)構和成組鏈接法的這么一個概念。通過查閱各種博客或者文檔然后陪PPT發(fā)現(xiàn)成組鏈接法并不是很難。那么接下來就是實現(xiàn)老師提示過的以及任務書內(nèi)的數(shù)據(jù)結(jié)構。在這部分前幾個數(shù)據(jù)結(jié)構實現(xiàn)并不是很難,因為這方面的博客也不少。很快便實現(xiàn)了SuperBlock 和DINode、Dentry、Block這些結(jié)構,但是問題就出現(xiàn)在這由于SuperBlock是參考其他資料的,很多資料里面都沒有提到SuperBlock里面有根目錄的信息,所以也不敢妄自添加或者因為思維定式就沒想過去添加。那么要實現(xiàn)按名存取,不知道根目錄怎么找,然后是各種百度,由于這問題描述也比較難,所以百度的結(jié)果不盡人意。一直尋找根目錄信息是如何獲取的方法,這個問題阻擋了

溫馨提示

  • 1. 本站所有資源如無特殊說明,都需要本地電腦安裝OFFICE2007和PDF閱讀器。圖紙軟件為CAD,CAXA,PROE,UG,SolidWorks等.壓縮文件請下載最新的WinRAR軟件解壓。
  • 2. 本站的文檔不包含任何第三方提供的附件圖紙等,如果需要附件,請聯(lián)系上傳者。文件的所有權益歸上傳用戶所有。
  • 3. 本站RAR壓縮包中若帶圖紙,網(wǎng)頁內(nèi)容里面會有圖紙預覽,若沒有圖紙預覽就沒有圖紙。
  • 4. 未經(jīng)權益所有人同意不得將文件中的內(nèi)容挪作商業(yè)或盈利用途。
  • 5. 人人文庫網(wǎng)僅提供信息存儲空間,僅對用戶上傳內(nèi)容的表現(xiàn)方式做保護處理,對用戶上傳分享的文檔內(nèi)容本身不做任何修改或編輯,并不能對任何下載內(nèi)容負責。
  • 6. 下載文件中如有侵權或不適當內(nèi)容,請與我們聯(lián)系,我們立即糾正。
  • 7. 本站不保證下載資源的準確性、安全性和完整性, 同時也不承擔用戶因使用這些下載資源對自己和他人造成任何形式的傷害或損失。

評論

0/150

提交評論