Linux文件系统简介
目录
概念
一切皆文件
Linux文件目录
常见的Linux文件系统类型
读取文件流程示例
概念
Linux文件系统指的是Linux操作系统用于组织和管理硬盘上文件的方法和数据结构。
一切皆文件
在Linux中,几乎所有资源(如硬件设备、进程间通信通道、网络连接等)都被抽象为文件或文件描述符。这种设计使得我们可以使用统一的接口(如open、read、write、close等)来操作各种不同的资源。
文件:在Linux的抽象中,文件是一种资源的抽象。每个文件都有一个对应的inode结构或类似的内核数据结构(如设备、管道等)来描述它。
文件描述符:当进程打开一个文件时,内核会返回一个文件描述符,它是一个非负整数,是进程级文件描述表的一个索引。每个文件描述符对应一个打开的文件,内核会为每个打开的文件维护一个文件描述符表,通过这个表可以找到对应的文件对象(file结构体)。
比如:当你打开一个文件(比如 /home/test.txt)时,内核会创建一个文件对象(代表打开的文件),然后返回一个文件描述符(比如3)给进程。之后,进程就可以通过文件描述符3来读写这个文件。
文件主要包括:
①普通文件:文本、图片、程序;
②目录:包含其他文件的文件,内容是文件名和对应inode编号的映射表,详解见硬链接和软链接;
③设备文件:硬盘是/dev/sda、键盘是/dev/input等,它们有对应的设备驱动,当对设备文件进行读写时,内核会调用相应的驱动函数;
④进程和内核信息:在/proc目录下,将进程的信息以文件的形式暴露给用户空间,在/sys目录下,将内核信息以文件的形式暴露给用户空间;
⑤网络套接字:是网络通信的端点,它是操作系统提供给应用程序的一个编程接口,允许不同计算机上的进程通过网络进行数据交换;
⑥管道:创建的管道本质是一块内存缓冲区,对于Shell来说就是两个文件描述符。
Linux文件目录
| 目录路径 | 用途说明 |
| / | 根目录,整个文件系统的起点 |
| /bin | 基本用户命令二进制文件。包含所有用户都可用的命令,如ls、cp |
| /boot | 启动引导程序文件。包含内核、RAM disk镜像和引导加载程序的文件 |
| /dev | 设备文件。包含代表硬件设备或虚拟设备的特殊文件,如/dev/sda(第一块硬盘) |
| /etc | 系统配置文件。包含所有硬件程序的配置文件,如/etc/passwd(用户密码) |
| /home | 用户主目录。每个普通用户在此都有一个以自己用户名命名的子目录,用于存放个人文件和数据 |
| /lib | 基本共享库。为/bin和/sbin中的程序提供必要的库文件 |
| /meida | 可移动媒体挂在带你。系统自动将U盘、光盘等挂载到此目录下 |
| /mnt | 临时挂载点。 |
| /opt | 可选应用软件包。通常用于安装第三方应用程序 |
| /proc | 进程和内核信息文件系统 |
| /root | root用户的主目录 |
| /sbin | 系统管理命令二进制文件。包含系统管理命令,只有root用户才能执行,如fdisk、idconfig |
| /tmp | 临时文件。所有用户都可在此创建临时文件,系统重启后可能会被清空 |
| /usr | 用户程序和数据。包含绝大部分用户应用程序和文件 |
| /var | 可变数据文件。存放经常变化的文件,如日志、缓存 |
常见的Linux文件系统类型
Linux内核支持多种文件系统,它们负责在磁盘上实际组织和存储数据。一下是常见类型:
Ext4:最广泛使用、最稳定的文件系统,是Ext3的升级版,良好的性能和可靠性,支持日志功能;
XFS:高性能的日志文件系统,擅长处理大文件和高并发I/O操作。常用于企业级服务器;
Btrfs:很年轻的、功能丰富的写时复制文件系统。支持快快照等高级特性;
ZFS:有Linux版本,提供强大的数据管理功能。
读取文件流程示例
用户 -> Shell(或其他应用) -> 系统调用 -> 内核 -> 硬件
①用户输入命令
cat document.txt
②shell解析命令
Bash Shell 接收到键盘输入;
解析命令:可执行程序cat + 参数 document.txt;
在$PATH环境变量中查找cat程序的位置;
找到/bin/cat。
③请求内核并执行
// Shell通过系统调用请求内核
1. fork() // 创建新进程:内核创建Shell进程的完整副本作为子进程。2. exec() // 内核检查可执行文件的权限;加载可执行文件(/bin/cat)的代码和数据到内存;设置进程的代码段、数据段等;开始执行cat的main函数。3. open() // 打开document.txt文件:解析路径,找到文件的inode;检查权限;创建文件描述符,返回给cat程序。4. read() // 从文件中读取数据:通过文件描述符找到文件的inode;检查页面缓存,如果缓存命中则直接返回数据;否则,从磁盘读取数据到页面缓存,再返回给用户空间。磁盘I/O:硬盘磁头移动,数据读取到内存5. write() // 将读取到的数据写入标准输出(文件描述符1)。
④内核处理标准输出
文件描述符1指向终端设备;
终端驱动接收字符数据;
在终端显示器上渲染文本;
用户看到文件内容显示在屏幕上。
