VFS,虛擬文件系統,為用戶提供了文件和文件系統相關的接口。
這些接口可以跨越各種文件系統和不同介質執行。
VFS提供了一個通用文件系統模型,該模型囊括了任何文件系統的常用功能集和行為。
該模型偏重於Unix風格的文件系統。
如下圖,下圖描述了VFS相關數據結構的關系
Unix使用了4個和文件系統相關的傳統概念:文件,目錄項,索引節點,安裝點(mount point)
簡單的面向字節流的抽象
文件通過目錄組織起來,目錄中的每一個部分都是一個目錄條目, /home/wolfman/butter , / , home, wolfman , butter 都是目錄條目,統稱為目錄項
Unix文件系統,將文件的相關信息和文件本身區分開來。文件控制信息,如權限,擁有者,大小,創建時間等”元數據”,被存儲在一個單獨的數據結構中,該結構被稱為索引節點inode
linux中的磁盤文件系統的入口目錄,類似於windows中的用來訪問不同分區的C:、D:、E:等盤符。[百度百科詞條]
文件系統的信息存儲在超級塊中,集單獨文件信息和文件系統信息於一身。
對於FAT,NTFS這種,雖然也可以在Linux上工作,但必須進行封裝。比如:一個文件系統不支持索引節點,也必須在內存中裝配索引節點結構體,就像它本身包含一樣。
超級塊對象
代表一個具體的已安裝文件系統,由super_block結構體表示,定義於索引節點對象
代表一個具體文件,包含了內核在操作文件或目錄時需要的全部信息,由inode結構體表示,定義於
struct file_system_type {
const char *name;
int fs_flags;
#define FS_REQUIRES_DEV 1
#define FS_BINARY_MOUNTDATA 2
#define FS_HAS_SUBTYPE 4
#define FS_USERNS_MOUNT 8 //Can be mounted by userns root
#define FS_USERNS_DEV_MOUNT 16 // A userns mount does not imply MNT_NODEV
#define FS_RENAME_DOES_D_MOVE 32768 /* FS will handle d_move() during rename() internally. */
struct dentry *(*mount) (struct file_system_type *, int,const char *, void *);
void (*kill_sb) (struct super_block *);
struct module *owner;
struct file_system_type * next;
struct hlist_head fs_supers;
struct lock_class_key s_lock_key;
struct lock_class_key s_umount_key;
struct lock_class_key s_vfs_rename_key;
struct lock_class_key s_writers_key[SB_FREEZE_LEVELS];
struct lock_class_key i_lock_key;
struct lock_class_key i_mutex_key;
struct lock_class_key i_mutex_dir_key;
};
vfsmont
用來描述一個安裝文件系統的實例,定義於 文件系統被實際安裝時,一個vfsmount結構在安裝點創建,代表文件系統的實例,換句話說,代表安裝點。
struct vfsmount {
struct dentry *mnt_root;/* root of the mounted tree */
struct super_block *mnt_sb;/* pointer to superblock */
int mnt_flags;
};
和進程相關的數據結構
file_struct
定義於 與單個進程相關的信息都包含在內
fs_struct
定義於 包含文件系統和進程相關信息
namespace
定義於
使得每一個進程在系統中看到唯一的安裝文件系統,不僅是唯一的根目錄,而是唯一的文件系統層次結構
Linux存儲棧