Disk Input/Output Error

(Fault Injection Series)

1 Overview

Simulate the disk IO error with dm-error:

Term/Tool Usage
Device Mapper (DM) Map software devices to physical device.
Loop Device Allow users to mount a regular file as a disk.
dmsetup Manage DM devices.
losetup Manage loop device.
dm-linear Split, merge devices
dm-error Return I/O errors for any read, write to an erea.

2 Setup Lab

vm$ apk add device-mapper lsblk dmesg

3 Create Devices

vm$ dd if=/dev/zero of=file0.img bs=1M count=2048
# find a free loop device
vm$ losetup -f
/dev/loop0

# create loop device
vm$ losetup /dev/loop0 file0.img

# list loop devices
$ losetup -a
/dev/loop0: 0 file0.img

vm$ lsblk
NAME   MAJ:MIN RM  SIZE RO TYPE MOUNTPOINTS
loop0    7:0    0    2G  0 loop
# get size of loop device, unit: 512-byte sector
vm$ blockdev --getsz /dev/loop0
4194304

# create the dm-linear device
vm$ dmsetup create dm0 --table '0 4194304 linear /dev/loop0 0'

# show dm table
vm$ dmsetup table
dm0: 0 4194304 linear 7:0 0

vm$ lsblk
NAME   MAJ:MIN RM  SIZE RO TYPE MOUNTPOINTS
loop0    7:0    0    2G  0 loop 
└─dm0  253:0    0    2G  0 dm 

4 Inject IO Errors

vm$ fdisk -l
Disk /dev/dm-0: 2048 MB, 2147483648 bytes, 4194304 sectors
261 cylinders, 255 heads, 63 sectors/track
Units: sectors of 1 * 512 = 512 bytes
# inject IO errors
vm$ dmsetup reload dm0 << EOF
0 3145728 linear /dev/loop0 0
3145728 1048576 error
EOF
# after injected, the setting still inactive
vm$ dmsetup table --inactive
dm0: 0 3145728 linear 7:0 0
dm0: 3145728 1048576 error

# resume to activate the setting
vm$ dmsetup resume dm0

# show dm table
vm$ dmsetup table
dm0: 0 3145728 linear 7:0 0
dm0: 3145728 1048576 error

5 Reproduce IO Errors

vm$ dd if=/dev/dm-0 of=/dev/null bs=512 count=1 skip=3145728
dd: /dev/dm-0: I/O error

vm$ dmesg -w
Buffer I/O error on dev dm-0, logical block 393216, async page read

6 References