我有一台旧的硬盘驱动器,我打算用它来摆弄一下。我要做的第一件事就是以不同的速度旋转电机。
问题是:
我实际上发现了一个功能,显然是旋转电机,这是:
/* 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);
}
虽然我不太明白实际命令发送到控制器的位置,也不知道如何控制速度,但我没有看到任何转速规格。
答案 0 :(得分:4)
你无法控制硬盘的转速,这是一件好事。如果可以,你将不可避免地破坏数据。
头部漂浮在通常所说的“空气轴承”中。 换句话说,就是磁盘的旋转在磁盘的运行速度下处于平衡状态时,弹簧机构将磁头压在磁盘表面上,并具有明确的力和来自气流的空气。当磁盘关闭时,另一个弹簧机构会迅速将磁头拉出一个“停放位置”。
如果你可以以任意速度运行驱动器,那么磁头会刮伤表面。不好!</ p>
关于在上面的代码段中发送实际命令的位置,ioctl
之后的行中是/* execute SCSI request */
来电。
如果您有兴趣使用旧的硬盘(请注意,您很可能会破坏它!),请查看hdparm
工具及其源代码。 hdparm
可让您调整许多参数,例如省电模式,缓存或声音管理......几乎所有磁盘驱动器都支持这些参数。
在该工具的源代码中,您还可以找到完整的设备命令列表。