আমি কিভাবে লিনাক্সে এসডি কার্ডের সম্পূর্ণ ক্ষমতা পরীক্ষা করতে পারি?


16

আমি ইবে থেকে 64 গিগাবাইট এসডি কার্ড কিনেছি। যখন এটি একটি আর্চ লিনাক্স এআরএম চিত্রটি পুড়িয়ে দেয় তখন এটি সূক্ষ্ম কাজ করে এবং আমার রাস্পবেরী Pi বুট করার জন্য এটি ব্যবহার করে।

যাইহোক, যখন আমি কার্ডের সমস্ত ক্ষমতা ব্যবহার করার জন্য এটিতে একটি একক ext4 পার্টিশন তৈরি করার চেষ্টা করি, ত্রুটি ঘটে। mkfs.ext4সর্বদা সুখী সমাপ্তি; যাইহোক, পার্টিশনটি সম্পাদন করা যায় না mount, সর্বদা একটি ত্রুটি নিক্ষেপ করে এবং dmesgকার্নেল বার্তাগুলি দেখায় Cannot find journal। এটি কমপক্ষে দুটি প্ল্যাটফর্মের ক্ষেত্রে প্রমাণিত হয়েছে: আর্ক লিনাক্স এআরএম এবং উবুন্টু 13.04।

অন্যদিকে, আমি কোনও ত্রুটি ছাড়াই একটি FAT32 পার্টিশন তৈরি এবং মাউন্ট করতে পারি (সম্পূর্ণ ক্ষমতা যাচাই করা হয়নি)।

আমি শুনেছি কিছু ভাল লোকই এসএস কার্ডের ইন্টারফেস পরিবর্তন করতে পারে যাতে এটি একটি ভাল দামে কার্ডটি বিক্রি করার জন্য OS তে ভুল ক্ষমতার প্রতিবেদন করতে পারে (অর্থাত্ কার্ডটি কেবল ২ গিগাবাইট তবে এটি 64 গিগাবাইট হিসাবে নিজেকে রিপোর্ট করে)।

আমি badblocksখারাপ ব্লক জন্য এসডি কার্ড চেক আমার জন্য বিদ্যমান সরঞ্জাম জানি । badblocksএই মত সমস্যা সনাক্ত করতে পারেন ? যদি না হয়, কার্ড পরীক্ষা করার জন্য আমার অন্যান্য সমাধান কি?

আমি আদর্শভাবে জানতে চাই যে আমি প্রতারণা করেছি কিনা বা না; যদি ফলাফল দেখায় যে আমি একটি খারাপ আইটেম পেয়েছি, আমি শুধুমাত্র বিক্রেতার কাছে ফিরে আসতে পারি, বরং ইবে রিপোর্ট করতে পারি যে কেউ আমাকে প্রতারণার চেষ্টা করেছে।

হালনাগাদ

অপারেশন এবং বার্তা:

~$ sudo mkfs.ext4 /dev/sde1
mke2fs 1.42.5 (29-Jul-2012)
Filesystem label=
OS type: Linux
Block size=4096 (log=2)
Fragment size=4096 (log=2)
Stride=0 blocks, Stripe width=0 blocks
4096000 inodes, 16383996 blocks
819199 blocks (5.00%) reserved for the super user
First data block=0
Maximum filesystem blocks=4294967296
500 block groups
32768 blocks per group, 32768 fragments per group
8192 inodes per group
Superblock backups stored on blocks: 
    32768, 98304, 163840, 229376, 294912, 819200, 884736, 1605632, 2654208, 
4096000, 7962624, 11239424

Allocating group tables: done                            
Writing inode tables: done                            
Creating journal (32768 blocks): done
Writing superblocks and filesystem accounting information: done   

~$ dmesg | tail
...
[4199.749118]...
~$ sudo mount /dev/sde1 /mnt
mount: wrong fs type, bad option, bad superblock on /dev/sde1,
   missing codepage or helper program, or other error
   In some cases useful info is found in syslog - try
   dmesg | tail  or so

~$ dmesg | tail
...
[ 4199.749118]...
[ 4460.857603] JBD2: no valid journal superblock found
[ 4460.857618] EXT4-fs (sde1): error loading journal

হালনাগাদ

আমি রান আছে badblocks /dev/sdeকিন্তু এটা কোন ত্রুটি রিপোর্ট। এর মানে হল অবশিষ্ট কারণগুলি হল:

  • এসডি গাড়ীটি ভাল তবে কিছু কারণের জন্য mke2fsবা mountকার্নেলটিতে একটি বাগ রয়েছে যা সমস্যার কারণ করে।

  • আমি এমনভাবে প্রতারিত ছিলাম badblocksযে পরাজয়ের সন্ধান করতে পারিনি। এটি যুক্তিযুক্ত কারণ আমি মনে করি badblocksকেবল কিছু জায়গায় লিখতে-পড়ার পরীক্ষা করা হচ্ছে। যাইহোক, প্রতারক আউটবাউন্ড এলাকায় অ্যাক্সেস করতে পারেন কিছু অন্তর্মুখী ব্লক লিঙ্ক। এই ক্ষেত্রে একটি অন-লিখতে লিখুন-পড়া চেক সমস্যা সনাক্ত করতে পারবেন না।

যদি কোনও অ্যাপ্লিকেশন না থাকে তবে সঠিক পরীক্ষা করতে পারে, আমি মনে করি আমি এটি পরীক্ষা করার জন্য একটি সহজ সি প্রোগ্রাম লিখতে চেষ্টা করতে পারি।


আপনি এটি একটি SDXC ইউএসবি কার্ড রিডারে চেষ্টা করেছেন?
ইগনাসিও ভাকুক্জ-এব্রামস

এছাড়াও, ত্রুটি বার্তা হিসাবে একই সময়ে সিস্টেম লগ প্রদর্শিত কোন বার্তা?
ইগনাসিও ভাকুক্জ-এব্রামস

আমি উভয় নেটিভ রাস্পবেরি পাই কার্ড রিডার এবং আমার উবুন্টু ডেস্কটপের জন্য বহিরাগত কার্ড পাঠক উভয়ের সাথেও চেষ্টা করেছি। আমি বলেছি যে dmesgকার্নেল বার্তাগুলি দেখায় এবং আমি নিশ্চিত যে এটি ত্রুটিগুলির সাথে একই সময়ে প্রদর্শিত হবে কারণ আমি আগে এবং পরে এটি করেছি এবং তাদের তুলনা করেছি। আমি চেক না syslogকারণ আমি বিশ্বাস dmesgবার্তা প্রদর্শন করা হবে।
পৃথিবী ইঞ্জিন

এটা অন্য কোন বার্তা প্রদর্শন করে?
ইগনাসিও ভজুক্জ-এব্রামস

আমি ব্যবহৃত বহিরাগত কার্ড পাঠক আমার অন্যান্য কার্ডের জন্য কাজ করছে, এসডিএক্সসি কার্ড রয়েছে। তবে সমস্যাযুক্ত ব্যক্তির মধ্যে একটি পার্থক্য রয়েছে: এটি একটি এসডি অ্যাডাপ্টারের সাথে একটি মাইক্রো এসডি কার্ড।
আর্থ ইঞ্জিন

উত্তর:


25

যদি কেউ পরে এটি দেখে তবে কেউ কেউ এসডি কার্ড এবং অন্যান্য মিডিয়াগুলির ক্ষমতা পরীক্ষা করার জন্য "F3" নামের একটি ওপেন সোর্স টুল লিখেছেন। এটি প্রকল্প হোম পেজ এবং গীথুব মধ্যে পাওয়া যাবে ।


প্রকৃতপক্ষে এটি এসডি কার্ডগুলির পরীক্ষা করার বিষয়টির রেফারেন্স ...
ফিলিপ গাচোড

6

প্রতারণা এখন নিম্নলিখিত পদক্ষেপ দ্বারা নিশ্চিত করা হয়েছে:

  • একটি এলোমেলো তথ্য ফাইল তৈরি করুন। (4194304 = 4 × 1024 × 1024 = 4 MiB, মোট আকার = 40 × 4 MiB = 160 MiB)

    COMMAND:

    dd if=/dev/urandom of=test.orig bs=4194304 count=40
    40+0 records in
    40+0 records out
    167772160 bytes (168 MB) copied, 11.0518 s, 15.2 MB/s
    
  • এসডি কার্ড থেকে তথ্য অনুলিপি করুন। (2038340 × 4096 = 8153600 KiB = 7962.5 MiB)

    COMMAND:

    sudo dd if=test.orig of=/dev/sde seek=2038399 bs=4096
    40960+0 records in
    40960+0 records out
    167772160 bytes (168 MB) copied, 41.6087 s, 4.0 MB/s
    
  • এসডি কার্ড থেকে তথ্য ফিরে পড়ুন।

    COMMAND:

    sudo dd if=/dev/sde of=test.result skip=2038399 bs=4096 count=40960
    40960+0 records in
    40960+0 records out
    167772160 bytes (168 MB) copied, 14.5498 s, 11.5 MB/s
    
  • ফলাফল দেখান

    COMMAND:

    hexdump test.result | less
    ...
    0000ff0 b006 fe69 0823 a635 084a f30a c2db 3f19
    0001000 0000 0000 0000 0000 0000 0000 0000 0000
    *
    1a81000 a8a5 9f9d 6722 7f45 fbde 514c fecd 5145
    
    ...
    

কি হলো? আমরা zeros একটি ফাঁক পালন। এটি একটি নির্দেশক যে র্যান্ডম তথ্য কার্ডে আসলে লেখা হয় নি। কিন্তু কেন তথ্য পরে ফিরে আসা 1a81000? অবশ্যই কার্ড একটি অভ্যন্তরীণ ক্যাশে আছে।

আমরা ক্যাশে আচরণ তদন্ত করার চেষ্টা করতে পারেন।

hexdump test.orig | grep ' 0000 0000 '

কোন ফলাফল প্রদান করা হয়, যা উত্পন্ন আবর্জনা যেমন একটি প্যাটার্ন নেই মানে। যাহোক,

hexdump test.result | grep ' 0000 0000 '
0001000 0000 0000 0000 0000 0000 0000 0000 0000
213b000 0000 0000 0000 0000 0000 0000 0000 0000
407b000 0000 0000 0000 0000 0000 0000 0000 0000
601b000 0000 0000 0000 0000 0000 0000 0000 0000

4 ম্যাচ আছে।

তাই এটি badblocksচেক পাস কেন । আরও পরীক্ষাগুলি দেখাতে পারে যে প্রকৃত ক্ষমতা 7962.5 এমবি, অথবা 8 গিগাবাইটের চেয়ে কম।

আমি উপসংহারে পৌঁছেছি যে এটি কেবলমাত্র র্যান্ডম হার্ডওয়্যার ব্যর্থতার পক্ষে অসম্ভাব্য, কিন্তু প্রতারণার (যেমন জালিয়াতি) হতে পারে। আমি অন্যান্য শিকারদের সাহায্য করার জন্য কোন পদক্ষেপ নিতে পারি তা জানতে চাই।

আপডেট 11/05/2019

  • মানুষ আমাকে কিভাবে সঠিক seekপরামিতি figured সম্পর্কে জিজ্ঞাসা 2038399। আমি উপরে দেখানো চেয়ে অনেক বেশি অভিজ্ঞতা ছিল। মূলত আপনি প্রথম স্থানে অনুমান করতে হবে। আপনি তথ্য সঠিক আকার অনুমান করতে হবে, এবং আপনি তথ্য দুর্নীতি ছিল যেখানে অনুমান করতে হবে। কিন্তু আপনি সবসময় সাহায্য করার জন্য bisection পদ্ধতি ব্যবহার করতে পারেন।

  • নীচের মন্তব্যে আমি ভেবেছিলাম আমি উপরের ধাপে দ্বিতীয় পদক্ষেপ (এসডি কার্ডে তথ্য অনুলিপি করে) শুধুমাত্র 1 সেক্টরের কপি করে। কিন্তু আমি আমার পরীক্ষায় এই ভুলটি করিনি। পরিবর্তে, seekদেখানো হয়েছিল যে "শো ফলাফল" ধাপে অফসেট 1000কেবল তথ্যটির দ্বিতীয় সেক্টরে ঘটে। যদি seek2038399 খাতে হয়, দুর্নীতির 2038400th সেক্টরে হয়।


(1) ২038340 এবং ২038399 নম্বরগুলি কোথা থেকে এসেছে? (2) কেন ব্যবহার করবেন  bs=4194304 count=40 যখন থেকে পড়া /dev/urandom কিন্তু   bs=4096 count=40960  যখন লিখিতভাবে এবং SD কার্ড থেকে পড়া? (তারা গাণিতিকভাবে সমান; 167772160 বাইট প্রতিটি।)
স্কট

1) আমি thie অফসেট figured জন্য bisec tecnique ব্যবহার। Bisec পদ্ধতিটি উত্তরের জন্য খুব verbose হিসাবে, আমি কেবল আরও exaplaination ছাড়া একটি স্পষ্ট হিসাবে তাদের রাখা। 2) হ্যাঁ গণনা equivlent হয়; কিন্তু আমি জানি না যে আমি কার্ডের সেক্টর আকারের সাথে মেলে কিনা, যা আমার মনে হয় 4096।
আর্থ ইঞ্জিন

ওহ, বিন্দু 2) আমি ব্যবহার করি seek, তাই আমি শুধুমাত্র কার্ডে 1 টি সেক্টর লিখেছি, যা ডাটা স্থানান্তরের পরিমাণ সংরক্ষণ করে। কারন, যখন আমি বড় ডাটা ব্লক ব্যবহার করি, তখনই ডেটা ফাইল 160 এমআইবি হয়।
পৃথিবী ইঞ্জিন

আপনার দ্বিতীয় মন্তব্য কোন ধারনা করে না। আপনার উত্তর দ্বিতীয় কমান্ড - যে কার্ড লিখতে হয় - হয় sudo dd if=test.orig of=/dev/sde seek=2038399 bs=4096। এবং সম্ভবত আপনি ঠিক আছেন; এটা ব্যবহার করে seek। এবং, হ্যাঁ, টেকনিক্যালি, এটি ব্যবহার করে না count। ... (Cont'd)
স্কট

(Cont'd) ... কিন্তু আপনি বলছেন "আমি শুধুমাত্র কার্ডে 1 টি সেক্টর লিখেছি, যা ডেটা স্থানান্তরের পরিমাণ সংরক্ষণ করে।" এটি স্পষ্টভাবে ভুল; একটি countস্পেসিফিকেশন ছাড়া , ddপুরো ইনপুট স্থানান্তরিত (অর্থাত্, এটি EOF আপ বা একটি ত্রুটি স্থানান্তর)। যাতে কমান্ডটি সমগ্র সামগ্রীর স্থানান্তর করে test.orig, যা 4096 টি রেকর্ড 4096 বাইট প্রতিটি রেকর্ডের জন্য, মোট 167772160 বাইট (যেমন আমি বলেছি)।
স্কট

3

প্রথমত, @ রাদুর দ্বারা F3 উত্তরটি পড়ুন। এটা সঠিক উপায়।

আমি একেবারে মিস করেছি, এবং আমার নিজের উপায় চেষ্টা:

  1. 1 জিবি পরীক্ষা ফাইল তৈরি করুন: dd if=/dev/urandom bs=1024k count=1024 of=testfile1gb

  2. sdcard এ ফাইলটির কপি লিখুন (64 জিবিতে SD কার্ডের আকার): for i in $(seq 1 64); do dd if=testfile1gb bs=1024k of=/media/sdb1/test.$i; done

  3. ফাইলের MD5 পরীক্ষা করুন (সব শেষ, অসম্পূর্ণ, মিল করা উচিত): md5sum testfile1gb /media/sdb1/test.*


এটি একটি সহজ এবং দ্রুত পদ্ধতির।
আর্থ ইঞ্জিন

এই পদ্ধতিটি এখানে ডকুমেন্ট করা হয়েছে ccollins.wordpress.com/2016/01/18/testing-sd-cards-with-linux
ফিলিপ গাচোড

2

এসডি কার্ডের সম্পূর্ণ ক্ষমতা পরীক্ষা করার সবচেয়ে সহজ উপায় ফাইলগুলির সাথে এটি পূরণ করা, তারপরে ফাইলগুলি সঠিক কিনা তা যাচাই করুন: diff -qr /directory/on/computer /directory/on/SD

অন্যথায়, আপনি কোনও ফাইলে নিদর্শনগুলি, বা হ্যাশের চেইনগুলি লেখার জন্য প্রোগ্রামগুলি ব্যবহার করতে পারেন এবং তারপরে যাচাই করুন যে তারা সঠিক।

হিসাবে @Earthy ইঞ্জিন নির্দিষ্ট, এটা SD কার্ড ভরাট, তারপর ডেটা পড়তে, প্রথাগত পন্থা যে কেবল তথ্য একটি ছোট ব্লক লিখতে যেমন, তাহলে এটি পড়া গুরুত্বপূর্ণ, জাল এসএসডি কার্ড দ্বারা বোকা বানানো হয়।


2

আমি নিম্নলিখিত একটি ছোট স্ক্রিপ্ট লিখেছেন।

লক্ষ্য ইউএসবি বা এসসি কার্ড একটি অস্থায়ী ডিরেক্টরি তৈরি করে

md5sum checksum সহ একটি 5 এমবি এলোমেলোভাবে উত্পন্ন রেফারেন্স ফাইল তৈরি করে

- লক্ষ্যের রেফারেন্স ফাইলটি কপি করে এবং লেখার সফলতা / লিখন নিশ্চিত করার জন্য একটি MD5sum চেক তৈরি করে

- একটি চেকসাম ত্রুটি ঘটে যখন ক্ষমতা (100%) টার্গেট লক্ষ্য করে বা স্টপ

স্ক্রিপ্ট স্বাভাবিকভাবেই বন্ধ করে দেয়, এটি লক্ষ্য করা আকার, ব্যবহৃত এবং বিনামূল্যে পরিমাণ লক্ষ্য প্রদর্শন করে।

এই স্ক্রিপ্টটি দিয়ে আমি সিদ্ধান্ত নিলাম যে একটি ইবে বিক্রেতার দ্বারা আমাকে আটক করা হয়েছিল, যিনি 64 গিগাবাইটের জন্য 8 গিগাবাইট মাইক্রোএসডি পাস করেছিলেন

#!/bin/bash
#Save file as 'filltext' and remember to set the executable flag to run it
if [ -d "$1" ]; then
 if [ -d "$1/tmp" ]; then
  echo "."
 else
  mkdir $1/tmp
 fi

#Make a tmp file and fill it with 3MB of junk
 TMPTSTR=$(mktemp)      
 base64 </dev/urandom  | head -c 5000000 > $TMPTSTR

 TESTVAL=$(md5sum $TMPTSTR | awk '{ print $1 }')

 while $CHECKEDOK; do

  FL=$( tr -dc A-Za-z0-9 </dev/urandom  | head -c 5).TEST

  cp $TMPTSTR $1/tmp/$FL
  TESTTMP=$(md5sum $1/tmp/$FL | awk '{ print $1 }')
  if [ "$TESTVAL" != "$TESTTMP" ]; then   
   echo "Checksum ERROR"
   echo "Original: $TESTVAL Temp File:$TESTTMP"
   CHECKEDOK=false
   df $1 -Ph
   echo 
   echo 
   echo "Removing test files"
   rm $1/tmp -r
   rm $TMPTSTR
   df $1 -Ph
  else
   #echo -n "$FL..."
   clear
   df $1 -Ph
  fi
 done

else
 echo "Error: Directory $1 does not exists."
 echo "Usage: filltest [PATH]"
 echo
 echo "Try the PATH of a mounted USB dongle or SD card to confirm it's capacity"

fi

1
এই সম্ভবত বিভ্রান্তিকর ফলাফল দিতে হবে। যেহেতু ওএস বাফার ফাইল সিস্টেম লিখেছে, আপনি বেশিরভাগই আপনার সিস্টেমে মেমরি পরীক্ষা করছেন, এসডি কার্ড নয়।
সেরিন

"hdparm -W 0 / dev / disk" নির্বাহ করা একটি buffered লেখা সমস্যা সমাধান করা উচিত।
মাইকেল

1

কেউ সংখ্যার একটি ক্রম লিখতে পারে (প্রতিটি সারি 16 বাইট) এবং তারপরে সামগ্রী যাচাই করে:

dd if=<(seq -w 0 123456789012345) of=/dev/yourSdHere

তারপরে skip == আউটপুট যাচাই করুন (স্কিপ মানগুলির একটি ছোট নমুনা ব্যবহার করে যা রেকর্ডগুলির ছোট সংখ্যা রয়েছে) যেমন skip = 9876 :

dd if=/dev/yourSdHere bs=16 count=1 skip=9876
000000000009876
1+0 records in
1+0 records out
16 bytes copied, ...

অথবা, এক লাইনারের সাথে ২0 টি অবস্থানের নমুনা তৈরি করুন:

seq -w 000000000000000 NumberOfWrittenRecords | shuf | head -20 | while read i; do [[ $(dd if=/dev/yourSdHere bs=16 count=1 skip=$i) == $i ]] && echo ok || echo bad; done
  • আপনি এসডি কার্ড লিখিত হয় তা নিশ্চিত করুন
  • একটি ফাইল লিখুন of=tempFileOnSD, যদি আপনি আপনার কার্ড সংরক্ষণ করা ডেটা ধ্বংস করতে চান (এটি জাল না হলেই কেবল প্রাসঙ্গিক)
  • 64 গিগাবাইটের মতো 8 গিগাবাইট কার্ডের ক্ষেত্রে, ২0 টি পরীক্ষা পাস করার সুযোগ (8 গিগাবাইট / 64 গিগাবাইট) ** 20 <1e-18

1
আপনি কি বলছিলেন তা বোঝার আগে আমাকে তিনবার আপনার উত্তরটি পড়তে হয়েছিল: "skip == output =" আউটপুট যাচাই করুন "স্পষ্ট নয়। এবং, যদি না আমি কিছু অনুপস্থিত করছি, আপনার পদ্ধতির ব্যবহারকারীকে রান 123456789012345 কমান্ড এবং প্রয়োজন  ম্যানুয়ালি আউটপুট পরিদর্শন! অবশ্যই যে অযৌক্তিক। কেন শুধু না seq -w 0 123456789012345 > /dev/yourSdHereএবং seq -w 0 123456789012345 | cmp - /dev/yourSdHere?
স্কট

মন্তব্যের জন্য ধন্যবাদ :) আমি আমার উত্তর সম্পাদনা করেছি, আশা করি এটি এখন ভাল!
করপাদা

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