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.