I / O ত্রুটির কারণ হয়ে থাকে এমন বিশেষ ফাইল


13

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

ইউনিক্সের সমস্ত কিছু ফাইল হিসাবে, আমি সন্দেহ করেছিলাম যে কোনও বিশেষ ফাইল থাকতে পারে যা সর্বদা I / O এর ত্রুটি ঘটায় যখন কেউ এটি পড়ার চেষ্টা করে (যেমন / dev)।

কিছু অনুরূপ ফাইল (imo) হবে:

  • /dev/full যদি আপনি এটি লেখার চেষ্টা করেন তবে সর্বদা "ডিভাইসে কোনও স্থান অবশিষ্ট নেই" বলে
  • /dev/null এবং /dev/zero

সুতরাং আমি ধরে নিয়েছি যে সেখানে কেবল একটি ফাইল থাকতে হবে (তবে এখনও এটি খুঁজে পায় নি)।

আমার কাছে পছন্দসই ফলাফল (ইচ্ছাকৃতভাবে ত্রুটিযুক্ত পার্টিশনের চিত্র, এলডিপ্রেলএড ব্যবহার করে () উন্মুক্ত একটি র‌্যাপার, ...) পাওয়ার জন্য এই জাতীয় ফাইল বা অন্য কোনও পদ্ধতি কি কেউ জানেন?
এখানে যাওয়ার সর্বোত্তম উপায় কী?


যতদূর আমি জানি, লিনাক্সে এমন কোনও বিশেষ ফাইল নেই যা আপনি যখন এটি থেকে পড়েন তখন সিমিও দেয়। শেষবার যখন আমি সিআইজিআইও পেলাম তখন একটি ইউএসবি স্টিকের কারণে যা একটি ক্ষমতাটিকে আসল, শারীরিক চেয়ে অনেক বড় ঘোষণা করেছিল। সম্ভবত এটি একটি সম্ভাবনা হতে পারে?
দীর্ঘমেয়াদী

হুম, আমি একটি ছোট্ট পার্টিশন ইমেজের সাহায্যে এটি চেষ্টা করতে সক্ষম হব যা আমি মাঝখানে কোথাও ক্রপ করব ...
মরিথুব

সিআইজিওর অর্থ এই নয় যে কোনও ত্রুটি হয়েছে, এটি এমন একটি উপায় যা একটি প্রোগ্রামটি অবহিত করা উচিত যে নন-ব্লকিং আইও এখন সম্ভব (সিলেক্ট () বা পোল ()) কল করার পরিবর্তে possible
psusi

ওপস, হ্যাঁ, আপনি ঠিক বলেছেন। আমি SIGIO লিখেছিলাম তবে EIO ত্রুটি কোডটি নিয়ে ভাবছিলাম। তবে ওপিও হতে পারে? কেন পড়তে ব্যর্থতা একটি সিআইজিআইও দেবে?
দীর্ঘমেয়াদী

ওহ, আমিও প্রশ্নটিতে একই ভুল করেছি ... এটি সম্পাদনা করেছে ...
ম্রিথুব

উত্তর:


8

আপনি ব্যবহার করতে পারেন dmsetupযেকোন একটি ব্যবহার করে একটি ডিভাইস-ম্যাপার ডিভাইস তৈরি করতে errorবা flakeyঅনুকরণ ব্যর্থতার লক্ষ।

dmsetup create test --table '0 123 flakey 1 0 /dev/loop0'

যেখানে 123 ডিভাইসটির দৈর্ঘ্য, সেক্টর এবং / ডিভ / লুপ 0 মূল ডিভাইস যা আপনি ত্রুটিগুলি অনুকরণ করতে চান want ত্রুটির জন্য, আপনার পরবর্তী যুক্তিগুলির প্রয়োজন নেই কারণ এটি সর্বদা ত্রুটি প্রদান করে।


1
আমি এই কমান্ডটিতে কমপক্ষে দুটি ত্রুটি পেয়েছি: অনুপস্থিত ডিভাইসের নাম, উদ্ধৃতি টাইপো এবং "1 0 / dev / null" মানে কী?
হউক লেগেছে

@ হককিজিং, আহ, হ্যাঁ, আমি নামটি ছেড়ে দিয়েছিলাম এবং কোনওভাবে ভুল উক্তিটি আঘাত করেছি। 1 0 / dev / নাল অর্থ 1 টি লক্ষ্য, অফসেট 0 থেকে শুরু করে ডিভাইস / dev / নাল দ্বারা ব্যাক করা। এটি flakey জন্য প্রয়োজন, কিন্তু সম্ভবত ত্রুটি জন্য alচ্ছিক।
psusi

আমার কাছে মনে হচ্ছে এটি "alচ্ছিক" নয় তবে কেবল উপেক্ষা করা হয়েছে। আপনি চেক করতে পারেন dmsetup table test। এমনকি আপনি foo barপিছনে লিখতে পারেন error; এটি কেবল পাত্তা দেয় না (এবং এভাবে মুছে ফেলা উচিত)।
হউক লেগেইং

@ হককিজিং, সম্পাদিত।
psusi

উত্তরের জন্য ধন্যবাদ, আমি মনে করি আমি এখনই এই পথে যাব। এর সাথে আমার একমাত্র ছোটখাটো সমস্যা হ'ল এটিতে রুট অ্যাক্সেসের প্রয়োজন, তবে আমার ধারণা আপনার যে কোনও উপায়ে বা এ জাতীয় নিম্ন স্তরের জিনিসগুলি প্রয়োজন হবে ... (আমি সময় পেলেই এলডিপ্রেলএড ধারণাটি খনন করব)।
মরিথুব

14

ইতিমধ্যে স্ট্যাক ওভারফ্লো এবং সার্ভার ফল্ট এ এর ​​উত্তরের একটি দুর্দান্ত সেট রয়েছে তবে কিছু কৌশল অনুপস্থিত। জীবনকে আরও সহজ করার জন্য এখানে ভিএম / লিনাক্স ব্লক ডিভাইস / লিনাক্স ফাইল সিস্টেম / লিনাক্স ব্যবহারকারী স্থান লাইব্রেরি I / O ফল্ট ইঞ্জেকশন প্রক্রিয়াগুলির একটি তালিকা রয়েছে:

বোনাস ফ্যাক্ট: এসকিউএলাইটের ত্রুটিগুলি অনুকরণের জন্য একটি ভিএফএস ড্রাইভার রয়েছে যাতে এটি ভাল পরীক্ষার কভারেজ পেতে পারে।

সম্পর্কিত:


5

আপনি I / O এর জন্য একটি ফল্ট ইঞ্জেকশন প্রক্রিয়া চান ।

লিনাক্সে, এখানে এমন একটি পদ্ধতি রয়েছে যার কোনও পূর্ববর্তী সেটআপের প্রয়োজন হয় না এবং একটি অস্বাভাবিক ত্রুটি উত্পন্ন হয় (EIO "ইনপুট / আউটপুট ত্রুটি নয়" তবে ESRCH "এরকম কোনও প্রক্রিয়া নেই"):

cat /proc/1234/mem

যেখানে 1234 হ'ল এমন কোনও প্রক্রিয়াটির পিআইডি হ'ল একই ব্যবহারকারীর হিসাবে চলমান প্রক্রিয়াটির হিসাবে যা আপনি পরীক্ষা করছেন, কিন্তু সেই প্রক্রিয়াটি নিজেই নয়। ক্রেডিট rubasov জন্য চিন্তা এর /proc/$pid/mem

আপনি যদি প্রক্রিয়াটির পিআইডি নিজেই ব্যবহার করেন তবে আপনি ইআইও পাবেন তবে কেবল যদি আপনি এমন কোনও অঞ্চল থেকে পড়ছেন যা প্রক্রিয়াটির স্মৃতিতে ম্যাপযুক্ত নয়। প্রথম পৃষ্ঠাটি কখনই ম্যাপ করা যায় না, সুতরাং আপনি যদি যথাক্রমে ফাইলটি পড়েন তবে ঠিক আছে তবে এটি একটি ডাটাবেস প্রক্রিয়ার জন্য উপযুক্ত নয় যা সরাসরি ফাইলের মাঝখানে সন্ধান করে।

রুট হিসাবে আরও কিছু সেটআপ দিয়ে, আপনি বৈধ খাত এবং খারাপ সেক্টর সহ ফাইলগুলি তৈরি করতে ডিভাইস ম্যাপারকে উত্তোলন করতে পারেন ।

অন্য পদ্ধতির একটি ছোট FUSE ফাইল সিস্টেম বাস্তবায়ন করা হবে । EIO হ'ল ডিফল্ট ত্রুটি কোড যখন আপনার ইউজারস্পেস ফাইলসিস্টেম ড্রাইভারটি কিছু ভুল করে, তাই এটি অর্জন করা সহজ। পার্ল এবং পাইথন উভয় বাঁধাই শুরু করার জন্য উদাহরণ সহ আসে, আপনি দ্রুত একটি ফাইল সিস্টেম লিখতে পারেন যা বেশিরভাগ বিদ্যমান ফাইলগুলিকে আয়না করে তবে সাবধানতার সাথে নির্বাচিত জায়গায় একটি ইআইও ইনজেক্ট করে। এমন একটি বিদ্যমান ফাইল সিস্টেম রয়েছে: পেটার্ডস ( নিবন্ধ ), আমি জানি না যে এটি বাক্স থেকে কীভাবে কার্যকর হয়।

তবুও অন্য একটি পদ্ধতি একটি LD_PRELOADমোড়ক। বিদ্যমান একটি হ'ল লিবিফিউ (ইউজারস্পেসে ফল্ট ইঞ্জেকশন)। এটি একটি লাইব্রেরি প্রিলোড করে কাজ করে যা POSIX API কলগুলি ওভারলোড করে। সাধারণ আচরণকে ওভাররাইড করতে আপনি সাধারণ নির্দেশনা বা স্বেচ্ছাসেবী সি কোড লিখতে পারেন।


লিবিফিউ দেখতে সত্যিই আশাব্যঞ্জক দেখাচ্ছে (এবং এটি ডিবিয়ান স্টোরগুলির মধ্যে রয়েছে)। দুর্দান্ত উত্তর, ধন্যবাদ, +1
মরিথব

1

"I / O ত্রুটিযুক্ত ফাইল" হিসাবে কোনও ডিভাইস ফাইল ব্যবহার করা ঠিক থাকলে সমাধানটি অনেক সহজ। আমার প্রস্তাব সেই সব ক্ষেত্রে যেখানে নিয়মিত ফাইলটিতে ত্রুটি থাকতে পারে।

> dd if=/dev/zero of=/path/to/ext2.img bs=10M count=10
> losetup /dev/loop0 /path/to/ext2.img
> blockdev --getsz /dev/loop0
204800
> echo "0 204800 linear /dev/loop0 0" | dmsetup create sane_dev
> mke2fs /dev/mapper/sane_dev # ext2 reicht
> mount -t ext2 /dev/mapper/sane_dev /some/where
> dd if=/dev/zero of=/some/where/unreadable_file bs=512 count=4
> hdparm --fibmap /some/where/unreadable_file
/mnt/tmp/unreadable_file:
 filesystem blocksize 1024, begins at LBA 0; assuming 512 byte sectors.
 byte_offset  begin_LBA    end_LBA    sectors
           0       2050       2053          4
> umount /dev/mapper/sane_dev
> dmsetup remove sane_dev
> start_sector=$((204800-2053-1))
> echo $'0 2053 linear /dev/loop0 0\n2053 1 error\n2054 '"${start_sector} linear /dev/loop0 2054" | 
>   dmsetup create error_dev
> mount -t ext2 /dev/mapper/error_dev /some/where
> cat /some/where/unreadable_file # 3rd sector of file is unreadable
cat: /some/where/unreadable_file: Input/output error

আমাকে অবশ্যই স্বীকার করতে হবে যে আমি কিছুটা বিভ্রান্ত হয়ে পড়েছি কারণ আমি কোনও ত্রুটি (সহ dd .. seek=...) ছাড়াই সেই ফাইল থেকে একক ক্ষেত্রগুলি পড়তে পারি নি । হতে পারে এটি একটি রিড-ফরোয়ার্ড সমস্যা।


আপনার ফাইল সিস্টেমের ব্লকগুলি কমপক্ষে 4096 বাইট আকারের তাই তারা ফাইল ছোট হলেও একাধিক সেক্টর বিস্তৃত করবে।
আনন

1

আপনি CharybdeFS ব্যবহার করতে পারেন যা ঠিক এই ধরণের উদ্দেশ্যে তৈরি হয়েছিল।

এটি পেটার্ডএফএসের মতো পাসস্ট্রু ফিউজ ফাইল সিস্টেম তবে অনেক বেশি কনফিগারযোগ্য।

চ্যারিডেবিএফএস কুকবুকটি এখানে দেখুন: http://www.scylladb.com/2016/05/02/fault-inication-files system-cookbook /

এটি একটি ডাটাবেস পরীক্ষা করার জন্য যথেষ্ট উন্নত।


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