linux中inode和dentry的结构在文件系统的存放位置

2025-03-13 03:56:11
推荐回答(1个)
回答1:

VFSLinux非核概念linux部操作都要用VFS相关功能使用者角度VFS进行简单说明使用者需要知道Linux哪些文件操作函数需要VFS结构比较清晰解才能更使用例hard link 与symbolic没VFS结构相解搞清楚何使用
本文首先建立简单目录模型介绍该目录VFS结构终总结何使用各文件操作函数

本着简单使用原则主要使用析加猜测鉴于本水平限文免些错误欢迎各位读者理性阅读胆批判您批判我进步力

目录
1 目录模型
2 VFS概念
3 VFS构建
4 VFS结构
5 Dentry cache
6 denty定位文件
7 dentry定位文件
8 Symbolic link
9 hard link
10 进程文件管理
11 open程
12 open与dup
13 Fork打文件影响
14 文件操作函数解析

1 目录模型
面目录例

dir第级目录dirsubdir0与subdir1两目录与文件file0subdir0两文件file1与file0subdir1文件file3

2 VFS概念
VFSLinux虚拟文件文件系统称虚拟文件系统交换层(Virtual Filesystem Switch)应用程序员提供层抽象屏蔽底层各种文件系统差异图所示:

同文件系统Ext2/3、XFS、FAT32等具同结构假用户调用open等文件IO函数打文件具体实现非同屏蔽种差异Linux引入VFS概念相于Linux自建新贮存内存文件系统所其文件系统都需要先转换VFS结构才能用户所调用

3 VFS构建
所谓VFS构建加载实际文件系统程mount调用程图所示mountext2文件系统例
经简化Ext2磁盘结构用于说明用构建VFS基本程
mount命令般形式:mount /dev/sdb1 /mnt/mysdb1
/dev/sdb1设备名/mnt/mysdb1挂载点

VFS文件系统基本结构dentry结构体与inode结构体
Dentry代表文件目录点目录文件
Inode代表磁盘文件与磁盘文件应
Inode与dentry定应inode能应dentry项(hard link)
Mountlinux首先找磁盘区super block通解析磁盘inode table与file data构建自dentry列表与indoe列表
需要注意VFS实际按照Ext式进行构建所两者非相似(毕竟ExtLinux原文件系统)
比inode节点Ext与VFS都文件管理结构称inode实际Extinode节点磁盘;VFSinode节点内存Ext-inode些员变量其实没用引用计数等保留目与vfs-node保持致用ext-inode节点构造vfs-inode节点需要赋值需内存拷贝即
非EXT格式磁盘没幸运所mount非EXT磁盘慢些

4 VFS结构
构建VFS文件系统步第节提目录模型映射VFS结构体系
文提VFS主要由denty与inode构Dentry用于维护VFS目录结构每dentry项代表着我用ls看项(每目录每文件都应着dentry项)Inode文件节点与文件应Linux目录种文件所dentry应inode节点
图第节目录模型VFS结构

5 Dentry cache
每文件都要应inode节点与至少dentry项假设我100G硬盘面写满空文件需要少内存才能重建VFS呢
文件少要占用1block(般4K)假dentry与inode需要100byte则dentry与inode需要占用1/40空间1G硬盘则需要2.5G空间近都始换装1T硬盘需要 25G内存才能放inode与dentry相信没几台电脑承受
避免资源浪费VFS采用dentry cache设计
用户用ls命令查看某目录或用open命令打文件VFS用每目录项与文件建立dentry项与inode即按需创建维护LRU(Least Recently Used)列表Linux认VFS占用太资源VFS释放掉间没使用dentry项与inode项
需要注意:建立于释放内存占用角度看Linux角度看dentry与inodeVFS固东西所同VFS否dentry与inode读内存于Ext2/3文件系统构建dentry与inode程非简单于其文件系统则慢
解Dentry cache概念才能明白何面两种定位文件式

6 denty定位文件
面提Denty CacheVFS并能保证随都dentry项与inode项用面dentry项与inode项定位式
简化问题假设已经找dirdentry项(找dentry程面讲解)
首先通dir应dentry0找inode0节点inode节点读取目录信息其包含该目录包含级目录与文件文件列表包括name与inode号实际用ls命令查看些信息ls -i显示文件inode号

> ls -i
975248 subdir0 975247 subdir1 975251 file0

根据通根据subdir0应inode号重建inode2并通文件数据(目录文件)与inode2重建subdir0dentry节点:dentry1

> ls -i
975311 file1 975312 file2

接着根据file1应inode号重建inode4并通文件数据与inode4重建file1dentry节点
通inode4节点访问文件

注意:文件应inode号确定inode结构体需要重新构造

7 dentry定位文件
旦Dentry cache建立dentry项访问便
Dentry关键变量d_subdirs保存级目录列表用于快速定位文件
首先代表dir目录dentry0d_subdirs查找名字subdir0dentry项找dentry1
dentry1查找名字file1dentry项找file1应dentry项
通file1应dentry项获file1应inode4
与dentry项比较dentry项操作精简许

8 Symbolic link
建立symboliclink命令 :ln -s 源文件目标文件
Linuxsymbolic link类似于Windows系统快捷式图所示symlink1指向file1symbolic linksymlink1本身文件自独立inode节点symlink实际存储源文件相路径
部文件操作直接symbolic link指向目标进行操作比open(symlikn1)实际打file3

file3发事情呢open函数照按照symlink1文件路径打文件file3存报错说文件存

9 hard link
Linux除symbolic linkhard link概念
Hard link建立实际dentry项拷贝都指向同inode节点我使用write改写file1内容hardlink1内容改写所实际同文件
图所示hardlink1file1hard link都指向同inode1节点Inode1计数器用于记录几dentry项指向删除任意dentry项都导致inode1删除所指向inode1dentry都删除inode1才删除
实际
某种意义讲所dentry项都hard link

10 进程文件管理
进程控制块task_struct两变量与文件关:fs与files
files存储着root与pwd两指向dentry项指针用户定路径绝路径通root进行定位;相路径通pwd进行定位(进程root定文件系统根目录比ftp进程根目录文件系统根目录才能保证用户能访问ftp目录内容)
fsfile object列表其每节点应着打文件进程定位文件构造file object并通f_inode 关联inode节点文件关闭(close)进程释放应应file objectFile objectf_mode打选择权限f_pos读写位置打同文件每都构造新file object每file object独立f_mode与f_pos
用inode标识比:
linuxserver:/etc/zypp # ls -al
total 56
drwxr-xr-x 5 root root 4096 Apr 2 04:49 .
drwxr-xr-x 104 root root 12288 Apr 3 08:45 ..
drwxr-xr-x 2 root root 4096 Apr 2 04:49 credentials.d
drwxr-xr-x 2 root root 4096 Feb 2 15:55 repos.d
drwxr-xr-x 2 root root 4096 May 9 2011 services.d
-rw-r--r-- 1 root root 360 Apr 23 2011 systemCheck
-rw-r--r-- 1 root root 13315 Apr 23 2011 zypp.conf
-rw-r--r-- 1 root root 4121 May 9 2011 zypper.conf
第二列inode号