Sudah ada banyak jawaban untuk ini di Stack Overflow dan Server Fault tetapi beberapa teknik hilang. Untuk mempermudah, berikut adalah daftar perangkat blok VM/Linux/sistem berkas Linux/perpustakaan ruang pengguna Linux mekanisme injeksi kesalahan I/O:
- Gunakan perangkat error/flakey/delay/dm-dust Pemeta Perangkat untuk mengembalikan kesalahan/korupsi dari, atau menunda/membagi IO ke perangkat blok yang disintesis (kernel, membutuhkan kernel yang telah dibangun dengan dukungan pemetaan perangkat, perangkat tambahan yang sesuai modul mapper (dm-dust hanya tersedia pada kernel>=5.2) dan memiliki bit ruang pengguna mapper perangkat).
- Gunakan kepribadian salah md untuk melakukan injeksi kesalahan berkala pada perangkat blok yang disintesis. Lihat
--layout
opsi halaman manual mdadm untuk cara mengonfigurasinya (bit kernel dan mdadm userspace). - Gunakan libfiu untuk melakukan injeksi kesalahan pada panggilan API POSIX (ruang pengguna, dapat digunakan dengan
LD_PRELOAD
). - Gunakan injektor kesalahan kernel Linux untuk menyuntikkan kesalahan ke perangkat blok yang mendasarinya (kernel, mengharuskan kernel dibuat dengan
FAIL_MAKE_REQUEST=y
). - Menggunakan SystemTap untuk melakukan injeksi kesalahan (kernel, membutuhkan kernel yang telah dibuat dengan banyak hal).
- Masukkan kesalahan sistem file menggunakan CharybdeFS atau PetardFS (userspace melalui FUSE).
- Buat perangkat blok yang disintesis menggunakan driver Linux scsi_debug yang melakukan injeksi kesalahan (kernel).
- Jalankan sistem Anda dalam QEMU dan gunakan QEMU untuk menyuntikkan kesalahan perangkat pemblokiran menggunakan blkdebug driver (VM).
- Buat perangkat blok yang disintesis melalui opsi perangkat null_blk untuk menyuntikkan kesalahan (kernel>=4.14 tetapi opsi seperti probabilitas batas waktu tidak tiba hingga 4.17 dan mengharuskan kernel dibangun dengan
BLK_DEV_NULL_BLK_FAULT_INJECTION=y
). - Buat Perangkat Blok Jaringan yang disintesis yang disajikan ke host melalui filter NBDkit seperti
delay
atauerror
dan kemudian pasang perangkat blok ke sana melaluinbd-client
(kernel + NBD userspace bit, kernel>=4.18 dibuat dengan dukungan NBD, nbdclient>=3.18 dan nbdkit>=1.8.1 direkomendasikan - lihat video demo NBDKit sekitar 20 menit).
Fakta bonus:SQLite memiliki driver VFS untuk mensimulasikan kesalahan sehingga bisa mendapatkan cakupan pengujian yang baik.
Terkait:
- Bagaimana cara menyimulasikan disk yang gagal selama pengujian?
- Simulasikan perangkat blok yang rusak dengan kesalahan baca?
- Buat kesalahan baca
- Sengaja menyebabkan kesalahan I/O di Linux?
Anda dapat menggunakan dmsetup
untuk membuat device-mapper device menggunakan error
atau flakey
target untuk mensimulasikan kegagalan.
dmsetup create test --table '0 123 flakey 1 0 /dev/loop0'
Di mana 123 adalah panjang perangkat, di sektor dan /dev/loop0 adalah perangkat asli tempat Anda ingin mensimulasikan kesalahan. Untuk kesalahan, Anda tidak memerlukan argumen berikutnya karena selalu mengembalikan kesalahan.
Anda menginginkan mekanisme injeksi kesalahan untuk I/O.
Di Linux, berikut adalah metode yang tidak memerlukan penyiapan sebelumnya dan menghasilkan kesalahan yang tidak biasa (bukan "Kesalahan masukan/keluaran" EIO tetapi ESRCH "Tidak ada proses seperti itu"):
cat /proc/1234/mem
di mana 1234 adalah PID dari proses yang berjalan sebagai pengguna yang sama dengan proses yang Anda uji, tetapi bukan proses itu sendiri. Penghargaan untuk rubasov karena telah memikirkan /proc/$pid/mem
.
Jika Anda menggunakan PID dari proses itu sendiri, Anda mendapatkan EIO, tetapi hanya jika Anda membaca dari area yang tidak dipetakan dalam memori proses. Halaman pertama tidak pernah dipetakan, jadi tidak apa-apa jika Anda membaca file secara berurutan, tetapi tidak cocok untuk proses database yang mencari langsung ke tengah file.
Dengan beberapa penyiapan lagi sebagai root, Anda dapat memanfaatkan pemetaan perangkat untuk membuat file dengan sektor yang valid dan sektor yang buruk.
Pendekatan lain adalah mengimplementasikan sistem file FUSE kecil. EIO adalah kode kesalahan default ketika driver sistem file userspace Anda melakukan kesalahan, sehingga mudah dicapai. Baik pengikatan Perl dan Python datang dengan contoh untuk memulai, Anda dapat dengan cepat menulis sistem file yang sebagian besar mencerminkan file yang ada tetapi menyuntikkan EIO di tempat yang dipilih dengan cermat. Ada sistem file seperti itu:petardfs (artikel), saya tidak tahu seberapa baik kerjanya di luar kotak.
Metode lainnya adalah LD_PRELOAD
pembungkus. Yang sudah ada adalah Libfiu (injeksi kesalahan di ruang pengguna). Ini bekerja dengan memuat pustaka yang membebani panggilan API POSIX. Anda dapat menulis arahan sederhana atau kode C arbitrer untuk mengganti perilaku normal.