如何通过 ioctl 调用或其他方式查明 SCSI 设备(例如 /etc/sda)是否是磁盘?
如何通过 ioctl 调用或其他方式查明 SCSI 设备(例如 /dev/sda)是否是磁盘? 我已尝试以下操作,但 ioctl 调用失败。我的/dev/sda是一个U盘。
#include <stdlib.h>
#include <stdio.h>
#include <string.h>
#include <unistd.h>
#include <fcntl.h>
#include <errno.h>
#include <scsi/scsi.h>
#include <scsi/sg.h>
#include <sys/ioctl.h>
int main(int argc, char** argv) {
char *dev = "/dev/sda";
struct sg_scsi_id m_id;
int rc;
int fd;
fd = open(dev, O_RDONLY | O_NONBLOCK);
if (fd < 0) {
perror(dev);
}
memset(&m_id, 0, sizeof (m_id));
rc = ioctl(fd, SG_GET_SCSI_ID, &m_id);
if (rc < 0) {
close(fd);
printf("FAIL: ioctl SG_GET_SCSI_ID, rc=%d, errno=%d\n", rc, errno);
} else {
if (m_id.scsi_type == TYPE_DISK || m_id.scsi_type == 14) {
printf("OK: is disk\n");
} else {
printf("OK: is NOT disk\n");
}
}
close(fd);
return (EXIT_SUCCESS);
}
// result is: FAIL: ioctl SG_GET_SCSI_ID, rc=-1, errno=22
How to find out if SCSI device (say /dev/sda) is a disk or not via ioctl calls or other ?
I have tried the following but the ioctl
call fails. My /dev/sda is a USB flash disk.
#include <stdlib.h>
#include <stdio.h>
#include <string.h>
#include <unistd.h>
#include <fcntl.h>
#include <errno.h>
#include <scsi/scsi.h>
#include <scsi/sg.h>
#include <sys/ioctl.h>
int main(int argc, char** argv) {
char *dev = "/dev/sda";
struct sg_scsi_id m_id;
int rc;
int fd;
fd = open(dev, O_RDONLY | O_NONBLOCK);
if (fd < 0) {
perror(dev);
}
memset(&m_id, 0, sizeof (m_id));
rc = ioctl(fd, SG_GET_SCSI_ID, &m_id);
if (rc < 0) {
close(fd);
printf("FAIL: ioctl SG_GET_SCSI_ID, rc=%d, errno=%d\n", rc, errno);
} else {
if (m_id.scsi_type == TYPE_DISK || m_id.scsi_type == 14) {
printf("OK: is disk\n");
} else {
printf("OK: is NOT disk\n");
}
}
close(fd);
return (EXIT_SUCCESS);
}
// result is: FAIL: ioctl SG_GET_SCSI_ID, rc=-1, errno=22
如果你对这篇内容有疑问,欢迎到本站社区发帖提问 参与讨论,获取更多帮助,或者扫码二维码加入 Web 技术交流群。
绑定邮箱获取回复消息
由于您还没有绑定你的真实邮箱,如果其他用户或者作者回复了您的评论,将不能在第一时间通知您!
发布评论
评论(3)
我已经使用
SG_IO
解决了这个问题,并根据 的规范直接解释二进制数据INQUIRY 命令(字段:外围设备类型)并根据 SCSI 外围设备类型(如果 per.dev.type 为 00h 或 0Eh,则为磁盘)I have solved this using
SG_IO
and interpreting the binary data directly according to the specification of the INQUIRY command (field: peripheral device type) and interpreting them according to SCSI Peripheral Device Types (is disk if per. dev. type is either 00h or 0Eh)也许您可以从 /sys/bus/scsi/devices/*/ 文件系统获取有用的信息。
Maybe you can get useful information from /sys/bus/scsi/devices/*/ filesystem.
HDIO_GET_IDENTITY
似乎适用于磁盘,但不适用于闪存驱动器。我认为这就是hdparm -i
使用的。HDIO_GET_IDENTITY
seems to work for me on disks but not on flash drives. I think this is whathdparm -i
uses.