Linux编程:文件所在的设备

时间:2011-04-01 19:34:09

标签: c linux file device

我想知道/ dev文件中的哪个条目。例如,如果/ dev / sdc1安装在/ media / disk下,我要求/media/disk/foo.txt,我想将/ dev / sdc作为响应。

对该文件使用 stat 系统调用,我将获得其分区主要和次要编号(对于sdc1为8和33)。现在我需要从中获取“root”设备(sdc)或其主要/次要设备。是否有系统调用或库函数我可以用来将分区链接到其主设备?或者甚至更好,直接从文件中获取该设备?

brw-rw---- 1 root floppy 8, 32 2011-04-01 20:00 /dev/sdc
brw-rw---- 1 root floppy 8, 33 2011-04-01 20:00 /dev/sdc1

提前致谢!

5 个答案:

答案 0 :(得分:8)

快速而肮脏的版本:df $file | awk 'NR == 2 {print $1}'

以编程方式......好吧,我开始使用快速和脏版本是有原因的。没有可移植的方法以编程方式获取已安装文件系统的列表。 (getmntent()获取fstab条目,这不是一回事。)而且,你甚至无法可靠地解析mount(8)的输出;在不同的Unix上,mountpoint可能是第一个或最后一个项目。最便携的方式最终是...解析df输出(即使这是iffy,正如你注意到的分区号。)。因此,无论如何,您都要回到快速而又脏的shell解决方案,除非您想要遍历/dev并查找匹配major(st_rdev)的{​​{1}}(major()来自sys/types.h的块设备)。

如果将此限制为Linux,则可以使用/proc/mounts获取已安装文件系统的列表。其他特定的Unix也可以类似地进行优化:例如,在OS X和我认为FreeBSD上,您可以在sysctl()树上使用vfs来获取挂载点。在最坏的情况下,您可以找到并使用适当的头文件来解密任何挂载表文件(是的,即使它有所不同:在Solaris上它是/etc/mnttab,在许多其他系统上它是/etc/mtab,一些系统放置它在/var/run而不是/etc,在许多Linux上它不存在或者是/proc/mounts的符号链接。它的格式在几乎所有类Unix操作系统上都是不同的。

答案 1 :(得分:3)

您想要的信息存在于sysfs中,它暴露了linux设备树。这模拟了系统上设备之间的关系,并且由于您尝试从分区中确定父磁盘设备,因此可以查看该位置。我不知道是否有任何硬性和快速的规则可以依赖于使用未来版本的内核来阻止代码破解,但内核开发人员确实尝试将sysfs维护为稳定的接口。

如果查看/sys/dev/block/<major>:<minor>,您会看到它是一个符号链接,其尾部组件为block/<disk-device-name>/<partition-device-name>。如果要对其执行readlink(2)系统调用,则可以解析链接目标以获取磁盘设备名称。在shell中(因为它更容易以这种方式表达,但在C中执行它将非常简单):

$ echo $(basename $(dirname $(readlink /sys/dev/block/8:33)))
sdc

或者,您可以利用磁盘目录中的分区目录的嵌套(再次在shell中,但是从C,它是open(2)read(2)close(2)):

$ cat /sys/dev/block/8:33/../dev
8:32

这假定你的起始专业:minor实际上是分区,而不是其他类型的非嵌套设备。

答案 2 :(得分:2)

你要找的东西是不可能的 - 块设备文件和它描述的分区之间没有1:1的连接。

考虑:

  1. 您可以使用不同的名称创建多个块设备文件(但是相同的主要和次要编号)并且它们无法区分(N:1)

  2. 您可以使用块设备文件作为参数来挂载以安装分区,然后删除块设备文件而不安装分区。 (0:1)

  3. 所以除了一些特定和狭隘的案例外,没有办法做你想做的事。

答案 3 :(得分:1)

主要编号将告诉您它是哪个设备:3 - 第一个控制器上的IDE,22 - 第二个控制器上的IDE和8个SCSI。

对于IDE设备,次要号码将告诉您分区号码 - 如果是主要或次要驱动器。 IDE和SCSI的计算方式不同。

对于IDE,它是:x * 64 + p,x是控制器上的驱动器号(0或1),p是分区

对于SCSI,它是:y * 16 + p,其中y是驱动器号,p是分区

答案 4 :(得分:0)

不是系统调用,而是:

df -h /path/to/my/file

来自https://unix.stackexchange.com/questions/128471/determine-what-device-a-directory-is-located-on

所以你可以查看df的源代码,看看它的作用。

我发现这篇文章已经过时了,但这个问题是我搜索的第二个结果,没人提到df -h