Linux에서 의도적으로 I / O 오류가 발생합니까? 장치가 의도적으로 I

어쨌든 Linux에서 블록 장치가 의도적으로 I / O 오류를보고하게하거나 테스트 목적으로 시뮬레이션 할 수 있습니까?



답변

예, 장치 매퍼 로이 작업을 수행하는 매우 그럴듯한 방법이 있습니다.

장치 매퍼는 블록 장치를 선택한 새로운 매핑 / 순서로 다시 결합 할 수 있습니다. LVM이이를 수행합니다. 또한 고장난 디스크를 시뮬레이트하기위한 ‘flakey’및 디스크의 고장난 영역을 시뮬레이트하기위한 ‘error’와 같은 다른 대상 (일부 참신한)을 지원합니다.

의도적으로 IO 블랙홀이있는 장치를 구성 할 수 있으며, 교차 할 때 IO 오류를보고합니다.

먼저, 대상으로 사용할 가상 볼륨을 생성하고이를 블록 장치로 지정할 수있게하십시오.

dd if=/dev/zero of=/var/lib/virtualblock.img bs=512 count=1048576
losetup /dev/loop0 /var/lib/virtualblock.img

따라서 이것을 시작하기 위해 가상 블록 장치의 기초가되는 512M 파일을 만들어 ‘구멍’을 뚫습니다. 아직 구멍이 없습니다. 당신이 있다면 mkfs.ext4 /dev/loop0완벽하게 유효한 파일 시스템을 얻게 될 것입니다.

따라서이 블록 장치를 사용하는 dmsetup을 사용하여 구멍이있는 새 장치를 만듭니다. 여기 예가 먼저 있습니다

dmsetup create errdev0
0 261144 linear /dev/loop0 0
261144 5 error
261149 787427 linear /dev/loop0 261139

‘errdev0’이라는 장치가 생성됩니다 (일반적으로 / dev / mapper에 있음). 입력 dmsetup create errdev0하면 stdin을 기다리며 ^ D 입력이 완료되면 완료됩니다.

위의 예에서 루프 장치의 섹터 261144에 5 개의 섹터 홀 (2.5kb)을 만들었습니다. 그런 다음 루프 장치를 정상적으로 계속 진행합니다.

이 스크립트는 대략 16Mb 주위에 퍼져있는 임의의 위치에 구멍을 배치하는 테이블을 생성하려고 시도합니다.

#!/bin/bash
start_sector=0
good_sector_size=0

for sector in {0..1048576}; do

    if [[ ${RANDOM} == 0 ]]; then
        echo "${start_sector} ${good_sector_size} linear /dev/loop0 ${start_sector}"
        echo "${sector} 1 error"
        start_sector=$((${sector}+1))
        good_sector_size=0
    else
        good_sector_size=$((${good_sector_size}+1))
    fi
done

echo "${start_sector} $((${good_sector_size}-1)) linear /dev/loop0 ${start_sector}"

이 스크립트는 512Mb 장치도 생성했으며 가상 블록 장치가 켜져 있다고 가정합니다 /dev/loop0.

이 데이터를 텍스트 파일에 테이블로 출력하여 파이프에 넣을 수 dmsetup create errdev0있습니다.

장치를 만든 후에는 먼저 장치를 포맷 한 다음 파일을 배치하여 일반 블록 장치처럼 사용할 수 있습니다. 언젠가는 가상 장치에서 실제로 IO 홀인 섹터에 부딪 치는 일부 IO 문제가 발생해야합니다.

사용이 끝나면 dmsetup remove errdev0장치를 제거하십시오.

IO 오류가 발생할 가능성을 높이려면 구멍을 더 자주 추가하거나 생성 한 구멍의 크기를 변경할 수 있습니다. 특정 섹션에 오류를 넣으면 32MB의 IE가 문제를 일으킬 수 있으므로 일반적으로 시도하는 수퍼 블록을 작성할 수 없으므로 형식이 작동하지 않습니다.

재미를 더하기 위해 실제로는 losetup그때 mkfs.ext4 /dev/loop0데이터로 채울 수 있습니다. 파일 시스템이 제대로 작동하면 파일 시스템을 마운트 해제하고 dmsetup을 사용하여 구멍을 추가하고 다시 마운트하십시오!


답변

출력이 실패한 경우 프로그램의 견고성을 확인하기 위해 pseudodevice를 사용할 수 있습니다. pseudodevice /dev/full는 쓸 때 항상 “ENOSPACE”를 반환합니다.

$ dd if=/dev/zero of=/dev/full
dd: writing to `/dev/full': No space left on device
1+0 records in
0+0 records out


답변

테스트하려는 대상에 따라 다릅니다. LD_PRELOADed 라이브러리를 사용하면 ‘모든 쓰기 실패 ENOSPC또는 EIO‘ 와 같은 사고 방식으로 응용 프로그램을 속일 수 있습니다 .


답변

당신은 오 재미있는 방법으로 그렇게 할 수 있습니다. https://www.kernel.org/doc/Documentation/fault-injection/fault-injection.txt를 참조 하십시오


답변

파티션 테이블을 변경하여 파티션을 실제보다 크게 만들 수 있습니다. 아마도 i / o 오류가 발생했을 것입니다. 또는 디스크가 핫 플러 거블 인 경우 하나만 꺼낼 수 있습니다.


답변