Linux 文件系统重要知识点总结

*---记录文件系统学习基本知识点---------------------------------------------------------------------------------------

1.一个文件的存储主要分为两部分
    元数据区:文件属性(存储位置、文件长度等)、时间戳、读写权限、所属组、所有者、链接数
    纯数据区:文件真正的数据,基本单位为block

2.重要概念:inode,索引节点,用来存储文件信息
    linux中,
    用stat  file.name ,可以查看inode信息。
    用df -i ,查看某个分区的inode统计信息
    用df -h , 查看某个分区的大小统计,M、G等单位
    用df , 查看某个分区block数

    索引节点表:

    

3.存储映射方式:

4.重要概念:super block,超级块,

  *文件系统挂载时,super block 记录的信息会加载到内存常驻:

    ..记录整个文件系统信息

    ..单个inode、block的大小

    ..inode 使用情况,已使用/未使用

    ..block 使用情况,已使用/未使用

    ..文件系统挂载情况

    ..文件系统挂载时间、最后依次写入数据、检验磁盘的时间

5.文件系统构建历程:

6.目录和目录项

.目录:是一个文件,有自己的inode,在inode中将该文件类型标记为“目录”;存储在data block中;

            目录本质上是一个表格:由若干目录项组成

                 一个目录下面可以有多个文件:文件名和文件对应的inode

                 一个目录文件有多个子目录:目录名和其对应的inode

                 多个子目录构成树状的文件系统结构

.目录项:一个目录项由文件名和inode编号组成,根据inode编号可以找到inode table中真正的inode节点

               目录项存储在data block中

. 如何查找一个文件?

在inode table中找到 "根目录" 对应的inode -> 查询其数据块指针指向的data block -> 数据中存储着"/bin" 目录对应inode在inode表中的位置 -> 找到该inode -> 查询其数据块指针指向的data block  -> 数据中存储着"cp" 文件对应inode在inode表中的位置 -> 找到该inode -> 查询其数据块指针指向的data block 即为cp文件。如下图所示:

 

 

7.文件系统挂载

sudo mount --mind  [source]  [target]

sudo umount [dir] 

*挂载的文件路径,会在dentry中标记为 DCACHE_MOUNTED,路径解析时对该目录项屏蔽。

 

8.文件系统类型

(1)按照系统区分:----

  Linux/android

    .ext/ext2/ext3/ext4、XFS、brtfs、iso9660、JFFS/JFFS2、

    .minix、proc、NFS、SMB、swap

    .CRAMFS、yaffs、yaffs2、UBIFS

 windows

    .FAT16、FAT32

    .NTFS

 MAC OS X

    . HFS

(2)按照存储介质区分:----

 磁盘\flash

    .ext2/ext3/ext4

    .JFFS2、UBIFS、CRAMFS

 内存

    .ramdisk: ramfs、tmpfs

 其他特殊文件系统

    .procf、sysfs

    .NFS: networkfile system

    .dives

9.虚拟文件系统VFS(visual file system)

    .内核和存储设备间的抽象层

    .向上:统一封装不同设备、文件系统的读写接口:系统调用API

    .向下:新的设备、文件系统 添加到linux内核,实现VFS的接口即可

    .Linux 内核支持60+不同类型的文件系统

    *系统中VFS位置:

 

10.VFS的对象类型

     .对象属性

             super_block: 已经安装的具体文件系统

             inode:代表一个具体的文件

             dentry:目录项,目录项路径的组成部分

             file:进程打开的文件

     .对象方法

             super_operations: alloc_inode、write_inode、destroy_inode

             inode_operations: link、mknod、mkdir、rename、create

             dentry_operations: d_hash、d_compare、d_delete、d_release

             file_operations: read、write、open、close、fsync、mmap

 

11. 程序中如何操作文件

      * Linux进程使用文件描述符(file descriptors -> "fd")操作文件

        ---------

        int fd = open("/file_path/file_name", O_WRONLY, 0666);

        read (fd, buf, 100)

        ---------

       * 关注结构体:

                struct file_struct{                                             /* 用来表示一个进程打开的文件列表 */

                          xxx

                          ...

                          xxx

                          struct  file  _rcu  *fd_array[NR_OPEN_DEFAULT] 

                 };

                ===> 

                struct  file {                                                       /* 描述内核中打开的文件 */

                            union {

                                        struct llist_node    fu_llist;

                                        struct rcu_head     fu_rcuhead;

                             }  f_u;                                                    /* 内核中打开的所有文件构成一个系统级的全局双链表 */

                           ....

                            struct inode                          *f_inode;  /* 对应文件inode节点 */

                            const struct file_operations  *f_op;       /* 该文件的读写方法 */

                            ...

                            fmode_t                                  f_mode;  /* 打开模式 */

                            ...

                            loff_t                                       f_pos;      /* 文件当前位置 */

                            ...

                }

        * 进程中打开文件过程举例(注意:此处仅为举例,fd=2 为标准错误输出)

 

12. C语言文件指针FILE*

    注意对比:   

    int fd=open();                                                            /* 文件描述符 */

    FILE  *fp = fopen("file_path/file_name.txt", "w+");    /* 文件指针 */    

 

    *文件指针是对文件描述符的封装,包含:

       。文件描述符:fd

       。文件位置:f_fops

       。文件标志:f_mod

       。缓冲区

 

    *标准输入输出流

文件描述符用途POSIX名称stdio流
0标准输入STDIN_FILENOstdin
1标准输出STDOUT_FILENOstdout
2标准错误STDERR_FILENOstderr

   *打印代码实现差异比较,两次均在终端打印 "hello"

  1 #include <stdio.h>                                                                                        
  2                                                                                 
  3 int main(void)                                                                  
  4 {                                                                               
  5     printf("hello\n");                                                                                                         
  6     fprintf(stdout,"hello\n");                                                  
  7     return 0;                                                                   
  8 }

 

13. 硬链接和软链接

    *Linux系统和window系统一样,有类似“快捷方式”的实现。其基本实现原理如下:

      *硬链接 :(1)和文件有相同的 inode 和 data block

                      (2)创建方式: ln  test.c  test-hardlink.c

                      (3)只能对存在文件创建硬链接;不能对目录创建硬链接;创建硬链接不能跨越文件系统分区;

      *软链接:(1)是一个普通的文件,文件内容为:指向文件的路径名;

                     (2)有自己的inode编号和data block、文件权限和属性等;

                     (3)删除软链接不会影响到其指向的文件本身。

                     (4)创建方式: ln  -s  test.c  test-softlink.c

                     (5)可以对不存在的文件或目录创建软链接;可以对目录创建软链接;可以跨文件系统分区创建软链接

                       

 

 

14. 文件系统相关的常见命令

    。df -h                                                          统计磁盘使用率

    。du                                                             统计目录

    。find . -name "*.c"  | wc -l                           统计当前目录下c文件个数

    。ls -lR | grep "^-" | wc -l                              统计一个项目的总目录个数 

    。find . -name "*.c" | xargs cat | wc -l          统计一个项目的c代码总行数

 

***---------------------------------------------------------------------完

 

 

 

 

 

 

 

 

 

 

 

 

  • 1
    点赞
  • 2
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值