首页
社区
课程
招聘
[原创]linux下判断某一磁盘是否为usb类型
2010-5-28 14:54 12500

[原创]linux下判断某一磁盘是否为usb类型

2010-5-28 14:54
12500
玩linux 也有一段时间啦。。想区分linux下某一设备是否为usb设备。。google了一段时间,,

ioctl   没有找到
判断拔出,插入的也有些例子可看,,但是假如,知道 一个名为: /dev/sda 的分区,如何根据分区名判断这个设备是不是usb设备。。网上有读/proc的。在我用的Ubuntu 10.04中看,没有/dev/sda对应的相关信息。。

最后根据udev 实现一个比较山寨的函数,,
bool is_usb_device(char * devpath)
{
	struct stat buf;
	char link[512] = {0};
	char link_path[512]={0};
	if(lstat(devpath,&buf) < 0)
	{
		return false;
	}	
	printf("dev %d,%d,\n",major(buf.st_dev),minor(buf.st_dev));
	if( S_ISBLK(buf.st_mode))
	{
		sprintf(link_path,"/sys/dev/block  /%d:%d",major(buf.st_rdev),minor(buf.st_rdev));
		if( access(link_path,F_OK) >= 0  )
		{
			int i = readlink(link_path,link,512);
			if(i == 0 ) return false;
			string strlink = link;
			int pos = strlink.find("usb",0);
			if(pos == string::npos) return false;
			return true; 		

		}	

	}	
	
	return false;

}


大家有什么其它好方法的。欢迎分享和讨论。。。

devfs、sysfs、udev介绍
一、devfs

linux下有专门的文件系统用来对设备进行管理,devfs和sysfs就是其中两种。

在2.6内核以前一直使用的是devfs,devfs挂载于/dev目录下,提供了一种类似于文件的方法来管理位于/dev目录下的所有设备,我们知道 /dev目录下的每一个文件都对应的是一个设备,至于当前该设备存在与否先且不论,而且这些特殊文件是位于根文件系统上的,在制作文件系统的时候我们就已经建立了这些设备文件,因此通过操作这些特殊文件,可以实现与内核进行交互。但是devfs文件系统有一些缺点,例如:不确定的设备映射,有时一个设备映射的设备文件可能不同,例如我的U盘可能对应sda有可能对应sdb;没有足够的主/辅设备号,当设备过多的时候,显然这会成为一个问题;/dev目录下文件太多而且不能表示当前系统上的实际设备;命名不够灵活,不能任意指定等等。

二、sysfs

正因为上述这些问题的存在,在linux2.6内核以后,引入了一个新的文件系统sysfs,它挂载于/sys目录下,跟devfs一样它也是一个虚拟文件系统,也是用来对系统的设备进行管理的,它把实际连接到系统上的设备和总线组织成一个分级的文件,用户空间的程序同样可以利用这些信息以实现和内核的交互,该文件系统是当前系统上实际设备树的一个直观反应,它是通过kobject子系统来建立这个信息的,当一个kobject被创建的时候,对应的文件和目录也就被创建了,位于/sys下的相关目录下,既然每个设备在sysfs中都有唯一对应的目录,那么也就可以被用户空间读写了。用户空间的工具udev 就是利用了sysfs提供的信息来实现所有devfs的功能的,但不同的是udev运行在用户空间中,而devfs却运行在内核空间,而且udev不存在 devfs那些先天的缺陷。很显然,sysfs将是未来发展的方向。

The top level sysfs directory looks like:
block/
bus/
class/
devices/
firmware/
net/
fs/

devices/ contains a filesystem representation of the device tree. It maps
directly to the internal kernel device tree, which is a hierarchy of
struct device.

bus/ contains flat directory layout of the various bus types in the
kernel. Each bus's directory contains two subdirectories:
       devices/
       drivers/
devices/ contains symlinks for each device discovered in the system
that point to the device's directory under root/.

drivers/ contains a directory for each device driver that is loaded
for devices on that particular bus (this assumes that drivers do not
span multiple bus types).

fs/ contains a directory for some filesystems. Currently each
filesystem wanting to export attributes must create its own hierarchy
below fs/ (see ./fuse.txt for an example).

三、udev

udev是一种工具,它能够根据系统中的硬件设备的状况动态更新设备文件,包括设备文件的创建,删除等。设备文件通常放在/dev目录下,使用udev 后,在/dev下面只包含系统中真实存在的设备。它于硬件平台无关的,位于用户空间,需要内核sysfs和tmpfs的支持,sysfs为udev提供设备入口和uevent通道,tmpfs为udev设备文件提供存放空间。

[培训]科锐软件逆向50期预科班报名即将截止,速来!!! 50期正式班报名火爆招生中!!!

收藏
免费 7
打赏
分享
最新回复 (3)
雪    币: 243
活跃值: (149)
能力值: ( LV2,RANK:10 )
在线值:
发帖
回帖
粉丝
xicao 2014-1-9 16:31
2
0
google了半天,找来了,不错
cat  /proc/partitions
雪    币: 36
活跃值: (10)
能力值: ( LV2,RANK:10 )
在线值:
发帖
回帖
粉丝
zhuyi注意 2015-1-18 00:32
3
0
呃 这个不一定准确啊 比如我openwrt挂了两个USB移动硬盘
root@openwrt:/mnt# cat  /proc/partitions
major minor  #blocks  name

   8        0    1000944 sda
   8        1       4096 sda1
   8        2     993280 sda2
  31        0     993280 mtdblock0
  31        1     982080 mtdblock1
   8       16  244198584 sdb
   8       17  244196001 sdb1
   8       32  156290902 sdc
   8       33  156289878 sdc1
雪    币: 11
活跃值: (10)
能力值: ( LV2,RANK:10 )
在线值:
发帖
回帖
粉丝
tylinging 2015-1-19 18:07
4
0
学习了,看了下我系统里有个/sys/block/sdc/removable这个应该可以判断
游客
登录 | 注册 方可回帖
返回