*---记录文件系统学习基本知识点---------------------------------------------------------------------------------------
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_FILENO | stdin |
1 | 标准输出 | STDOUT_FILENO | stdout |
2 | 标准错误 | STDERR_FILENO | stderr |
*打印代码实现差异比较,两次均在终端打印 "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代码总行数
***---------------------------------------------------------------------完