网站域名和空间费用,企业网站优化与推广,ip子域名查询,东莞网页制作设计培训文章目录 #x1f320;⽬录与⽂件名#x1f320;路径解析#x1f320;路径缓存#x1f320;挂载分区#x1f309; ⽂件系统总结 #x1f320;软硬连接#x1f309; 硬链接#x1f309; 软链接#x1f309; 软硬连接对⽐#x1f309;软硬连接的⽤途#xff1a; … 文章目录 ⽬录与⽂件名路径解析路径缓存挂载分区 ⽂件系统总结 软硬连接 硬链接 软链接 软硬连接对⽐软硬连接的⽤途 总结 ⽬录与⽂件名
问题
我们访问⽂件都是⽤的⽂件名没⽤过inode号啊⽬录是⽂件吗如何理解
答案
⽬录也是⽂件但是磁盘上没有⽬录的概念只有⽂件属性⽂件内容的概念。⽬录的属性不⽤多说内容保存的是⽂件名和Inode号的映射关系
readdir.c文件
#include stdio.h
#include string.h
#include stdlib.h
#include dirent.h
#include sys/types.h
#include unistd.h
int main(int argc, char *argv[])
{if (argc ! 2){fprintf(stderr, Usage: %s directory\n, argv[0]);exit(EXIT_FAILURE);}DIR *dir opendir(argv[1]); //系统调⽤⾃⾏查阅if (!dir){perror(opendir);exit(EXIT_FAILURE);}struct dirent *entry;while ((entry readdir(dir)) ! NULL){ //系统调⽤⾃⾏查阅// Skip the . and .. directory entriesif (strcmp(entry-d_name, .) 0 || strcmp(entry-d_name, ..) 0){continue;}printf(Filename: %s, Inode: %lu\n, entry-d_name, (unsigned long)entry-d_ino);}closedir(dir);return 0;
}所以访问文件必须打开当前目录根据文件名获得对应的inode号然后进行文件访问所以访问文件必须要知道当前工作目录本质是必须能打开当前工作目录文件查看目录文件的内容! 比如:要访问test.c就必须打开test(当前工作目录) ,然后才能获取test.c对应的inode进而对文件进行访问。
路径解析
问题打开当前⼯作⽬录⽂件查看当前⼯作⽬录⽂件的内容?当前⼯作⽬录不也是⽂件吗我们访问 当前⼯作⽬录不也是只知道当前⼯作⽬录的⽂件名吗要访问它不也得知道当前⼯作⽬录的inode 吗
答案1所以也要打开当前⼯作⽬录的上级⽬录额…上级⽬录不也是⽬录吗不还是上⾯的问题吗答案2所以类似递归需要把路径中所有的⽬录全部解析出⼝是/根⽬录。最终答案3⽽实际上任何⽂件都有路径访问⽬标⽂件⽐如: /home/whb/code/test/test/test.c都要从根⽬录开始依次打开每⼀个⽬录根据⽬录名依次访问每个⽬录下指定的⽬录直到访问 到test.c。这个过程叫做Linux路径解析。 注意 所以我们知道了访问⽂件必须要有⽬录⽂件名路径的原因根⽬录固定⽂件名inode号⽆需查找系统开机之后就必须知道 可是路径谁提供
你访问⽂件都是指令/⼯具访问本质是进程访问进程有CWD进程提供路径。你open⽂件提供了路径
可是最开始的路径从哪⾥来
所以Linux为什么要有根目录,根目录下为什么要有那么多缺省目录?你为什么要有家目录你自己可以新建目录?上面所有行为:本质就是在磁盘文件系统中新建目录文件。而你新建的任何文件都在你或者系统指定的目录下新建这不就是天然就有路径了嘛!系统用户共同构建Linux路径结构.
路径缓存 问题1Linux磁盘中存在真正的⽬录吗 答案不存在只有⽂件。只保存⽂件属性⽂件内容 问题2访问任何⽂件都要从/⽬录开始进⾏路径解析 答案原则上是但是这样太慢所以Linux会缓存历史路径结构 问题3Linux⽬录的概念怎么产⽣的 答案打开的⽂件是⽬录的话由OS⾃⼰在内存中进⾏路径维护 Linux中在内核中维护树状路径结构的内核结构体叫做struct dentry
struct dentry
{atomic_t d_count; /* protected by d_lock */unsigned int d_flags; /* per dentry lock */spinlock_t d_lock; /* Where the name belongs to - NULL is * negative *//** The next three fields are touched by __d_lookup. Place them here* so they all fit in a cache line.*/struct hlist_node d_hash; /* lookup hash list */struct dentry *d_parent; /*parent directory */struct qstr d_name;struct list_head d_lru; /* LRU list *//** d_child and d_rcu can share memory*/union{struct list_head d_child; /* child of parent list */struct rcu_head d_rcu;} d_u;struct list_head d_subdirs; /* our children */struct list_head d_alias; /* inode alias list */unsigned long d_time; /* used by d_revalidate */struct dentry_operations *d_op;struct super_block *d_sb; /* The root of the dentry tree */void *d_fsdata; /* fs-specific data */
#ifdef CONFIG_PROFILINGstruct dcookie_struct *d_cookie; /* cookie, if any */
#endifint d_mounted;unsigned char d_iname[DNAME_INLINE_LEN_MIN]; /* small names */
};注意
每个文件其实都要有对应的dentry结构包括普通文件。这样所有被打开的文件就可以在内存中形成整个树形结构整个树形节点也同时会隶属于LRU(Least Recently Used最近最少使用)结构中进行节点淘汰整个树形节点也同时会隶属于Hash方便快速查找更重要的是这个树形结构整体构成了Linux的路径缓存结构打开访问任何文件都在先在这棵树下根据路径进行查找找到就返回属性inode和内容没找到就从磁盘加载路径添加dentry结构缓存新路径 挂载分区
我们已经能够根据inode号在指定分区找⽂件了也已经能根据⽬录⽂件内容找指定的inode了在 指定的分区内我们可以为所欲为了。可是 问题inode不是不能跨分区吗Linux不是可以有多个分区吗我怎么知道我在哪⼀个分区
详细挂载分区可查看【linux学习指南】磁盘分区挂载到目录形成文件系统挂载点 ⽂件系统总结 软硬连接 硬链接
我们看到真正找到磁盘上⽂件的并不是⽂件名⽽是inode。其实在linux中可以让多个⽂件名对应 于同⼀个inode。
[rootlocalhost linux]# touch abc[rootlocalhost linux]# ln abc def[rootlocalhost linux]# ls -li abc def263466 abc263466 defabc和def的链接状态完全相同他们被称为指向⽂件的硬链接。内核记录了这个连接数inode 263466 的硬连接数为2。我们在删除⽂件时⼲了两件事情1.在⽬录中将对应的记录删除2.将硬连接数-1如果为0则将对应的磁盘释放。 软链接
硬链接是通过inode引⽤另外⼀个⽂件软链接是通过名字引⽤另外⼀个⽂件但实际上新的⽂件被引⽤的⽂件的inode不同应⽤常⻅上可以想象成⼀个快捷⽅式。在shell中的做法
[rootlocalhost linux]# ln -s abc.s abc[rootlocalhost linux]# ls -li263563 -rw-r--r--. 2 root root 0 9⽉ 15 17:45 abc261678 lrwxrwxrwx. 1 root root 3 9⽉ 15 17:53 abc.s - abc263563 -rw-r--r--. 2 root root 0 9⽉ 15 17:45 defacm 下⾯解释⼀下⽂件的三个时间
Access最后访问时间Modify⽂件内容最后修改时间Change属性最后修改时间 软硬连接对⽐
软连接是独⽴⽂件硬链接只是⽂件名和⽬标⽂件inode的映射关系
软硬连接的⽤途
硬链接 .和… 就是硬链接⽂件备份
软连接
类似快捷⽅式 总结