亚洲精品久久久久久久久久久,亚洲国产精品一区二区制服,亚洲精品午夜精品,国产成人精品综合在线观看,最近2019中文字幕一页二页

0
  • 聊天消息
  • 系統(tǒng)消息
  • 評(píng)論與回復(fù)
登錄后你可以
  • 下載海量資料
  • 學(xué)習(xí)在線課程
  • 觀看技術(shù)視頻
  • 寫文章/發(fā)帖/加入社區(qū)
會(huì)員中心
創(chuàng)作中心

完善資料讓更多小伙伴認(rèn)識(shí)你,還能領(lǐng)取20積分哦,立即完善>

3天內(nèi)不再提示

Linxu系統(tǒng)中文件系統(tǒng)的掛載方法和應(yīng)用實(shí)例

Linux閱碼場(chǎng) ? 來(lái)源:Linux閱碼場(chǎng) ? 作者:Linux閱碼場(chǎng) ? 2021-06-30 15:01 ? 次閱讀
加入交流群
微信小助手二維碼

掃碼添加小助手

加入工程師交流群

1.開場(chǎng)白

環(huán)境:處理器架構(gòu):arm64內(nèi)核源碼:linux-5.11ubuntu版本:20.04.1代碼閱讀工具:vim+ctags+cscope

我們知道,Linux系統(tǒng)中我們經(jīng)常將一個(gè)塊設(shè)備上的文件系統(tǒng)掛載到某個(gè)目錄下才能訪問(wèn)這個(gè)文件系統(tǒng)下的文件,但是你有沒(méi)有思考過(guò):為什么塊設(shè)備掛載之后才能訪問(wèn)文件?掛載文件系統(tǒng)Linux內(nèi)核到底為我們做了哪些事情?是否可以不將文件系統(tǒng)掛載到具體的目錄下也能訪問(wèn)?下面,本文將詳細(xì)講解Linxu系統(tǒng)中,文件系統(tǒng)掛載的奧秘。

注:本文主要講解文件系統(tǒng)掛載核心邏輯,暫不涉及掛載命名空間和綁定掛載等內(nèi)容(后面的內(nèi)容可能會(huì)涉及),且以ext2磁盤文件系統(tǒng)為例講解掛載。本專題文章分為上下兩篇,上篇主要介紹掛載全貌以及具體文件系統(tǒng)的掛載方法,下篇介紹如何通過(guò)掛載實(shí)例關(guān)聯(lián)掛載點(diǎn)和超級(jí)塊。

2. vfs 幾個(gè)重要對(duì)象

在這里我們不介紹整個(gè)IO棧,只說(shuō)明和文件系統(tǒng)相關(guān)的vfs和具體文件系統(tǒng)層。我們知道在Linux中通過(guò)虛擬文件系統(tǒng)層VFS統(tǒng)一所有具體的文件系統(tǒng),提取所有具體文件系統(tǒng)的共性,屏蔽具體文件系統(tǒng)的差異。VFS既是向下的接口(所有文件系統(tǒng)都必須實(shí)現(xiàn)該接口),同時(shí)也是向上的接口(用戶進(jìn)程通過(guò)系統(tǒng)調(diào)用最終能夠訪問(wèn)文件系統(tǒng)功能)。

下面我們來(lái)看下,vfs中幾個(gè)比較重要的結(jié)構(gòu)體對(duì)象:

2.1 file_system_type

這個(gè)結(jié)構(gòu)來(lái)描述一種文件系統(tǒng)類型,一般具體文件系統(tǒng)會(huì)定義這個(gè)結(jié)構(gòu),然后注冊(cè)到系統(tǒng)中;定義了具體文件系統(tǒng)的掛載和卸載方法,文件系統(tǒng)掛載時(shí)調(diào)用其掛載方法構(gòu)建超級(jí)塊、跟dentry等實(shí)例。

文件系統(tǒng)分為以下幾種:

1)磁盤文件系統(tǒng)

文件在非易失性存儲(chǔ)介質(zhì)上(如硬盤,flash),掉電文件不丟失。

如ext2,ext4,xfs

2)內(nèi)存文件系統(tǒng)

文件在內(nèi)存上,掉電丟失。

如tmpfs

3)偽文件系統(tǒng)

是假的文件系統(tǒng),是利用虛擬文件系統(tǒng)的接口(可以對(duì)用戶可見如proc、sysfs,也可以對(duì)用戶不可見內(nèi)核可見如sockfs,bdev)。

如proc,sysfs,sockfs,bdev

4)網(wǎng)絡(luò)文件系統(tǒng)

這種文件系統(tǒng)允許訪問(wèn)另一臺(tái)計(jì)算機(jī)上的數(shù)據(jù),該計(jì)算機(jī)通過(guò)網(wǎng)絡(luò)連接到本地計(jì)算機(jī)。

如nfs文件系統(tǒng)

結(jié)構(gòu)體定義源碼路徑:include/linux/fs.h +2226

2.2 super_block

超級(jí)塊,用于描述塊設(shè)備上的一個(gè)文件系統(tǒng)總體信息(如文件塊大小,最大文件大小,文件系統(tǒng)魔數(shù)等),一個(gè)塊設(shè)備上的文件系統(tǒng)可以被掛載多次,但是內(nèi)存中只能有個(gè)super_block來(lái)描述(至少對(duì)于磁盤文件系統(tǒng)來(lái)說(shuō))。

結(jié)構(gòu)體定義源碼路徑:include/linux/fs.h +1414

2.3 mount

掛載描述符,用于建立超級(jí)塊和掛載點(diǎn)等之間的聯(lián)系,描述文件系統(tǒng)的一次掛載,一個(gè)塊設(shè)備上的文件系統(tǒng)可以被掛載多次,每次掛載內(nèi)存中有一個(gè)mount對(duì)象描述。

結(jié)構(gòu)體定義源碼路徑:fs/mount.h +39

2.4 inode

索引節(jié)點(diǎn)對(duì)象,描述磁盤上的一個(gè)文件元數(shù)據(jù)(文件屬性、位置等),有些文件系統(tǒng)需要從塊設(shè)備上讀取磁盤上的索引節(jié)點(diǎn),然后在內(nèi)存中創(chuàng)建vfs的索引節(jié)點(diǎn)對(duì)象,一般在文件第一次打開時(shí)創(chuàng)建。

結(jié)構(gòu)體定義源碼路徑:include/linux/fs.h +610

2.5 dentry

目錄項(xiàng)對(duì)象,用于描述文件的層次結(jié)構(gòu),從而構(gòu)建文件系統(tǒng)的目錄樹,文件系統(tǒng)將目錄當(dāng)作文件,目錄的數(shù)據(jù)由目錄項(xiàng)組成,而每個(gè)目錄項(xiàng)存儲(chǔ)一個(gè)目錄或文件的名稱和索引節(jié)點(diǎn)號(hào)等內(nèi)容。每當(dāng)進(jìn)程訪問(wèn)一個(gè)目錄項(xiàng)就會(huì)在內(nèi)存中創(chuàng)建目錄項(xiàng)對(duì)象(如ext2路徑名查找中,通過(guò)查找父目錄數(shù)據(jù)塊的目錄項(xiàng),找到對(duì)應(yīng)文件/目錄的名稱,獲得inode號(hào)來(lái)找到對(duì)應(yīng)inode)。

結(jié)構(gòu)體定義源碼路徑:include/linux/dcache.h +90

2.6 file

文件對(duì)象,描述進(jìn)程打開的文件,當(dāng)進(jìn)程打開文件時(shí)會(huì)創(chuàng)建文件對(duì)象加入到進(jìn)程的文件打開表,通過(guò)文件描述符來(lái)索引文件對(duì)象,后面讀寫等操作都通過(guò)文件描述符進(jìn)行(一個(gè)文件可以被多個(gè)進(jìn)程打開,會(huì)由多個(gè)文件對(duì)象加入到各個(gè)進(jìn)程的文件打開表,但是inode只有一個(gè))。

結(jié)構(gòu)體定義源碼路徑:include/linux/fs.h +915

3. 掛載總體流程

3.1系統(tǒng)調(diào)用處理

用戶執(zhí)行掛載是通過(guò)系統(tǒng)調(diào)用路徑進(jìn)入內(nèi)核處理,拷貝用戶空間傳遞參數(shù)到內(nèi)核,掛載委托do_mount。

//fs/namespace.c

SYSCALL_DEFINE5(mount

參數(shù):

dev_name 要掛載的塊設(shè)備

dir_name 掛載點(diǎn)目錄

type 文件系統(tǒng)類型名

flags 掛載標(biāo)志

data 掛載選項(xiàng)

-》 kernel_type = copy_mount_string(type); //拷貝文件系統(tǒng)類型名到內(nèi)核空間

-》 kernel_dev = copy_mount_string(dev_name) //拷貝塊設(shè)備路徑名到內(nèi)核空間-》 options = copy_mount_options(data) //拷貝掛載選項(xiàng)到內(nèi)核空間

-》 do_mount(kernel_dev, dir_name, kernel_type, flags, options) //掛載委托do_mount

3.2 掛載點(diǎn)路徑查找

掛載點(diǎn)路徑查找,掛載委托path_mount

do_mount

-》 user_path_at(AT_FDCWD, dir_name, LOOKUP_FOLLOW, &path) //掛載點(diǎn)路徑查找 查找掛載點(diǎn)目錄的 vfsmount和dentry 存放在 path

-》 path_mount(dev_name, &path, type_page, flags, data_page) //掛載委托path_mount

3.3 參數(shù)合法性檢查

參數(shù)合法性檢查, 新掛載委托do_new_mount

path_mount

-》 參數(shù)合法性檢查

-》 根據(jù)掛載標(biāo)志調(diào)用不同函數(shù)處理這里講解是默認(rèn) do_new_mount

3.4 調(diào)用具體文件系統(tǒng)掛載方法

do_new_mount

-》 type = get_fs_type(fstype) //根據(jù)傳遞的文件系統(tǒng)名 查找已經(jīng)注冊(cè)的文件系統(tǒng)類型

-》 fc = fs_context_for_mount(type, sb_flags) //為掛載分配文件系統(tǒng)上下文 struct fs_context

-》 alloc_fs_context

-》 分配fs_context fc = kzalloc(sizeof(struct fs_context), GFP_KERNEL)

-》 設(shè)置 。..

-》 fc-》fs_type = get_filesystem(fs_type); //賦值相應(yīng)的文件系統(tǒng)類型

-》 init_fs_context = **fc-》fs_type-》init_fs_context**; //新內(nèi)核使用fs_type-》init_fs_context接口 來(lái)初始化文件系統(tǒng)上下文

if (!init_fs_context) //init_fs_context回掉 主要用于初始化

init_fs_context = **legacy_init_fs_context**; //沒(méi)有 fs_type-》init_fs_context接口

-》 init_fs_context(fc) //初始化文件系統(tǒng)上下文 (初始化一些回掉函數(shù),供后續(xù)使用)

來(lái)看下文件系統(tǒng)類型沒(méi)有實(shí)現(xiàn)init_fs_context接口的情況:

//fs/fs_context.c

init_fs_context = legacy_init_fs_context

-》 fc-》ops = &legacy_fs_context_ops //設(shè)置文件系統(tǒng)上下午操作

-》.get_tree = legacy_get_tree //操作方法的get_tree用于 讀取磁盤超級(jí)塊并在內(nèi)存創(chuàng)建超級(jí)塊,創(chuàng)建跟inode, 跟dentry

-》 root = fc-》fs_type-》mount(fc-》fs_type, fc-》sb_flags,

| fc-》source, ctx-》legacy_data) //調(diào)用文件系統(tǒng)類型的mount方法來(lái)讀取并創(chuàng)建超級(jí)塊

-》 fc-》root = root //賦值創(chuàng)建好的跟dentry

有一些文件系統(tǒng)使用原來(lái)的接口(fs_type.mount = xxx_mount):如ext2,ext4等

有一些文件系統(tǒng)使用新的接口(fs_type.init_fs_context = xxx_init_fs_context):xfs, proc, sys

無(wú)論使用哪一種,都會(huì)在xxx_init_fs_contex中實(shí)現(xiàn) fc-》ops = &xxx_context_ops 接口,后面會(huì)看的都會(huì)調(diào)用fc-》ops.get_tree 來(lái)讀取創(chuàng)建超級(jí)塊實(shí)例

繼續(xù)往下走:

do_new_mount

-》 。..

-》 fc = fs_context_for_mount(type, sb_flags) //分配 賦值文件系統(tǒng)上下文

-》 parse_monolithic_mount_data(fc, data) //調(diào)用fc-》ops-》parse_monolithic 解析掛載選項(xiàng)

-》 mount_capable(fc) //檢查是否有掛載權(quán)限

-》 vfs_get_tree(fc) //fs/super.c 掛載重點(diǎn) 調(diào)用fc-》ops-》get_tree(fc) 讀取創(chuàng)建超級(jí)塊實(shí)例

。..

3.5 掛載實(shí)例添加到全局文件系統(tǒng)樹

do_new_mount

。..

-》 do_new_mount_fc(fc, path, mnt_flags) //創(chuàng)建mount實(shí)例 關(guān)聯(lián)掛載點(diǎn)和超級(jí)塊 添加到命名空間的掛載樹中

下面主要看下vfs_get_tree和do_new_mount_fc:

4.具體文件系統(tǒng)掛載方法

1)vfs_get_tree

//以ext2文件系統(tǒng)為例

vfs_get_tree //fs/namespace.c

-》 fc-》ops-》get_tree(fc)

-》 legacy_get_tree //上面分析過(guò) fs_type-》init_fs_context == NULL使用舊的接口(ext2為NULL)

-》fc-》fs_type-》mount

-》 ext2_mount //fs/ext2/super.c 調(diào)用到具體文件系統(tǒng)的掛載方法

來(lái)看下ext2對(duì)掛載的處理:

啟動(dòng)階段初始化-》

//fs/ext2/super.c

module_init(init_ext2_fs)

init_ext2_fs

-》init_inodecache //創(chuàng)建ext2_inode_cache 對(duì)象緩存

-》register_filesystem(&ext2_fs_type) //注冊(cè)ext2的文件系統(tǒng)類型static struct file_system_type ext2_fs_type = {

.owner = THIS_MODULE,

.name = “ext2”,

.mount = ext2_mount, //掛載時(shí)調(diào)用 用于讀取創(chuàng)建超級(jí)塊實(shí)例

.kill_sb = kill_block_super, //卸載時(shí)調(diào)用 用于釋放超級(jí)塊

.fs_flags = FS_REQUIRES_DEV, //文件系統(tǒng)標(biāo)志為 請(qǐng)求塊設(shè)備,文件系統(tǒng)在塊設(shè)備上

};

掛載時(shí)調(diào)用-》

// fs/ext2/super.cstatic struct dentry *ext2_mount(struct file_system_type *fs_type,

int flags, const char *dev_name, void *data)

{

return mount_bdev(fs_type, flags, dev_name, data, ext2_fill_super);

}

ext2_mount通過(guò)調(diào)用mount_bdev來(lái)執(zhí)行實(shí)際文件系統(tǒng)的掛載工作,ext2_fill_super的一個(gè)函數(shù)指針作為參數(shù)傳遞給get_sb_bdev。該函數(shù)用于填充一個(gè)超級(jí)塊對(duì)象,如果內(nèi)存中沒(méi)有適當(dāng)?shù)某?jí)塊對(duì)象,數(shù)據(jù)就必須從硬盤讀取。

mount_bdev是個(gè)公用的函數(shù),一般磁盤文件系統(tǒng)會(huì)使用它來(lái)根據(jù)具體文件系統(tǒng)的fill_super方法來(lái)讀取磁盤上的超級(jí)塊并在創(chuàng)建內(nèi)存超級(jí)塊。

我們來(lái)看下mount_bdev的實(shí)現(xiàn)(**它執(zhí)行完成之后會(huì)創(chuàng)建vfs的三大數(shù)據(jù)結(jié)構(gòu) super_block、根inode和根dentry **):

2)mount_bdev源碼分析

//fs/super.c

mount_bdev

-》bdev = blkdev_get_by_path(dev_name, mode, fs_type) //通過(guò)要掛載的塊設(shè)備路徑名 獲得它的塊設(shè)備描述符block_device(會(huì)涉及到路徑名查找和通過(guò)設(shè)備號(hào)在bdev文件系統(tǒng)查找block_device,block_device是添加塊設(shè)備到系統(tǒng)時(shí)創(chuàng)建的)

-》 s = sget(fs_type, test_bdev_super, set_bdev_super, flags | SB_NOSEC,

|bdev); //查找或創(chuàng)建vfs的超級(jí)塊 (會(huì)首先在文件系統(tǒng)類型的fs_supers鏈表查找是否已經(jīng)讀取過(guò)指定的超級(jí)塊,會(huì)對(duì)比每個(gè)超級(jí)塊的s_bdev塊設(shè)備描述符,沒(méi)有創(chuàng)建一個(gè))

-》 if (s-》s_root) { //超級(jí)塊的根dentry是否被賦值?

。..

} else { //沒(méi)有賦值說(shuō)明時(shí)新創(chuàng)建的sb

。..

-》 sb_set_blocksize(s, block_size(bdev)) //根據(jù)塊設(shè)備描述符設(shè)置文件系統(tǒng)塊大小

-》 fill_super(s, data, flags & SB_SILENT ? 1 : 0) //調(diào)用傳遞的具體文件系統(tǒng)的填充超級(jí)塊方法讀取填充超級(jí)塊等 如ext2_fill_super

-》 bdev-》bd_super = s //塊設(shè)備bd_super指向sb

}

-》 return dget(s-》s_root) //返回文件系統(tǒng)的根dentry

可以看到mount_bdev主要是:1.根據(jù)要掛載的塊設(shè)備文件名查找到對(duì)應(yīng)的塊設(shè)備描述符(內(nèi)核后面操作塊設(shè)備都是使用塊設(shè)備描述符);2.首先在文件系統(tǒng)類型的fs_supers鏈表查找是否已經(jīng)讀取過(guò)指定的vfs超級(jí)塊,會(huì)對(duì)比每個(gè)超級(jí)塊的s_bdev塊設(shè)備描述符,沒(méi)有創(chuàng)建一個(gè)vfs超級(jí)塊; 3.新創(chuàng)建的vfs超級(jí)塊,需要調(diào)用具體文件系統(tǒng)的fill_super方法來(lái)讀取填充超級(jí)塊。

那么下面主要集中在具體文件系統(tǒng)的fill_super方法,這里是ext2_fill_super:

分析重點(diǎn)代碼如下:

3)ext2_fill_super源碼分析

//fs/ext2/super.cstatic int ext2_fill_super(struct super_block *sb, void *data, int silent)

{

struct buffer_head * bh; //緩沖區(qū)頭 記錄讀取的磁盤超級(jí)塊

struct ext2_sb_info * sbi; //內(nèi)存的ext2 超級(jí)塊信息

struct ext2_super_block * es; //磁盤上的 超級(jí)塊信息

。..

sbi = kzalloc(sizeof(*sbi), GFP_KERNEL); //分配 內(nèi)存的ext2 超級(jí)塊信息結(jié)構(gòu)

if (!sbi)

goto failed;

。..

sb-》s_fs_info = sbi; //vfs的超級(jí)塊 的s_fs_info指向內(nèi)存的ext2 超級(jí)塊信息結(jié)構(gòu)

sbi-》s_sb_block = sb_block;

if (?。╞h = sb_bread(sb, logic_sb_block))) { // 讀取磁盤上的超級(jí)塊到內(nèi)存的 使用buffer_head關(guān)聯(lián)內(nèi)存緩沖區(qū)和磁盤扇區(qū)

ext2_msg(sb, KERN_ERR, “error: unable to read superblock”);

goto failed_sbi;

}

es = (struct ext2_super_block *) (((char *)bh-》b_data) + offset); //轉(zhuǎn)換為struct ext2_super_block 結(jié)構(gòu)

sbi-》s_es = es; // 內(nèi)存的ext2 超級(jí)塊信息結(jié)構(gòu)的 s_es指向真正的ext2磁盤超級(jí)塊信息結(jié)構(gòu)

sb-》s_magic = le16_to_cpu(es-》s_magic); //獲得文件系統(tǒng)魔數(shù) ext2為0xEF53

if (sb-》s_magic != EXT2_SUPER_MAGIC) //驗(yàn)證 魔數(shù)是否正確

goto cantfind_ext2;

blocksize = BLOCK_SIZE 《《 le32_to_cpu(sbi-》s_es-》s_log_block_size); //獲得磁盤讀取的塊大小

/* If the blocksize doesn‘t match, re-read the thing.。 */

if (sb-》s_blocksize != blocksize) { //塊大小不匹配 需要重新讀取超級(jí)塊

brelse(bh);

if (!sb_set_blocksize(sb, blocksize)) {

ext2_msg(sb, KERN_ERR,

“error: bad blocksize %d”, blocksize);

goto failed_sbi;

}

logic_sb_block = (sb_block*BLOCK_SIZE) / blocksize;

offset = (sb_block*BLOCK_SIZE) % blocksize;

bh = sb_bread(sb, logic_sb_block); //重新 讀取超級(jí)塊

if(!bh) {

ext2_msg(sb, KERN_ERR, “error: couldn’t read”

“superblock on 2nd try”);

goto failed_sbi;

}

es = (struct ext2_super_block *) (((char *)bh-》b_data) + offset);

sbi-》s_es = es;

if (es-》s_magic != cpu_to_le16(EXT2_SUPER_MAGIC)) {

ext2_msg(sb, KERN_ERR, “error: magic mismatch”);

goto failed_mount;

}

}

sb-》s_maxbytes = ext2_max_size(sb-》s_blocksize_bits); //設(shè)置最大文件大小

。..

//讀取或設(shè)置 inode大小和第一個(gè)inode號(hào)

if (le32_to_cpu(es-》s_rev_level) == EXT2_GOOD_OLD_REV) {

sbi-》s_inode_size = EXT2_GOOD_OLD_INODE_SIZE;

sbi-》s_first_ino = EXT2_GOOD_OLD_FIRST_INO;

} else {

sbi-》s_inode_size = le16_to_cpu(es-》s_inode_size);

sbi-》s_first_ino = le32_to_cpu(es-》s_first_ino);

。..

}

。..

sbi-》s_blocks_per_group = le32_to_cpu(es-》s_blocks_per_group); //賦值每個(gè)塊組 塊個(gè)數(shù)

sbi-》s_frags_per_group = le32_to_cpu(es-》s_frags_per_group);

sbi-》s_inodes_per_group = le32_to_cpu(es-》s_inodes_per_group); //賦值每個(gè)塊組 inode個(gè)數(shù)

sbi-》s_inodes_per_block = sb-》s_blocksize / EXT2_INODE_SIZE(sb); //賦值每個(gè)塊 inode個(gè)數(shù)

。..

sbi-》s_desc_per_block = sb-》s_blocksize /

sizeof (struct ext2_group_desc); //賦值每個(gè)塊 塊組描述符個(gè)數(shù)

sbi-》s_sbh = bh; //賦值讀取的超級(jí)塊緩沖區(qū)

sbi-》s_mount_state = le16_to_cpu(es-》s_state); //賦值掛載狀態(tài)

。..

if (sb-》s_magic != EXT2_SUPER_MAGIC)

goto cantfind_ext2;

//一些合法性檢查

。..

//計(jì)算塊組描述符 個(gè)數(shù)

sbi-》s_groups_count = ((le32_to_cpu(es-》s_blocks_count) -

le32_to_cpu(es-》s_first_data_block) - 1)

/ EXT2_BLOCKS_PER_GROUP(sb)) + 1;

db_count = (sbi-》s_groups_count + EXT2_DESC_PER_BLOCK(sb) - 1) /

| EXT2_DESC_PER_BLOCK(sb);

sbi-》s_group_desc = kmalloc_array(db_count,

| sizeof(struct buffer_head *),

| GFP_KERNEL); //分配塊組描述符 bh數(shù)組

for (i = 0; i 《 db_count; i++) { //讀取塊組描述符

block = descriptor_loc(sb, logic_sb_block, i);

sbi-》s_group_desc[i] = sb_bread(sb, block); //讀取的 塊組描述符緩沖區(qū)保存 到sbi-》s_group_desc[i]

if (!sbi-》s_group_desc[i]) {

for (j = 0; j 《 i; j++)

brelse (sbi-》s_group_desc[j]);

ext2_msg(sb, KERN_ERR,

“error: unable to read group descriptors”);

goto failed_mount_group_desc;

}

}

sb-》s_op = &ext2_sops; //賦值超級(jí)塊操作

。..

root = ext2_iget(sb, EXT2_ROOT_INO); //讀取根inode (ext2 根根inode號(hào)為2)

sb-》s_root = d_make_root(root); //創(chuàng)建根dentry 并建立根inode和根dentry關(guān)系

ext2_write_super(sb); //同步超級(jí)塊信息到磁盤 如掛載時(shí)間等

可以看到ext2_fill_super主要工作為:

1.讀取磁盤上的超級(jí)塊;

2.填充并關(guān)聯(lián)vfs超級(jí)塊;

3.讀取塊組描述符;

4.讀取磁盤根inode并建立vfs 根inode;

5.創(chuàng)建根dentry關(guān)聯(lián)到根inode。

下面給出ext2_fill_super之后ext2相關(guān)圖解:

有了這些信息,雖然能夠獲得塊設(shè)備上的文件系統(tǒng)全貌,內(nèi)核也能通過(guò)已經(jīng)建立好的block_device等結(jié)構(gòu)訪問(wèn)塊設(shè)備,但是用戶進(jìn)程不能真正意義上訪問(wèn)到,用戶一般會(huì)通過(guò)open打開一個(gè)文件路徑來(lái)訪問(wèn)文件,但是現(xiàn)在并沒(méi)有關(guān)聯(lián)掛載目錄的路徑,需要將文件系統(tǒng)關(guān)聯(lián)到掛載點(diǎn),以至于路徑名查找的時(shí)候查找到掛載點(diǎn)后,在轉(zhuǎn)向文件系統(tǒng)的根目錄,而這需要通過(guò)do_new_mount_fc來(lái)去關(guān)聯(lián)并加入全局的文件系統(tǒng)樹中,下一篇我們將做詳細(xì)講解。

文章出處:【微信公眾號(hào):Linux閱碼場(chǎng)】

責(zé)任編輯:gt

聲明:本文內(nèi)容及配圖由入駐作者撰寫或者入駐合作網(wǎng)站授權(quán)轉(zhuǎn)載。文章觀點(diǎn)僅代表作者本人,不代表電子發(fā)燒友網(wǎng)立場(chǎng)。文章及其配圖僅供工程師學(xué)習(xí)之用,如有內(nèi)容侵權(quán)或者其他違規(guī)問(wèn)題,請(qǐng)聯(lián)系本站處理。 舉報(bào)投訴
  • 處理器
    +關(guān)注

    關(guān)注

    68

    文章

    20117

    瀏覽量

    244885
  • 接口
    +關(guān)注

    關(guān)注

    33

    文章

    9364

    瀏覽量

    155855
  • linxu
    +關(guān)注

    關(guān)注

    0

    文章

    7

    瀏覽量

    2736

原文標(biāo)題:深入理解Linux文件系統(tǒng)之文件系統(tǒng)掛載(上)

文章出處:【微信號(hào):LinuxDev,微信公眾號(hào):Linux閱碼場(chǎng)】歡迎添加關(guān)注!文章轉(zhuǎn)載請(qǐng)注明出處。

收藏 人收藏
加入交流群
微信小助手二維碼

掃碼添加小助手

加入工程師交流群

    評(píng)論

    相關(guān)推薦
    熱點(diǎn)推薦

    睿擎派文件系統(tǒng)指南:從開發(fā)到發(fā)布全流程實(shí)踐 | 技術(shù)解析

    發(fā)布階段的鏡像打包,為開發(fā)者提供了全面的支持。本文將詳細(xì)介紹睿擎平臺(tái)文件系統(tǒng)的綜合使用方法。一、睿擎平臺(tái)文件系統(tǒng)設(shè)計(jì)1.1睿擎平臺(tái)存儲(chǔ)布局概覽睿擎平臺(tái)采用了清晰的
    的頭像 發(fā)表于 11-05 18:13 ?3686次閱讀
    睿擎派<b class='flag-5'>文件系統(tǒng)</b>指南:從開發(fā)到發(fā)布全流程實(shí)踐 | 技術(shù)解析

    文件系統(tǒng)文件怎么循環(huán)覆蓋的寫入數(shù)據(jù)?

    請(qǐng)教一個(gè)文件系統(tǒng)數(shù)據(jù)寫入的問(wèn)題。 比如我新建一個(gè)文件,test.txt,寫入數(shù)據(jù)超過(guò)512KB后,就從頭開始寫,后面的數(shù)據(jù)不刪除,從頭開始覆蓋。 比如原來(lái)寫了1000條數(shù)據(jù),然后從頭開始循環(huán)覆蓋
    發(fā)表于 09-22 08:20

    掛載sramfs文件系統(tǒng)到外掛sdram ,掛載時(shí)返回錯(cuò)誤碼為-1,怎么解決?

    掛載sramfs文件系統(tǒng)到外掛sdram ,掛載時(shí)返回錯(cuò)誤碼為-1。求大神指點(diǎn)。謝謝各位大佬。
    發(fā)表于 09-16 06:41

    掛載elm文件系統(tǒng)到sd卡上時(shí)靈時(shí)不靈如何解決?

    使用野火開發(fā)板的gd32h759,將elm文件系統(tǒng)掛載到sd卡上,使用的是sdio接口,發(fā)現(xiàn)時(shí)靈時(shí)不靈,sd卡格式化幾次還是不行,請(qǐng)教一下各位大神,如何解決?
    發(fā)表于 09-12 06:18

    技術(shù)貼|【RK3588】ELF 2開發(fā)板如何添加exFAT和NTFS文件系統(tǒng)格式

    基于RK3588設(shè)計(jì)的ELF2開發(fā)板在搭載Desktop22.04系統(tǒng)時(shí),對(duì)TF卡的文件系統(tǒng)支持存在以下限制:不支持exFAT格式;支持NTFS格式,但需手動(dòng)掛載;針對(duì)上述兼容性問(wèn)題,本文將介紹
    的頭像 發(fā)表于 08-27 17:21 ?3070次閱讀
    技術(shù)貼|【RK3588】ELF 2開發(fā)板如何添加exFAT和NTFS<b class='flag-5'>文件系統(tǒng)</b>格式

    Linux三大主流文件系統(tǒng)解析

    還在為選擇哪個(gè)文件系統(tǒng)而糾結(jié)?作為一名摸爬滾打多年的運(yùn)維老鳥,我將用最接地氣的方式,帶你徹底搞懂 Linux 三大主流文件系統(tǒng)的奧秘。
    的頭像 發(fā)表于 08-05 17:37 ?945次閱讀

    飛凌嵌入式ElfBoard ELF 1板卡-文件系統(tǒng)簡(jiǎn)介

    9.1 文件系統(tǒng)概念文件系統(tǒng)通常提供目錄或文件夾用于記錄文件,在很多系統(tǒng)中目錄本身也是文件,在這
    發(fā)表于 06-19 17:22

    服務(wù)器數(shù)據(jù)恢復(fù)—ocfs2文件系統(tǒng)被格式化為Ext4文件系統(tǒng)的數(shù)據(jù)恢復(fù)案例

    服務(wù)器存儲(chǔ)數(shù)據(jù)恢復(fù)環(huán)境&故障: 人為誤操作將Ext4文件系統(tǒng)誤裝入一臺(tái)服務(wù)器存儲(chǔ)上的Ocfs2文件系統(tǒng)數(shù)據(jù)卷上,導(dǎo)致原Ocfs2文件系統(tǒng)被格式化為Ext4文件系統(tǒng)。
    的頭像 發(fā)表于 06-10 12:03 ?462次閱讀
    服務(wù)器數(shù)據(jù)恢復(fù)—ocfs2<b class='flag-5'>文件系統(tǒng)</b>被格式化為Ext4<b class='flag-5'>文件系統(tǒng)</b>的數(shù)據(jù)恢復(fù)案例

    單片機(jī)項(xiàng)目實(shí)例文件系統(tǒng)資料與SD卡資料

    單片機(jī)項(xiàng)目實(shí)例文件系統(tǒng)資料與SD卡資料,推薦下載!
    發(fā)表于 06-09 22:31

    如何正確選擇嵌入式文件系統(tǒng)

    Linux嵌入式系統(tǒng)中,文件系統(tǒng)和緩存機(jī)制常導(dǎo)致數(shù)據(jù)存儲(chǔ)穩(wěn)定性問(wèn)題。本文通過(guò)案例分析原因,對(duì)比不同文件系統(tǒng)特性,為開發(fā)者提供優(yōu)化建議,助力提升數(shù)據(jù)穩(wěn)定性和系統(tǒng)可靠性。前言基于Linux
    的頭像 發(fā)表于 03-17 11:35 ?765次閱讀
    如何正確選擇嵌入式<b class='flag-5'>文件系統(tǒng)</b>?

    NFS網(wǎng)絡(luò)文件系統(tǒng)深度解析

    NFS:Network File System 網(wǎng)絡(luò)文件系統(tǒng),基于內(nèi)核的文件系統(tǒng)。Sun 公司開發(fā),通過(guò)使用 NFS,用戶和程序可以像訪問(wèn)本地文件一樣訪問(wèn)遠(yuǎn)端系統(tǒng)上的
    的頭像 發(fā)表于 03-01 14:15 ?1078次閱讀

    防止根文件系統(tǒng)破壞,OverlayRootfs 讓你的設(shè)備更安全

    OverlayRootfs介紹OverlayRootfs是指利用OverlayFS技術(shù)創(chuàng)建的根文件系統(tǒng)(rootfilesystem)。OverlayFS是一種聯(lián)合文件系統(tǒng)(UnionFS),允許將
    的頭像 發(fā)表于 01-08 16:33 ?2304次閱讀
    防止根<b class='flag-5'>文件系統(tǒng)</b>破壞,OverlayRootfs 讓你的設(shè)備更安全

    關(guān)于更新openharmony文件系統(tǒng)時(shí)遇到的問(wèn)題

    用的固件,文件系統(tǒng),內(nèi)核是之前的,之前版本用起來(lái)沒(méi)問(wèn)題。但是 用下面三個(gè)的時(shí)候 固件可以正常燒錄,也按照文檔里面加載了環(huán)境變量,但是燒錄內(nèi)核和文件系統(tǒng)(都是U盤更新的)的時(shí)候出現(xiàn)了這樣的問(wèn)題
    發(fā)表于 12-30 11:55

    華納云:VFS在提升文件系統(tǒng)性能方面的具體實(shí)踐

    VFS(Virtual File System)通過(guò)提供統(tǒng)一的接口和抽象層,使得操作系統(tǒng)能夠以高效的方式管理和訪問(wèn)不同的文件系統(tǒng)。以下是一些VFS在提升文件系統(tǒng)性能方面的具體實(shí)踐示例: 統(tǒng)一的
    的頭像 發(fā)表于 11-27 15:59 ?1323次閱讀

    虛擬化數(shù)據(jù)恢復(fù)—UFS2文件系統(tǒng)數(shù)據(jù)恢復(fù)案例

    虛擬化數(shù)據(jù)恢復(fù)環(huán)境: SAN環(huán)境下通過(guò)iSCSI實(shí)現(xiàn)FreeNAS,F(xiàn)reeNAS采用的UFS2文件系統(tǒng)。物理存儲(chǔ)架構(gòu)在一臺(tái)服務(wù)器上,另外兩臺(tái)服務(wù)器上安裝ESXi虛擬化系統(tǒng)。整個(gè)存儲(chǔ)建立一個(gè)稀疏
    的頭像 發(fā)表于 11-11 11:02 ?899次閱讀