直接指定已挂载设备(如/dev/mapper/centos-root或/dev/sda)会导致fio绕过文件系统写裸扇区,破坏superblock等关键元数据,引发文件系统损坏、无法挂载甚至系统崩溃;安全做法是测文件系统时用普通文件路径(如/mnt/test/fiofile),测硬件极限时仅用未挂载裸盘(如/dev/nvme0n1)。

直接指定/dev/mapper/xxx或/dev/sdX会破坏文件系统
这是最常见也最危险的误用:把 fio 的 --filename 参数指向一个已挂载的设备路径(如 /dev/mapper/centos-root 或 /dev/sda2),fio 会绕过文件系统直接写裸扇区,覆盖 superblock、inode 表、日志等关键元数据,导致 mount 失败、ls 报错、甚至系统无法启动。
真实案例中,有人在生产服务器上执行 fio --filename=/dev/mapper/centos-root ... 后,ext4 文件系统直接变为 unknown filesystem type,e2fsck 也无法修复。
- 绝对不要对任何已挂载的块设备(无论是否为系统盘)运行 fio
-
/dev/mapper/xxx、/dev/dm-*、/dev/sdX[1-9]、/dev/nvme0n1p1等带分区号或映射名的路径,只要挂载了,就禁止使用 - 即使加了
--allow_mounted_write=1,也不能抵消底层覆写风险——这个参数只影响 fio 自身校验逻辑,不阻止内核写入
安全压测的两种可靠路径:文件 vs 裸设备
本质区别在于:你是在测「文件系统 + 硬件」还是纯「硬件」。选错路径,结果不可比,风险也完全不同。
-
测真实业务场景(推荐新手):用普通文件,路径如
/mnt/test/fiofile。确保该目录所在分区有足够空间(建议 ≥ 测试--size的 2 倍),且未被其他进程占用 -
测硬件极限性能(需谨慎):用未挂载的裸盘,如
/dev/nvme0n1(注意:不是/dev/nvme0n1p1)。必须确认该设备:- 未出现在
mount或lsblk的挂载列表中 - 无 LVM / RAID / 加密层(即不是
/dev/mapper/xxx) - 已提前备份或可接受数据清零(fio 会重写整个设备)
- 未出现在
--direct=1 和 --filename 组合的坑
--direct=1 是绕过 page cache 的关键开关,但它本身不决定是否安全;真正决定风险的是 --filename 指向什么。
- 当
--filename=/mnt/test/fiofile+--direct=1:安全。fio 直接写文件对应的数据块,不影响文件系统结构 - 当
--filename=/dev/nvme0n1+--direct=1:危险但可控。前提是该设备空闲、未挂载、无分区表——否则会抹掉第一个 512 字节(MBR)或 GPT 头 - 当
--filename=/dev/nvme0n1p1+--direct=1:高危。等同于往 ext4/xfs 分区头直接写,大概率让mkfs都救不回来
简单记:只要 --filename 包含 p[0-9] 或 mapper,就别碰。
Windows 下用 fio.exe 测物理盘要特别注意 \.PhysicalDriveX
Windows 版 fio 使用 \.PhysicalDriveX 格式访问裸设备,和 Linux 的 /dev/sdX 等价,风险完全一致。
-
fio.exe -filename="\.PhysicalDrive1"→ 会清空磁盘 0 号扇区及后续所有扇区,不管上面有没有 C: 盘 - 务必先用
diskpart→list disk确认目标盘编号,再检查list volume是否有卷挂载到该盘 - 若该盘已有系统或数据卷(如 C:、D:),哪怕只是部分分区,都禁止使用
PhysicalDriveX,改用文件路径如E:io est.dat
最易被忽略的一点:Windows 的“磁盘管理”里显示“状态:联机”的盘,不代表没挂载卷——它可能正被某个服务或页面文件占用,此时直接裸写仍可能导致蓝屏或数据损坏。











