场景

排障时经常会遇到 /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 是关键开关。

一套可复用的检查流程

  1. 先确认设备拓扑。
lsblk -o NAME,MAJ:MIN,SIZE,TYPE,FSTYPE,MOUNTPOINT /dev/dm-0
  1. 用 file -s 识别设备内容。
sudo file -s /dev/dm-0
  1. 交叉验证(可选)。
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 看“节点里是什么”。