2014-02-20 6 views
1

나는 약간의 주위에 바이올린을 쓸 계획이었던 오래된 HDD를 가지고있다. 우선 내가하려고하는 것은 다른 속도로 모터를 돌리는 것입니다.리눅스에서 C로 하드 드라이브 모터 속도를 제어하는 ​​방법?

질문은 다음과 같습니다

  1. 이 작업을 수행하는 일반적인 방법이 있나요하거나 하드 디스크 모델에 의존 하는가?
  2. 어디에서 모터 속도를 제어하기 위해 HDD 컨트롤러에 보낼 수있는 명령 목록을 찾을 수 있습니까?

는 사실은 여기있다, 분명히 모터를 회전 기능을 발견 : 실제 명령이 컨트롤러로 전송된다

/* spin-down a disk */ 
static void spindown_disk(const char *name) 
{ 
    struct sg_io_hdr io_hdr; 
    unsigned char sense_buf[255]; 
    char dev_name[100]; 
    int fd; 

    dprintf("spindown: %s\n", name); 

    /* fabricate SCSI IO request */ 
    memset(&io_hdr, 0x00, sizeof(io_hdr)); 
    io_hdr.interface_id = 'S'; 
    io_hdr.dxfer_direction = SG_DXFER_NONE; 

    /* SCSI stop unit command */ 
    io_hdr.cmdp = (unsigned char *) "\x1b\x00\x00\x00\x00\x00"; 

    io_hdr.cmd_len = 6; 
    io_hdr.sbp = sense_buf; 
    io_hdr.mx_sb_len = (unsigned char) sizeof(sense_buf); 

    /* open disk device (kernel 2.4 will probably need "sg" names here) */ 
    snprintf(dev_name, sizeof(dev_name), "/dev/%s", name); 
    if ((fd = open(dev_name, O_RDONLY)) < 0) { 
    perror(dev_name); 
    return; 
    } 

    /* execute SCSI request */ 
    if (ioctl(fd, SG_IO, &io_hdr) < 0) { 
    char buf[100]; 
    snprintf(buf, sizeof(buf), "ioctl on %s:", name); 
    perror(buf); 

    } else if (io_hdr.masked_status != 0) { 
    fprintf(stderr, "error: SCSI command failed with status 0x%02x\n", 
      io_hdr.masked_status); 
    if (io_hdr.masked_status == CHECK_CONDITION) { 
     phex(sense_buf, io_hdr.sb_len_wr, "sense buffer:\n"); 
    } 
    } 

    close(fd); 
} 

난 정말 이해가 안하지만,도 내가 할 속도를 제어하는 ​​방법을 알고, 나는 어떤 rpm 사양도 보지 못한다.

답변

3

하드 디스크의 회전 속도를 제어 할 수 없으므로 좋은 방법입니다. 그렇게 할 수 있다면 필연적으로 데이터를 파괴 할 수 있습니다.

헤드는 일반적으로 "에어 베어링"으로 부유합니다. 이것은 디스크의 작동 속도에서 평형 상태에있는 디스크의 회전으로 인해 잘 정의 된 힘과 기류로 인한 공기의 우발적 인 소리로 헤드를 디스크의 표면 위로 밀어 넣는 스프링 메커니즘입니다. 디스크가 꺼지면 다른 스프링 장치가 헤드를 신속하게 "주차 위치"로 끌어들입니다.

의 경우 임의의 속도로 드라이브를 실행하면 헤드가 표면에 긁힐 수 있습니다. 안좋다!

위의 코드에서 실제 명령이 전송되는 곳은 /* execute SCSI request */ 다음 줄의 ioctl 호출입니다.
오래된 하드 디스크를 가지고 놀고 싶다면 hdparm 도구와 소스 코드를 살펴보십시오. hdparm을 사용하면 절전 모드, 캐싱 또는 엄격한 관리와 같은 수십 가지 매개 변수를 조정할 수 있습니다. 디스크 드라이브가 지원하는 거의 모든 것.
도구의 소스 코드에는 아주 완벽한 장치 명령 목록도 있습니다.

+0

고맙습니다. hdparm을 살펴보세요. 컨트롤러가 회전 속도를 제어 할 수있는 옵션을 제공하지 않는다는 것을 알지 못했지만 물론 이해할 수 있습니다. – defoe