어쨌든 Linux에서 블록 장치가 의도적으로 I / O 오류를보고하게하거나 테스트 목적으로 시뮬레이션 할 수 있습니까?
modprobe
블록 장치처럼 동작하는 로드 할 수있는 작은 커널 모듈을 작성한 다음 ioctl()'s
드라이버로 전송 하여 원하는 값을 반환하는 다른 작은 프로그램 을 작성했습니다.
어쨌든 Linux에서 블록 장치가 의도적으로 I / O 오류를보고하게하거나 테스트 목적으로 시뮬레이션 할 수 있습니까?
modprobe
블록 장치처럼 동작하는 로드 할 수있는 작은 커널 모듈을 작성한 다음 ioctl()'s
드라이버로 전송 하여 원하는 값을 반환하는 다른 작은 프로그램 을 작성했습니다.
답변:
예, 장치 매퍼 로이 작업을 수행하는 매우 그럴듯한 방법이 있습니다.
장치 매퍼는 블록 장치를 선택한 새로운 매핑 / 순서로 다시 결합 할 수 있습니다. 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_PRELOAD
ed 라이브러리를 사용하면 '모든 쓰기 실패 ENOSPC
또는 EIO
' 와 같은 사고 방식으로 응용 프로그램을 속일 수 있습니다 .
당신은 오 재미있는 방법으로 그렇게 할 수 있습니다. https://www.kernel.org/doc/Documentation/fault-injection/fault-injection.txt를 참조 하십시오
fail_make_request
시겠습니까? 링크 썩음을 방지하는데도 좋습니다.