2009-09-01 192 views
25

在Linux VM(Vmware工作站或類似工具)中,如何模擬以前正常工作的光盤出現故障?如何在測試期間模擬出現故障的磁盤?

我在生產中發生光盤故障(可能是控制器,電纜或固件問題)的情況。顯然這是不可預測或可重複的,我想測試我的監控以確保它正確提醒。

我理想地希望能夠模擬寫入失敗但成功讀取以及完全失敗的情況,即scsi接口將錯誤報告回內核。

回答

23

有幾個層可以模擬磁盤錯誤。如果您正在測試單個用戶空間程序,最簡單的方法可能是介入適當的調用(例如write()),並讓它們有時會返回錯誤。 libfiu故障注入庫can do this使用其工具fiu-run

另一種方法是使用內核驅動程序,該驅動程序可以將數據傳遞到另一個設備或從另一個設備傳遞數據,但一路注入故障。然後,您可以掛載設備並從任何應用程序中使用它,就好像它是故障磁盤一樣。 fsdisk驅動程序就是一個例子。

還有一個故障注入基礎設施已經被合併到Linux內核中,儘管您可能需要重新配置內核來啓用它。它記錄在Documentation/fault-injection/fault-injection.txt。這對測試內核代碼很有用。可以使用SystemTap在內核級別注入錯誤。見The SCSI fault injection testKernel Fault injection using SystemTap

+0

也許最集中有用的答案我見過... – 2015-06-10 22:19:07

+0

Upvoted爲'fsdisk'建議。 – 2018-03-01 21:32:43

4

一個簡單的方法,使用2.6內核SCSI磁盤消失是:

echo 1 > /sys/bus/scsi/devices/H:B:T:L/delete 

(H:B:T:L是主機,總線,目標,LUN)。爲了模擬只讀情況,你必須使用mark4o提到的故障注入方法。

6

要添加到mark4o的答案,您還可以使用Linux的Device Mapper來生成失敗的設備。

Device Mapper's delay device可用於將同一塊的讀寫I/O發送到不同的基礎設備(它也可以延遲該I/O,正如其名稱所示)。設備映射器的錯誤設備可用於在訪問特定塊時生成永久性錯誤。通過組合這兩者,您可以創建一個寫入總是失敗的設備,但對於給定的區域,讀取總是成功的。

以上是Simulate a faulty block device with read errors?問題中描述內容的更復雜示例(有關簡單的Device Mapper示例,請參閱https://stackoverflow.com/a/1871029)。

還有一個list of Linux disk fault injection mechanisms上的Special File that causes I/O error Unix & Linux的問題。

0

您可以使用scsi_debug內核模塊來模擬RAM磁盤,並且它支持optsevery_nth選件的所有SCSI錯誤。

請檢查介質錯誤此http://sg.danny.cz/sg/sdebug26.html

例如在部門4656:

[[email protected] ~]$ sudo modprobe scsi_debug opts=2 every_nth=1 
[[email protected] ~]$ sudo dd if=/dev/sdb of=/dev/null 
dd: error reading ‘/dev/sdb’: Input/output error 
4656+0 records in 
4656+0 records out 
2383872 bytes (2.4 MB) copied, 0.021299 s, 112 MB/s 
[[email protected] ~]$ dmesg|tail 
[11201.454332] blk_update_request: critical medium error, dev sdb, sector 4656 
[11201.456292] sd 5:0:0:0: [sdb] FAILED Result: hostbyte=DID_OK driverbyte=DRIVER_SENSE 
[11201.456299] sd 5:0:0:0: [sdb] Sense Key : Medium Error [current] 
[11201.456303] sd 5:0:0:0: [sdb] Add. Sense: Unrecovered read error 
[11201.456308] sd 5:0:0:0: [sdb] CDB: Read(10) 28 00 00 00 12 30 00 00 08 00 
[11201.456312] blk_update_request: critical medium error, dev sdb, sector 4656 

你可以通過sysfs的改變在運行時optsevery_nth選項:

echo 2 | sudo tee /sys/bus/pseudo/drivers/scsi_debug/opts 
echo 1 | sudo tee /sys/bus/pseudo/drivers/scsi_debug/opts 
1

Linux內核提供一個很好的功能被稱爲「故障注入」

echo 1 > /sys/block/vdd/vdd2/make-it-fail 

要設置一些選項:

mkdir /debug 
mount debugfs /debug -t debugfs 
cd /debug/fail_make_request 
echo 10 > interval # interval 
echo 100 > probability # 100% probability 
echo -1 > times # how many times: -1 means no limit 

https://lxadm.com/Using_fault_injection

1

你也可以使用由磁盤提供給媒體做誤碼測試該方法。 SCSI具有可通過與無效ECC寫入數據被用於損壞的塊的WRITE LONG命令。 SATA和NVMe也有類似的命令。

對於最常見的情況(SATA),您可以使用帶有--make-bad-sector的hdparm來使用該命令,您可以將sg_write_long用於SCSI,對於NVMe,您可以將nvme-cli與write-uncor一起使用選項。

的一大優勢,這些命令比其他的注射方法是,他們也表現得就像一個驅動器確實,充分的延遲影響,並在該部門通過再分配寫恢復。這也包括驅動器中的錯誤計數器。

的缺點是,如果你在同一個驅動器做太多的錯誤計數器就會上升,SMART可以標記磁盤壞或者你可能會耗盡它的重新分配表。所以,不要使用它的手動測試,但如果你是在自動測試運行它不這樣做太頻繁。