आमतौर पर लिनक्स में I / O त्रुटि होती है?


42

वैसे भी, लिनक्स के साथ, I / O त्रुटि की रिपोर्ट करने के लिए जानबूझकर ब्लॉक डिवाइस का कारण बनता है, या संभवतः परीक्षण उद्देश्यों के लिए एक अनुकरण?


क्या आप डिस्क विफलता का अनुकरण कर रहे हैं? शायद आप एक निर्देशिका को माउंट कर सकते हैं और तब इसे अनमाउंट कर सकते हैं जब यह उपयोग में था।
शेफ

2
मैं एक छोटा कर्नेल मॉड्यूल लिखूंगा जिसे आप लोड कर सकते हैं modprobe, एक ब्लॉक डिवाइस की तरह व्यवहार कर सकते हैं, और फिर एक और छोटा प्रोग्राम जो ioctl()'sड्राइवर को भेजता है ताकि वह आपके इच्छित मान को वापस कर सके।
ott--


@Gilles द्वारा की गई टिप्पणी का अनुसरण करने के लिए, इस पर भी पूछा गया था stackoverflow.com/questions/1361518/… (कई अलग-अलग दोष इंजेक्शन जवाब) और stackoverflow.com/questions/1870696/… (डिवाइस मैस्टर का उपयोग करें)।
आयन

जवाबों:


54

हां, डिवाइस मैपर के साथ ऐसा करने के लिए एक बहुत ही प्रशंसनीय तरीका है।

डिवाइस मैपर आपके चयन के एक नए मैपिंग / ऑर्डर में ब्लॉक डिवाइसेस को फिर से जोड़ सकता है। 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 का उपयोग करके कुछ छेद जोड़ें और रिमाउंट करें!


6
मुझे नहीं पता था कि आप ऐसा कर सकते हैं। बहुत अच्छा।

15

यदि उनका आउटपुट विफल हो जाता है, तो प्रोग्राम की मजबूती की जाँच करने के लिए, आप /dev/fullछद्म कोड का उपयोग कर सकते हैं , जो हमेशा लिखे जाने पर "ENOSPACE" देता है।

$ dd if=/dev/zero of=/dev/full
dd: writing to `/dev/full': No space left on device
1+0 records in
0+0 records out

7

आप क्या परीक्षण करना चाहते हैं पर निर्भर करता है। एक LD_PRELOADएड लाइब्रेरी का उपयोग करके , आप उदाहरण के लिए 'सभी राइट्स के साथ विफल ENOSPCया EIO' जैसी चीजों में एप्लिकेशन को ट्रिक कर सकते हैं ।


7

आप ओह में इतने दिलचस्प तरीके से कर सकते हैं। Https://www.kernel.org/doc/Documentation/fault-injection/fault-injection.txt देखें


3
क्या आप प्रासंगिक "दिलचस्प" तरीकों को उजागर कर सकते हैं जो डिस्क अनुरोधों ( fail_make_request) के लिए विशिष्ट हैं ? लिंक रोट को रोकने के लिए भी बहुत अच्छा होगा।
हिरण हंटर

1

शायद आप विभाजन तालिका को बदल सकते हैं और विभाजन को बड़ा बना सकते हैं कि यह वास्तव में है। कि शायद एक i / o त्रुटि का कारण होगा। या यदि आपके डिस्क गर्म प्लगेबल हैं तो आप बस एक को बाहर निकाल सकते हैं।

हमारी साइट का प्रयोग करके, आप स्वीकार करते हैं कि आपने हमारी Cookie Policy और निजता नीति को पढ़ और समझा लिया है।
Licensed under cc by-sa 3.0 with attribution required.