Linux

導致 I/O 錯誤的特殊文件

  • October 7, 2019

如果無法讀取基本 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 故障注入機制:

額外的事實:SQLite 有一個用於模擬錯誤的 VFS 驅動程序,因此它可以獲得良好的測試覆蓋率。

有關的:

引用自:https://unix.stackexchange.com/questions/77492