歡迎來到裝配圖網(wǎng)! | 幫助中心 裝配圖網(wǎng)zhuangpeitu.com!
裝配圖網(wǎng)
ImageVerifierCode 換一換
首頁 裝配圖網(wǎng) > 資源分類 > DOC文檔下載  

實驗5添加一個文件系統(tǒng)

  • 資源ID:17809516       資源大?。?span id="rtgiekz" class="font-tahoma">237.91KB        全文頁數(shù):14頁
  • 資源格式: DOC        下載積分:9.9積分
快捷下載 游客一鍵下載
會員登錄下載
微信登錄下載
三方登錄下載: 微信開放平臺登錄 支付寶登錄   QQ登錄   微博登錄  
二維碼
微信掃一掃登錄
下載資源需要9.9積分
郵箱/手機:
溫馨提示:
用戶名和密碼都是您填寫的郵箱或者手機號,方便查詢和重復下載(系統(tǒng)自動生成)
支付方式: 支付寶    微信支付   
驗證碼:   換一換

 
賬號:
密碼:
驗證碼:   換一換
  忘記密碼?
    
友情提示
2、PDF文件下載后,可能會被瀏覽器默認打開,此種情況可以點擊瀏覽器菜單,保存網(wǎng)頁到桌面,就可以正常下載了。
3、本站不支持迅雷下載,請使用電腦自帶的IE瀏覽器,或者360瀏覽器、谷歌瀏覽器下載即可。
4、本站資源下載后的文檔和圖紙-無水印,預(yù)覽文檔經(jīng)過壓縮,下載后原文更清晰。
5、試題試卷類文檔,如果標題沒有明確說明有答案則都視為沒有答案,請知曉。

實驗5添加一個文件系統(tǒng)

實驗5 添加一個文件系統(tǒng)實驗?zāi)康奈募到y(tǒng)是操作系統(tǒng)中最直觀的部分,因為用戶可以通過文件直接地和操作系統(tǒng)交互,操作系統(tǒng)也必須為用戶提供數(shù)據(jù)計算、數(shù)據(jù)存儲的功能。本實驗通過添加一個文件系統(tǒng),進一步理解Linux中的文件系統(tǒng)原理及其實現(xiàn)。l深入理解操作系統(tǒng)文件系統(tǒng)原理l學習理解Linux的VFS文件系統(tǒng)管理技術(shù)l學習理解Linux的ext2文件系統(tǒng)實現(xiàn)技術(shù)l設(shè)計和實現(xiàn)自定義文件系統(tǒng)實驗內(nèi)容添加一個類似于ext2的自定義文件系統(tǒng)myext2。實驗主要內(nèi)容:l添加一個和ext2完全相同的文件系統(tǒng)myext2l修改myext2的magic numberl修改文件系統(tǒng)操作l添加文件系統(tǒng)創(chuàng)建工具實驗指導1. 問題描述本實驗的內(nèi)容是要添加一個類似于ext2的自定義文件系統(tǒng)myext2。myext2文件系統(tǒng)的描述如下:1、myext2文件系統(tǒng)的物理格式定義與ext2基本一致,除了myext2的magic number是0x6666,而ext2的magic number是0xEF53。2、myext2是ext2的定制版本,它只支持原來ext2文件系統(tǒng)的部分操作,以及修改了部分操作。2. 實驗步驟提示:下面的操作步驟以3.6.6版本的內(nèi)核為例,2.6.15版本的內(nèi)核請參照教材,其它版本內(nèi)核可能會有所區(qū)別。2.1 添加一個和ext2完全相同的文件系統(tǒng)myext2要添加一個與ext2完全相同的文件系統(tǒng)myext2,首先是確定實現(xiàn)ext2文件系統(tǒng)的內(nèi)核源碼是由哪些文件組成。Linux源代碼結(jié)構(gòu)很清楚地告訴我們:fs/ext2目錄下的所有文件是屬于ext2文件系統(tǒng)的。再檢查一下這些文件所包含的頭文件,可以初步總結(jié)出來Linux源代碼中屬于ext2文件系統(tǒng)的有:fs/ext2/acl.cfs/ext2/acl.hfs/ext2/balloc.cfs/ext2/bitmap.cfs/ext2/dir.cfs/ext2/ext2.hfs/ext2/file.cinclude/linux/ext2_fs.hinclude/linux/ext2_fs_sb.h接下來開始添加myext2文件系統(tǒng)的源代碼到Linux源代碼。把ext2部分的源代碼克隆到myext2去,即復制一份以上所列的ext2源代碼文件給myext2用。按照Linux源代碼的組織結(jié)構(gòu),把myext2文件系統(tǒng)的源代碼存放到fs/myext2下,頭文件放到include/linux下。在Linux的shell下,執(zhí)行如下操作:#cd /linux-3.6.6 /* 內(nèi)核源代碼目錄,假設(shè)內(nèi)核源代碼解壓在主目錄的Linux-3.6.6只目錄中*/#cd fs#cp R ext2 myext2 #cd ./include/linux#cp ext2_fs.h myext2_fs.h #cp ext2_fs_sb.h myext2_fs_sb.h /3.6.6沒有此文件#cd /linux-3.6.6/fs/myext2#mv ext2.h myext2.h #cd /linux-3.6.6# cd include/asm-generic/bitops# cp ext2-atomic.h myext2-atomic.h# cp ext2-atomic-setbit.h myext2-atomic-setbit.h /3.6.6修改此文件這樣就完成了克隆文件系統(tǒng)工作的第一步源代碼復制。對于克隆文件系統(tǒng)來說,這樣當然還遠遠不夠,因為文件里面的數(shù)據(jù)結(jié)構(gòu)名、函數(shù)名、以及相關(guān)的一些宏等內(nèi)容還沒有根據(jù)myext2改掉,連編譯都通不過。下面開始克隆文件系統(tǒng)的第二步:修改上面添加的文件的內(nèi)容。為了簡單起見,做了一個最簡單的替換:將原來“EXT2”替換成“MYEXT2”;將原來的“ext2”替換成“myext2”。對于fs/myext2下面文件中字符串的替換,也可以使用下面的腳本:#!/bin/bashSCRIPT=substitute.shfor f in * do if $f = $SCRIPT then echo "skip $f" continue fi echo -n "substitute ext2 to myext2 in $f." cat $f | sed s/ext2/myext2/g > $f_tmp mv $f_tmp $f echo "done" echo -n "substitute EXT2 to MYEXT2 in $f." cat $f | sed s/EXT2/MYEXT2/g > $f_tmp mv $f_tmp $f echo "done"done把這個腳本命名為substitute.sh,放在fs/myext2下面,加上可執(zhí)行權(quán)限,運行之后就可以把當前目錄里所有文件里面的“ext2”和“EXT2”都替換成對應(yīng)的“myext2”和“MYEXT2”。用編輯器的替換功能,把include/linux/myext2_fs.h , include/linux/myext2_fs_sb.h(3.6.6沒有此文件)和include/asm-generic/bitops/myext2-atomic.h,myext2-atomic-setbit.h(3.6.6為此文件) 文件中的“ext2”、“EXT2”分別替換成“myext2”、“MYEXT2”在include/asm-generic/bitops.h文件中添加:kernel 3.6.6:其他內(nèi)核版本可能需要做:在arch/x86/include/asm/bitops.h文件中添加:kernel 3.6.6:其他內(nèi)核版本可能需要做:在include/linux/magic.h 文件中添加”#define MYEXT2_SUPER_MAGIC 0xEF53”源代碼的修改工作到此結(jié)束。接下來就是第三步工作編譯源代碼。首先要把myext2加到編譯選項中去,以便在做make menuconfig的時候,可以將該選項加上去。做這項工作只需要修改三個文件:fs/Kconfig fs/Makefile fs/Kconfig中拷貝一份對應(yīng)的對EXT2文件宏的定義和幫助信息,這樣在做make menuconfig的時候可以查看該選項的有關(guān)幫助的內(nèi)容。fs/Makefile的修改是告內(nèi)核編譯系統(tǒng),當myext2對應(yīng)的宏被選擇上的時候,到fs/myext2目錄下去編譯myext2文件系統(tǒng)。在kernel 3.6.6,在fs/Kconfig文件中增加 source “fs/myext2/Kconfig”,并且對“ext2”相關(guān)項的地方添加“myext2”項。在 fs/Makefile 文件中添加“obj-$(CONFIG_MYEXT2_FS) += myext2/”為了在make mencuconfig中看得更加清楚,修改 fs/myext2/Kconfig文件中“Ext2”替換為“MYExt2” ,“Second”前加上“MY”一切都準備就緒了,使用make menuconfig選擇上myext2,如下:# cd /linux-3.6.6# make menuconfig選中ext2和myext2文件系統(tǒng)對應(yīng)的選項,即原來空白用空格鍵選中為*號:保存修改,退出。然后做make等重建內(nèi)核的工作。第一部分工作克隆ext2文件系統(tǒng)已經(jīng)完成了。新編譯出來的內(nèi)核重新啟動系統(tǒng)。下面我們來對添加的myext2文件系統(tǒng)進行一下測試:#pwd/root#dd if=/dev/zero of=myfs bs=1M count=1#/sbin/mkfs.ext2 myfs#cat /proc/filesystems | grep ext ext2 ext3 myext2 ext4#sudo mount t myext2 o loop ./myfs /mnt#mount/dev/loop0 on /mnt type myext2 (rw)#sudo umount /mnt#sudo mount t ext2 o loop ./myfs /mnt#mount/dev/loop0 on /mnt type ext2 (rw)#sudo umount /mnt2.2 修改myext2的magic number在上面做的基礎(chǔ)上。找到myext2的magic number,并將其改為0x6666:2.6.20以后內(nèi)核版本,這個值在include/linux/magic.h文件中。2.6.15內(nèi)核參照教材。- #define MYEXT2_SUPER_MAGIC 0xEF53+ #define MYEXT2_SUPER_MAGIC 0x6666改動完成之后,再用make重新編譯內(nèi)核。以新內(nèi)核重新啟動,準備下面的測試。在我們測試這個部分之前,我們需要寫個小程序changeMN.c,來修改我們創(chuàng)建的myfs文件系統(tǒng)的magic number。因為它必須和內(nèi)核中記錄myext2文件系統(tǒng)的magic number匹配,myfs文件系統(tǒng)才能被正確地mount。changeMN.c程序可以在課程網(wǎng)站中下載。這個程序經(jīng)過編譯后產(chǎn)生的可執(zhí)行程序名字為changeMN。下面我們開始測試:#dd if=/dev/zero of=myfs bs=1M count=1#/sbin/mkfs.ext2 myfs#./changeMN myfs#sudo mount t myext2 o loop ./fs.new /mnt#mount/home/user/fs.new on /mnt type myext2 (rw)#sudo umount /mnt# sudo mount t ext2 o loop ./fs.new /mntmount: wrong fs type, bad option, bad superblock on /dev/loop0, #2.3 修改文件系統(tǒng)操作myext2只是一個實驗性質(zhì)的文件系統(tǒng),我們希望它只要能支持簡單的文件操作即可。因此在完成了myext2的總體框架以后,我們來修改掉myext2支持的一些操作,來加深對操作系統(tǒng)對文件系統(tǒng)的操作的理解。下面以裁減myext2的mknod操作為例,了解這個過程的實現(xiàn)流程。Linux將所有的對塊設(shè)備、字符設(shè)備和命名管道的操作,都看成對文件的操作。mknod操作是用來產(chǎn)生那些塊設(shè)備、字符設(shè)備和命名管道所對應(yīng)的節(jié)點文件。在ext2文件系統(tǒng)中它的實現(xiàn)函數(shù)如下:fs/ext2/namei.c, line 144144 static int ext2_mknod (struct inode * dir, struct dentry *dentry, int mode, dev_t rdev)145 146 struct inode * inode;147 int err;148 149 if (!new_valid_dev(rdev)150 return -EINVAL;151 152 inode = ext2_new_inode (dir, mode);153 err = PTR_ERR(inode);154 if (!IS_ERR(inode) 155 init_special_inode(inode, inode->i_mode, rdev);156 #ifdef CONFIG_EXT2_FS_XATTR157 inode->i_op = &ext2_special_inode_operations;158 #endif159 mark_inode_dirty(inode);160 err = ext2_add_nondir(dentry, inode);161 162 return err;163 它定義在結(jié)構(gòu)ext2_dir_inode_operations中:fs/ext2/namei.c, line 400392 struct inode_operations ext2_dir_inode_operations = 393 .create = ext2_create,394 .lookup = ext2_lookup,395 .link = ext2_link,396 .unlink = ext2_unlink,397 .symlink = ext2_symlink,398 .mkdir = ext2_mkdir,399 .rmdir = ext2_rmdir,400 .mknod = ext2_mknod,401 .rename = ext2_rename,402 #ifdef CONFIG_EXT2_FS_XATTR403 .setxattr = generic_setxattr,404 .getxattr = generic_getxattr,405 .listxattr = ext2_listxattr,406 .removexattr = generic_removexattr,407 #endif408 .setattr = ext2_setattr,409 .permission = ext2_permission,410 ;當然,從ext2克隆過去的myext2的myext2_mknod,以及myext2_dir_inode_operations和上面的程序是一樣的。對于mknod函數(shù),我們在myext2中作如下修改:fs/myext2/namei.cstatic int myext2_mknod (struct inode * dir, struct dentry *dentry, int mode, int rdev) printk(KERN_ERR “haha, mknod is not supported by myext2! youve been cheated!n”); return EPERM;添加的程序中:第一行 打印信息,說明mknod操作不被支持。第二行 將錯誤號為EPERM的結(jié)果返回給shell,即告訴shell,在myext2文件系統(tǒng)中,maknod不被支持。修改完畢,然后重新編譯內(nèi)核。以新生成的內(nèi)核重新啟動計算機,我們在shell下執(zhí)行如下測試程序:# sudo mount t myext2 o loop ./fs.new /mnt#cd /mnt# sudo mknod myfifo pmknod: myfifo: Operation not permitted#第一行命令:將fs.new mount到/mnt目錄下。第二行命令:進入/mnt目錄,也就是進入fs.new這個myext2文件系統(tǒng)。第三行命令:執(zhí)行創(chuàng)建一個名為myfifo的命名管道的命令。第四、五行是執(zhí)行結(jié)果:第四行是我們添加的myext2_mknod函數(shù)的printk的結(jié)果;第五行是返回錯誤號EPERM結(jié)果給shell,shell捕捉到這個錯誤后打出的出錯信息。需要注意的是,如果你是在圖形界面下使用虛擬控制臺,printk打印出來的信息不一定能在你的終端上顯示出來,但是可以通過命令dmesg|tail來觀察??梢?,我們的裁減工作取得了預(yù)期的效果。2.4. 添加文件系統(tǒng)創(chuàng)建工具文件系統(tǒng)的創(chuàng)建對于一個文件系統(tǒng)來說是首要的。因為,如果不存在一個文件系統(tǒng),所有對它的操作都是空操作,也是無用的操作。其實,前面的第一小節(jié)添加一個和ext2完全相同的文件系統(tǒng)myext2和第二小節(jié)修改myext2的magic number在測試實驗結(jié)果的時候,已經(jīng)陸陸續(xù)續(xù)地講到了如何創(chuàng)建myext2文件系統(tǒng)。下面工作的主要目的就是將這些內(nèi)容總結(jié)一下,制作出一個更快捷方便的myext2文件系統(tǒng)的創(chuàng)建工具:mkfs.myext2(名稱上與mkfs.ext2保持一致)。首先需要確定的是該程序的輸入和輸出。為了靈活和方便起見,我們的輸入為一個文件,這個文件的大小,就是myext2文件系統(tǒng)的大小。輸出就是帶了myext2文件系統(tǒng)的文件。我們在主目錄下編輯如下的程序:/mkfs.myext2 #!/bin/bash /sbin/losetup -d /dev/loop2 /sbin/losetup /dev/loop2 $1 /sbin/mkfs.ext2 /dev/loop2 dd if=/dev/loop2 of=./tmpfs bs=1k count=2 ./changeMN ./tmpfs dd if=./fs.new of=/dev/loop2 /sbin/losetup -d /dev/loop2rm -f ./tmpfs第一行 表明是shell程序。第三行 如果有程序用了/dev/loop2了,就將它釋放。第四行 用losetup將第一個參數(shù)裝到/dev/loop2上第五行 用mkfs.ext2格式化/dev/loop2。也就是用ext2文件系統(tǒng)格式格式化我們的文件系統(tǒng)。第六行 將文件系統(tǒng)的頭2K字節(jié)的內(nèi)容取出來。第七行 調(diào)用程序changeMN將magic number改成0x6666第八行 再將2K字節(jié)的內(nèi)容寫回去。第九行 把我們的文件系統(tǒng)從loop2中卸下來。第十行 將臨時文件刪除。編輯完了之后,做如下測試:# dd if=/dev/zero of=myfs bs=1M count=1# ./mkfs.myext2 myfs (或 sudo bash mkfs.myext2 myfs )# sudo mount t myext2 o loop ./fs.new /mnt# mount/dev/loop0 on /mnt myext2 (rw)#至此,文件系統(tǒng)部分的實驗已經(jīng)全部完成了。通過本實驗,你對Linux整個文件系統(tǒng)的運作流程,如何添加一個文件系統(tǒng),以及如何修改Linux對文件系統(tǒng)的操作,有了比較深的了解。在本實驗的基礎(chǔ)上,你完全可以發(fā)揮自己的創(chuàng)造性,構(gòu)造出自己的文件系統(tǒng),然后將它添加到Linux中。撰寫實驗報告的要求1.按照實驗報告模板格式撰寫;2.整個實驗過程的截圖; 3.程序的修改部分,運行結(jié)果的截圖;4.實驗過程中遇到的問題及解決方法等。5.心得體會

注意事項

本文(實驗5添加一個文件系統(tǒng))為本站會員(jun****875)主動上傳,裝配圖網(wǎng)僅提供信息存儲空間,僅對用戶上傳內(nèi)容的表現(xiàn)方式做保護處理,對上載內(nèi)容本身不做任何修改或編輯。 若此文所含內(nèi)容侵犯了您的版權(quán)或隱私,請立即通知裝配圖網(wǎng)(點擊聯(lián)系客服),我們立即給予刪除!

溫馨提示:如果因為網(wǎng)速或其他原因下載失敗請重新下載,重復下載不扣分。




關(guān)于我們 - 網(wǎng)站聲明 - 網(wǎng)站地圖 - 資源地圖 - 友情鏈接 - 網(wǎng)站客服 - 聯(lián)系我們

copyright@ 2023-2025  zhuangpeitu.com 裝配圖網(wǎng)版權(quán)所有   聯(lián)系電話:18123376007

備案號:ICP2024067431-1 川公網(wǎng)安備51140202000466號


本站為文檔C2C交易模式,即用戶上傳的文檔直接被用戶下載,本站只是中間服務(wù)平臺,本站所有文檔下載所得的收益歸上傳人(含作者)所有。裝配圖網(wǎng)僅提供信息存儲空間,僅對用戶上傳內(nèi)容的表現(xiàn)方式做保護處理,對上載內(nèi)容本身不做任何修改或編輯。若文檔所含內(nèi)容侵犯了您的版權(quán)或隱私,請立即通知裝配圖網(wǎng),我們立即給予刪除!