實(shí)驗(yàn)5添加一個(gè)文件系統(tǒng)
《實(shí)驗(yàn)5添加一個(gè)文件系統(tǒng)》由會(huì)員分享,可在線閱讀,更多相關(guān)《實(shí)驗(yàn)5添加一個(gè)文件系統(tǒng)(14頁(yè)珍藏版)》請(qǐng)?jiān)谘b配圖網(wǎng)上搜索。
1、實(shí)驗(yàn)5 添加一個(gè)文件系統(tǒng) 實(shí)驗(yàn)?zāi)康? 文件系統(tǒng)是操作系統(tǒng)中最直觀的部分,因?yàn)橛脩艨梢酝ㄟ^(guò)文件直接地和操作系統(tǒng)交互,操作系統(tǒng)也必須為用戶提供數(shù)據(jù)計(jì)算、數(shù)據(jù)存儲(chǔ)的功能。本實(shí)驗(yàn)通過(guò)添加一個(gè)文件系統(tǒng),進(jìn)一步理解Linux中的文件系統(tǒng)原理及其實(shí)現(xiàn)。 l深入理解操作系統(tǒng)文件系統(tǒng)原理 l學(xué)習(xí)理解Linux的VFS文件系統(tǒng)管理技術(shù) l學(xué)習(xí)理解Linux的ext2文件系統(tǒng)實(shí)現(xiàn)技術(shù) l設(shè)計(jì)和實(shí)現(xiàn)自定義文件系統(tǒng) 實(shí)驗(yàn)內(nèi)容 添加一個(gè)類似于ext2的自定義文件系統(tǒng)myext2。實(shí)驗(yàn)主要內(nèi)容: l添加一個(gè)和ext2完全相同的文件系統(tǒng)myext2 l修改myext2的magic number l
2、修改文件系統(tǒng)操作 l添加文件系統(tǒng)創(chuàng)建工具 實(shí)驗(yàn)指導(dǎo) 1. 問(wèn)題描述 本實(shí)驗(yàn)的內(nèi)容是要添加一個(gè)類似于ext2的自定義文件系統(tǒng)myext2。myext2文件系統(tǒng)的描述如下: 1、myext2文件系統(tǒng)的物理格式定義與ext2基本一致,除了myext2的magic number是0x6666,而ext2的magic number是0xEF53。 2、myext2是ext2的定制版本,它只支持原來(lái)ext2文件系統(tǒng)的部分操作,以及修改了部分操作。 2. 實(shí)驗(yàn)步驟 提示:下面的操作步驟以3.6.6版本的內(nèi)核為例,2.6.15版本的內(nèi)核請(qǐng)參照教材,其它版本內(nèi)核可能會(huì)有所區(qū)別。 2.1 添
3、加一個(gè)和ext2完全相同的文件系統(tǒng)myext2 要添加一個(gè)與ext2完全相同的文件系統(tǒng)myext2,首先是確定實(shí)現(xiàn)ext2文件系統(tǒng)的內(nèi)核源碼是由哪些文件組成。Linux源代碼結(jié)構(gòu)很清楚地告訴我們:fs/ext2目錄下的所有文件是屬于ext2文件系統(tǒng)的。再檢查一下這些文件所包含的頭文件,可以初步總結(jié)出來(lái)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 接下來(lái)開(kāi)始添加myext2文件系統(tǒng)的源代碼到Linux源代碼。把ext2部分的源代碼克隆到myext2去,即復(fù)制一份以上所列的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 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沒(méi)有此文件 #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)工作的第一步——源代碼復(fù)制。對(duì)于克隆文件系統(tǒng)來(lái)說(shuō),這樣當(dāng)然還遠(yuǎn)遠(yuǎn)不夠,因?yàn)槲募锩娴臄?shù)據(jù)結(jié)構(gòu)名、函數(shù)名、以及相關(guān)的一些宏等內(nèi)容還沒(méi)有根據(jù)myext2改掉,連編譯都通不過(guò)。 下面開(kāi)始克隆文件系統(tǒng)的第二步:修改上面添加的文件的內(nèi)容。為了簡(jiǎn)單起見(jiàn),做了一個(gè)最簡(jiǎn)單的替換:將原來(lái)“EXT2”替換成“MYEXT2”;將原來(lái)的“ext2”替換成“myext2”。 對(duì)于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 把這個(gè)腳本命名為substitute.sh,放在fs/myext2下面,加上可執(zhí)行權(quán)限,運(yùn)行之后就可以把當(dāng)前目錄里所有文件里面的“ext2”和“EXT2”都替換成對(duì)應(yīng)的“myext2”和“MYEXT2”。 用編輯器的替換功能,把include/linux/myext2_fs.h , include/linux/myext2_fs_sb.h(3.6.6沒(méi)有此文件)和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” 源代碼的修改工作到此結(jié)束。接下來(lái)就是第三步工作——編譯源代碼。首先要把myext2加到編譯選項(xiàng)中去,以便在做make menuconfig的時(shí)
10、候,可以將該選項(xiàng)加上去。做這項(xiàng)工作只需要修改三個(gè)文件: fs/Kconfig fs/Makefile fs/Kconfig中拷貝一份對(duì)應(yīng)的對(duì)EXT2文件宏的定義和幫助信息,這樣在做make menuconfig的時(shí)候可以查看該選項(xiàng)的有關(guān)幫助的內(nèi)容。fs/Makefile的修改是告內(nèi)核編譯系統(tǒng),當(dāng)myext2對(duì)應(yīng)的宏被選擇上的時(shí)候,到fs/myext2目錄下去編譯myext2文件系統(tǒng)。 在kernel 3.6.6,在fs/Kconfig文件中增加 source “fs/myext2/Kconfig”,并且對(duì)“ext2”相關(guān)項(xiàng)的地方添加“myext2”項(xiàng)。 在 fs/Ma
11、kefile 文件中添加“obj-$(CONFIG_MYEXT2_FS) += myext2/” 為了在make mencuconfig中看得更加清楚,修改 fs/myext2/Kconfig文件中“Ext2”替換為“MYExt2” ,“Second”前加上“MY” 一切都準(zhǔn)備就緒了,使用make menuconfig選擇上myext2,如下: # cd ~/linux-3.6.6 # make menuconfig 選中ext2和myext2文件系統(tǒng)對(duì)應(yīng)的選項(xiàng),即原來(lái)空白用空格鍵選中為*號(hào): 保存修改,退出。然后做make等重建內(nèi)核的工作。
12、 第一部分工作——克隆ext2文件系統(tǒng)已經(jīng)完成了。 新編譯出來(lái)的內(nèi)核重新啟動(dòng)系統(tǒng)。 下面我們來(lái)對(duì)添加的myext2文件系統(tǒng)進(jìn)行一下測(cè)試: #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 在上面做的基礎(chǔ)上。找到myext2的magic number,并將其改為0x6666: 2.6.20以后內(nèi)核版本,這個(gè)值在include/linux/magic.h文件中。2.6.15內(nèi)核參照教材。 - #define MYEXT2_SUPER_MA
14、GIC 0xEF53 + #define MYEXT2_SUPER_MAGIC 0x6666 改動(dòng)完成之后,再用make重新編譯內(nèi)核。以新內(nèi)核重新啟動(dòng),準(zhǔn)備下面的測(cè)試。 在我們測(cè)試這個(gè)部分之前,我們需要寫(xiě)個(gè)小程序changeMN.c,來(lái)修改我們創(chuàng)建的myfs文件系統(tǒng)的magic number。因?yàn)樗仨毢蛢?nèi)核中記錄myext2文件系統(tǒng)的magic number匹配,myfs文件系統(tǒng)才能被正確地mount。 changeMN.c程序可以在課程網(wǎng)站中下載。這個(gè)程序經(jīng)過(guò)編譯后產(chǎn)生的可執(zhí)行程序名字為changeMN。 下面我們開(kāi)始測(cè)試: #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只是一個(gè)實(shí)驗(yàn)性質(zhì)的文件系統(tǒng),我們希望它只要能支持簡(jiǎn)單的文件操作即可。因此在完成了myext2的總體框架以后,我們來(lái)修改掉myext2支持的一些操作,來(lái)加深對(duì)操作系統(tǒng)對(duì)文件系統(tǒng)的操作的理解。下面以裁減myext2的mknod操作為例,了解這個(gè)過(guò)程的實(shí)現(xiàn)流程。 Linux將所有的對(duì)塊設(shè)備、字符設(shè)備和命名管道的操作,都看成對(duì)文件的操作。mknod操作是用來(lái)產(chǎn)生那些塊設(shè)備、字符設(shè)備和命名管道所對(duì)應(yīng)的節(jié)點(diǎn)文件。在ext2文件系統(tǒng)中它的實(shí)現(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 } 它定義在結(jié)構(gòu)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 }; 當(dāng)然,從ext2克隆過(guò)去的myext2的myext2_mknod,以及myext2_dir_
21、inode_operations和上面的程序是一樣的。 對(duì)于mknod函數(shù),我們?cè)趍yext2中作如下修改: 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; } 添加的程序中: 第一行 打印信息,說(shuō)明mknod
22、操作不被支持。 第二行 將錯(cuò)誤號(hào)為EPERM的結(jié)果返回給shell,即告訴shell,在myext2文件系統(tǒng)中,maknod不被支持。 修改完畢,然后重新編譯內(nèi)核。以新生成的內(nèi)核重新啟動(dòng)計(jì)算機(jī),我們?cè)趕hell下執(zhí)行如下測(cè)試程序: # sudo mount –t myext2 –o loop ./fs.new /mnt #cd /mnt # sudo mknod myfifo p mknod: `myfifo: Operation not permitted # 第一行命令:將fs.new mount到/mnt目錄下。 第二行命令:進(jìn)入/mnt目錄,也就是進(jìn)入fs
23、.new這個(gè)myext2文件系統(tǒng)。 第三行命令:執(zhí)行創(chuàng)建一個(gè)名為myfifo的命名管道的命令。 第四、五行是執(zhí)行結(jié)果:第四行是我們添加的myext2_mknod函數(shù)的printk的結(jié)果;第五行是返回錯(cuò)誤號(hào)EPERM結(jié)果給shell,shell捕捉到這個(gè)錯(cuò)誤后打出的出錯(cuò)信息。需要注意的是,如果你是在圖形界面下使用虛擬控制臺(tái),printk打印出來(lái)的信息不一定能在你的終端上顯示出來(lái),但是可以通過(guò)命令dmesg|tail來(lái)觀察。 可見(jiàn),我們的裁減工作取得了預(yù)期的效果。 2.4. 添加文件系統(tǒng)創(chuàng)建工具 文件系統(tǒng)的創(chuàng)建對(duì)于一個(gè)文件系統(tǒng)來(lái)說(shuō)是首要的。因?yàn)椋绻淮嬖谝粋€(gè)文件系統(tǒng),所有對(duì)它的操作
24、都是空操作,也是無(wú)用的操作。 其實(shí),前面的第一小節(jié)《添加一個(gè)和ext2完全相同的文件系統(tǒng)myext2》和第二小節(jié)《修改myext2的magic number》在測(cè)試實(shí)驗(yàn)結(jié)果的時(shí)候,已經(jīng)陸陸續(xù)續(xù)地講到了如何創(chuàng)建myext2文件系統(tǒng)。下面工作的主要目的就是將這些內(nèi)容總結(jié)一下,制作出一個(gè)更快捷方便的myext2文件系統(tǒng)的創(chuàng)建工具:mkfs.myext2(名稱上與mkfs.ext2保持一致)。 首先需要確定的是該程序的輸入和輸出。為了靈活和方便起見(jiàn),我們的輸入為一個(gè)文件,這個(gè)文件的大小,就是myext2文件系統(tǒng)的大小。輸出就是帶了myext2文件系統(tǒng)的文件。 我們?cè)谥髂夸浵戮庉嬋缦碌某绦颍? ~
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將第一個(gè)參數(shù)裝到/dev/loop2上 第五行 用mkfs.ext2格式化/dev/loop2。也就是用ext2文件系統(tǒng)格式格式化我們的文件系統(tǒng)。 第六行 將文件系統(tǒng)的頭2K字節(jié)的內(nèi)容取出來(lái)。 第七行 調(diào)用程序changeMN將magic number改成0x6666 第八行 再將2K字節(jié)的內(nèi)容寫(xiě)回去。 第九行 把我們的文件系統(tǒng)從loop2中卸下來(lái)。 第十行 將臨時(shí)文件刪除。 編輯完了之后,做如下測(cè)試: # 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)部分的實(shí)驗(yàn)已經(jīng)全部完成了。通過(guò)本實(shí)驗(yàn),你對(duì)Linux整個(gè)文件系統(tǒng)的運(yùn)作流程,如何添加一個(gè)文件系統(tǒng),以及如何修改Linux對(duì)文件系統(tǒng)的操作,有了比較深的了解。在本實(shí)驗(yàn)的基礎(chǔ)上,你完全可以發(fā)揮自己的創(chuàng)造性,構(gòu)造出自己的文件系統(tǒng),然后將它添加到Linux中。 撰寫(xiě)實(shí)驗(yàn)報(bào)告的要求 1.按照實(shí)驗(yàn)報(bào)告模板格式撰寫(xiě); 2.整個(gè)實(shí)驗(yàn)過(guò)程的截圖; 3.程序的修改部分,運(yùn)行結(jié)果的截圖; 4.實(shí)驗(yàn)過(guò)程中遇到的問(wèn)題及解決方法等。 5.心得體會(huì)
- 溫馨提示:
1: 本站所有資源如無(wú)特殊說(shuō)明,都需要本地電腦安裝OFFICE2007和PDF閱讀器。圖紙軟件為CAD,CAXA,PROE,UG,SolidWorks等.壓縮文件請(qǐng)下載最新的WinRAR軟件解壓。
2: 本站的文檔不包含任何第三方提供的附件圖紙等,如果需要附件,請(qǐng)聯(lián)系上傳者。文件的所有權(quán)益歸上傳用戶所有。
3.本站RAR壓縮包中若帶圖紙,網(wǎng)頁(yè)內(nèi)容里面會(huì)有圖紙預(yù)覽,若沒(méi)有圖紙預(yù)覽就沒(méi)有圖紙。
4. 未經(jīng)權(quán)益所有人同意不得將文件中的內(nèi)容挪作商業(yè)或盈利用途。
5. 裝配圖網(wǎng)僅提供信息存儲(chǔ)空間,僅對(duì)用戶上傳內(nèi)容的表現(xiàn)方式做保護(hù)處理,對(duì)用戶上傳分享的文檔內(nèi)容本身不做任何修改或編輯,并不能對(duì)任何下載內(nèi)容負(fù)責(zé)。
6. 下載文件中如有侵權(quán)或不適當(dāng)內(nèi)容,請(qǐng)與我們聯(lián)系,我們立即糾正。
7. 本站不保證下載資源的準(zhǔn)確性、安全性和完整性, 同時(shí)也不承擔(dān)用戶因使用這些下載資源對(duì)自己和他人造成任何形式的傷害或損失。
最新文檔
- 市教育局冬季運(yùn)動(dòng)會(huì)安全工作預(yù)案
- 2024年秋季《思想道德與法治》大作業(yè)及答案3套試卷
- 2024年教師年度考核表個(gè)人工作總結(jié)(可編輯)
- 2024年xx村兩委涉案資金退還保證書(shū)
- 2024年憲法宣傳周活動(dòng)總結(jié)+在機(jī)關(guān)“弘揚(yáng)憲法精神推動(dòng)發(fā)改工作高質(zhì)量發(fā)展”專題宣講報(bào)告會(huì)上的講話
- 2024年XX村合作社年報(bào)總結(jié)
- 2024-2025年秋季第一學(xué)期初中歷史上冊(cè)教研組工作總結(jié)
- 2024年小學(xué)高級(jí)教師年終工作總結(jié)匯報(bào)
- 2024-2025年秋季第一學(xué)期初中物理上冊(cè)教研組工作總結(jié)
- 2024年xx鎮(zhèn)交通年度總結(jié)
- 2024-2025年秋季第一學(xué)期小學(xué)語(yǔ)文教師工作總結(jié)
- 2024年XX村陳規(guī)陋習(xí)整治報(bào)告
- 2025年學(xué)校元旦迎新盛典活動(dòng)策劃方案
- 2024年學(xué)校周邊安全隱患自查報(bào)告
- 2024年XX鎮(zhèn)農(nóng)村規(guī)劃管控述職報(bào)告