Linux
導致 I/O 錯誤的特殊文件
如果無法讀取基本 SQLite DB 文件(導致 I/O 錯誤),我想自動測試一個軟體是否按預期做出反應。這正是幾天前發生在客戶身上的事情。我們手動修復了它,但現在我想創建自動程式碼來修復它,並且需要訪問一個損壞的文件來測試它。
由於 Unix 中的所有內容都是一個文件,我懷疑可能有一個特殊的文件在嘗試讀取它時總是會導致 I/O 錯誤(例如,在 /dev 中)。
一些類似的文件(imo)將是:
/dev/full
如果您嘗試編寫它,它總是說“設備上沒有剩餘空間”/dev/null
和/dev/zero
所以我認為必須有一個這樣的文件(但還沒有找到)。
有誰知道這樣的文件或任何其他方法讓我獲得所需的結果(故意錯誤的分區映像,使用 LD_PRELOAD 的 open() 包裝器,…)?
去這裡的最佳方式是什麼?
您可以使用或目標
dmsetup
來創建設備映射器設備以模擬故障。error``flakey
dmsetup create test --table '0 123 flakey 1 0 /dev/loop0'
其中 123 是設備的長度,以扇區為單位,/dev/loop0 是您要在其上模擬錯誤的原始設備。對於錯誤,您不需要後續參數,因為它總是返回錯誤。
在 Stack Overflow 和 Server Fault 上已經有很多答案,但是缺少一些技術。為了讓生活更輕鬆,這裡列出了 VM/Linux 塊設備/Linux 文件系統/Linux 使用者空間庫 I/O 故障注入機制:
- 使用Device Mapper 的 error / flakey / delay / dm-dust 設備從合成塊設備返回錯誤/損壞,或延遲/拆分 IO(核心,要求核心已經建構了設備映射器支持,適當的附加設備映射器模組( dm-dust 僅在核心 >=5.2 上可用)並具有設備映射器使用者空間位)。
- 使用md 的故障特性在合成塊設備上執行週期性故障注入。請參閱
--layout
mdadm 手冊頁的選項了解如何配置它(核心和 mdadm 使用者空間位)。- 使用libfiu 對 POSIX API 呼叫執行錯誤注入 (使用者空間,可與 一起使用
LD_PRELOAD
)。- 使用Linux 核心的錯誤注入器將錯誤注入底層塊設備 (核心,需要核心已建構
FAIL_MAKE_REQUEST=y
)。- 使用SystemTap 進行故障注入(核心,需要一個核心已經建構了很多東西)。
- 使用 CharybdeFS或PetardFS(通過 FUSE 的使用者空間)注入文件系統故障。
- 使用執行故障注入(核心)的Linux scsi_debug 驅動程序創建合成塊設備。
- 在 QEMU 中執行您的系統,並使用QEMU 使用 blkdebug 驅動程序(VM) 注入塊設備錯誤。
- 通過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 - 請參閱20 分鐘左右的NBDKit 展示影片)。額外的事實:SQLite 有一個用於模擬錯誤的 VFS 驅動程序,因此它可以獲得良好的測試覆蓋率。
有關的: