Linux에서 USB 스틱의 물리적 상태를 확인하는 방법은 무엇입니까?


85

USB 스틱의 상태를 확인하는 방법은 무엇입니까?

USB가 수리 이상으로 고장 나거나 수리 가능하다는 것을 어떻게 알 수 있습니까?


12
멀리 던져. 새로운 시간을 사는 것보다 투자 시간이 더 비쌉니다.
mailq

1
@mailq에 동의해야합니다. 요즘 $ 2.00에 알맞은 4GB 썸 드라이브를 구입할 수 있습니다.
iglvzx

17
@iglvzx 글쎄, 그것이 싼 것이거나, 어떤 것이 + 32Gb의 빠른 것을 암호화하고 있는지 질문은 알 수 없습니다.
varesa

답변:


69

SMART와 유사한 매개 변수에 대해 USB 메모리 스틱을 조회 할 방법이 없습니다. 공개적으로 사용 가능한 독점 소프트웨어를 통해서도 그렇게 할 수있는 메모리 스틱은 없습니다. 최선의 방법은을 사용하여 전체 장치에 성공적으로 읽고 쓸 수 있는지 확인하는 것 badblocks입니다.

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

쓰기 테스트 중 하나를 지정하면 스틱의 모든 데이터가 지워집니다. 먼저 백업하십시오.

dmesgUSB 스틱을 꽂은 후 보고 장치를 찾으 십시오. 장치 이름 (대부분 sd_, 즉 sdc, sdd 등)과 제조업체 정보가 표시됩니다. 올바른 장치를 사용하고 있는지 확인하십시오!

스틱이 유효한 파일 시스템으로 포맷 된 경우 먼저 스틱을 사용해야 할 수도 있습니다 unmount.

/ dev / sdz로 열거 된 USB 스틱의 경우, 구문 분석 정보 가 usbstick.log에 기록 된 데이터 파괴 쓰기 테스트 및 오류 로그와 함께 출력되는 예제 구문 :

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

스틱이 통과한다고 가정하면 나중에 파티션을 다시 분할하고 다시 포맷해야합니다. 이 테스트는 스틱의 모든 것을 지 웁니다. 모든 오류는 장치의 메모리 컨트롤러에 오류가 있음을 나타내거나 오류가 발생한 블록을 다시 매핑하기위한 예비 블록이 부족합니다. 이 경우 장치의 영역을 신뢰할 수 없습니다.


21
badblocks가 아마도 가장 좋은 옵션 일 것입니다. "가치가 없다"라는 의견은 이것이 필요할 때 몇 가지 사례를 완전히 놓친다 (예를 들어, 회사가 상품 플래시 드라이브를 구매했을 때 그들이 얼마나 심하게 사기를 당했는지보고 싶다 ...)
Richlv

2
링크 된 Wikipedia 기사에서 지적한 것처럼 파일 시스템에서 이러한 불량 블록 e2fsck -c을 사용 badblocks하고 효과적으로 숨기므로 쓰기가 손상되는 것을 피할 수 있습니다. 그러나 디스크에 새로운 불량 블록이있는 경우 디스크가 손상되어 나중에 새로운 불량 블록이 발생할 수 있습니다. 즉, 수명이 단축되고 교체해야합니다.
igorsantos07

1
-v 플래그를 추가하면 터미널 창에 오류가 표시되는 것이 좋습니다. (예를 들어 밤새 실행하게된다면, 로그 파일은 그것이 얼마나 나쁜지 빠르게 볼 수 있도록 도움이되지 않습니다.
Tilo

@BeeDee, 우리는 전체 장치 또는 일부 파티션을 사용해야합니까, 아니면 중요하지 않습니까? / dev / sdz 또는 / dev / sdz1을 의미합니까?
Mr. P

1
@Pisek 당신은 전체 장치를 사용해야합니다. 단지 파티션이 아니라 장치 고장이기 때문입니다.
Hi-Angel

21

를 통해 [우분투] 에러 체크 USB 플래시 드라이브 , 나는 결국 도움이 될 수있는이 발견 :

플래시 메모리를 테스트하기 위해 소프트웨어 H2testw (여기 또는 여기 참조)를 추천하는 Fight Flash Fraud 및 SOSFakeFlash 블로그에 도착했습니다. H2testw를 다운로드하여 두 가지 문제를 발견했습니다. (1) Windows 전용이고 (2) 오픈 소스가 아닙니다. 그러나 저자는 자신이하는 일을 설명하는 텍스트 파일을 포함 할만큼 친절했습니다. 이 페이지는 해당 알고리즘의 GPLv3 구현에 관한 것입니다.
내 구현은 간단하고 신뢰할 수 있으며 H2testw를 실행 한 적이 없으므로 F3이 H2testw와 어떻게 비교되는지 정확히 알지 못합니다. 나는 F3 구현이라고 부릅니다. Fight Flash Fraud 또는 Fight Fake Flash의 줄임말입니다.

@pbhj의 부록 : F3은 우분투 저장소에 있습니다. f3write는 장치에 1GB 파일을 쓰고 f3read는 나중에 파일을 읽습니다. 이러한 방식으로 데이터를 작성하고 효과적으로 읽을 수있는 용량과 기능을 테스트합니다.


4
F3보다 장점이 badblocks있습니까?
Zaz


14

그것은 실패 모드에 달려 있다고 생각합니다. 그들은 이유가 싸다.

USB 장치로서 Windows의 장치 관리자 또는 Linux의 dmesg 출력을 통해 버스를 보면 장치가 연결되어있는 것으로 인식되는지 여부를 알 수 있습니다. 그렇지 않은 경우 보드상의 컨트롤러 또는 물리적 연결 고장났다.

장치가 꽂혀있는 것으로 인식되었지만 디스크 컨트롤러로 식별되지 않는 경우 (그리고 어떻게 될 수 있는지 모르겠지만 ...) 컨트롤러가 촬영되었습니다.

디스크 드라이브로 인식되지만 마운트 할 수없는 경우 fdisk를 통해 디스크를 복구하고 파티션 테이블을 다시 작성한 다음 다른 파일 시스템을 만들 수 있습니다.

SMART 에 해당하는 제품을 찾으면 찾을 수 없습니다. 썸 드라이브 컨트롤러는 저렴합니다. 이 제품은 상용 스토리지이며 최신 드라이브의 일반적인 안전 장치 및 인텔리전스를 갖추고 있지 않습니다.


2

오늘날까지이 스레드는 몇 가지 질문을 제기했습니다.

- 시간이 얼마나 걸리 나요 (하룻밤 동안 실행하도록하는 것에 대한 암시).

sudo badblocks -w -s -o현재을 사용하여 USB 3.0 128G Sandisk를 테스트하고 있으며 이전 Athlon 64x2의 USB 3 / USBC PCIe 카드에 연결되어 있습니다. 따라서 PCIe의 USB3를 USB3에 연결하는 것은 매우 빠릅니다.

다음은 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.

주의 : 테스트는 오후 8시 30 분에 시작되었으며 다음 날 오전 8시 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.

현재 배포 매뉴얼 페이지에서 -n이 비파괴임을 확인합니다.

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

그리고 마지막으로 가치가 없다는 것입니다. 성명서.

플래시 칩에서 수십억 개의 메모리 사이트의 상황을 기반으로 한 요약문은 이미 수만 번 작성되어 지워진 셀입니다. 한 테스트에서 셀이 실패한 것으로 표시되면 추가 및 지운 각 파일이 해당주기를 실행하고 있음을 기억하십시오.

여기서 아이디어는 하나의 셀이 실패하면 더 많은 셀이 동일한 실패 지점에 도달한다는 것입니다. 오늘 하나의 셀이 고장 났지만 한동안 더 오래 사용하면 3 개의 셀이 더 이상 실패하고 24 개의 더 많은 수가 실패하고 183이되며 메모리를 알기 전에 메모리 배열에 불량 점이 있습니다. 사용 가능한 용량이 떨어지기 전에 죽을 수있는 셀이 너무 많아 결국 빠르게 떨어집니다. 더 많은 세포가 실패하고 있음을 어떻게 알 수 있습니까? 따라서 여기의 게시물은 불량 셀이 있으면 신뢰할 수있는 스토리지와 관련하여 거의 완료되었다고 말함으로써 데이터를 보호합니다. 사용량이 여전히 몇 달이 될 수 있습니다.

당신의 데이터입니다.

HTH


1

많은 실패가 완료되었거나 한 위치에서 여러 위치를 지원할 수 있습니다. 패턴과 주소 모두 의사 난수 생성기에 소수를 사용하는 작은 임의 쓰기 읽기 프로그램을 작성했습니다. 읽기는 시스템에서 램 캐시를 테스트하지 않도록 충분한 페이지만큼 쓰기 뒤에 엇갈려 있습니다. 아직 매개 변수화되어 있지는 않지만 8G 램이있는 시스템의 64G 장치에 대해서만 설정하십시오. 자유롭게 비판하고, 매개 변수화하고, 더 똑똑하게 만드십시오.

이것은 강력한 검사이며 모든 바이트를 맨 처음부터 끝까지 수행하는 것보다 빠르지 만 훌륭한 스왑 생성기이기도합니다 (거의 다른 모든 것을 롤아웃). 나는 일시적으로 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 ;
        }
}

1024와 같은 2의 거듭 제곱을 사용하면 홉당 8 바이트 만 검사하더라도 더 나은 검사 또는 죽은 주소 비트를 사용할 수 있습니다.
David Pickett

그래, 이것은 죽은 높은 비트의 경우를 놓칠 것입니다. 또한 같은 패스에서 읽기와 쓰기를 수행하면이를 놓칠 수 있습니다.
user313114

0

USB 드라이브는 매우 초보적이며, 잘못 될 수있는 것은 많지 않습니다! 일반적으로 드라이브로 표시되고 포맷 할 수 있으면 작동합니다. CrystalDiskInfo휴대용 버전은 빠른 경량 분석 도구이므로 살펴볼 수 있습니다. SMART 정보 등을보고하는 USB 스틱은 거의 없습니다.


1
다음은 영어로 된 Crystal Disk Info 매뉴얼입니다. crystalmark.info/software/CrystalDiskInfo/manual-en
Matt Simmons
당사 사이트를 사용함과 동시에 당사의 쿠키 정책개인정보 보호정책을 읽고 이해하였음을 인정하는 것으로 간주합니다.
Licensed under cc by-sa 3.0 with attribution required.