Как контролировать скорость двигателя жесткого диска с C на Linux?
У меня есть старый жесткий диск, с которым я планировал немного повозиться. Первое, что я пытаюсь сделать, это вращать мотор с разными скоростями.
Вопросы:
- Есть ли общий способ сделать это или это зависит от модели жесткого диска?
- Где я могу найти список команд, которые я могу отправить на контроллер жесткого диска для управления скоростью двигателя?
Я действительно нашел функцию, которая, по-видимому, вращает двигатель, вот она:
/* 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
позволяет настраивать десятки параметров, таких как режимы энергосбережения, кэширование или управление акустикой... практически все, что поддерживают дисководы.
В исходном коде инструмента вы также найдете довольно полный список команд устройства.