我需要知道如何找出/ proc/bus/usb/devices/dev/sdX設備映射到哪個項目。基本上,我需要知道給定U盤(可能沒有序列號)的供應商ID和產品ID。如何將/ proc/bus/usb/devices條目映射到/ dev/sdX設備?
在我的情況,我有這樣的條目在/ proc /總線/ USB /設備我的閃存驅動器:
T: Bus=01 Lev=01 Prnt=01 Port=00 Cnt=01 Dev#= 6 Spd=480 MxCh= 0
D: Ver= 2.00 Cls=00(>ifc) Sub=00 Prot=00 MxPS=64 #Cfgs= 1
P: Vendor=0781 ProdID=5530 Rev= 2.00
S: Manufacturer=SanDisk
S: Product=Cruzer
S: SerialNumber=0765400A1BD05BEE
C:* #Ifs= 1 Cfg#= 1 Atr=80 MxPwr=200mA
I:* If#= 0 Alt= 0 #EPs= 2 Cls=08(stor.) Sub=06 Prot=50 Driver=usb-storage
E: Ad=81(I) Atr=02(Bulk) MxPS= 512 Ivl=0ms
E: Ad=02(O) Atr=02(Bulk) MxPS= 512 Ivl=0ms
我碰巧知道,在我的情況下,它是/ dev/sda上,但我我不知道如何在代碼中弄清楚這一點。我的第一個方法是通過所有的/ dev/sdXX設備迴路並出具SCSI_IOCTL_GET_BUS_NUMBER和/或SCSI_IOCTL_GET_IDLUN請求,但返回的信息不幫我搭配起來:
/tmp # ./getscsiinfo /dev/sda
SCSI bus number: 8
ID: 00
LUN: 00
Channel: 00
Host#: 08
four_in_one: 08000000
host_unique_id: 0
我不知道我是怎麼可以使用SCSI總線編號或ID,LUN,Channel,Host將其映射到/ proc/bus/usb/devices中的條目。或者,我怎麼可能從/ proc /巴士/ USB/001/006設備,這是一個USBFS設備並沒有出現喜歡同樣的IOCTL的獲得SCSI總線號:
/tmp # ./getscsiinfo /proc/bus/usb/001/006
Could not get bus number: Inappropriate ioctl for device
這裏的測試代碼爲我的小getscsiinfo測試工具:
#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>
struct scsi_idlun
{
int four_in_one;
int host_unique_id;
};
int main(int argc, char** argv) {
if (argc != 2)
return 1;
int fd = open(argv[1], O_RDONLY | O_NONBLOCK);
if (fd < 0)
{
printf("Error opening device: %m\n");
return 1;
}
int busNumber = -1;
if (ioctl(fd, SCSI_IOCTL_GET_BUS_NUMBER, &busNumber) < 0)
{
printf("Could not get bus number: %m\n");
close(fd);
return 1;
}
printf("SCSI bus number: %d\n", busNumber);
struct scsi_idlun argid;
if (ioctl(fd, SCSI_IOCTL_GET_IDLUN, &argid) < 0)
{
printf("Could not get id: %m\n");
close(fd);
return 1;
}
printf("ID: %02x\n", argid.four_in_one & 0xFF);
printf("LUN: %02x\n", (argid.four_in_one >> 8) & 0xFF);
printf("Channel: %02x\n", (argid.four_in_one >> 16) & 0xFF);
printf("Host#: %02x\n", (argid.four_in_one >> 24) & 0xFF);
printf("four_in_one: %08x\n", (unsigned int)argid.four_in_one);
printf("host_unique_id: %d\n", argid.host_unique_id);
close(fd);
return 0;
}
有沒有人有任何想法?
不幸的是,我似乎無法從udev獲取/ dev/sdX節點。 dev節點路徑libudev返回給我的usb棒爲空。但是我確實得到了它的父路徑(主控制器),但不幸的是指向了/ proc/bus/usb/001/006設備。我需要能夠安裝這個設備,我只能做到這一點與適當的/ dev/sdX的設備...我不知道哪一個/ dev/sdX設備涉及到的/ proc /巴士/ USB/001/006。 libudev也不會給我這些信息。 – Tom
大多數Linux系統都有'udev'配置爲在插入USB密鑰時執行操作。也許你可以根據你的需要調整配置規則 –