Làm cách nào để kiểm tra sức khỏe vật lý của thanh USB trong Linux?


85

Làm thế nào để kiểm tra tình trạng sức khỏe của thanh USB?

Làm thế nào để tôi biết rằng USB bị hỏng ngoài sửa chữa hoặc có thể sửa chữa?


12
Ném nó đi. Thời gian đầu tư của bạn đắt hơn mua một cái mới.
mailq

1
Tôi phải đồng ý với @mailq. Bạn có thể mua một ổ đĩa 4 GB phong nha với giá $ 2,00 những ngày này.
iglvzx

17
@iglvzx Vâng câu hỏi không nói, nếu nó là một giá rẻ, hoặc một số + 32Gb mã hóa một nhanh ...
varesa

Câu trả lời:


69

Không có cách nào để truy vấn thẻ nhớ USB cho các tham số giống như SMART; Tôi không biết bất kỳ thẻ nhớ nào hỗ trợ làm việc đó ngay cả thông qua phần mềm độc quyền công khai. Điều tốt nhất bạn có thể làm là kiểm tra xem bạn có thể đọc thành công + ghi vào toàn bộ thiết bị bằng cách sử dụng badblocks.

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

Bạn muốn chỉ định một trong các bài kiểm tra ghi, sẽ xóa tất cả dữ liệu trên thanh; tạo bản sao lưu trước.

Tìm thiết bị bằng cách nhìn vào dmesgsau khi cắm USB; bạn sẽ thấy tên thiết bị (rất có thể là sd_, ví dụ: sdc, sdd, v.v.) và thông tin về nhà sản xuất. Hãy chắc chắn rằng bạn đang sử dụng thiết bị phù hợp!

Nếu thanh được định dạng với một hệ thống tập tin hợp lệ, bạn có thể phải sử dụng unmountnó trước.

Cú pháp ví dụ, đối với thanh USB được liệt kê là / dev / sdz, xuất thông tin tiến trình, với kiểm tra ghi phá hủy dữ liệu và nhật ký lỗi được ghi vào usbstick.log:

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

Bạn sẽ cần phải phân vùng lại và định dạng lại thanh sau đó, giả sử nó đi qua; bài kiểm tra này sẽ xóa sạch mọi thứ trên thanh. Bất kỳ lỗi nào cho thấy lỗi của bộ điều khiển bộ nhớ của thiết bị hoặc thiết bị đã hết khối dự phòng để sắp xếp lại các khối bị lỗi. Trong trường hợp đó, không có khu vực nào của thiết bị có thể được tin cậy.


21
badblocks có lẽ là lựa chọn tốt nhất. các ý kiến ​​nói rằng "không đáng" hoàn toàn bỏ lỡ một số trường hợp khi điều này có thể rất cần thiết (ví dụ: một công ty có thể đã mua flashdrive hàng hóa và muốn xem họ đã bị lừa đảo đến mức nào ...)
Richlv

2
như đã chỉ ra trong bài viết trên wikipedia được liên kết, cũng e2fsck -ccó cách sử dụng badblocksvà che giấu hiệu quả những lỗi xấu đó khỏi hệ thống tập tin, do đó tránh việc ghi bị hỏng. Tuy nhiên, cần lưu ý rằng, nếu đĩa bị lỗi mới, nó có thể bị hỏng và những cái mới có thể xuất hiện sau đó, có nghĩa là tuổi thọ của nó đang rút ngắn và bạn nên xem xét thay thế nó.
igorsantos07

1
Tôi đề nghị thêm cờ -v cũng như xem lỗi trong các cửa sổ đầu cuối. (nếu bạn để nó chạy qua đêm chẳng hạn. Logfile không hữu ích cho việc xem nhanh mức độ tệ của nó.
Tilo

@BeeDee, chúng ta nên sử dụng toàn bộ thiết bị hay chỉ một số phân vùng hoặc nó không quan trọng? Ý tôi là / dev / sdz hay / dev / sdz1?
Ông P

1
@Pisek bạn nên sử dụng toàn bộ thiết bị, bởi vì đó là thiết bị bị lỗi, không chỉ là một phân vùng.
Hi-Angel

21

Qua [ubfox] Lỗi Kiểm tra USB Flash Drive , cuối cùng tôi đã tìm thấy cái này, có thể hữu ích:

Tôi đã đến blog Chống lại gian lận Flash và SOSFakeFlash, trong đó giới thiệu phần mềm H2testw (xem tại đây hoặc tại đây) để kiểm tra bộ nhớ flash. Tôi đã tải xuống H2testw và tìm thấy hai vấn đề với nó: (1) nó chỉ dành cho Windows và (2) nó không phải là nguồn mở. Tuy nhiên, tác giả của nó đã tốt bụng bao gồm một tệp văn bản giải thích những gì nó làm; trang này nói về việc triển khai GPLv3 của thuật toán đó.
Việc triển khai của tôi rất đơn giản và đáng tin cậy và tôi không biết chính xác F3 so với H2testw như thế nào vì tôi chưa bao giờ chạy H2testw. Tôi gọi F3 triển khai của mình, viết tắt của Fight Flash Fraud hoặc Fight Fake Flash.

Phụ lục của @pbhj: F3 có trong repos Ubuntu. Nó có hai phần, f3write ghi các tệp 1GB vào thiết bị và f3read cố gắng đọc chúng sau đó. Bằng cách này, năng lực và khả năng viết và đọc dữ liệu hiệu quả được kiểm tra.


4
Có bất kỳ lợi thế cho F3 hơn badblocks?
Zaz


14

Nó phụ thuộc vào chế độ thất bại, tôi cho rằng. Chúng rẻ vì một lý do.

Là một thiết bị USB, xem xe buýt thông qua trình quản lý thiết bị trong Windows hoặc đầu ra của dmesg trong Linux sẽ cho bạn biết nếu thiết bị thậm chí được nhận dạng là đã được cắm. Nếu không, thì bộ điều khiển trên bo mạch hoặc các kết nối vật lý bị hỏng

Nếu thiết bị được nhận dạng là đã được cắm, nhưng không được xác định là bộ điều khiển đĩa (và tôi không biết điều đó có thể xảy ra như thế nào, nhưng ...) thì bộ điều khiển sẽ bị bắn.

Nếu nó được công nhận là ổ đĩa, nhưng bạn không thể gắn nó, bạn có thể sửa chữa nó thông qua fdisk và viết lại bảng phân vùng, sau đó tạo một hệ thống tệp khác.

Nếu bạn đang tìm kiếm tương đương với SMART , thì bạn sẽ không tìm thấy nó. Bộ điều khiển Thumbdrive có giá rẻ. Chúng là kho lưu trữ hàng hóa, và không có nghĩa là có các lỗi thông thường và trí thông minh mà các ổ đĩa hiện đại có.


2

Trên đường đến ngày hôm nay, chủ đề này đưa ra một số câu hỏi.

- Việc này sẽ kéo dài bao lâu (ngụ ý bởi cuộc thảo luận về việc để nó chạy qua đêm).

Tôi hiện đang thử nghiệm USB 3.0 128G Sandisk bằng cách sử dụng sudo badblocks -w -s -o, nó được kết nối với thẻ PCIe USB 3 / USBC của tôi trong một Athlon 64x2 cũ hơn. Vì vậy, USB3 thành USB3 trên PCIe nên khá nhanh.

Đây là dòng lệnh console của tôi khi hoàn thành 33%:

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

và một lần nữa sau:

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

Tiếp đến là phân khúc này:

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

Quá trình này lặp lại với oxaa, sau đó là 0x55, 0xff và cuối cùng là 0x00.

ArchLinux đã đưa ra một tuyên bố không đủ tiêu chuẩn:

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

Lưu ý: Việc kiểm tra đã bắt đầu vào khoảng 8:30 tối, thử nghiệm đã hoàn thành trước 8:45 sáng ngày hôm sau, hoàn thành trong khoảng 12 giờ cho tình huống của tôi .

- Thử nghiệm phá hủy không phải là phương pháp duy nhất có thể.

Wikipedia đưa ra tuyên bố này:

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.

Trang người đàn ông phân phối hiện tại của tôi xác nhận -n là không phá hủy.

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

Và cuối cùng là nó không xứng đáng. tuyên bố.

Một tuyên bố tóm tắt, dựa trên tình hình hàng tỷ trang web bộ nhớ trong chip flash, một lỗi là một tế bào đã được viết và xóa hàng chục ngàn lần, và hiện đang thất bại. Và khi một thử nghiệm cho thấy một ô bị lỗi, hãy nhớ rằng mỗi tệp bạn đã thêm và xóa đang chạy theo các chu kỳ đó.

Ý tưởng ở đây là khi 1 ô bị lỗi, nhiều ô khác cũng đạt đến điểm thất bại tương tự. Một ô không thành công ngày hôm nay, nhưng bạn sử dụng nó bình thường trong một thời gian dài hơn, sau đó thêm 3 ô thất bại, sau đó thêm 24 ô thất bại, sau đó là 183 và trước khi bạn biết điều đó, mảng bộ nhớ bị đánh dấu bởi những điểm xấu. Chỉ có rất nhiều tế bào có thể chết trước khi khả năng sử dụng của bạn bắt đầu giảm, cuối cùng giảm xuống nhanh chóng. Làm thế nào bạn sẽ biết nhiều tế bào đang thất bại? Vì vậy, các bài đăng ở đây đang bảo vệ dữ liệu của bạn bằng cách nói rằng một khi bạn có một tế bào xấu, bạn đã hoàn thành khá nhiều việc liên quan đến việc lưu trữ đáng tin cậy. Việc sử dụng của bạn vẫn có thể cung cấp cho bạn một vài tháng.

Đó là dữ liệu của bạn.

HTH


1

Nhiều thất bại đã hoàn thành hoặc cho phép một địa điểm hỗ trợ nhiều địa điểm. Tôi đã viết một chương trình đọc ghi ngẫu nhiên nhỏ sử dụng số nguyên tố cho trình tạo số giả ngẫu nhiên, cho cả mẫu và địa chỉ. Các lần đọc được đặt so le phía sau ghi bởi đủ các trang để đảm bảo tôi không kiểm tra bộ đệm ram trên hệ thống. Nó chưa được tham số hóa, chỉ cần thiết lập cho một thiết bị 64G trên hệ thống của tôi với ram 8G. Hãy phê bình, tham số hóa, làm cho nó thông minh hơn.

Đây là một kiểm tra mạnh mẽ và nhanh hơn so với việc thực hiện mọi byte từ dưới lên trên, nhưng cũng là một trình tạo hoán đổi tuyệt vời (cuộn hầu hết mọi thứ khác). Tôi tạm thời trao đổi ở mức 1 và nó trở nên chậm hơn nhưng dễ chấp nhận hơn đối với các ứng dụng khác. Bất kỳ lời khuyên nào về cách điều chỉnh chống hoán đổi cũng sẽ được đánh giá cao:

$ 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 ;
        }
}

Sử dụng inc có công suất 2 như 1024 sẽ cho phép kiểm tra tốt hơn hoặc chết các bit địa chỉ cao, mặc dù chỉ kiểm tra 8 byte mỗi hop.
David Pickett

yeah, điều này sẽ bỏ lỡ trường hợp bit cao chết. cũng có thể đọc và viết trong cùng một lượt có thể bỏ lỡ điều đó,
dùng313114

0

Ổ USB khá thô sơ, không có nhiều thứ có thể sai trên chúng! Nói chung, nếu nó hiển thị dưới dạng một ổ đĩa và bạn có thể định dạng nó thì nó hoạt động. Bạn có thể thử xem phiên bản Portable của CrystalDiskInfo vì đây là công cụ phân tích nhẹ nhanh. Rất ít thanh USB báo cáo lại thông tin SMART và những thứ tương tự.


1
Để tham khảo, đây là hướng dẫn sử dụng Crystal Disk Info bằng tiếng Anh: crystalmark.info/software/CstallDiskInfo/manual-en
Matt Simmons
Khi sử dụng trang web của chúng tôi, bạn xác nhận rằng bạn đã đọc và hiểu Chính sách cookieChính sách bảo mật của chúng tôi.
Licensed under cc by-sa 3.0 with attribution required.