중요한 SQLite DB 파일을 읽을 수 없는 경우(I/O 오류 발생) 소프트웨어가 예상대로 반응하는지 자동으로 테스트하고 싶습니다. 이것이 바로 며칠 전 한 고객에게서 일어난 일입니다. 수동으로 문제를 해결했지만 이제 문제를 해결하기 위한 자동 코드를 만들고 테스트하려면 손상된 파일에 액세스해야 합니다.
Unix의 모든 것은 파일이기 때문에 사람들이 읽으려고 할 때 항상 I/O 오류를 일으키는 특수 파일(예: /dev)이 있을 수 있다고 생각합니다.
일부 유사한 파일(imo)은 다음과 같습니다.
/dev/full
쓰려고 하면 항상 "장치에 남은 공간이 없습니다"라는 메시지가 나타납니다./dev/null
그리고/dev/zero
그래서 제 생각에는 이와 같은 파일이 있으면 될 것 같습니다(아직 찾지 못했습니다).
원하는 결과를 얻을 수 있는 파일이나 다른 방법을 아는 사람이 있습니까(open() 주위에 LD_PRELOAD 래퍼를 사용하여 의도적으로 잘못된 파티션 이미지...)?
여기로 가는 가장 좋은 방법은 무엇인가요?
답변1
스택 오버플로 및 서버 오류에 대한 이 질문에 대한 답변은 이미 많이 있지만 일부 기술이 누락되어 있습니다. 삶을 더 쉽게 만들기 위해 VM/Linux 블록 장치/Linux 파일 시스템/Linux 사용자 공간 라이브러리 I/O 오류 주입 메커니즘 목록은 다음과 같습니다.
- 사용장치 매퍼 오류/시트/지연/DM 먼지 합성 블록 장치에서 합성 블록 장치(커널, 장치 매퍼 지원으로 구축된 커널 필요, 적절한 추가 장치 매퍼 모듈(dm-dust는 커널 >=5.2에서만 사용 가능)로 오류/손상 또는 지연/분할 IO를 반환하는 장치) 장치 매퍼 사용자 공간 비트).
- 사용MD 성격이 이상해요합성 블록 장치에 주기적으로 오류 주입을 수행합니다. 보다
--layout
mdadm 매뉴얼 페이지 옵션구성 방법(커널 및 mdadm 사용자 공간 비트)을 알아보세요. - 사용libfiu는 POSIX API 호출에 오류 주입을 수행합니다. (사용자 공간은 와 함께 사용할 수 있습니다
LD_PRELOAD
). - 사용Linux 커널의 오류 주입기는 기본 블록 장치에 오류를 주입합니다. (커널은 커널이 로 빌드되어야 합니다
FAIL_MAKE_REQUEST=y
). - 사용SystemTap은 오류 주입을 수행합니다.(커널, 커널 빌드 필요많은 것들).
- CharybdeFS를 사용하여 파일 시스템 오류 주입또는페타드 FS(FUSE를 통한 사용자 공간).
- 다음 명령을 사용하여 합성 블록 장치를 만듭니다.오류 주입을 수행하는 Linux scsi_debug 드라이버(핵심).
- QEMU에서 시스템을 실행하고 사용하십시오.QEMU는 blkdebug 드라이버를 사용하여 블록 장치 오류를 삽입합니다.(가상 기기).
- 다음을 통해 합성 블록 장치를 생성합니다.결함을 주입하는 장치에 대한 null_blk 옵션(커널 >= 4.14이지만 다음과 같은 옵션은타임아웃 확률4.17까지는 나타나지 않으며 커널을 빌드해야 합니다
BLK_DEV_NULL_BLK_FAULT_INJECTION=y
. - 를 통해 호스트에 서비스를 제공하는 포괄적인 네트워크 블록 장치를 만듭니다.NBDkit 필터예를 들어
delay
또는error
nbd-client
그런 다음 (커널 + NBD 사용자 공간 비트, 커널 >= 4.18에는 내장 NBD 지원, nbdclient >= 3.18 및 nbdkit >= 1.8.1 권장)을 통해 블록 장치를 연결합니다. - 참조NBDKit 데모 비디오약 20분).
추가 사실:SQLite에는 오류 시뮬레이션을 위한 VFS 드라이버가 있습니다.이는 좋은 테스트 적용 범위로 이어집니다.
관련된:
답변2
또는 대상을 사용하여 dmsetup
장치 매퍼 장치를 생성하여 오류를 시뮬레이션할 수 있습니다.error
flakey
dmsetup create test --table '0 123 flakey 1 0 /dev/loop0'
여기서 123은 섹터 단위의 장치 길이이고 /dev/loop0은 오류가 시뮬레이션될 원시 장치입니다. 오류의 경우 항상 오류를 반환하므로 후속 매개변수가 필요하지 않습니다.
답변3
당신은 하나를 원한다결함 주입I/O 메커니즘.
Linux에서는 사전 설정이 필요하지 않고 예외 오류(EIO "입력/출력 오류"가 아니라 ESRCH "해당 프로세스 없음")를 생성하는 방법이 있습니다.
cat /proc/1234/mem
여기서 1234는 테스트 중인 프로세스와 동일한 사용자로 실행되는 프로세스의 PID이지만 프로세스 자체는 아닙니다. 감사의 말루바소프~을 위한생각~의/proc/$pid/mem
.
프로세스 자체의 PID를 사용하면 EIO를 얻게 되지만 프로세스의 메모리에 매핑되지 않은 영역에서 읽는 경우에만 해당됩니다. 첫 번째 페이지는 매핑되지 않으므로 파일을 순차적으로 읽는다면 괜찮지만 파일 중간을 직접 보는 데이터베이스 프로세스에는 적합하지 않습니다.
루트로서 더 많은 설정을 하려면 다음을 수행하십시오.장치 매퍼 활용유효한 섹터와 불량 섹터가 있는 파일을 만듭니다.
또 다른 접근 방식은 작은 규모를 구현하는 것입니다.퓨즈파일 시스템. EIO는 사용자 공간 파일 시스템 드라이버에서 오류가 발생할 때 기본 오류 코드이므로 구현이 쉽습니다. 이 두진주그리고파이썬바인딩에는 기존 파일을 대부분 미러링하지만 신중하게 선택한 위치에 EIO를 주입하는 파일 시스템을 빠르게 작성할 수 있는 시작 예제가 함께 제공됩니다. 다음과 같은 기존 파일 시스템이 있습니다.petarddevs(기사), 그것이 기본적으로 얼마나 잘 작동하는지 모르겠습니다.
또 다른 방법은LD_PRELOAD
포장지. 기존 것은도서관(사용자 공간에 오류 주입). POSIX API 호출을 오버로드하는 라이브러리를 미리 로드하여 작동합니다. 간단한 지침이나 임의의 C 코드를 작성하여 정상적인 동작을 재정의할 수 있습니다.
답변4
이 목적을 위해 특별히 제작된 CharybdeFS를 사용할 수 있습니다.
PetardFS와 유사하지만 더 구성 가능한 통과 퓨즈 파일 시스템입니다.
여기에서 CharybdeFS 레시피를 참조하세요.http://www.scyladb.com/2016/05/02/fault-injection-filesystem-cookbook/
데이터베이스를 테스트할 수 있을 만큼 충분히 발전했습니다.