Linux读取U盘或者移动硬盘序列号并获取U盘或者移动硬盘分区名。基本原理如下:
当有外置 USB 插入的时候,会产生 /proc/scsi/usb-storage 目录,并在其中产生数字文件(形如 1 2 3 4),此文件存储了设备相关信息。
相应的 /sys/class/scsi_device/ 目录中会有 scsi 设备的目录(ide 硬盘默认无子目录,sata硬盘默认有子目录),以数字开头(形如 1:0:0:0 2:0:0:0)
这个数字与前面 /proc/scsi/usb-storage目录中的相对应,子目录表示sata硬盘。比如 /sys/class/scsi_device/2:0:0:0/device/block 中有USB设备,从该目录下得到U盘或者移动硬盘的分区名,比如sda1。
该demo实现了上述过程,先检查 /proc/scsi/usb-storage 目录,看是否有u盘或者移动硬盘接入,如果有则读取u盘或者移动硬盘的序列号,然后在/sys/class/scsi_device/目录下逐级查找,直到找到u盘或者移动硬盘的分区。
完整代码,可直接编译和测试,嵌入式环境下也是适应的。
在linux测试如下,id表示序列号,sdb1表示是分区名称:
# ./a.out
udisk dev num:0
udisk id:055CE21B
ret:0
dev num:0
found dir:0:0:0:1
found dev dir:0:0:0:1,full path:/sys/class/scsi_device/0:0:0:1
sub founction found dir:sda
found sd device dir:sda,full path:/sys/class/scsi_device/0:0:0:1/device/block/sda
found dir:0:0:0:2
found dev dir:0:0:0:2,full path:/sys/class/scsi_device/0:0:0:2
sub founction found dir:sdb
found sd device dir:sdb,full path:/sys/class/scsi_device/0:0:0:2/device/block/sdb
found sd sub device dir:sdb1
found dir:0:0:0:0
found dev dir:0:0:0:0,full path:/sys/class/scsi_device/0:0:0:0
sub funciton Open Directory /sys/class/scsi_device/0:0:0:0/device/block Error:No such file or directory
get name return:0,disk name:sdb1
#
因为有的USB设备会有好几个,比如把CD和U盘集成到一起,就会出现上面的情况,有多个子目录去查找。