實驗5 添加一個文件系統參考模板_第1頁
實驗5 添加一個文件系統參考模板_第2頁
實驗5 添加一個文件系統參考模板_第3頁
實驗5 添加一個文件系統參考模板_第4頁
實驗5 添加一個文件系統參考模板_第5頁
已閱讀5頁,還剩9頁未讀 繼續免費閱讀

下載本文檔

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

文檔簡介

1、實驗5 添加一個文件系統實驗目的文件系統是操作系統中最直觀的部分,因為用戶可以通過文件直接地和操作系統交互,操作系統也必須為用戶提供數據計算、數據存儲的功能。本實驗通過添加一個文件系統,進一步理解Linux中的文件系統原理及其實現。 l 深入理解操作系統文件系統原理l 學習理解Linux的VFS文件系統管理技術l 學習理解Linux的ext2文件系統實現技術l 設計和實現自定義文件系統 實驗內容添加一個類似于ext2的自定義文件系統myext2。實驗主要內容:l 添加一個和ext2完全相同的文件系統myext2l 

2、修改myext2的magic numberl 修改文件系統操作l 添加文件系統創建工具實驗指導1. 問題描述本實驗的內容是要添加一個類似于ext2的自定義文件系統myext2。myext2文件系統的描述如下:1、myext2文件系統的物理格式定義與ext2基本一致,除了myext2的magic number是0x6666,而ext2的magic number是0xEF53。2、myext2是ext2的定制版本,它只支持原來ext2文件系統的部分操作,以及修改了部分操作。1 / 14 2. 實驗步驟提示:下面的操作步驟以3.6.6版本的內核為例,2.6.15版本的內

3、核請參照教材,其它版本內核可能會有所區別。2.1 添加一個和ext2完全相同的文件系統myext2要添加一個與ext2完全相同的文件系統myext2,首先是確定實現ext2文件系統的內核源碼是由哪些文件組成。Linux源代碼結構很清楚地告訴我們:fs/ext2目錄下的所有文件是屬于ext2文件系統的。再檢查一下這些文件所包含的頭文件,可以初步總結出來Linux源代碼中屬于ext2文件系統的有:fs/ext2/acl.cfs/ext2/acl.hfs/ext2/balloc.cfs/ext2/bitmap.cfs/ext2/dir.cfs/ext2/ext2.hfs/ext2/file.cinc

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

5、 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修改此文件 

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

7、en        echo "skip $f"        continue    fi     echo -n "substitute ext2 to myext2 in $f."    cat $f | sed 's/ext2/myext2/g' > $f_tmp  &

8、#160; 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 把這個腳本命名為s

9、ubstitute.sh,放在fs/myext2下面,加上可執行權限,運行之后就可以把當前目錄里所有文件里面的“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”、“MYEXT2” 

10、;在include/asm-generic/bitops.h文件中添加:kernel 3.6.6 :其他內核版本可能需要做:  在arch/x86/include/asm/bitops.h文件中添加:kernel 3.6.6 :其他內核版本可能需要做:  在include/linux/magic.h 文件中添加”#define MYEXT2_SUPER_MAGIC 0xEF53”  源代碼的修改工作到此結束。接下來就是第三步工作編譯源代碼。首先要把myext2加到編譯選項中去,以便在做make menuconfig

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

12、的地方添加“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

13、文件系統對應的選項,即原來空白用空格鍵選中為*號: 保存修改,退出。然后做make等重建內核的工作。第一部分工作克隆ext2文件系統已經完成了。新編譯出來的內核重新啟動系統。    下面我們來對添加的myext2文件系統進行一下測試: #pwd/root#dd if=/dev/zero of=myfs bs=1M count=1#/sbin/mkfs.ext2 myfs#cat /proc/filesystems | grep ext    ext2    ext3 

14、;   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 /mnt 2.2 修改myext2的magic number在上面做的基礎上。找到myext2的magic number,并將其改為

15、0x6666:2.6.20以后內核版本,這個值在include/linux/magic.h文件中。2.6.15內核參照教材。 - #define MYEXT2_SUPER_MAGIC    0xEF53+ #define MYEXT2_SUPER_MAGIC    0x6666 改動完成之后,再用make重新編譯內核。以新內核重新啟動,準備下面的測試。在我們測試這個部分之前,我們需要寫個小程序changeMN.c,來修改我們創建的myfs文件系統的magic number。因為它必須和內核中記錄myext2文件系統

16、的magic number匹配,myfs文件系統才能被正確地mount。changeMN.c程序可以在課程網站中下載。這個程序經過編譯后產生的可執行程序名字為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 mou

17、nt t ext2 o loop ./fs.new /mntmount: wrong fs type, bad option, bad superblock on /dev/loop0, # 2.3 修改文件系統操作myext2只是一個實驗性質的文件系統,我們希望它只要能支持簡單的文件操作即可。因此在完成了myext2的總體框架以后,我們來修改掉myext2支持的一些操作,來加深對操作系統對文件系統的操作的理解。下面以裁減myext2的mknod操作為例,了解這個過程的實現流程。Linux將所有的對塊設備、字符設備和命名管道的操作,都看成對文件的操作。mknod操作是用來產生那些塊設

18、備、字符設備和命名管道所對應的節點文件。在ext2文件系統中它的實現函數如下: 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;14

19、8 149         if (!new_valid_dev(rdev)150                 return -EINVAL;151 152         inode = ext2_new_inode (dir, mode);153  &

20、#160;      err = PTR_ERR(inode);154         if (!IS_ERR(inode) 155                 init_special_inode(inode, inode->i_mode, rdev);156 #ifdef CONFIG_EXT2

21、_FS_XATTR157                 inode->i_op = &ext2_special_inode_operations;158 #endif159                 mark_inode_dirty(inode);160&#

22、160;                err = ext2_add_nondir(dentry, inode);161         162         return err;163  它定義在結構ext2_dir_inode_operations中: fs/e

23、xt2/namei.c, line 400392 struct inode_operations ext2_dir_inode_operations = 393         .create         = ext2_create,394         .lookup       

24、  = ext2_lookup,395         .link           = ext2_link,396         .unlink         = ext2_unlink,397    

25、     .symlink        = ext2_symlink,398         .mkdir          = ext2_mkdir,399         .rmdir    &

26、#160;     = ext2_rmdir,400         .mknod          = ext2_mknod,401         .rename         = ext2_rename,402 #ifde

27、f CONFIG_EXT2_FS_XATTR403         .setxattr       = generic_setxattr,404         .getxattr       = generic_getxattr,405       

28、;  .listxattr      = ext2_listxattr,406         .removexattr    = generic_removexattr,407 #endif408         .setattr        = ext2_setattr,4

29、09         .permission     = ext2_permission,410 ; 當然,從ext2克隆過去的myext2的myext2_mknod,以及myext2_dir_inode_operations和上面的程序是一樣的。對于mknod函數,我們在myext2中作如下修改:fs/myext2/namei.cstatic int myext2_mknod (struct inode * dir, struct dentry *dentry,

30、int mode, int rdev)    printk(KERN_ERR “haha, mknod is not supported by myext2! youve been cheated!n”);    return EPERM; 添加的程序中:第一行 打印信息,說明mknod操作不被支持。第二行 將錯誤號為EPERM的結果返回給shell,即告訴shell,在myext2文件系統中,maknod不被支持。 修改完畢,然后重新編譯內核。以新生成的內核重新啟動計算機,我們在shell下執行如下測試程序:&#

31、160;# 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文件系統。第三行命令:執行創建一個名為myfifo的命名管道的命令。第四、五行是執行結果:第四行是我們添加的myext2_mknod函數的printk的結果;第五行是返回錯誤號EPERM結果給shell,shell捕捉到這個錯

32、誤后打出的出錯信息。需要注意的是,如果你是在圖形界面下使用虛擬控制臺,printk打印出來的信息不一定能在你的終端上顯示出來,但是可以通過命令dmesg|tail來觀察。 可見,我們的裁減工作取得了預期的效果。2.4. 添加文件系統創建工具文件系統的創建對于一個文件系統來說是首要的。因為,如果不存在一個文件系統,所有對它的操作都是空操作,也是無用的操作。其實,前面的第一小節添加一個和ext2完全相同的文件系統myext2和第二小節修改myext2的magic number在測試實驗結果的時候,已經陸陸續續地講到了如何創建myext2文件系統。下面工作的主要目的就是將這些內容總結一下,制作出一個更快捷方便的myext2文件系統的創建工具:mkfs.myext2(名稱上與mkfs.ext2保持一致

溫馨提示

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

評論

0/150

提交評論