Linux 文件设备类型分析
这篇文章从 VFS 视角梳理 Linux 的 7 种文件类型。
1. Linux 的文件类型全景
Linux 里"一切皆文件"并不是说所有对象都长得一样,而是说它们都尽量通过统一接口被访问。常见类型共有 7 种:
- 普通文件(regular file)
- 目录(directory)
- 字符设备(character device)
- 块设备(block device)
- 符号链接(symbolic link)
- FIFO(命名管道)
- 套接字(socket)
1.1 结构图:7 种类型与用途分层
Linux 文件对象
regular file 普通文件
directory 目录
character device 字符设备
block device 块设备
symbolic link 符号链接
FIFO 命名管道
socket 套接字
数据持久化
命名空间组织
设备控制与流式 I/O
存储块 I/O
路径重定向
本机进程间通信
本机/网络通信
1.2 在 ls -l 里的类型标记
-:普通文件d:目录c:字符设备b:块设备l:符号链接p:FIFOs:套接字
2. 7 种文件类型逐项解析
2.1 普通文件(regular file)
- 保存用户数据,如文本、二进制、日志、媒体文件。
- 支持顺序读写和随机访问。
- 最常见的文件类型。
2.2 目录(directory)
- 本质是"文件名 -> inode"的索引结构。
- 用于组织命名空间,不直接承载业务数据。
- 系统调用通过目录项遍历完成路径解析。
2.3 字符设备(character device)
- 以字节流方式读写,强调"流"和"控制"。
- 常见于串口、键盘、鼠标、GPIO、I2C/SPI 外设节点。
- 多数场景偏顺序访问,不强调大规模随机定位。
2.4 块设备(block device)
- 以固定大小块访问,如 512B 或 4KB。
- 典型设备是 HDD、SSD、U 盘、eMMC、NVMe。
- 支持随机读写,和页缓存、I/O 调度、文件系统协同紧密。
2.5 符号链接(symbolic link)
- 内容是一个路径字符串,指向另一个文件对象。
- 可以跨文件系统。
- 目标不存在时会出现悬空链接。
2.6 FIFO(命名管道)
- 带路径名的管道对象,用于进程间流式通信。
- 数据通常不作为普通文件持久化。
- 常见于简单的生产者-消费者进程通信。
2.7 套接字(socket)
- 支持本机 IPC(Unix Domain)与网络通信。
- 常见于守护进程控制接口、服务间通信。
- 以消息/流语义进行数据交换。
3. 为什么硬盘是块设备,不是字符设备
硬盘属于块设备(block device)这个判断完全正确。关键在于它的访问模型和内核处理路径。
- 访问粒度
- 块设备按固定块读写。
- 字符设备按字节流读写。
- 访问模式
- 块设备天然支持随机访问。
- 字符设备通常以顺序流处理为主。
- 内核栈路径
- 块设备经过块层:bio、request queue、I/O 调度器等。
- 字符设备通常直接走 file_operations 回调。
- 性能目标
- 块设备偏吞吐与延迟平衡。
- 字符设备偏控制语义和实时交互。
3.1 图表:字符设备与块设备 I/O 路径对比
用户态 read/write/ioctl
VFS
字符设备驱动 file_operations
串口/传感器/控制器
文件系统
页缓存
块层 bio/request queue
I/O 调度
HDD/SSD/NVMe
4. 驱动开发中为何"字符设备最多"
你的观察非常接近实际工程:很多自定义设备驱动最终都做成字符设备。
4.1 核心原因
- 设备天然不是"存储"
- 大量外设是寄存器控制 + 中断通知 + 小规模数据交换。
- 这类场景不需要块层的复杂机制。
- 接入成本更低
- 字符设备注册路径短,模型清晰。
- 常用接口(read、write、ioctl、poll、mmap)覆盖面广。
- 业务语义更贴近控制面
- 很多设备操作是"命令-响应"而不是"逻辑块读写"。
- 调试与迭代效率更高
- 通过设备节点就能快速联调,用户态工具链简单。
4.2 图表:驱动类型选型思路
扇区/块读写
网络收发帧
命令控制/字节流
新硬件驱动
核心语义是什么?
块设备驱动
网络设备驱动
字符设备驱动
接入块层与文件系统路径
接入 net_device/NAPI
基于 file_operations 暴露节点
5. 实战速查:如何识别文件类型
5.1 常用命令
bash
ls -l
stat <path>
find . -type b # 块设备
find . -type c # 字符设备
find . -type p # FIFO
find . -type s # 套接字
find . -type l # 符号链接
5.2 设备号补充
对于 b/c 设备,ls -l 还会显示主设备号(major)和次设备号(minor):
- major:定位到内核中的驱动类别。
- minor:定位该驱动下的具体实例。
这也是字符设备和块设备节点能被统一管理的基础。
6. 总结
- Linux 常见文件对象分为 7 种,VFS 提供统一入口。
- 硬盘、U 盘、SSD 归类为块设备,因为它们的核心语义是块 I/O。
- 字符设备更适合控制类和流式外设,因此在驱动开发里占比通常更高。
- 除字符设备外,存储类走块设备,网卡类走网络子系统,这是主流三分法。