1. 程式人生 > >Linux核心檔案系統掛載分析

Linux核心檔案系統掛載分析

http://edsionte.com/techblog/archives/4389?f=http://blogread.cn/

1.資料結構

下面將對檔案系統掛載過程中涉及到的兩個主要資料結構vfsmount和path進行節本說明。

1.1 struct vfsmount

每個掛載在核心目錄樹中的檔案系統都將對應一個vfsmount結構,下面將對該結構中的部分欄位進行說明。假設裝置/dev/sdc為ntfs檔案系統,現需要將其掛載在檔案系統為ext3的/home/edsionte/work下。因此,/home/edsionte/work可以被稱為ntfs檔案系統的掛載點,並且稱ntfs檔案系統與ext3檔案系統形成父子檔案檔案系統關係。同時ntfs也可稱為原始檔系統,而ext3也可稱為目的檔案系統。

struct list_head mnt_hash;

核心將系統內所有已掛載的檔案系統通過散列表的形式進行組織,每個vfsmount將處於其對應雜湊值的衝突連結串列當中。mnt_hash欄位則為具體衝突連結串列的元素。

struct list_head mnt_mounts;

如果當前檔案系統下掛載了其他的子檔案系統,那麼這些子檔案系統將通過自身vfsmount中的mnt_child欄位組成一個連結串列,該連結串列頭為父檔案系統中的mnt_mounts欄位。

struct list_head mnt_child;

當前檔案系統將通過該欄位與其他父檔案系統下的子檔案系統組成一個連結串列。

struct vfsmount *mnt_parent;

該欄位指向父檔案系統對應的vfsmount結構。即指向ext3檔案系統對應的vfsmount結構。

struct dentry *mnt_mountpoint;

該欄位表示原始檔系統在目的檔案系統中掛載點對應的dentry結構。/home/edsionte/work為掛載點,則該欄位指向目錄項work。

struct dentry *mnt_root;

指向當前檔案系統的根目錄項。對於原始檔系統ntfs來說,根目錄項相對為/,但在整個系統目錄樹中,根目錄項為work。

struct super_block *mnt_sb;

每個檔案系統都將對應一個super_block結構,該欄位指向/dev/sdc裝置上檔案系統對應的超級塊。

struct list_head mnt_list;

所有處於一個名字空間的檔案系統通過mnt_list欄位連結在一起,而該連結串列的表頭為該名字空間結構中的list欄位。

struct mnt_namespace *mnt_ns;

該欄位表示當前vfsmount所對應的名字空間結構。

1.2 struct path

path結構由vfsmount結構和dentry結構組成。該結構在掛載檔案系統時表示目的檔案系統的vfsmount結構和掛載點dentry。

2.函式呼叫關係圖

do_mount

3.實現

3.1 mount系統呼叫服務例程

mount()系統呼叫服務例程為:

SYSCALL_DEFINE5(mount, char __user *, dev_name, char __user *, dir_name, char __user *, type, unsigned long, flags, void __user *, data)

其內部實現主要是將使用者態的引數依次複製到核心態,接著呼叫核心函式do_mount()。

3.2 do_mount()

該函式內部首先通過kern_path()獲取目的檔案系統的path結構,即掛載點目錄項以及目的檔案系統的vfsmount結構;接著,通過檢查flags對掛載操作進行不同目的的分發。這裡我們只討論最普通的情形,即將一個檔案系統掛載在一個新的掛載點中,這種情況呼叫do_new_mount()。

3.3 do_new_mount()

這個函式描述的是掛載一個新檔案系統最普遍的情形,主要包括以下幾點:

1.檔案系統型別、操縱許可權檢查等;

2.通過do_kern_mount()獲取原始檔系統的vfsmount結構;

3.通過do_add_mount()將原始檔系統增加到目的檔案系統中;

3.4 do_add_mount()

1.flags引數合法性檢查;

2.檢查指定的目的檔案系統是否為當前檔案系統。如果是,則失敗;

3.檢查原始檔系統的根inode是否為連結檔案。如果是,則失敗;

4.通過graft_tree()將原始檔系統裝載到目的檔案系統中。其內部graft又封裝了attach_recursive_mnt();

3.5 attach_recursive_mnt()

該函式的主要作用是設定父子檔案系統的對映關係。具體操作為:

1.通過mnt_set_mountpoint()將子vfsmount中的mnt_parent指向父vfsmount,將子vfsmount的mnt_mountpoint指向位於父檔案系統中的掛載點dentry;

2.通過commit_tree()將子檔案系統新增到核心的檔案系統雜湊表中,並將子檔案系統新增到父檔案系統對應的子檔案系統連結串列中;

3.6 commit_tree()

1.將當前檔案系統的名字空間設定為父名字空間,父vfsmount通過當前vfsmount中的mnt_parent獲取;再將其連線到父名字空間連結串列中。

2.將當前vfsmount加入到對應雜湊值的衝突連結串列當中,雜湊值通過hash()計算。其中,mnt_hash作為連結串列元素。

3.將當前vfsmount加入到父vfsmount對應的子檔案系統連結串列mnt_mounts中。其中,mnt_child作為連結串列元素。

從整個掛載的處理流程上看,掛載的本質就是將原始檔系統的vfsmount結構連線到目的檔案系統對應的vfsmount結構中,即具體涉及到兩個vfsmount中欄位的指向問題。兩個vfsmount具體父子等級關係,這也對應著核心中目錄樹的父子等級關係。

參考資料:

1.深入理解Linux核心:http://book.douban.com/subject/2287506/;

2.深入Linux核心架構:http://book.douban.com/subject/4843567/;

3.Linux核心探祕:http://book.douban.com/subject/25817503/;


相關推薦

Linux核心檔案系統掛載分析

http://edsionte.com/techblog/archives/4389?f=http://blogread.cn/ 1.資料結構 下面將對檔案系統掛載過程中涉及到的兩個主要資料結構vfsmount和path進行節本說明。 1.1 struct vfsmo

用uboot 燒寫uboot linux核心 檔案系統到nandflash的 過程以及bootm go命令啟動與區別

文章結構 結構順序有變化 -1:燒寫uboot 0: bootargs bootcmd 命令引數的設定 1:製作yaffs2的過程 2:燒寫yaffs2的過程 3:製作uimage 的過程 4: 燒寫uiamge的過程 5:uimage zimage vm

用uboot 燒寫uboot linux核心 檔案系統到nandflash的 過程以及bootm go命令啟動與區別(2010-12-19 17:27:43)

文章結構 結構順序有變化 -1:燒寫uboot 0: bootargs bootcmd 命令引數的設定 1:製作yaffs2的過程 2:燒寫yaffs2的過程 3:製作uimage 的過程 4: 燒寫uiamge的過程 5:uimage zimage vmlinux 的區別 6: uboot傳遞給核心的引數結

linux核心 檔案系統 樹莓派 wireshark ssh uml

1, 原始機器資料格式化輸出 static const char *fmt_lower =         "%08x-%04x-%04x-%02x%02x-%02x%02x%02x%02x%02

Linux VFS 檔案系統結構分析

VFS是Linux非常核心的一個概念,linux下的大部分操作都要用到VFS的相關功能。這裡從使用者的角度,對VFS進行了簡單說明。使用者不但需要知道Linux下有哪些檔案操作的函式,還需要對VFS的結構有一個比較清晰的瞭解,才能更好的使用它。例如hard link 與sy

Linux--根檔案系統掛載過程分析

【轉自 http://blog.csdn.net/guopeixin/article/details/5962482】 前言: 本篇文章以S3C6410公版的Linux BSP和U-Boot來進行分析,文中所有提及的名詞和資料都是以該環境為例,所有的程式碼流程

Linux檔案系統掛載過程分析

前言: 本篇文章以S3C6410公版的Linux BSP和U-Boot來進行分析,文中所有提及的名詞和資料都是以該環境為例,所有的程式碼流程也是以該環境為例來進行分析。哈哈。如果有不正確或者不完善的地方,歡迎前來拍磚留言或者發郵件到[email protect

如何將HDFS檔案系統掛載Linux本地檔案系統

本文轉自https://cloud.tencent.com/developer/article/1078538,如果侵權請聯絡我刪除。 1.文件編寫目的 Hadoop支援通過NFSv3掛載HDFS檔案系統到本地目錄,允許使用者像訪問本地檔案系統一樣訪問HDFS,對於普通使用者來說大大的簡

Linux檔案系統製作與各種掛載方式的實現

Linux根檔案系統的製作 什麼是檔案系統 計算機的檔案系統是一種儲存和組織計算機資料的方法,它使得對其訪問和查詢變得容易,檔案系統使用檔案和樹形目錄的抽象邏輯概念代替了硬碟和光碟等物理裝置使用資料塊的概念,使用者使用檔案系統來儲存資料不必關心資料實際儲存在硬碟(或者光碟)的地址為多少的資料

深度解析Linux檔案系統掛載過程

在前面的文章中介紹《Linux作業系統啟動過程》,而Linux系統的根檔案系統(root file system)的掛載過程則是其中一個重要環節,下面這部分內容來自於網路,經整理分享如下,希望能給這部份知識點比較迷茫的朋友一點幫助。 一、rootfs的種類 總的來說,rootfs分為兩種:虛擬roo

Linux:Day8(上) 檔案系統掛載和管理工具

檔案系統管理:   將額外檔案系統與根檔案系統某現存的目錄建立起關聯關係,進而使得此目錄做為其它檔案訪問入口的行為稱之為掛載;   解除此關聯關係的過程稱之為解除安裝;   把裝置關聯掛載點:Mount Point     mount   解除安裝時:可使用裝置,也可以使用掛載點     umou

linux檔案系統核心合二為一

《ARM Linux開發-warewin 2G/3G無線傳輸(DTU)和路由器—筆記》 硬體平臺 :AT91SAM9260 核心版本:Linux-2.6.36 核心檔案和根檔案系統在Flash中一起壓縮放置可節省大量的Flash儲存空間,也便於韌體的存檔和升級,把根檔案系

I.MX6Q(TQIMX6Q/TQE9)學習筆記——核心啟動與檔案系統掛載

經過前面的移植,u-boot已經有能力啟動核心了,本文主要來看下如何通過之前移植的u-boot來啟動核心。如果按照前面的文章完成了LTIB的編譯,那麼,Linux的核心應該就會出現rpm/BUILD/目錄下,接下來,我們就開始移植這個3.0.35版本的核心到TQIMX6Q。

nfs啟動:u-boot啟動後從ubuntu tftp下載核心及裝置樹,檔案系統掛載在nfs伺服器目錄

U-Boot# setenv netargs "setenv bootargs console=${console} ${optargs}    root=/dev/nfs  rootfstype=nfsroot    nfsroot=${serverip}:${rootpath}   ip=${ipaddr

嵌入式linux燒寫核心,檔案系統的2種方式

一.網路下載燒寫 tftpboot 二.linux下的DNW,win7下的DNW無法使用 第一種方式 1.設定開發板ip,及其伺服器IP在同一段 set ipaddr 192.168.1.X set serverip 192.168.1.X 與上面不同 save 2.從

windows掛載linux網路檔案系統NFS

1.建立linux的NFS服務端 2.linux掛載linux的NFS 3.windows掛載Linux的NFS 工具/原料 掛載語句: mount -t nfs 192.168.0.10:/home/share /mnt 取消掛載語句:  umount

Linux】【檔案系統】squashfs檔案系統掛載失敗問題

最近負責將A公司一個比較穩定的程式碼分支移植到新平臺上,新平臺中包含了M公司和B公司的程式碼,這樣的一個程式碼架構方便以後不同公司晶片方案的新增和開發。 在移植的過程中,編譯成功後DUT上電,但是出現解壓檔案系統失敗,串列埠資訊: 0.760000] unlzma 63

Linux虛擬檔案系統核心初始化)

這部分主要對linux虛擬檔案系統核心初始化部分做些補充。 關於shrinker,inode和dentry cache初始化階段都需要註冊自己的shrinker,用於縮減cache。兩個操作原理類似。 shrinker資料結構介紹 /* * A callback you

Linux檔案系統掛載管理

mount多個引數用逗號隔開: 例子mount掛載和查詢已經掛載的分割槽: 例子帶引數的命令: 預設的是讀寫的,可以建立檔案: 改成RO後: 加入sync引數,不使用快取,缺點是讀寫速度慢,優點是安全性高。 加入async引數,使用快取,缺

linux檔案系統掛載,及各種型別的實現試驗

掛載介紹: 系統的中的檔案系統需要掛載才可進行讀取訪問。掛載就是將檔案系統與當前系統根下的某一個目錄產生對映關係,訪問該目錄時實際訪問的是掛載在該目錄上的檔案系統。 注意:在目錄下有檔案時,將檔案系統掛載在該目錄上時,將無法訪問該原本該目錄下的檔案,只能顯示