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

上傳人:jun****875 文檔編號:17809516 上傳時間:2020-12-07 格式:DOC 頁數(shù):14 大?。?37.91KB
收藏 版權申訴 舉報 下載
實驗5添加一個文件系統(tǒng)_第1頁
第1頁 / 共14頁
實驗5添加一個文件系統(tǒng)_第2頁
第2頁 / 共14頁
實驗5添加一個文件系統(tǒng)_第3頁
第3頁 / 共14頁

下載文檔到電腦,查找使用更方便

9.9 積分

下載資源

還剩頁未讀,繼續(xù)閱讀

資源描述:

《實驗5添加一個文件系統(tǒng)》由會員分享,可在線閱讀,更多相關《實驗5添加一個文件系統(tǒng)(14頁珍藏版)》請在裝配圖網(wǎng)上搜索。

1、實驗5 添加一個文件系統(tǒng) 實驗目的 文件系統(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)管理技術 l學習理解Linux的ext2文件系統(tǒng)實現(xiàn)技術 l設計和實現(xiàn)自定義文件系統(tǒng) 實驗內(nèi)容 添加一個類似于ext2的自定義文件系統(tǒng)myext2。實驗主要內(nèi)容: l添加一個和ext2完全相同的文件系統(tǒng)myext2 l修改myext2的magic number l

2、修改文件系統(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 添

3、加一個和ext2完全相同的文件系統(tǒng)myext2 要添加一個與ext2完全相同的文件系統(tǒng)myext2,首先是確定實現(xiàn)ext2文件系統(tǒng)的內(nèi)核源碼是由哪些文件組成。Linux源代碼結構很清楚地告訴我們:fs/ext2目錄下的所有文件是屬于ext2文件系統(tǒng)的。再檢查一下這些文件所包含的頭文件,可以初步總結出來Linux源代碼中屬于ext2文件系統(tǒng)的有: fs/ext2/acl.c fs/ext2/acl.h fs/ext2/balloc.c fs/ext2/bitmap.c fs/ext2/dir.c fs/ext2/ext2.h fs/ext2/file.c …… include

4、/linux/ext2_fs.h include/linux/ext2_fs_sb.h 接下來開始添加myext2文件系統(tǒng)的源代碼到Linux源代碼。把ext2部分的源代碼克隆到myext2去,即復制一份以上所列的ext2源代碼文件給myext2用。按照Linux源代碼的組織結構,把myext2文件系統(tǒng)的源代碼存放到fs/myext2下,頭文件放到include/linux下。在Linux的shell下,執(zhí)行如下操作: #cd ~/linux-3.6.6 /* 內(nèi)核源代碼目錄,假設內(nèi)核源代碼解壓在主目錄的Linux-3.6.6只目錄中*/ #cd fs #cp –R ext2 m

5、yext2 #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修

6、改此文件 這樣就完成了克隆文件系統(tǒng)工作的第一步——源代碼復制。對于克隆文件系統(tǒng)來說,這樣當然還遠遠不夠,因為文件里面的數(shù)據(jù)結構名、函數(shù)名、以及相關的一些宏等內(nèi)容還沒有根據(jù)myext2改掉,連編譯都通不過。 下面開始克隆文件系統(tǒng)的第二步:修改上面添加的文件的內(nèi)容。為了簡單起見,做了一個最簡單的替換:將原來“EXT2”替換成“MYEXT2”;將原來的“ext2”替換成“myext2”。 對于fs/myext2下面文件中字符串的替換,也可以使用下面的腳本: #!/bin/bash SCRIPT=substitute.sh for f in * do if [ $f

7、 = $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" d

8、one 把這個腳本命名為substitute.sh,放在fs/myext2下面,加上可執(zhí)行權限,運行之后就可以把當前目錄里所有文件里面的“ext2”和“EXT2”都替換成對應的“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”

9、、“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” 源代碼的修改工作到此結束。接下來就是第三步工作——編譯源代碼。首先要把myext2加到編譯選項中去,以便在做make menuconfig的時

10、候,可以將該選項加上去。做這項工作只需要修改三個文件: fs/Kconfig fs/Makefile fs/Kconfig中拷貝一份對應的對EXT2文件宏的定義和幫助信息,這樣在做make menuconfig的時候可以查看該選項的有關幫助的內(nèi)容。fs/Makefile的修改是告內(nèi)核編譯系統(tǒng),當myext2對應的宏被選擇上的時候,到fs/myext2目錄下去編譯myext2文件系統(tǒng)。 在kernel 3.6.6,在fs/Kconfig文件中增加 source “fs/myext2/Kconfig”,并且對“ext2”相關項的地方添加“myext2”項。 在 fs/Ma

11、kefile 文件中添加“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)對應的選項,即原來空白用空格鍵選中為*號: 保存修改,退出。然后做make等重建內(nèi)核的工作。

12、 第一部分工作——克隆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 ty

13、pe myext2 (rw) #sudo umount /mnt #sudo mount –t ext2 –o loop ./myfs /mnt #mount …… /dev/loop0 on /mnt type ext2 (rw) #sudo umount /mnt 2.2 修改myext2的magic number 在上面做的基礎上。找到myext2的magic number,并將其改為0x6666: 2.6.20以后內(nèi)核版本,這個值在include/linux/magic.h文件中。2.6.15內(nèi)核參照教材。 - #define MYEXT2_SUPER_MA

14、GIC 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=my

15、fs 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 /mnt mount: wrong fs type, bad option, bad superblock on /dev/loop0, … # 2.3 修改文

16、件系統(tǒng)操作 myext2只是一個實驗性質的文件系統(tǒng),我們希望它只要能支持簡單的文件操作即可。因此在完成了myext2的總體框架以后,我們來修改掉myext2支持的一些操作,來加深對操作系統(tǒng)對文件系統(tǒng)的操作的理解。下面以裁減myext2的mknod操作為例,了解這個過程的實現(xiàn)流程。 Linux將所有的對塊設備、字符設備和命名管道的操作,都看成對文件的操作。mknod操作是用來產(chǎn)生那些塊設備、字符設備和命名管道所對應的節(jié)點文件。在ext2文件系統(tǒng)中它的實現(xiàn)函數(shù)如下: fs/ext2/namei.c, line 144 144 static int ext2_mknod (struct

17、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, inod

18、e->i_mode, rdev); 156 #ifdef CONFIG_EXT2_FS_XATTR 157 inode->i_op = &ext2_special_inode_operations; 158 #endif 159 mark_inode_dirty(inode); 160 err = ext2_add_nondir(dentry, inode); 161 } 162 return err; 163 } 它定義在結構ext2_dir_inode_operations中: fs/ext2/namei.c, line 400 392 struct inod

19、e_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 C

20、ONFIG_EXT2_FS_XATTR 403 .setxattr = generic_setxattr, 404 .getxattr = generic_getxattr, 405 .listxattr = ext2_listxattr, 406 .removexattr = generic_removexattr, 407 #endif 408 .setattr = ext2_setattr, 409 .permission = ext2_permission, 410 }; 當然,從ext2克隆過去的myext2的myext2_mknod,以及myext2_dir_

21、inode_operations和上面的程序是一樣的。 對于mknod函數(shù),我們在myext2中作如下修改: fs/myext2/namei.c static int myext2_mknod (struct inode * dir, struct dentry *dentry, int mode, int rdev) { printk(KERN_ERR “haha, mknod is not supported by myext2! you’ve been cheated!\n”); return –EPERM; } 添加的程序中: 第一行 打印信息,說明mknod

22、操作不被支持。 第二行 將錯誤號為EPERM的結果返回給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 p mknod: `myfifo: Operation not permitted # 第一行命令:將fs.new mount到/mnt目錄下。 第二行命令:進入/mnt目錄,也就是進入fs

23、.new這個myext2文件系統(tǒng)。 第三行命令:執(zhí)行創(chuàng)建一個名為myfifo的命名管道的命令。 第四、五行是執(zhí)行結果:第四行是我們添加的myext2_mknod函數(shù)的printk的結果;第五行是返回錯誤號EPERM結果給shell,shell捕捉到這個錯誤后打出的出錯信息。需要注意的是,如果你是在圖形界面下使用虛擬控制臺,printk打印出來的信息不一定能在你的終端上顯示出來,但是可以通過命令dmesg|tail來觀察。 可見,我們的裁減工作取得了預期的效果。 2.4. 添加文件系統(tǒng)創(chuàng)建工具 文件系統(tǒng)的創(chuàng)建對于一個文件系統(tǒng)來說是首要的。因為,如果不存在一個文件系統(tǒng),所有對它的操作

24、都是空操作,也是無用的操作。 其實,前面的第一小節(jié)《添加一個和ext2完全相同的文件系統(tǒng)myext2》和第二小節(jié)《修改myext2的magic number》在測試實驗結果的時候,已經(jīng)陸陸續(xù)續(xù)地講到了如何創(chuàng)建myext2文件系統(tǒng)。下面工作的主要目的就是將這些內(nèi)容總結一下,制作出一個更快捷方便的myext2文件系統(tǒng)的創(chuàng)建工具:mkfs.myext2(名稱上與mkfs.ext2保持一致)。 首先需要確定的是該程序的輸入和輸出。為了靈活和方便起見,我們的輸入為一個文件,這個文件的大小,就是myext2文件系統(tǒng)的大小。輸出就是帶了myext2文件系統(tǒng)的文件。 我們在主目錄下編輯如下的程序: ~

25、/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/loop2 rm -f ./tmpfs 第一行 表明是shell程序。 第三行 如果有程序用了/dev/loo

26、p2了,就將它釋放。 第四行 用losetup將第一個參數(shù)裝到/dev/loop2上 第五行 用mkfs.ext2格式化/dev/loop2。也就是用ext2文件系統(tǒng)格式格式化我們的文件系統(tǒng)。 第六行 將文件系統(tǒng)的頭2K字節(jié)的內(nèi)容取出來。 第七行 調用程序changeMN將magic number改成0x6666 第八行 再將2K字節(jié)的內(nèi)容寫回去。 第九行 把我們的文件系統(tǒng)從loop2中卸下來。 第十行 將臨時文件刪除。 編輯完了之后,做如下測試: # dd if=/dev/zero of=myfs bs=1M count=1 # ./mkfs.myext2 myf

27、s (或 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)的操作,有了比較深的了解。在本實驗的基礎上,你完全可以發(fā)揮自己的創(chuàng)造性,構造出自己的文件系統(tǒng),然后將它添加到Linux中。 撰寫實驗報告的要求 1.按照實驗報告模板格式撰寫; 2.整個實驗過程的截圖; 3.程序的修改部分,運行結果的截圖; 4.實驗過程中遇到的問題及解決方法等。 5.心得體會

展開閱讀全文
溫馨提示:
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. 本站不保證下載資源的準確性、安全性和完整性, 同時也不承擔用戶因使用這些下載資源對自己和他人造成任何形式的傷害或損失。

相關資源

更多
正為您匹配相似的精品文檔
關于我們 - 網(wǎng)站聲明 - 網(wǎng)站地圖 - 資源地圖 - 友情鏈接 - 網(wǎng)站客服 - 聯(lián)系我們

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

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


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