我想对Peter Cordes的回答进行详细说明。
在bash中,使用loopback设备设置一个ext4镜像,然后将一个名为binary.bin的文件写入其中。
imageName=faulty.img
mountDir=$(pwd)/mount
sudo umount $mountDir
dd if=/dev/zero of=$imageName bs=1M count=10
mkfs.ext4 $imageName
loopdev=$(sudo losetup -P -f --show $imageName); echo $loopdev
mkdir $mountDir
sudo mount $loopdev $mountDir
sudo chown -R $USER:$USER mount
echo "2ed99f0039724cd194858869e9debac4" | xxd -r -p > $mountDir/binary.bin
sudo umount $mountDir
在
Python3中(因为Bash处理二进制数据有困难),搜索
binary.bin
中的魔术二进制数据。
import binascii
with open("faulty.img", "rb") as fd:
s = fd.read()
search = binascii.unhexlify("2ed99f0039724cd194858869e9debac4")
beg=0
find = s.find(search, beg); beg = find+1; print(find)
start_sector = find//512; print(start_sector)
然后在bash中挂载有故障的块设备
start_sector=
next_sector=$(($start_sector+1))
size=$(($(wc -c $imageName|cut -d ' ' -f1)/512))
len=$(($size-$next_sector))
echo -e "0\t$start_sector\tlinear\t$loopdev\t0" > fault_config
echo -e "$start_sector\t1\terror" >> fault_config
echo -e "$next_sector\t$len\tlinear\t$loopdev\t$next_sector" >> fault_config
cat fault_config | sudo dmsetup create bad_drive
sudo mount /dev/mapper/bad_drive $mountDir
最终,我们可以通过读取文件来测试故障块设备。
cat $mountDir/binary.bin
出现错误的代码:
cat: /path/to/your/mount/binary.bin: Input/output error
测试完成后进行清理
sudo umount $mountDir
sudo dmsetup remove bad_drive
sudo losetup -d $loopdev
rm fault_config $imageName