• [文件系统]文件系统学习笔记(一)---基本概念以及inode


    1,文件系统基本概念

    文件系统是一种用来存储和组织计算机文件、目录及其包含的数据的方法,它使文件、目录以及数据的查找和访问得到简化。

    2,硬链接和软链接的区别

    硬链接和软链接的区别

    –        符号链接

    –        ln –s file1 file2

    •       目录项,内容为指向文件名的指针,并不存在其他数据。目标文件删除时,符号链接仍然继续保持。使用了一个独立的inode。Inode的数据段包含了一个字符串,给出了链接目录的路径。(相当于windows中的快捷键)

    –        硬链接

    –        ln file1 file2

    •       与原文件共用一个inode,增加引用计数。新建或者删除硬链接,则相应的增加或减小该引用计数。为0时,删除源文件;

    •       dentry还是不一样,inode是一样

    3,struct inode结构体

    这里虚拟文件系统里的inode节点是指内存里的inode节点,包含了一些实际硬盘上的inode节点所没有的信息。

    [cpp] view plaincopy在CODE上查看代码片派生到我的代码片
     
    1. <pre name="code" class="cpp"><fs.h>  
    2. struct inode {  
    3.     struct hlist_node i_hash;  
    4.     struct list_head i_list;  
    5.     struct list_head i_sb_list;  
    6.     struct list_head i_dentry;  
    7.     unsigned long i_ino;    //每个inode的唯一编号  
    8.     atomic_t i_count;<span style="white-space:pre">   </span>//记录使用该inode的进程的个数  
    9.     unsigned int i_nlink;<span style="white-space:pre">   </span>//使用该inode的硬连接的个数  
    10.     uid_t i_uid;<span style="white-space:pre">        </span>//文件的user  
    11.     gid_t i_gid;<span style="white-space:pre">        </span>//文件的group  
    12.     dev_t i_rdev;<span style="white-space:pre">       </span>//当该inode表示设备文件的时候表示与哪个设备文件通信,只是一个数字  
    13.     unsigned long i_version;  
    14.     loff_t i_size;   <span style="white-space:pre">       </span>//文件的长度,以字节大小表示  
    15.     struct timespec i_atime;     //文件最后访问时间  
    16.     struct timespec i_mtime;<span style="white-space:pre">    </span>//文件最后修改时间  
    17.     struct timespec i_ctime;         //最后修改inode结构本身的时间  
    18.     unsigned int i_blkbits;  
    19.     blkcnt_t i_blocks;<span style="white-space:pre">      </span>//文件按块计算的长度  
    20.     umode_t i_mode;<span style="white-space:pre">         </span>//文件的权限  
    21.     struct inode_operations *i_op;<span style="white-space:pre">  </span>//inode操作,创建连接,文件重命名,在目录下创建文件,删除文件  
    22.     const struct file_operations *i_fop; /* former ->i_op->default_file_ops */   //文件内容的操作,设置文件位置指针等等  
    23.     struct super_block *i_sb;  
    24.     struct address_space *i_mapping;  
    25.     struct address_space i_data;  
    26.     struct dquot *i_dquot[MAXQUOTAS];  
    27.     struct list_head i_devices;  
    28.     union {  
    29.     struct pipe_inode_info *i_pipe;  //管道  
    30.     struct block_device *i_bdev;<span style="white-space:pre">    </span>//块设备  
    31.     struct cdev *i_cdev;<span style="white-space:pre">        </span>//字符设备  
    32.     };  
    33.     int i_cindex;  
    34.     __u32 i_generation;  
    35.     unsigned long i_state;  
    36.     unsigned long dirtied_when; /* jiffies of first dirtying */  
    37.     unsigned int i_flags;  
    38.     atomic_t i_writecount;  
    39.     void *i_security;  
    40. };  



    
    

    i_mapping成员指向该文件所在的内存空间,要访问该文件的实际内容则通过该成员访问,address_space用于管理文件映射到内存的页面。

    inode结构中的i_mapping成员的目的是缓存文件的内容,对文件的读写操作首先在i_mapping包含的缓存里寻找文件的内容,如果有缓存,对文件读写操作可以直接从缓存中获取,而不用再去物理硬盘读取,写操作也是首先写到缓存,然后在合适时机由缓存写到磁盘。

    每个inode有一个i_list成员,用于将inode存储在一个链表中,根据inode状态,它有三种主要情况
    (1)inode在内存中,未关联到任何文件,处于非活动状态
    (2)inode在内存中,正在由一个或者多个进程使用,通常表示一个文件,此时i_count和i_nlink都大于0。
    文件内容和底层元数据都于底层磁盘上的信息相同,
    (3)inode处于活动使用状态,其数据内容已经改变,与存储介质上的内容不一样,这种状态的inode节点为脏的。


    superblock是用于管理该文件系统中所有的inode相关信息的,比如增加inode,每个inode的起始地址等等。

    如果一个分区大小为1GB,每个block为4KB,一个inode为128B,并假设平均每个文件占用2个block。那么inode的数量为1GB/(8KB+128B)=129055.5,即129055。那么inode table的大小为129055*128B=15.75MB。所以按照这样的规划,如果一个1GB的磁盘,那么格式化后,就已经有15.75MB被使用了。

    3,查看文件inode信息的命令

    stat命令

  • 相关阅读:
    CRM客户关系管理系统(十)
    CRM客户关系管理系统(九)
    CRM客户关系管理系统(八)
    CRM客户关系管理系统(七)
    CRM客户关系管理系统(六)
    5.使用Redis+Flask维护动态Cookies池
    1.数据结构--数组
    php接口安全设计浅谈
    python3 使用selenium +webdriver打开chrome失败,报错:FileNotFoundError: [Errno 2] No such file or directory: 'chromedriver': 'chromedriver'
    4.使用Redis+Flask维护动态代理池
  • 原文地址:https://www.cnblogs.com/zhiliao112/p/4067833.html
Copyright © 2020-2023  润新知