/dev是linux内核动态生成的设备接口集合,将硬件操作抽象为文件读写;字符设备按字节流顺序访问(如/dev/ttys0),块设备以固定大小块支持随机访问(如/dev/sda1);伪设备如/dev/null、/dev/zero提供系统级功能;现代系统由udev自动管理设备节点,/dev用于实际i/o,/sys用于查询和配置设备信息。

/dev目录不是普通文件夹,它是Linux内核动态生成的设备接口集合,把硬件操作变成文件读写——打开、读、写、关闭这些动作背后,实际触发的是驱动程序与物理设备的通信。
字符设备与块设备的核心差异
区分它们的关键不在“有没有硬件”,而在数据访问方式:
- 字符设备:按字节流顺序处理,不能跳转。比如串口发指令、键盘输入、/dev/ttyS0读取传感器数据,每次read()拿到的就是下一个字节,没有缓存层,也不支持lseek()定位。
- 块设备:以固定大小(如512B或4KB)为单位读写,支持随机访问。硬盘分区/dev/sda1可以读第1000个块,也可以直接写第5000个块;内核会自动缓存、合并请求、调度I/O,提升效率。
- 查看类型最直接的方法是ls -l /dev:开头是c就是字符设备,b就是块设备。例如crw-rw----对应/dev/ttyS0,brw-rw----对应/dev/sda。
/dev里的伪设备不是摆设
这些没有物理实体的设备,提供稳定、可预测的系统级功能:
- /dev/null:所有写入立即丢弃,读取立刻返回EOF。常用于屏蔽输出:command > /dev/null 2>&1。
- /dev/zero:持续输出\0字节。可用于快速填充文件:dd if=/dev/zero of=test.img bs=1M count=100。
- /dev/random和/dev/urandom:前者阻塞等待熵池充足,适合密钥生成;后者不阻塞,适合多数加密场景。
设备节点怎么来的?不是手动建的
现代Linux不再靠管理员手动生成设备文件。启动时内核探测到硬件,自动创建基础节点;后续热插拔由udev守护进程接管:
- udev监听内核uevent,根据规则(/etc/udev/rules.d/)重命名、设置权限、创建符号链接。比如U盘插入后,/dev/sdb可能被软链为/dev/disk/by-label/MYUSB。
- 每个设备文件都含主设备号(标识驱动类型)和次设备号(标识具体实例),内核靠这对数字把open()调用路由到正确驱动。
- 误删设备文件不用慌——重启或重新插拔后,udev会重建;临时需要可用mknod命令手工补,但仅限调试,不建议长期使用。
/dev与/sys的关系不是重复
两者分工明确,不可替代:
- /dev是**应用层入口**:程序用标准文件API操作它,完成实际I/O,比如mount /dev/sda1 /mnt、cat /dev/video0获取摄像头帧。
- /sys是**内核状态视图**:存放设备属性、参数、拓扑关系,只读为主,用于查询和配置(如echo 1 > /sys/class/backlight/intel_backlight/brightness)。/sys/dev是其中按设备号组织的快捷入口,本质是符号链接。
- 简单说:/dev让你“做事”,/sys让你“看和调”。一个面向功能,一个面向信息。











