Simulate a faulty block device with read errors?

前端 未结 4 1201
离开以前
离开以前 2020-12-08 16:17

I\'m looking for an easier way to test my application against faulty block devices that generate i/o read errors when certain blocks are read. Trying to use a physical hard

4条回答
  •  长情又很酷
    2020-12-08 16:54

    I would like to elaborate on Peter Cordes answer.

    In bash, setup an image on a loopback device with ext4, then write a file to it named binary.bin.

    imageName=faulty.img
    mountDir=$(pwd)/mount
    
    sudo umount $mountDir ## make sure nothing is mounted here
    
    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
    

    in python3 (since bash struggles to deal with binary data) search for the magic binary data in 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)
    

    then back in bash mount the faulty block device

    start_sector=## copy value from variable start_sector in python
    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
    

    finally we can test the faulty block device by reading a file

    cat $mountDir/binary.bin
    

    which produces the error:

    cat: /path/to/your/mount/binary.bin: Input/output error
    

    clean up when you're done with testing

    sudo umount $mountDir
    sudo dmsetup remove bad_drive
    sudo losetup -d $loopdev
    rm fault_config $imageName
    

提交回复
热议问题