มีอยู่แล้วกับ Linux เพื่อจงใจทำให้อุปกรณ์บล็อกเพื่อรายงานข้อผิดพลาด I / O หรืออาจจำลองหนึ่งสำหรับการทดสอบ?
modprobe
ทำตัวเหมือนอุปกรณ์บล็อกจากนั้นอีกหนึ่งโปรแกรมเล็ก ๆ ที่ส่งioctl()'s
ไปยังไดรเวอร์เพื่อให้มันคืนค่าที่คุณต้องการ
มีอยู่แล้วกับ Linux เพื่อจงใจทำให้อุปกรณ์บล็อกเพื่อรายงานข้อผิดพลาด I / O หรืออาจจำลองหนึ่งสำหรับการทดสอบ?
modprobe
ทำตัวเหมือนอุปกรณ์บล็อกจากนั้นอีกหนึ่งโปรแกรมเล็ก ๆ ที่ส่งioctl()'s
ไปยังไดรเวอร์เพื่อให้มันคืนค่าที่คุณต้องการ
คำตอบ:
ใช่มีวิธีที่เป็นไปได้มากในการทำเช่นนี้กับผู้ทำแผนที่อุปกรณ์
ผู้ทำแผนที่อุปกรณ์สามารถรวมอุปกรณ์บล็อกเข้ากับการแมป / ลำดับใหม่ที่คุณเลือก 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 และติดตั้งใหม่!
สำหรับการตรวจสอบความทนทานของโปรแกรมในกรณีที่เอาต์พุตล้มเหลวคุณสามารถใช้ 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
ขึ้นอยู่กับสิ่งที่คุณต้องการทดสอบ การใช้LD_PRELOAD
ไลบรารี ed คุณสามารถหลอกให้แอปพลิเคชันคิดถึงสิ่งต่าง ๆ เช่น 'การเขียนทั้งหมดล้มเหลวENOSPC
หรือEIO
' ตัวอย่างเช่น
คุณสามารถทำได้ในหลายวิธีที่น่าสนใจ ดูhttps://www.kernel.org/doc/Documentation/fault-injection/fault-injection.txt
fail_make_request
) ได้หรือไม่? ก็จะดีเพื่อป้องกันการเชื่อมโยงเน่า
บางทีคุณอาจเปลี่ยนตารางพาร์ติชันและทำให้พาร์ติชันใหญ่กว่าเดิมได้ ที่อาจทำให้เกิดข้อผิดพลาด i / o หรือถ้าดิสก์ของคุณมีความร้อนคุณสามารถดึงออกมาได้