จะตรวจสอบสุขภาพทางกายภาพของแท่ง USB ใน Linux ได้อย่างไร?


85

จะตรวจสอบสถานะสุขภาพของอุปกรณ์ USB ได้อย่างไร?

ฉันจะรู้ได้อย่างไรว่า USB นั้นเสียเกินกว่าจะซ่อมหรือซ่อมได้


12
โยนมันออกไป. เวลาที่คุณลงทุนมีราคาแพงกว่าการซื้อใหม่
mailq

1
ฉันต้องเห็นด้วยกับ @mailq คุณสามารถซื้อไดรฟ์หัวแม่มือขนาด 4 GB ราคา $ 2.00 ได้ในวันนี้
iglvzx

17
@iglvzx คำถามก็ไม่ได้บอกว่ามันราคาถูกหรือ 32Gb ที่เข้ารหัสได้เร็ว ...
varesa

คำตอบ:


69

ไม่มีวิธีสอบถามหน่วยความจำ USB สำหรับพารามิเตอร์ที่คล้ายสมาร์ท ฉันไม่ทราบว่ามีหน่วยความจำแท่งใดที่สนับสนุนการทำเช่นนี้แม้ผ่านซอฟต์แวร์ที่เป็นกรรมสิทธิ์ของสาธารณชน วิธีที่ดีที่สุดที่คุณสามารถทำได้คือตรวจสอบว่าคุณสามารถอ่าน + เขียนไปยังอุปกรณ์ทั้งหมด badblocksได้สำเร็จ

https://en.wikipedia.org/wiki/Badblocks

คุณต้องการระบุหนึ่งในการทดสอบการเขียนซึ่งจะล้างข้อมูลทั้งหมดที่ติด; ทำการสำรองข้อมูลก่อน

ค้นหาอุปกรณ์โดยดูdmesgหลังจากเสียบปลั๊ก USB; คุณจะเห็นชื่ออุปกรณ์ (น่าจะเป็น sd_, เช่น sdc, sdd, ฯลฯ ) และข้อมูลผู้ผลิต ตรวจสอบให้แน่ใจว่าคุณใช้อุปกรณ์ที่เหมาะสม!

หากไม้ถูกฟอร์แมทด้วยระบบไฟล์ที่ถูกต้องคุณอาจต้องใช้unmountมันก่อน

ตัวอย่างไวยากรณ์สำหรับแท่ง USB ที่ระบุเป็น / dev / sdz แสดงผลข้อมูลความคืบหน้าพร้อมการทดสอบการเขียนข้อมูลแบบทำลายข้อมูลและบันทึกข้อผิดพลาดที่เขียนไปยัง usbstick.log:

sudo badblocks -w -s -o usbstick.log /dev/sdz

คุณจะต้องแบ่งพาร์ติชั่นและฟอร์แมตใหม่หลังจากนั้น การทดสอบนี้จะเช็ดทุกอย่างที่ติด ความล้มเหลวใด ๆ บ่งบอกถึงความล้มเหลวของตัวควบคุมหน่วยความจำของอุปกรณ์หรือมีบล็อกสำรองว่างเปล่าเพื่อทำการแมปบล็อกที่ล้มเหลวอีกครั้ง ในกรณีนั้นพื้นที่ของอุปกรณ์ไม่สามารถเชื่อถือได้


21
บล็อกแบดอาจเป็นตัวเลือกที่ดีที่สุด ความคิดเห็นที่บอกว่า "ไม่คุ้ม" พลาดหลายกรณีเมื่อมีความจำเป็นมาก (เช่น บริษัท อาจซื้อสินค้าแฟลชไดรฟและต้องการดูว่าพวกเขาถูกหลอกลวง ... )
Richlv

2
ตามที่ระบุไว้ในบทความวิกิพีเดียที่เชื่อมโยงนอกจากนี้ยังมีการe2fsck -cใช้badblocksและซ่อน badblocks เหล่านั้นจากระบบไฟล์อย่างมีประสิทธิภาพดังนั้นจึงหลีกเลี่ยงการเขียนที่เสียหาย ควรสังเกตว่าหากดิสก์มีแบดบล๊อคใหม่อาจได้รับความเสียหายและอาจจัดใหม่ในภายหลังซึ่งหมายความว่าอายุการใช้งานสั้นลงและคุณควรพิจารณาแทนที่มัน
igorsantos07

1
ฉันขอแนะนำให้เพิ่มแฟล็ก -v และเห็นข้อผิดพลาดในหน้าต่างเทอร์มินัล (ถ้าคุณปล่อยให้มันข้ามคืนตัวอย่างเช่น logfile นั้นไม่เป็นประโยชน์สำหรับการดูอย่างรวดเร็วว่ามันแย่แค่ไหน
Tilo

@BeeDee เราควรใช้ทั้งอุปกรณ์หรือพาร์ทิชันบางส่วนหรือไม่สำคัญ? ฉันหมายถึง / dev / sdz หรือ / dev / sdz1?
นาย P

1
@Pisek คุณควรใช้ทั้งอุปกรณ์เพราะมันเป็นอุปกรณ์ที่ล้มเหลวไม่ใช่แค่พาร์ติชัน
Hi-Angel

21

จากข้อผิดพลาด [ubuntu] ตรวจสอบ USB Flash Driveฉันพบสิ่งนี้ในที่สุดซึ่งอาจเป็นประโยชน์:

ฉันมาที่บล็อก Fight Flash Fraud และ SOSFakeFlash ซึ่งแนะนำซอฟต์แวร์ H2testw (ดูที่นี่หรือที่นี่) เพื่อทดสอบความทรงจำแฟลช ฉันดาวน์โหลด H2testw และพบปัญหาสองประการ: (1) สำหรับ Windows เท่านั้นและ (2) ไม่ใช่โอเพนซอร์ส อย่างไรก็ตามผู้เขียนก็ใจดีพอที่จะรวมไฟล์ข้อความที่อธิบายสิ่งที่มันทำ; หน้านี้เกี่ยวกับการนำ GPLv3 ไปใช้ของอัลกอริทึมนั้น
การใช้งานของฉันนั้นง่ายและเชื่อถือได้และฉันก็ไม่รู้เหมือนกันว่า F3 เปรียบเทียบกับ H2testw อย่างไรตั้งแต่ฉันไม่เคยใช้ H2testw ฉันเรียกว่าการติดตั้งใช้งานของฉัน F3 สิ่งที่สั้นสำหรับ Fight Flash Fraud หรือ Fight Fake Flash

ภาคผนวกโดย @pbhj: F3 อยู่ใน repos ของ Ubuntu มีสองส่วนคือ f3write เขียนไฟล์ 1GB ไปยังอุปกรณ์และพยายามอ่านไฟล์ f3 หลังจากนั้น วิธีนี้ความจุและความสามารถในการเขียนและอ่านข้อมูลอย่างมีประสิทธิภาพได้รับการทดสอบ


4
มีข้อได้เปรียบอะไรบ้างที่จะทำให้ F3 มีมากกว่าbadblocks?
Zaz


14

มันขึ้นอยู่กับโหมดความล้มเหลวฉันคิดว่า พวกเขาราคาถูกด้วยเหตุผล

ในฐานะอุปกรณ์ USB การดูบัสผ่านตัวจัดการอุปกรณ์ใน Windows หรือเอาต์พุตของ dmesg ใน Linux จะบอกคุณว่าอุปกรณ์ดังกล่าวได้รับการยอมรับว่าเสียบอยู่หรือไม่ถ้าไม่ใช่ให้ใช้คอนโทรลเลอร์บนบอร์ดหรือการเชื่อมต่อทางกายภาพ ถูกทำลาย

หากอุปกรณ์ได้รับการยอมรับว่าเสียบอยู่ แต่ไม่ได้รับการระบุว่าเป็นตัวควบคุมดิสก์ (และฉันไม่รู้ว่าจะเกิดอะไรขึ้น แต่ ... ) จากนั้นตัวควบคุมจะถูกยิง

หากได้รับการยอมรับว่าเป็นดิสก์ไดรฟ์ แต่คุณไม่สามารถต่อเชื่อมได้คุณอาจสามารถซ่อมแซมผ่าน fdisk และเขียนตารางพาร์ติชันใหม่จากนั้นสร้างระบบไฟล์อื่น

หากคุณกำลังมองหาเทียบเท่าของสมาร์แล้วคุณจะไม่พบมัน ตัวควบคุม Thumbdrive ราคาถูก พวกเขาเป็นที่เก็บสินค้าและไม่ได้หมายความว่าจะมีร้านกาแฟและสติปัญญาที่ทันสมัย


2

หัวข้อนี้ทำให้เกิดคำถามขึ้นมา

- ใช้เวลานานเท่าไร (โดยนัยจากการอภิปรายว่าปล่อยให้ทำงานข้ามคืน)

ขณะนี้ฉันทดสอบ USB 3.0 128G Sandisk โดยใช้sudo badblocks -w -s -oมันเชื่อมต่อกับการ์ด USB 3 / USBC PCIe ของฉันใน Athlon 64x2 รุ่นเก่า ดังนั้น USB3 ใน USB3 บน PCIe น่าจะเร็วมาก

นี่คือบรรทัดคำสั่งคอนโซลของฉันที่เสร็จสมบูรณ์ 33%:

Testing with pattern 0xaa: 33.35% done, 49:47 elapsed. (0/0/0 errors)

และอีกครั้งในภายหลัง:

Testing with pattern 0xaa: 54.10% done, 1:17:04 elapsed. (0/0/0 errors)

ถัดมากลุ่มนี้:

Reading and comparing: 43.42% done, 2:23:44 elapsed. (0/0/0 errors)

กระบวนการนี้ซ้ำกับ oxaa จากนั้น 0x55, 0xff และสุดท้าย 0x00

ArchLinux ให้คำสั่งอย่างไม่มีเงื่อนไข:

For some devices this will take a couple of days to complete.

หมายเหตุ: การทดสอบเริ่มต้นประมาณ 20:30 ทดสอบได้เสร็จสิ้นก่อน 08:45 วันถัดไปเสร็จสิ้นในเวลาประมาณ12 ชั่วโมงสำหรับสถานการณ์ของฉัน

- การทดสอบแบบทำลายไม่ได้เป็นวิธีเดียวที่ทำได้

Wikipedia เสนอข้อความนี้:

badblocks -nvs /dev/sdb This would check the drive "sdb" in non-destructive read-write mode and display progress by writing out the block numbers as they are checked.

หน้า man distro ปัจจุบันของฉันยืนยัน -n ว่าไม่ทำลาย

-n Use non-destructive read-write mode. By default only a non- destructive read-only test is done.

และในที่สุด มันก็ไม่คุ้มค่า คำให้การ.

คำแถลงสรุปตามสถานการณ์ของหน่วยความจำหลายพันล้านไซต์ในชิปแฟลชความล้มเหลวคือเซลล์ที่ถูกเขียนและลบไปแล้วนับหมื่นครั้งและตอนนี้ล้มเหลว และเมื่อการทดสอบหนึ่งครั้งแสดงให้เห็นว่าเซลล์ล้มเหลวโปรดจำไว้ว่าแต่ละไฟล์ที่คุณเพิ่มและลบถูกเรียกใช้รอบนั้น

แนวคิดนี้คือเมื่อ 1 เซลล์ล้มเหลวเซลล์อื่น ๆ อีกมากมายก็มาถึงจุดล้มเหลวเดียวกัน เซลล์หนึ่งล้มเหลวในวันนี้ แต่คุณใช้งานได้ตามปกติเป็นเวลานานกว่านั้นอีก 3 เซลล์จะล้มเหลวและอีก 24 เซลล์ล้มเหลวจากนั้น 183 เซลล์และก่อนที่คุณจะรู้ว่าหน่วยความจำนั้นเต็มไปด้วยจุดที่ไม่ดี มีเซลล์จำนวนมากเท่านั้นที่สามารถตายก่อนที่ความสามารถในการใช้งานของคุณจะเริ่มลดลงในที่สุดก็ร่วงลงอย่างรวดเร็ว คุณจะรู้ได้อย่างไรว่ามีเซลล์จำนวนมากล้มเหลว ดังนั้นการโพสต์ที่นี่กำลังปกป้องข้อมูลของคุณโดยบอกว่าเมื่อคุณมีเซลล์ที่ไม่ดีคุณจะได้รับการจัดเก็บที่น่าเชื่อถือ การใช้งานของคุณอาจยังให้คุณสองสามเดือน

มันเป็นข้อมูลของคุณ

HTH


1

ความล้มเหลวหลายอย่างเสร็จสมบูรณ์หรืออนุญาตให้หนึ่งตำแหน่งรองรับหลายตำแหน่ง ฉันเขียนโปรแกรมอ่านเขียนแบบสุ่มเล็ก ๆ ที่ใช้หมายเลขเฉพาะสำหรับตัวสร้างตัวเลขแบบหลอกเทียมสำหรับทั้งรูปแบบและที่อยู่ การอ่านถูกส่ายไปหลังการเขียนโดยเพจที่เพียงพอเพื่อให้แน่ใจว่าฉันไม่ได้ทดสอบแคช RAM บนระบบ ยังไม่ได้กำหนดพารามิเตอร์เพียงตั้งค่าสำหรับอุปกรณ์ 64G ในระบบของฉันด้วย RAM 8G อย่าลังเลที่จะวิพากษ์วิจารณ์ทำให้เป็นพารามิเตอร์ทำให้มันฉลาดขึ้น

นี่คือการตรวจสอบที่มีประสิทธิภาพและเร็วกว่าการทำทุก ๆ ไบต์ไปด้านบน แต่ก็เป็นตัวสร้าง swap ที่ยอดเยี่ยม ฉันใส่ swapiness ที่ 1 ชั่วคราวและมันก็ช้าลง แต่ก็ทนได้มากกว่าแอพอื่น ๆ เคล็ดลับเกี่ยวกับวิธีการปรับเทียบกับการแลกเปลี่ยนจะได้รับการชื่นชม:

$ sudo ksh -c 'echo 1> / proc / sys / vm / swappiness'

$ cat mysrc/test64g.c

#include <stdio.h>
#include <sys/types.h>
#include <sys/stat.h>
#include <fcntl.h>
#include <unistd.h>
#include <stdlib.h>

int main( int argc, char **argv ){

        long long int mask = 0xFFFFFFFF8L ;    // 64Gb word
        long long int stag = 8413257 ;  // 8G / 1021
        long long int inc = 1021L ;     // prime < 1024

        long long int w_addr = 0L ;
        long long int r_addr = 0L ;
        long long int w_ct = 0L ;
        long long int r_ct = 0L ;
        long long int w_patt = 0xFEDCBA9876543210L ;
        long long int r_patt = 0xFEDCBA9876543210L ;
        long long int r_buf ;
        int fd, ret ;

        if ( argc < 2
          || argv[1] == NULL
          || 0 > ( fd = open( argv[1], O_RDWR ))){
                printf( "Fatal: Cannot open file $1 for RW.\n" );
                exit( 1 );
        }

        while ( 1 ){
                if ( (off_t)-1 == lseek( fd, w_addr & mask, SEEK_SET )){
                        printf( "Seek to %llX\n", w_addr & mask );
                        perror( "Fatal: Seek failed" );
                        exit( 2 );
                }

                if ( 8 != ( ret = write( fd, (void*)&w_patt, 8 ))){
                        printf( "Seek to %llX\n", w_addr & mask );
                        perror( "Fatal: Write failed" );
                        exit( 3 );
                }

                w_ct++ ;
                w_addr += inc ;
                w_patt += inc ;

                if ( ( w_ct - r_ct ) < stag ){
                        continue ;
                }

                if ( (off_t)-1 == lseek( fd, r_addr & mask, SEEK_SET )){
                        printf( "Seek to %llX\n", r_addr & mask );
                        perror( "Fatal: Seek failed" );
                        exit( 4 );
                }

                if ( 8 != ( ret = read( fd, (void*)&r_buf, 8 ))){
                        printf( "Seek to %llX\n", w_addr & mask );
                        perror( "Fatal: Read failed" );
                        exit( 5 );
                }

                if ( ( ++r_ct & 0XFFFFF ) == 0 ){
                        printf( "Completed %lld writes, %lld reads.\n", w_ct, r_ct );
                }

                if ( r_buf != r_patt ){
                        printf( "Data miscompare on read # %lld at address %llX:\nWas: %llX\nS/B: %llX\n\n", r_ct, r_addr & mask, r_buf, r_patt );
                }

                r_addr += inc ;
                r_patt += inc ;
        }
}

การใช้ inc ของกำลัง 2 เช่น 1024 จะช่วยให้ตรวจสอบได้ดีขึ้นหรือบิตที่อยู่สูงตายถึงแม้ว่าการตรวจสอบเพียง 8 ไบต์ต่อ hop
David Pickett

ใช่นี้จะพลาดกรณีของบิตสูงตาย การอ่านและเขียนด้วยบัตรเดียวกันสามารถพลาดได้
user313114

0

ไดรฟ์ USB นั้นค่อนข้างพื้นฐาน แต่ก็มีไม่มากที่จะผิดพลาดได้! โดยทั่วไปถ้ามันปรากฏเป็นไดรฟ์และคุณสามารถฟอร์แมตมันก็จะทำงาน คุณสามารถลองดูCrystalDiskInfo เวอร์ชันพกพาซึ่งเป็นเครื่องมือวิเคราะห์น้ำหนักเบาอย่างรวดเร็ว แท่ง USB น้อยมากที่รายงานข้อมูลสมาร์ทและสิ่งที่คล้ายกัน


1
สำหรับการอ้างอิงนี่คือคู่มือ Crystal Disk Info ในภาษาอังกฤษ: crystalmark.info/software/CrystalDiskInfo/manual-en
Matt Simmons
โดยการใช้ไซต์ของเรา หมายความว่าคุณได้อ่านและทำความเข้าใจนโยบายคุกกี้และนโยบายความเป็นส่วนตัวของเราแล้ว
Licensed under cc by-sa 3.0 with attribution required.