Linux下应如何获取磁盘信息

Linux下如何获取磁盘信息熟悉Linux的都知道,Linux下硬盘的命名规则是had、hdb…sda、sdb之类的。但是,如何才能知道机器上到底有多少块硬盘呢?


  刚开始,我以为/dev目录下会有所体现结果我发现设备文件存在并不代表这个设备。那么怎么办才好呢。后来我发现fdisk可以得到硬盘的数量。于是就阅读了一下fdisk的源代码。果然找到了Linux获取硬盘数量的方法。实例代码如下:


  #include


  #include


  int GetDiskCount()


  {


  FILE* f = fopen(“/proc/partitions”, “r”);


  if (!f)


  {


  fprintf(stderr, “fopen /proc/partitions failed!errno=%d\n”, errno);


  return 0;


  }


  char line[100], ptname[100], devname[120], *s;


  int ma, mi, sz;


  int nDiskCount = 0;


  while (fgets(line, sizeof(line), f))


  {


  if (sscanf(line, “ %u %u %u %[^\n ]”,


  &ma, &mi, &sz, ptname) != 4)


  continue;


  for (s = ptname; *s; s++)


  continue;


  /* note: excluding ‘0’: e.g. mmcblk0 is not a partition name! */


  if (s[-1] 》= ‘1’ && s[-1] 《= ‘9’)


  continue;


  nDiskCount++;


  }


  fclose(f);


  return nDiskCount;


  }


  int main(int argc, char * argv[])


  {


  printf(“DiskCount: %d\n”, GetDiskCount());


  return 0;


  }


  其实,原理很简单。就是通过proc文件系统获得。在proc文件系统中有一个名为partitions的文件。这个文件中包含本地磁盘的硬盘及分区信息。根据Linux下设备命名规则,如果设备名的最后一个字符是数字就应该是分区,否则就是硬盘。于是,我们就可以轻而易举的知道电脑中有几个硬盘。


  当然,根据这个文件,还可以知道硬盘设备名称以及每个硬盘中分区的数量和每个分区的设备名称。至于如何获取,大家应该都会的。


  获取硬盘信息:


  现在,我们已经可以知道硬盘数量、硬盘的设备名称、分区数及分区的设备名称。那么,怎么才能知道这些设备的信息呢?比如硬盘大小、扇区大小、分区大小、分区已经使用的大小等等。


  关于硬盘的信息,在fdisk的源码中也可以找到相关的源码。实例代码如下:


  #include


  #include


  int GetDiskCount()


  {


  FILE* f = fopen(“/proc/partitions”, “r”);


  if (!f)


  {


  fprintf(stderr, “fopen /proc/partitions failed!errno=%d\n”, errno);


  return 0;


  }


  char line[100], ptname[100], devname[120], *s;


  int ma, mi, sz;


  int nDiskCount = 0;


  while (fgets(line, sizeof(line), f))


  {


  if (sscanf(line, “ %u %u %u %[^\n ]”,


  &ma, &mi, &sz, ptname) != 4)


  continue;


  for (s = ptname; *s; s++)


  continue;


  /* note: excluding ‘0’: e.g. mmcblk0 is not a partition name! */


  if (s[-1] 》= ‘1’ && s[-1] 《= ‘9’)


  continue;


  nDiskCount++;


  }


  fclose(f);


  return nDiskCount;


  }


  int main(int argc, char * argv[])


  {


  printf(“DiskCount: %d\n”, GetDiskCount());


  return 0;


  }


  其实,就是通过打开设备文件然后分别调用ioctl来获取硬盘的大小、扇区大小、CHS信息等等。程序运行结果如下:


  user:~/$sudo 。/diskinfo /dev/sda


  Disk /dev/sda infomation:


  Size: 42949672960 Bytes 40.00 GB


  SectorSize: 512 Bytes


  heads: 255


  sectors: 63


  cylinders: 5221


  start: 0




原文出自【比特网】,转载请保留原文链接:http://soft.chinabyte.com/os/313/12230813.shtml
原文出自【比特网】,转载请保留原文链接:http://soft.chinabyte.com/os/313/12230813.shtml
原文出自【比特网】,转载请保留原文链接:http://soft.chinabyte.com/os/313/12230813.shtml
  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
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盘集成到一起,就会出现上面的情况,有多个子目录去查找。

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值