如何复现du命令抛出Input/output error的故障场景
复现
du命令Input/output error报错方案 所有操作需root权限,必须在纯测试环境执行,严禁操作生产数据盘或系统盘,避免数据丢失。
Input/output error对应系统错误码EIO,是底层块设备IO请求失败时返回的标准错误,不需要物理损坏硬盘,通过内核设备映射机制即可100%稳定复现。
推荐方案:使用dm-error模拟故障块设备
该方案无硬件风险,测试完成后可一键清理环境:
创建虚拟磁盘文件作为块设备后端:
dd if=/dev/zero of=/tmp/virtual_disk.img bs=1M count=1024将虚拟文件映射为loop块设备,记录返回的设备路径(示例为
/dev/loop0,实际操作替换为你环境返回的路径):losetup -fP /tmp/virtual_disk.img格式化块设备并挂载到测试路径
/data:mkfs.ext4 /dev/loop0 mkdir -p /data mount /dev/loop0 /data写入测试文件,验证正常场景下
du可正常执行:mkdir -p /data/testdir touch /data/testdir/a.txt /data/b.txt du -sh /data # 此时会正常返回目录大小替换为故障映射设备,触发IO错误:
umount /data # 创建全量返回IO错误的映射设备 echo "0 $(blockdev --getsize /dev/loop0) error" | dmsetup create error_disk mount /dev/mapper/error_disk /data执行测试命令,即可复现目标报错:
du -sh /data/预期输出完全匹配示例效果:
du: cannot access '/data/': Input/output error
测试完成后清理环境:
umount /data dmsetup remove error_disk losetup -d /dev/loop0 rm -f /tmp/virtual_disk.img
如果需要模拟遍历子目录/文件时才触发IO错误的场景,可以替换dm-error为dm-flakey靶,配置自定义的IO错误触发概率、触发时间即可。
其他可触发Input/output error的命令
只要是对故障块设备上的文件/目录做读写、属性查询、遍历操作的命令,都会抛出同款错误,常见可用于测试的命令如下:
ls -l /data/find /data -type fcat /data/b.txtstat /data/testdirdf -h /data
内容的提问来源于stack exchange,提问作者Subhash Karemore
相关产品推荐
相关产品推荐

