ทำให้เกิดข้อผิดพลาด I / O ใน Linux โดยเจตนาหรือไม่


42

มีอยู่แล้วกับ Linux เพื่อจงใจทำให้อุปกรณ์บล็อกเพื่อรายงานข้อผิดพลาด I / O หรืออาจจำลองหนึ่งสำหรับการทดสอบ?


คุณกำลังจำลองดิสก์ล้มเหลวหรือไม่? บางทีคุณสามารถติดตั้งไดเรกทอรีแล้วยกเลิกการต่อเชื่อมในขณะที่ใช้งานอยู่
Shef

2
ฉันจะเขียนโมดูลเคอร์เนลเล็ก ๆ น้อย ๆ ที่คุณสามารถโหลดด้วยmodprobeทำตัวเหมือนอุปกรณ์บล็อกจากนั้นอีกหนึ่งโปรแกรมเล็ก ๆ ที่ส่งioctl()'sไปยังไดรเวอร์เพื่อให้มันคืนค่าที่คุณต้องการ
ott--

คำถามเดียวกันในกอง OverlflowและUnix และ Linux
Gilles 'หยุดความชั่วร้าย'

เพื่อติดตามความคิดเห็น @Gilles ที่ทำอย่างนี้ก็ยังได้รับการถามstackoverflow.com/questions/1361518/... (แตกต่างกันหลายคำตอบฉีดความผิด) และstackoverflow.com/questions/1870696/... (ใช้ mapper อุปกรณ์)
Anon

คำตอบ:


54

ใช่มีวิธีที่เป็นไปได้มากในการทำเช่นนี้กับผู้ทำแผนที่อุปกรณ์

ผู้ทำแผนที่อุปกรณ์สามารถรวมอุปกรณ์บล็อกเข้ากับการแมป / ลำดับใหม่ที่คุณเลือก LVM ทำสิ่งนี้ นอกจากนี้ยังสนับสนุนเป้าหมายอื่น ๆ (บางอันค่อนข้างใหม่) เช่น 'flakey' เพื่อจำลองดิสก์ที่ล้มเหลวและ 'ข้อผิดพลาด' เพื่อจำลองภูมิภาคที่ล้มเหลวของดิสก์

หนึ่งสามารถสร้างอุปกรณ์ที่จงใจมี IO blackholes ในนั้นซึ่งจะรายงานข้อผิดพลาด IO เมื่อข้าม

ขั้นแรกให้สร้างโวลุ่มเสมือนบางส่วนเพื่อใช้เป็นเป้าหมายและทำให้แอดเดรสเป็นอุปกรณ์บล็อกได้

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

สิ่งนี้จะสร้างอุปกรณ์ที่เรียกว่า 'errdev0' (โดยทั่วไปจะอยู่ใน / dev / mapper) เมื่อคุณพิมพ์dmsetup create errdev0มันจะรอ stdin และจะเสร็จสิ้นใน ^ D กำลังป้อนข้อมูล

ในตัวอย่างข้างต้นเราได้สร้างหลุม 5 ส่วน (2.5kb) ที่ส่วน 261144 ของอุปกรณ์วนรอบ จากนั้นเราจะดำเนินการต่อผ่านอุปกรณ์ลูปตามปกติ

สคริปต์นี้จะพยายามสร้างตารางที่จะวางหลุมในตำแหน่งสุ่มโดยประมาณประมาณ 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 คุณสามารถเพิ่มรูบ่อยขึ้นหรือเปลี่ยนขนาดของรูที่คุณสร้าง หมายเหตุการใส่ข้อผิดพลาดในบางส่วนมีแนวโน้มที่จะทำให้เกิดปัญหาจากการ get-go, IE ที่ 32mb ลงในอุปกรณ์ที่คุณไม่สามารถเขียน superblock ซึ่ง ext โดยปกติจะพยายามทำดังนั้นรูปแบบจะไม่ทำงาน ..

เพื่อความสนุกสนานเพิ่ม - คุณสามารถจริงเพียงแค่losetupนั้นmkfs.ext4 /dev/loop0และกรอกด้วยข้อมูล เมื่อคุณมีระบบไฟล์ที่ใช้งานได้ดีเพียงแค่ถอนติดตั้งระบบไฟล์และเพิ่มบางหลุมโดยใช้ dmsetup และติดตั้งใหม่!


6
ฉันไม่รู้ว่าคุณสามารถทำได้ สวยเท่ห์

15

สำหรับการตรวจสอบความทนทานของโปรแกรมในกรณีที่เอาต์พุตล้มเหลวคุณสามารถใช้ pseudodevice /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ไลบรารี ed คุณสามารถหลอกให้แอปพลิเคชันคิดถึงสิ่งต่าง ๆ เช่น 'การเขียนทั้งหมดล้มเหลวENOSPCหรือEIO' ตัวอย่างเช่น


7

คุณสามารถทำได้ในหลายวิธีที่น่าสนใจ ดูhttps://www.kernel.org/doc/Documentation/fault-injection/fault-injection.txt


3
คุณสามารถเน้นวิธี "น่าสนใจ" ที่เกี่ยวข้องที่เฉพาะเจาะจงสำหรับการร้องขอดิสก์ ( fail_make_request) ได้หรือไม่? ก็จะดีเพื่อป้องกันการเชื่อมโยงเน่า
Deer Hunter

1

บางทีคุณอาจเปลี่ยนตารางพาร์ติชันและทำให้พาร์ติชันใหญ่กว่าเดิมได้ ที่อาจทำให้เกิดข้อผิดพลาด i / o หรือถ้าดิสก์ของคุณมีความร้อนคุณสามารถดึงออกมาได้

โดยการใช้ไซต์ของเรา หมายความว่าคุณได้อ่านและทำความเข้าใจนโยบายคุกกี้และนโยบายความเป็นส่วนตัวของเราแล้ว
Licensed under cc by-sa 3.0 with attribution required.