हां, डिवाइस मैपर के साथ ऐसा करने के लिए एक बहुत ही प्रशंसनीय तरीका है।
डिवाइस मैपर आपके चयन के एक नए मैपिंग / ऑर्डर में ब्लॉक डिवाइसेस को फिर से जोड़ सकता है। LVM यह करता है। यह अन्य लक्ष्यों का भी समर्थन करता है, (कुछ जो काफी उपन्यास हैं) जैसे कि डिस्क के असफल क्षेत्रों को अनुकरण करने के लिए एक असफल डिस्क और 'त्रुटि' का अनुकरण करने के लिए 'परतदार'।
कोई एक उपकरण का निर्माण कर सकता है जो जानबूझकर आईओ ब्लैकहोल करता है जो पार होने पर आईओ त्रुटियों की रिपोर्ट करेगा।
सबसे पहले, लक्ष्य के रूप में उपयोग करने के लिए कुछ वर्चुअल वॉल्यूम बनाएं और इसे ब्लॉक डिवाइस के रूप में पता करने योग्य बनाएं।
dd if=/dev/zero of=/var/lib/virtualblock.img bs=512 count=1048576
losetup /dev/loop0 /var/lib/virtualblock.img
तो, इसे शुरू करने के लिए एक 512M फाइल बनती है जो हमारे वर्चुअल ब्लॉक डिवाइस का आधार है जिसे हम एक 'होल' में पंच करेंगे। कोई छेद अभी तक मौजूद नहीं है। यदि आप थे तो आपको mkfs.ext4 /dev/loop0
पूरी तरह से मान्य फाइल सिस्टम मिलेगा।
तो, dmsetup का उपयोग करने देता है, जो इस ब्लॉक डिवाइस का उपयोग करते हुए - एक नया उपकरण बनाएगा जिसमें कुछ छेद हैं। यहाँ एक उदाहरण पहले है
dmsetup create errdev0
0 261144 linear /dev/loop0 0
261144 5 error
261149 787427 linear /dev/loop0 261139
यह 'अराध्यदेव' (आमतौर पर / देव / मैपर) नामक एक उपकरण बनाएगा। जब आप टाइप dmsetup create errdev0
करेंगे तो यह stdin का इंतजार करेगा और ^ D इनपुट होने पर समाप्त होगा।
ऊपर के उदाहरण में, हमने लूप डिवाइस के सेक्टर 261144 में 5 सेक्टर का छेद (2.5kb) बनाया है। हम फिर लूप डिवाइस के माध्यम से सामान्य रूप से जारी रखते हैं।
यह स्क्रिप्ट आपको एक तालिका उत्पन्न करने का प्रयास करेगी जो कि लगभग 16Mb के आसपास फैले हुए यादृच्छिक स्थानों पर छेद करेगी (हालांकि इसकी बहुत यादृच्छिक)।
#!/bin/bash
start_sector=0
good_sector_size=0
for sector in {0..1048576}; do
if [[ ${RANDOM} == 0 ]]; then
echo "${start_sector} ${good_sector_size} linear /dev/loop0 ${start_sector}"
echo "${sector} 1 error"
start_sector=$((${sector}+1))
good_sector_size=0
else
good_sector_size=$((${good_sector_size}+1))
fi
done
echo "${start_sector} $((${good_sector_size}-1)) linear /dev/loop0 ${start_sector}"
स्क्रिप्ट मानती है कि आपने 512Mb डिवाइस भी बनाई है और आपका वर्चुअल ब्लॉक डिवाइस चालू है /dev/loop0
।
आप बस एक टेबल के रूप में इस डेटा को एक टेक्स्ट फ़ाइल में आउटपुट कर सकते हैं और इसमें पाइप कर सकते हैं dmsetup create errdev0
।
एक बार जब आप डिवाइस बना लेते हैं, तो आप इसे सामान्य ब्लॉक डिवाइस की तरह उपयोग करना शुरू कर सकते हैं, पहले इसे फॉर्मेट करके और फिर उस पर फाइल रखकर। कुछ बिंदु पर आपको कुछ IO समस्याएँ आनी चाहिए जहाँ आप उन सेक्टरों को हिट करते हैं जो वर्चुअल डिवाइस में वास्तव में IO छेद होते हैं।
एक बार जब आप dmsetup remove errdev0
डिवाइस को हटाने के लिए उपयोग समाप्त कर लेते हैं ।
यदि आप एक IO त्रुटि प्राप्त करना चाहते हैं, तो आप अधिक बार छेद जोड़ सकते हैं या आपके द्वारा बनाए गए छेद का आकार बदल सकते हैं। ध्यान दें कि कुछ सेक्शनों में त्रुटियां होने से गेट-गो की समस्या होने की संभावना है, IE एक डिवाइस में 32mb पर आप एक सुपरब्लॉक लिख सकते हैं, जो सामान्य रूप से करने की कोशिश करता है, इसलिए प्रारूप काम नहीं करेगा।
अतिरिक्त मज़े के लिए - आप वास्तव में बस losetup
तब mkfs.ext4 /dev/loop0
और इसे डेटा के साथ भर सकते हैं। एक बार जब आप वहां पर एक अच्छा काम कर रहे फाइलसिस्टम को प्राप्त कर लेते हैं, तो बस फाइलसिस्टम को अनमाउंट कर दें और dmsetup का उपयोग करके कुछ छेद जोड़ें और रिमाउंट करें!