2009-05-25 5 views
32

SSD (솔리드 스테이트 드라이브)가 아닌 일반 하드 드라이브에서만 효과가있는 도구를 출시 할 준비가되었습니다. 실제로 SSD와 함께 사용해서는 안되며 실제 효과가없는 많은 읽기/쓰기가 발생하기 때문입니다.드라이브가 SSD인지 감지 할 수있는 방법이 있습니까?

누구나 주어진 드라이브가 솔리드 스테이트인지 감지하는 방법을 알고 있습니까?

+0

이 질문 갖는다 ([유닉스 및 리눅스 응답] http://unix.stackexchange.com/questions/65595/how-to-know-if-a-disk-is- an-ssd-or-an-hdd/65602 # 65602). – Totor

+0

[내 Ubuntu가 SSD에 있는지 확인하는 방법] (http://askubuntu.com/q/792814/253474) –

답변

3

SSD를 감지하는 것은 dseifert가 만드는 것처럼 불가능하지 않습니다. 리눅스의 libata (http://linux.derkeiler.com/Mailing-Lists/Kernel/2009-04/msg03625.html)에는 이미 약간의 진전이 있지만 사용자가 아직 준비가되어 있지는 않습니다.

그리고이 작업을 수행해야하는 이유를 분명히 이해합니다. 기본적으로 연결된 목록과 배열의 차이점입니다. 조각 모음 등은 일반적으로 SSD에서 비생산적입니다.

0

SSD 장치는 하드 디스크 장치 인터페이스를 에뮬레이션하므로 하드 디스크처럼 사용할 수 있습니다. 이것은 또한 그들이 무엇인지를 탐지 할 수있는 일반적인 방법이 없다는 것을 의미합니다.

모든 드라이브에서 정확하지는 않지만 드라이브 특성 (대기 시간, 속도, 크기)을 사용할 수 있습니다. 또 다른 가능성은 S.M.A.R.T. 데이터를 확인하고 모델명, 특정 값에 따라이 유형의 디스크를 판별 할 수 있는지 확인하십시오. 그러나 모든 드라이브의 데이터베이스를 보존하지 않으면 100 % 정확하지는 않습니다.

+0

나는 SSD를 위해 제조사가 시리얼 키를 생성하는 방법을 알아낼 수있는 유일한 방법이라고 생각합니다. HDD와는 반대로 그런 다음 모든 제조업체 및 해당 SSD 문자열 패턴 목록을 작성하십시오. 나는 그들이 나의 필요 (미국 시장을위한 iPods, 리눅스 fw를 가진 Linksys 라우터)에 맞는지를 결정하기 위해 일련 번호를 찾아야 만했다. – Mihaela

+0

시리얼 키가 유일한 방법이라고 말하는 것은 옳지 않다. 일부 드라이브는 RPM을 1 또는 0으로 유용하게보고합니다 (http://linux.derkeiler.com/Mailing-Lists/Kernel/2009-04/msg02562.html) –

+1

아마 맞 겠지만 확실하지 않습니다. "몇몇 드라이브"-> 문제가있다, 그것은 모든 드라이브, 추측이 아니야. – Mihaela

8

회전 대기 시간을 실제로 쉽게 결정할 수 있습니다. 대학 프로젝트의 일환으로 이것을 한 번했습니다. 이것은 this report에 설명되어 있습니다. 대기 시간에 대한 좋은 그래프를 볼 수있는 7 페이지로 건너 뛰십시오. 그것은 약 9.3ms에서 1.1ms로 - 8.2ms가 감소합니다. 이는 60 s/8.2 ms = 7317 RPM에 직접 해당됩니다.

완료되었습니다. with simple C code - 여기에 위치는 ab 사이의 위치를 ​​스크래치 파일로 측정합니다.

 
/* Measure the difference in access time between a and b. The result 
* is measured in nanoseconds. */ 
int measure_latency(off_t a, off_t b) { 
    cycles_t ta, tb; 

    overflow_disk_buffer(); 

    lseek(work_file, a, SEEK_SET); 
    read(work_file, buf, KiB/2); 

    ta = get_cycles(); 
    lseek(work_file, b, SEEK_SET); 
    read(work_file, buf, KiB/2); 
    tb = get_cycles(); 

    int diff = (tb - ta)/cycles_per_ns; 
    fprintf(stderr, "%i KiB to %i KiB: %i nsec\n", a/KiB, b/KiB, diff); 
    return diff; 
} 
+0

C 코드가 아닙니다! Jeff는 결코 그것을 처리 할 수 ​​없습니다! 추신 :이 포드 캐스트에 언급하고 우리는 마셔야 해! – geoffc

+0

Hehe :-) 나는 단지 "델파이"라는 태그를 보았다 : 그것에 대해 유감스럽게 생각한다. 나는 당신이 파스칼로 변환한다고 믿는다. 나는 수년 동안 델파이를 사용하지 않았다. –

3

운 얻을 수 Smartmontools에서

smartctl -i sda 

을 실행하여 : 우리는 모든 방법 실린더 주위에 방황 할 때까지 우리는 더 크고 더 큰 b 값이했다. 거의 모든 SSD는 모델 필드에 SSD가 있습니다. 그래도 보장은 없습니다.

+0

'smartctl -i/dev/sda'를 의미합니다 – EarthMind

29

마지막으로 신뢰할 수있는 솔루션! 두 명, 실제로!

/sys/block/sdX/queue/rotation을 확인하십시오. 여기서 sdX은 드라이브 이름입니다. 0이면 SSD를, 1은 평범한 오래된 HDD를 의미합니다.

내가 소개 한 Linux 버전에는 손가락을 대어 둘 수 없지만, 우분투의 Linux 3.2와 바닐라 리눅스 3.6에는 존재하며 바닐라 2.6.38에는 존재하지 않습니다. 오라클은 또한 backported을 2.6.32를 기반으로하는 Unbreakable Enterprise 커널 5.5에 제공합니다.

리눅스 3.3 이후로 드라이브가 회전하는지 확인하는 ioctl도 있습니다 (this commit). sysfs를 사용하는 것이 더 편리합니다.

+0

RHEL 6.4에도 있습니다. – Raedwald

+6

나는 이것을 시험해 보았고'rotation' 거짓말을했습니다. – Flimm

+3

@Flimm 이것에 대해 [커널 버그보고를하십시오] (https://bugzilla.kernel.org/). – Totor

0

오래된 질문이지만 매우 중요한 질문에 답하는 두 가지 핵심 ... SCSI를 통해 디스크에 액세스하면 SCSI INQUIRY 명령을 사용하여 회전 속도를 요청할 수 있습니다.VPD (Vital Product Data) 페이지는 Block Device Characteristics이고 숫자는 0xB1입니다. 바이트 4 페이지의 5 의미있는 숫자를 포함 :

  • 0001H "비 회전 매체 (예를 들면, 고체 상태)"
  • 0002H를 "중간 회전 속도가보고되지 않습니다"
    • 0000H - 0400H를 "예약"
    • 0401H - FFFEH "분당 회전 공칭 중간 회전 속도 (즉, RPM) (예 7 200 RPM = 1C20h, 10000 RPM = 2710h 및 15,000 RPM = 3A98h)"
    • FFFFh "예약 됨"

    따라서 SSD는 0001h이어야합니다. 이 페이지에 대한 T10.org 문서는 here입니다.

    그러나이 표준의 구현 상태는 분명하지 않습니다.

  • 0

    다음 자바 스크립트 코드를 작성했습니다. 컴퓨터가 SSD 드라이브를 사용하고 있는지 여부와 부팅 드라이브인지 확인해야했습니다. 이 솔루션은 MSFT_PhysicalDisk WMI 인터페이스를 사용합니다.

    function main() 
    { 
        var retval= false; 
        // MediaType - 0 Unknown, 3 HDD, 4 SSD 
        // SpindleSpeed - -1 has rotational speed, 0 has no rotational speed (SSD) 
        // DeviceID - 0 boot device 
        var objWMIService = GetObject("winmgmts:\\\\.\\root\\Microsoft\\Windows\\Storage"); 
        var colItems = objWMIService.ExecQuery("select * from MSFT_PhysicalDisk"); 
        var enumItems = new Enumerator(colItems); 
        for (; !enumItems.atEnd(); enumItems.moveNext()) 
        { 
         var objItem = enumItems.item(); 
         if (objItem.MediaType == 4 && objItem.SpindleSpeed == 0) 
         { 
          if (objItem.DeviceID ==0) 
          { 
           retval=true; 
          } 
         } 
        } 
        if (retval) 
        { 
         WScript.Echo("You have SSD Drive and it is your boot drive."); 
        } 
        else 
        { 
         WScript.Echo("You do not have SSD Drive"); 
        } 
        return retval; 
    } 
    main(); 
    
    +2

    이것은 답변이 아닙니다. – TomSlick

    3

    이 명령 lsblk -d -o name,rota를 나열 드라이브를하고는 SSD의 경우는 회전 디스크이고 0 경우 ROTA에서 1 있습니다. 출력 예 :

     
    NAME ROTA 
    sda  1 
    sdb  0 
    
    관련 문제