सवाल जानबूझकर लिनक्स में आई / ओ त्रुटि का कारण बनता है?


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


40
2018-04-12 20:15


मूल


क्या आप डिस्क विफलता अनुकरण कर रहे हैं? शायद आप एक निर्देशिका को माउंट कर सकते हैं और फिर उपयोग में होने पर इसे अनमाउंट कर सकते हैं। - Shef
मैं एक छोटा कर्नेल मॉड्यूल लिखूंगा जिसे आप लोड कर सकते हैं modprobe, एक ब्लॉक डिवाइस की तरह व्यवहार, और फिर एक और छोटा कार्यक्रम भेजता है ioctl()'s ड्राइवर को उस मूल्य को वापस करने के लिए जो आप चाहते हैं उसे वापस कर दें। - ott--
वही सवाल है ढेर ओवरलैफ्लो और इसपर यूनिक्स और लिनक्स। - Gilles
@Gilles की टिप्पणी का पालन करने के लिए, यह भी पूछा गया था stackoverflow.com/questions/1361518/... (कई अलग-अलग गलती इंजेक्शन उत्तरों) और stackoverflow.com/questions/1870696/... (डिवाइस मैपर का उपयोग करें)। - Anon


जवाब:


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

डिवाइस मैपर ब्लॉक डिवाइस को आपके चयन के नए मैपिंग / ऑर्डर में पुन: संयोजित कर सकता है। एलवीएम यह करता है। यह डिस्क के असफल क्षेत्रों को अनुकरण करने के लिए एक विफल डिस्क और 'त्रुटि' को अनुकरण करने के लिए 'flakey' जैसे अन्य लक्ष्यों का समर्थन करता है, (कुछ जो उपन्यास हैं)।

कोई ऐसा डिवाइस बना सकता है जो जानबूझकर आईओ ब्लैकहोल पर है जो पार होने पर आईओ त्रुटियों की रिपोर्ट करेगा।

सबसे पहले, लक्ष्य के रूप में उपयोग करने के लिए कुछ वर्चुअल वॉल्यूम बनाएं और इसे ब्लॉक डिवाइस के रूप में एड्रेसेबल बनाएं।

dd if=/dev/zero of=/var/lib/virtualblock.img bs=512 count=1048576
losetup /dev/loop0 /var/lib/virtualblock.img

इसलिए, इसे शुरू करने के लिए 512 एम फ़ाइल बनाता है जो हमारे आभासी ब्लॉक डिवाइस का आधार है जिसे हम 'छेद' में पंच करेंगे। हालांकि कोई छेद मौजूद नहीं है। यदि आप थे mkfs.ext4 /dev/loop0 आप एक पूरी तरह से वैध फाइल सिस्टम प्राप्त करेंगे।

तो, इस ब्लॉक डिवाइस का उपयोग करके, dmsetup का उपयोग करें - एक नया डिवाइस बनाएगा जिसमें इसमें कुछ छेद हैं। पहले एक उदाहरण यहाँ है

dmsetup create errdev0
0 261144 linear /dev/loop0 0
261144 5 error
261149 787427 linear /dev/loop0 261139

यह 'errdev0' नामक एक डिवाइस बनाएगा (आमतौर पर / dev / mapper में)। जब आप टाइप करते हैं dmsetup create errdev0 यह stdin के लिए इंतजार करेगा और ^ डी इनपुट पर खत्म हो जाएगा।

उपर्युक्त उदाहरण में, हमने लूप डिवाइस के सेक्टर 261144 में 5 सेक्टर छेद (2.5 केबी) बनाया है। फिर हम लूप डिवाइस को सामान्य के रूप में जारी रखते हैं।

यह स्क्रिप्ट आपको एक टेबल उत्पन्न करने का प्रयास करेगी जो लगभग 16 एमबी (हालांकि इसकी सुंदर यादृच्छिक) के आसपास फैले यादृच्छिक स्थानों पर छेद रखेगी।

#!/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}"

स्क्रिप्ट मानती है कि आपने 512 एमबी डिवाइस भी बनाया है और आपका वर्चुअल ब्लॉक डिवाइस चालू है /dev/loop0

आप इस डेटा को किसी तालिका फ़ाइल में तालिका के रूप में आउटपुट कर सकते हैं और इसे पाइप कर सकते हैं dmsetup create errdev0

एक बार जब आप डिवाइस बना लेंगे तो आप इसे सामान्य ब्लॉक डिवाइस की तरह उपयोग करना शुरू कर सकते हैं, पहले इसे स्वरूपित करके और फिर फ़ाइलों को रखकर। किसी बिंदु पर आपको कुछ आईओ समस्याओं में आना चाहिए जहां आप वर्चुअल डिवाइस में वास्तव में आईओ छेद वाले क्षेत्रों को हिट करते हैं।

एक बार उपयोग समाप्त हो जाने के बाद dmsetup remove errdev0 डिवाइस को हटाने के लिए।

यदि आप आईओ त्रुटि प्राप्त करने की अधिक संभावना बनाते हैं तो आप छेद जोड़ सकते हैं या आपके द्वारा बनाए गए छेद के आकार को बदल सकते हैं। नोट कुछ निश्चित खंडों में त्रुटियों को डालने से समस्याएं दूर हो सकती हैं, आईई 32 एमबी पर एक डिवाइस में आप एक सुपरब्लॉक लिख नहीं सकते जो आम तौर पर करने की कोशिश करता है, इसलिए प्रारूप काम नहीं करेगा ..

अतिरिक्त मज़े के लिए - आप वास्तव में बस कर सकते हैं losetup फिर mkfs.ext4 /dev/loop0 और इसे डेटा के साथ भरें। एक बार जब आप वहां एक अच्छी काम कर रहे फाइल सिस्टम प्राप्त कर लेते हैं, तो बस फाइल सिस्टम को अनमाउंट करें और dmsetup का उपयोग करके कुछ छेद जोड़ें और उसे दोबारा दें!


50
2018-04-12 22:33



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


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

$ 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

13
2018-04-12 21:58





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


6
2018-04-12 20:46





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


5
2018-04-12 22:56



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


हो सकता है कि आप विभाजन तालिका बदल सकें और विभाजन को बड़ा कर सकें जो वास्तव में है। इससे शायद आई / ओ त्रुटि हो जाएगी। या यदि आपकी डिस्क गर्म प्लग करने योग्य हैं तो आप केवल एक को खींच सकते हैं।


0
2018-04-12 21:01