আমি এখানে আমার উত্তরটির যুক্তি এবং / বা সত্যতার বিষয়ে গতকাল কারও সাথে সামান্য বিতর্কে জড়িয়ে পড়েছি , ভদ্রতার (জিবি +) আকারের এসডি কার্ডে fs মেটা-ডেটা লগইন করা এবং বজায় রাখা কার্ডটি পরিধানের পক্ষে যথেষ্ট পরিমাণে কখনই তাত্পর্যপূর্ণ হতে পারে না could একটি যুক্তিসঙ্গত পরিমাণ সময় (বছর এবং বছর) আউট। পাল্টা-যুক্তির বক্তব্যটি দেখে মনে হয়েছিল যে এসডি কার্ড পরা লোকদের অনলাইনে প্রচুর গল্প রয়েছে বলে আমার অবশ্যই ভুল হতে হবে।
যেহেতু 24/7 এ বাকি rw রুট ফাইল সিস্টেমগুলি রয়েছে সেগুলিতে আমার এসডি কার্ডগুলির সাথে ডিভাইস রয়েছে, তাই আমি নিজের সন্তুষ্টির আগে ভিত্তিটি পরীক্ষা করেছিলাম। আমি এই পরীক্ষাটি কিছুটা টুইট করেছি, পুনরাবৃত্তি করেছি (একই কার্ডটি ব্যবহার করে, বাস্তবে) এবং এটি এখানে উপস্থাপন করছি। আমার কাছে দুটি কেন্দ্রীয় প্রশ্ন হ'ল:
- কার্ডটি নষ্ট করার চেষ্টা করার জন্য আমি যে পদ্ধতিটি ব্যবহার করেছি তা কি মনে রাখা উচিত, অল্প পরিমাণে ডেটা অবিচ্ছিন্নভাবে পুনরায় লেখার প্রভাবগুলি পুনরুত্পাদন করার উদ্দেশ্যে ?
- কার্ডটি যাচাই করতে আমি যে পদ্ধতিটি ব্যবহার করেছি তা কি এখনও কার্যকর ছিল?
আমি এখানে এসও বা সুপার ইউজারের চেয়ে প্রশ্নটি রাখছি কারণ প্রথম অংশের আপত্তি সম্ভবত এটির দাবিতে হবে যে আমার পরীক্ষাটি সত্যিই কার্ডটিতে লিখেনি যে আমি নিশ্চিত যে এটি করছি, এবং জোর দিয়ে কিছুটা প্রয়োজন লিনাক্স বিশেষ জ্ঞান।
[এটি এমনও হতে পারে যে এসডি কার্ডগুলি কোনও ধরণের স্মার্ট বাফারিং বা ক্যাশে ব্যবহার করে, যেমন একই জায়গায় বার বার লেখার জন্য বাফার / ক্যাশে দেওয়া হবে যেখানে পরতে কম ঝুঁকির আশঙ্কা রয়েছে। আমি এর কোথাও এর কোনও ইঙ্গিত পাইনি, তবে এসইউতে আমি এটি সম্পর্কে জিজ্ঞাসা করছি ]
পরীক্ষার পিছনে ধারণাটি হ'ল কয়েক বার কার্ডে একই ছোট ব্লকে লেখা। এই জাতীয় ডিভাইসগুলি কতগুলি লেখার চক্রটি বজায় রাখতে পারে তার কোনও দাবির বাইরে এটি ঠিক নয়, তবে অনুমান করা হয় যে পরিধান স্তর সমান করা কার্যকর, যদি কার্ডটি একটি আকারের আকারের হয় তবে লক্ষ লক্ষ লেখক এখনও খুব বেশি গুরুত্ব পাবে না, কারণ "একই ব্লক" হবে আক্ষরিকভাবে একই শারীরিক ব্লক না। এটি করার জন্য, আমার নিশ্চিত হওয়া দরকার যে প্রতিটি লেখা সত্যই হার্ডওয়্যার এবং একই আপাত স্থানে ফ্লাশ হয়েছে ।
হার্ডওয়্যার থেকে ফ্লাশ করার জন্য, আমি পসআইএক্স লাইব্রেরি কলটিতে নির্ভর করেছি fdatasync()
:
#include <stdio.h>
#include <string.h>
#include <fcntl.h>
#include <errno.h>
#include <unistd.h>
#include <stdlib.h>
// Compile std=gnu99
#define BLOCK 1 << 16
int main (void) {
int in = open ("/dev/urandom", O_RDONLY);
if (in < 0) {
fprintf(stderr,"open in %s", strerror(errno));
exit(0);
}
int out = open("/dev/sdb1", O_WRONLY);
if (out < 0) {
fprintf(stderr,"open out %s", strerror(errno));
exit(0);
}
fprintf(stderr,"BEGIN\n");
char buffer[BLOCK];
unsigned int count = 0;
int thousands = 0;
for (unsigned int i = 1; i !=0; i++) {
ssize_t r = read(in, buffer, BLOCK);
ssize_t w = write(out, buffer, BLOCK);
if (r != w) {
fprintf(stderr, "r %d w %d\n", r, w);
if (errno) {
fprintf(stderr,"%s\n", strerror(errno));
break;
}
}
if (fdatasync(out) != 0) {
fprintf(stderr,"Sync failed: %s\n", strerror(errno));
break;
}
count++;
if (!(count % 1000)) {
thousands++;
fprintf(stderr,"%d000...\n", thousands);
}
lseek(out, 0, SEEK_SET);
}
fprintf(stderr,"TOTAL %lu\n", count);
close(in);
close(out);
return 0;
}
পার্টিশনের শুরুতে 2 মিলিয়ন + লেখার আগ পর্যন্ত আমি এটি আট ঘন্টা /dev/sdb1
চালিয়েছি। 1 আমি কেবল সহজেই ব্যবহার করতে পারতাম /dev/sdb
(কাঁচা ডিভাইস এবং পার্টিশনটি নয়) তবে এটি কী পার্থক্য করতে পারে তা আমি দেখতে পাচ্ছি না।
আমি তখন একটি ফাইল সিস্টেম তৈরি এবং মাউন্ট করার চেষ্টা করে কার্ডটি পরীক্ষা করেছিলাম /dev/sdb1
। এটি কাজ করেছিল, আমি যে নির্দিষ্ট ব্লকটি সারা রাত ধরে লিখেছিলাম তা ইঙ্গিত দিয়েছিল তা সম্ভব ছিল। যাইহোক, এর অর্থ এই নয় যে কার্ডের কিছু অঞ্চল জীর্ণ হয়নি এবং পরিধান স্তরের দ্বারা স্থানচ্যুত হয়নি, তবে অ্যাক্সেসযোগ্য ছিল।
এটি পরীক্ষা করতে, আমি badblocks -v -w
পার্টিশনটিতে ব্যবহার করেছি । এটি একটি ধ্বংসাত্মক পাঠ্য-লেখার পরীক্ষা, তবে সমতলকরণ করা বা না পরা, এটি কার্ডের সম্ভাব্যতার একটি দৃ strong় ইঙ্গিত হওয়া উচিত কারণ এটি প্রতিটি রোলিং লেখার জন্য অবশ্যই স্থান সরবরাহ করতে হবে। অন্য কথায়, এটি কার্ড পুরোপুরি পূরণ করার আক্ষরিক সমতুল্য, তারপরে যা যা ঠিক আছে তা পরীক্ষা করে নেওয়া। বেশ কয়েকবার, যেহেতু আমি ব্যাডব্লকগুলিকে কয়েকটি নিদর্শন দিয়ে কাজ করতে দিয়েছি।
[নীচে কনট্রা জেসন সি'র মন্তব্য, এইভাবে ব্যাডব্লকগুলি ব্যবহার করা সম্পর্কে ভুল বা মিথ্যা কিছুই নেই। যদিও এটি এসডি কার্ডগুলির প্রকৃতির কারণে খারাপ ব্লকগুলি চিহ্নিত করার জন্য কার্যকর হবে না, তবে এটি -b
এবং -c
স্যুইচগুলি ব্যবহার করে একটি স্বেচ্ছাসেবীর আকারের ধ্বংসাত্মক পঠন-লিখন পরীক্ষা করা ভাল, যেখানে সংশোধিত পরীক্ষাটি গেছে (আমার নিজের উত্তর দেখুন )। কার্ডের নিয়ামক দ্বারা কোনও পরিমাণ যাদু বা ক্যাশিং কোনও পরীক্ষা বোকা বানাতে পারে না যার মাধ্যমে বেশ কয়েকটি মেগাবাইট ডেটা হার্ডওয়ারে লেখা যায় এবং আবার সঠিকভাবে পড়তে পারে। জেসনের অন্যান্য মন্তব্যগুলি ভুল প্রবন্ধের উপর ভিত্তি করে মনে হচ্ছে - আইএমও একটি ইচ্ছাকৃত মন্তব্য , যার কারণেই আমি তর্ক করতে বিরত হই নি। মাথাটা উপরে উঠার সাথে সাথে আমি এটি পাঠকের উপর ছেড়ে দিয়েছি কী বোঝায় এবং কোনটি বোঝায় না ।]
1 কার্ডটি পুরানো 4 জিবি স্যান্ডিস্ক কার্ড ছিল (এতে কোনও "শ্রেণি" নম্বর নেই) যা আমি সবে ব্যবহার করেছি। আবারও, মনে রাখবেন যে এটি 2 মিলিয়ন নয় আক্ষরিকভাবে একই শারীরিক স্থানে লিখেছেন; "প্রথম ব্লক" সমতলকরণের কারণে পরীক্ষার সময় নিয়ন্ত্রক নিয়মিতভাবে সরানো হবে, শব্দটি হিসাবে এই শব্দটি পরিধানকে সমতল করে দিয়েছে।
/dev/sdb1
বনাম হিসাবে /dev/sdb
এটি আপনার প্রোগ্রামের জন্য কোনও তাত্পর্যপূর্ণ করে না , তবে কী কী পার্থক্য করে (নীচে বর্ণিত হয়েছে) তা হ'ল আপনার ডিভাইসে অব্যবহৃত ব্লকগুলির অবস্থাটি আপনার পরীক্ষায় অজানা এবং অ্যাকাউন্টহীন নয় এবং আপনি পুরো ডিভাইসটি পূরণ না করে (উদাঃ) /dev/sdb
) প্রথমে ডেটা সহ, স্পেস ওয়্যার সমতলকরণের পরিমাণের সাথে কাজ করতে হবে তা একটি প্রধান পরিবর্তনশীল। সুতরাং ডিভাইস বনাম পার্টিশনটি আপনার পরীক্ষার জন্য অপ্রাসঙ্গিক, এটি বেশিরভাগ ক্ষেত্রে ত্রুটিযুক্ত পরীক্ষার ফলস্বরূপ, সঠিকভাবে ডেটা দিয়ে ডিভাইসটি পূরণ করার পরে, পার্টিশনটি কোনও উপলভ্য বিকল্প হতে পারে না (যদি আপনি পরে বিন্যাস না করেন)।
badblocks
কোনও ফ্ল্যাশ ড্রাইভে পৃষ্ঠা ব্যর্থতা প্রদর্শন করতে ব্যবহার করতে পারবেন না (এবং দাবি এটি খুব বিভ্রান্তিকর)। এগুলি নিয়ন্ত্রণকারী দ্বারা পরিচালিত হয় এবং সনাক্ত করার সময় স্থান সংরক্ষণে ম্যাপ করা হয়। ড্রাইভে থাকা তথ্যের দৈহিক বিন্যাস আই / ও করার সময় আপনি যে শারীরিক বিন্যাস দেখেন সেটির মতো নয়, এভাবে পরিধান স্তরের স্তরটি তার স্বচ্ছতা বজায় রাখে। আই / ও এর সময় এগুলির কোনওটি আপনার কাছে দৃশ্যমান নয়। সর্বাধিকত, যদি ড্রাইভটি স্মার্টকে সমর্থন করে তবে আপনি নিয়ামক থেকে ব্যর্থতা এবং অবশিষ্ট সংরক্ষিত স্থান সম্পর্কে সামান্য তথ্য পেতে পারেন।