自拍偷在线精品自拍偷,亚洲欧美中文日韩v在线观看不卡

圖解Linux虛擬文件系統(VFS)之關系篇

云計算 虛擬化
VFS的設計目標是將不同類型的文件系統抽象為一個統一的接口,使得用戶和應用程序無需關心底層文件系統的具體實現細節(jié)。通過VFS用戶可以使用相同的系統調用(如open、read、write等)來訪問不同類型的文件系統,包括本地文件系統(如ext4、XFS等)、網絡文件系統(如NFS、CIFS等)以及虛擬文件系統(如procfs、sysfs等)。

大家好,今天和大家探討一下Linux虛擬文件系統,虛擬文件系統是我一直想要去聊的一個知識點,如果你想從事Linux開發(fā)相關的工作,一定要了解虛擬文件系統。

1.什么是虛擬文件系統?

Linux虛擬文件系統(Virtual File System,VFS)是Linux操作系統中的一個重要組成部分,它提供了一個統一的接口,使得用戶和應用程序可以通過相同的方式訪問不同類型的文件系統。

圖片圖片

VFS的設計目標是將不同類型的文件系統抽象為一個統一的接口,使得用戶和應用程序無需關心底層文件系統的具體實現細節(jié)。通過VFS用戶可以使用相同的系統調用(如open、read、write等)來訪問不同類型的文件系統,包括本地文件系統(如ext4、XFS等)、網絡文件系統(如NFS、CIFS等)以及虛擬文件系統(如procfs、sysfs等)。

VFS由以下幾個主要組件組成:

  • 虛擬文件系統接口:VFS定義了一組通用的文件系統操作接口。
  • 超級塊(super_block):每個文件系統都有一個超級塊,它包含了文件系統的元數據信息,如文件系統類型、塊大小、inode表等,超級塊提供了對文件系統的整體描述和管理。
  • 目錄項(dentry):dentry是目錄項的縮寫,用于表示文件系統中的目錄和文件,dentry包含了目錄和文件對應的inode指針,通過它可以快速定位到目錄下的文件或子目錄。
  • 文件節(jié)點(inode):inode是文件系統中的一個數據結構,用于存儲文件或目錄的元數據信息,如文件大小、權限、所有者等,每個文件或目錄都對應一個唯一的inode。
  • 文件對象(file):file是表示打開文件的數據結構,它包含了對應的inode指針、當前讀寫位置等信息,通過file可以進行文件的讀寫操作。

2.Linux系統文件樹

對于一個普通的Linux用戶或者運維人員,Linux系統文件樹通常的樣子如下圖,以根文件系統根目錄為起點,通過根目錄遍歷整個文件樹。

圖片圖片

而在系統開發(fā)人員眼中,Linux系統文件樹則變成這樣一個結構,每個文件和目錄都對應一個dentry結構體。

圖片圖片

dentry到底是什么?

dentry結構體的主要作用是提供文件系統層次結構的表示,它們通過形成一個樹狀結構來組織目錄和文件,每個dentry都有一個唯一的路徑名,可以通過遍歷dentry樹來找到特定文件或目錄。

struct dentry結構體定義:

struct dentry {
    struct dentry *d_parent;
    struct qstr d_name;
    struct inode *d_inode;
   
    const struct dentry_operations *d_op;
    struct super_block *d_sb; 
    struct list_head d_child;
    struct list_head d_subdirs;
    ....
};

struct dentry結構體通過d_parent,d_child,d_subdirs等成員將文件系統組成一顆文件樹,要了解Linux文件系統,我們得學會運用dentry。

小節(jié):dentry是VFS重要的組成部分,要理解VFS先從dentry開始。

3.文件系統注冊

通過前面的學習,我們了解到dentry結構的重要性,接下來圍繞dentry結構體來解析文件VFS各組件之間的關系,我們先來看一下整體架構圖:

圖片圖片

Linux文件系統對應一個file_system_type結構體對象,file_system_type結構體定義如下:

struct file_system_type {
    const char *name;
    int fs_flags;
    int (*init_fs_context)(struct fs_context *);
    const struct fs_parameter_spec *parameters;
    struct dentry *(*mount) (struct file_system_type *, int,
                 const char *, void *);
    void (*kill_sb) (struct super_block *);
    ......
};

ramfs文件系統定義如下,name表示文件系統類型,當ramfs文件系統需要實例化,需要通過name查找全局文件系統鏈表頭找到對應的已注冊文件系統,再通過已注冊文件系統創(chuàng)建超級塊(super block)。

static struct file_system_type ramfs_fs_type = {
      .name = "ramfs",
      .init_fs_context = ramfs_init_fs_context,
      .parameters = ramfs_fs_parameters,
      .kill_sb = ramfs_kill_sb,
      .fs_flags = FS_USERNS_MOUNT,
};

定義好文件系統后,通過register_filesystem函數將文件系統注冊至Linux系統,注冊成功的文件系統會插入全局文件系統鏈表,已注冊的文件系統能夠用來創(chuàng)建超級塊(super block)。

通過cat /proc/filesystems查看系統所有已注冊文件系統

圖片圖片

4.文件系統掛載

文件系統掛載就是新文件系統生成一個掛載實例(struct mount),讓新掛載實例和父文件系統的掛載實例建立父子關系。

一個新的掛載實例包括幾個重要部分:

  • 超級塊(super_block)

超級塊用來指示新的文件系統對應的設備。

  • 父掛載實例(mount)

父掛載實例表示掛載點所處的文件系統掛載實例。

  • 掛載點(mountpoint)

掛載點是新文件系統和父文件系統之間連接的紐帶。

  • 文件系統根目錄(dentry)

每個文件系統都有一個根目錄,當索引一個文件路徑進入到一個新的文件系統后,會從新的文件系統根目錄開始索引。

4.1 索引掛載點

索引掛載點的目的是為了獲取掛載點的struct path記錄信息,掛載點索引的過程就是struct path記錄信息不斷被替換的過程。

圖片圖片

以掛載點/mnt/test/dir為例來講解:

  1. 索引/目錄,獲取/目錄的path記錄信息。
  2. 索引mnt目錄,獲取mnt目錄的path記錄信息,并覆蓋/目錄的path記錄信息。
  3. 索引test目錄,獲取test目錄的path記錄信息,并覆蓋mnt目錄的path記錄信息。
  4. 索引dir目錄,獲取dir目錄的path記錄信息,并覆蓋test目錄的path記錄信息。
  5. 最終獲取到掛載點dir的struct path記錄信息。

struct path結構體定義如下:

struct path {
      struct vfsmount *mnt;
      struct dentry *dentry;
};

mnt:記錄掛載點所在文件系統的掛載實例。

dentry:掛載點目錄dentry。

4.2 創(chuàng)建新文件系統掛載實例

  • 創(chuàng)建超級塊

要創(chuàng)建超級塊首先要知道文件系統類型,mount命令通過-t參數指定文件系統類型,通過mount命令傳入的文件系統類型,可以遍歷全局文件系統鏈表找到已注冊的文件系統,通過已注冊的文件系統創(chuàng)建超級塊。

  • 創(chuàng)建新文件系統掛載實例

創(chuàng)建超級塊后,通過超級塊的信息創(chuàng)建新文件系統掛載實例。

  • 創(chuàng)建掛載點

通過掛載點dentry創(chuàng)建一個掛載點。

4.3 新舊掛載實例對接

通過前面的過程,我們已經具備文件系統掛載三要素:

  • 新文件系統掛載實例。
  • 父文件系統掛載實例。
  • 掛載點。

通過掛載三要素,我們就能完成新舊掛載實例對接,完成對接后,新文件系統掛載實例的mnt_parent指向父掛載實例,整個掛載過程就已經完成。

新文件系統掛載成功后,Linux系統文件樹將新文件系統嫁接進來,如下圖:

圖片圖片


此時我們想要操作新文件系統中的文件,只需要根據路徑名層層索引獲取文件path信息,path信息記錄dentry信息,dentry綁定了inode對象。

最終獲取到inode文件節(jié)點就能操作文件了。

責任編輯:武曉燕 來源: 物聯網心球
相關推薦

2020-07-22 14:53:06

Linux系統虛擬文件

2025-03-28 09:19:11

2018-08-24 10:10:25

Linux文件系統技術

2019-09-20 10:04:45

Linux系統虛擬文件

2022-01-14 08:39:47

鴻蒙HarmonyOS應用

2019-05-22 09:00:16

Linux虛擬文件系統

2019-05-29 16:33:32

Linux虛擬系統

2023-12-06 09:32:35

Linux系統

2009-07-21 10:49:26

ASP.NET虛擬文件

2021-04-12 05:44:44

Linux文件系統

2022-04-21 14:09:17

lsofLinux虛擬文件

2020-10-12 17:40:44

lsofLinux虛擬文件

2021-01-28 11:37:51

虛擬文件

2010-03-02 14:21:30

Linux操作系統

2019-06-14 14:58:58

虛擬文件系統Linux

2021-08-24 10:57:24

Linux文件系統內存

2017-02-06 16:18:57

微軟GitGVFS

2010-01-21 09:15:05

Linux嵌入式文件系

2024-08-28 12:13:35

2021-05-31 07:50:59

Linux文件系統
點贊
收藏

51CTO技術棧公眾號