Как контролировать скорость двигателя жесткого диска с C на Linux?

У меня есть старый жесткий диск, с которым я планировал немного повозиться. Первое, что я пытаюсь сделать, это вращать мотор с разными скоростями.

Вопросы:

  1. Есть ли общий способ сделать это или это зависит от модели жесткого диска?
  2. Где я могу найти список команд, которые я могу отправить на контроллер жесткого диска для управления скоростью двигателя?

Я действительно нашел функцию, которая, по-видимому, вращает двигатель, вот она:

/* 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);
}

Хотя я не совсем понимаю, куда на контроллер отправляется фактическая команда, и при этом я не знаю, как управлять скоростью, я не вижу каких-либо спецификаций оборотов.

1 ответ

Решение

Вы не можете контролировать скорость вращения жесткого диска, и это хорошо. Если бы вы могли, вы неизбежно уничтожили бы данные.

Головки плавают в так называемом "воздушном подшипнике". Проще говоря, это пружинный механизм, прижимающий головку к поверхности дисков с четко определенной силой, и воздушный поток от воздушного потока вследствие того, что вращение диска находится в равновесии на рабочей скорости диска. Когда диск отключается, другие пружинные механизмы быстро вытягивают головки в своего рода "парковочное положение".

Если бы вы могли управлять приводом на произвольной скорости, головки поцарапали бы поверхность. Нехорошо!

Что касается того, где фактическая команда отправляется в приведенном выше фрагменте, это ioctl позвоните по следующей линии /* execute SCSI request */,
Если вы заинтересованы в игре со своим старым жестким диском (знайте, что вы, скорее всего, сломаете его!), Взгляните на hdparm инструмент и его исходный код. hdparm позволяет настраивать десятки параметров, таких как режимы энергосбережения, кэширование или управление акустикой... практически все, что поддерживают дисководы.
В исходном коде инструмента вы также найдете довольно полный список команд устройства.

Другие вопросы по тегам