ইচ্ছাকৃতভাবে লিনাক্সে আই / ও ত্রুটির কারণ?


42

লিনাক্স সহ, যাইহোক, কোনও ব্লক ডিভাইসটি আই / ও ত্রুটিটি উদ্দেশ্যমূলকভাবে রিপোর্ট করার জন্য, বা পরীক্ষার উদ্দেশ্যে সম্ভবত একটির অনুকরণের কারণ আছে?


আপনি কি ডিস্ক ব্যর্থতা অনুকরণ করছেন? সম্ভবত আপনি একটি ডিরেক্টরি মাউন্ট করতে পারেন এবং তারপরে এটি ব্যবহারের সময় আনমাউন্ট করতে পারেন।
শেফ

2
আমি একটি ছোট্ট কার্নেল মডিউল লিখব যা আপনি লোড করতে পারতেন modprobe, একটি ব্লক ডিভাইসের মতো আচরণ করতেন এবং তারপরে অন্য একটি ছোট্ট প্রোগ্রাম যা ioctl()'sড্রাইভারকে আপনার পছন্দসই মানটি ফিরিয়ে দিতে প্রেরণ করে।
অট--


মন্তব্য করেন @Gilles ফলো আপ করতে, এই এছাড়াও জিজ্ঞাসা করা হল ছিল stackoverflow.com/questions/1361518/... (বিভিন্ন দোষ ইনজেকশন উত্তর) এবং stackoverflow.com/questions/1870696/... (ব্যবহারের ডিভাইস ম্যাপার)।
আনন

উত্তর:


54

হ্যাঁ, ডিভাইস ম্যাপার দিয়ে এটি করার একটি খুব প্রশ্রয়জনক উপায় রয়েছে।

ডিভাইস ম্যাপারগুলি আপনার পছন্দসই একটি নতুন ম্যাপিং / ক্রমে ব্লক ডিভাইসগুলি পুনরায় সমন্বিত করতে পারে। এলভিএম এটি করে। এটি ব্যর্থতাযুক্ত ডিস্কের অনুকরণ করতে 'ফ্লকি' এবং ডিস্কের ব্যর্থ অঞ্চলগুলিকে অনুকরণ করতে 'ত্রুটি' এর মতো অন্যান্য লক্ষ্যগুলিও (কিছুটা বেশ উপন্যাস) সমর্থন করে।

কেউ এমন একটি ডিভাইস তৈরি করতে পারেন যা ইচ্ছাকৃতভাবে আইও ব্ল্যাকহোল রয়েছে যা ক্রস করার সময় আইও ত্রুটিগুলি রিপোর্ট করবে report

প্রথমে লক্ষ্য হিসাবে ব্যবহার করতে কিছু ভার্চুয়াল ভলিউম তৈরি করুন এবং এটিকে একটি ব্লক ডিভাইস হিসাবে সম্বোধনযোগ্য করে তুলুন।

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

সুতরাং, এটি শুরু করতে একটি 512M ফাইল তৈরি করে যা আমাদের ভার্চুয়াল ব্লক ডিভাইসের ভিত্তি যা আমরা একটি 'গর্ত' খোঁচা দেব though যদিও কোনও গর্ত এখনও বিদ্যমান নেই। আপনি যদি হন তবে mkfs.ext4 /dev/loop0আপনি একটি সঠিক বৈধ ফাইল সিস্টেম পাবেন get

সুতরাং, আসুন ডিএমসেটআপ ব্যবহার করুন যা এই ব্লক ডিভাইসটি ব্যবহার করে - একটি নতুন ডিভাইস তৈরি করবে যার এতে কিছু ছিদ্র রয়েছে। এখানে প্রথম একটি উদাহরণ

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

এটি 'errdev0' নামে একটি ডিভাইস তৈরি করবে (সাধারণত / dev / mapper এ)। আপনি যখন টাইপ করবেন dmsetup create errdev0এটি স্টিডিনের জন্য অপেক্ষা করবে এবং ^ ডি ইনপুট হবে তা শেষ হবে।

উপরের উদাহরণে, আমরা লুপ ডিভাইসের 261144 সেক্টরে একটি 5 সেক্টর হোল (2.5kb) করেছি। এরপরে আমরা লুপ ডিভাইসটি স্বাভাবিক হিসাবে চালিয়ে যাই।

এই স্ক্রিপ্টটি আপনাকে এমন একটি টেবিল তৈরি করার চেষ্টা করবে যা প্রায় 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

একবার আপনি ডিভাইসটি তৈরি করে নেওয়ার পরে আপনি প্রথমে এটি ফর্ম্যাট করে এবং তারপরে ফাইল স্থাপন করে এটি সাধারণ ব্লক ডিভাইসের মতো ব্যবহার শুরু করতে পারেন। ভার্চুয়াল ডিভাইসে সত্যই IO ছিদ্রকারী সেক্টরগুলিকে আপনি আঘাত করতে এমন কিছু আইও সমস্যা দেখা দিতে পারে।

একবার আপনি dmsetup remove errdev0ডিভাইস সরানোর জন্য ব্যবহার শেষ করেছেন ।

যদি আপনি এটির আইও ত্রুটি পাওয়ার সম্ভাবনা তৈরি করতে চান তবে আপনি আরও ঘন ঘন গর্ত যুক্ত করতে পারেন বা আপনার তৈরি গর্তের আকার পরিবর্তন করতে পারেন। দ্রষ্টব্য নির্দিষ্ট বিভাগগুলিতে ত্রুটি স্থাপনের ফলে 32২ এমবিতে এমন কোনও ডিভাইস পাওয়া যেতে সমস্যা হতে পারে যা আপনি একটি সুপারব্লক লিখতে পারবেন না যা প্রায়শই চেষ্টা করার চেষ্টা করে, তাই বিন্যাসটি কাজ করবে না ..

যুক্ত মজাদার জন্য - আপনি ঠিক losetupতখনই mkfs.ext4 /dev/loop0এটি ডেটা দিয়ে পূরণ করতে পারেন । একবার আপনি সেখানে একটি দুর্দান্ত ওয়ার্কিং ফাইল সিস্টেম পেয়ে যাবেন, কেবল ফাইল সিস্টেমটি আনমাউন্ট করুন এবং ডিএমসেটআপ ব্যবহার করে কিছু গর্ত যুক্ত করুন এবং এটি পুনঃনির্মাণ করুন!


6
আমি জানতাম না যে আপনি এটি করতে পারেন। বেশ দারুন.

15

প্রোগ্রামের দৃust়তা পরীক্ষা করার জন্য যদি তাদের আউটপুট ব্যর্থ হয় তবে আপনি সিউডোডভাইসটি ব্যবহার করতে পারেন /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/Docamentation/fault-inication/fault-inication.txt দেখুন


3
আপনি কি ডিস্কের অনুরোধগুলির জন্য সুনির্দিষ্ট "আকর্ষণীয়" উপায়গুলি হাইলাইট করতে পারবেন ( fail_make_request)? লিঙ্ক পচা রোধ করতেও দুর্দান্ত হবে।
হরিণ হান্টার

1

আপনি পার্টিশন টেবিল পরিবর্তন করতে পারেন এবং পার্টিশনটি এটির চেয়ে বড় করতে পারেন। এটি সম্ভবত একটি আই / ও ত্রুটির কারণ হতে পারে। অথবা যদি আপনার ডিস্কগুলি গরম প্লাগেবল হয় তবে আপনি কেবল একটিটিকে টেনে আনতে পারেন।

আমাদের সাইট ব্যবহার করে, আপনি স্বীকার করেছেন যে আপনি আমাদের কুকি নীতি এবং গোপনীয়তা নীতিটি পড়েছেন এবং বুঝতে পেরেছেন ।
Licensed under cc by-sa 3.0 with attribution required.