场景
排障时经常会遇到 /dev/dm-0 这类设备节点。
直接执行 file 往往只看到“块设备”,看不到里面真实的文件系统类型(ext4、squashfs 等)。
file /dev/dm-0
典型输出:
/dev/dm-0: block special (253/0)
这只能说明它是块设备节点,无法判断内部数据格式。
小技巧核心
对设备节点使用 file -s,让 file 去读取设备内容,而不只是识别节点类型。
sudo file -s /dev/dm-0
例如你的场景会看到:
/dev/dm-0: Linux rev 1.0 ext4 filesystem data, UUID=5b91b976-9660-42bc-87c3-b47338189d06 (needs journal recovery) (extents) (64bit) (large files) (huge files)
再比如 swap 设备也能直接识别:
file -s /dev/dm-1
/dev/dm-1: Linux swap file, 4k page size, little endian, version 1, size 500735 pages, 0 bad pages, no label, UUID=261e0d17-1e43-41c8-b8b1-23d3fc44c6a4
在其他镜像或设备上也可能识别出 SquashFS、XFS、LUKS 等信息。
为什么 file 和 file -s 结果不同
file /dev/dm-0:只看 inode 类型,结果就是block special。file -s /dev/dm-0:会读取设备前部数据并按 magic 规则匹配文件系统特征。
因此在 /dev/* 场景下,-s 是关键开关。
一套可复用的检查流程
- 先确认设备拓扑。
lsblk -o NAME,MAJ:MIN,SIZE,TYPE,FSTYPE,MOUNTPOINT /dev/dm-0
- 用
file -s识别设备内容。
sudo file -s /dev/dm-0
- 交叉验证(可选)。
sudo blkid /dev/dm-0
sudo lsblk -f /dev/dm-0
常见误区
- 误区 1:
file /dev/dm-0没识别出 ext4/SquashFS 就认为设备没数据。- 实际上只是没有加
-s。
- 实际上只是没有加
- 误区 2:只看
lsblk -f的FSTYPE。- 某些场景
FSTYPE可能为空或不完整,file -s往往更直观。
- 某些场景
注意事项
- 建议用
sudo,避免权限导致读取失败。 file -s主要是读取,不会改写设备内容,但生产环境仍建议先在只读窗口执行。- 如果设备被加密、封装或是上层映射,优先结合 dm 映射关系一起看(如
dmsetup ls --tree)。
结论
file -s 是排查块设备内容的一个高性价比小技巧。
一句话记忆:file 看“节点类型”,file -s 看“节点里是什么”。