【问题标题】:How to get a device/partition name of a file ?如何获取文件的设备/分区名称?
【发布时间】:2012-11-04 10:15:24
【问题描述】:

我有这样的分区结构:

$ df
Filesystem     1K-blocks     Used Available Use% Mounted on
/dev/sda6       51606140 16939248  34142692  34% /
/dev/sda5         495844    72969    397275  16% /boot
/dev/sda7      113022648 57515608  49765728  50% /home
/dev/sda8     113022648 57515608  49765728  4% /mnt

在使用 readdir() 解析目录内容时 - 如何找出哪个文件驻留在哪个设备上?

readdir() 从根目录调用并解析文件名并打印其大小。 就像来自设备:/dev/sda6 并列出该分区下的文件名。 当它从 /home 读取内容时 - 它应该显示从 /dev/sda7 读取的内容并列出文件名

如果您需要更多详细信息/信息,请告诉我

【问题讨论】:

  • 如果你打电话给readdir,一定有人先打电话给opendir。调用opendir时使用的路径是什么?
  • 实际上,opendir() 会在 / 目录上被调用。它解析整个文件系统 - 它在哪里面临识别是否跨越到不同分区的问题?

标签: c linux filesystems


【解决方案1】:

struct stat中有一个st_dev成员,它应该唯一标识一个分区。

bash 中的示例:

stat ~/.vimrc
  File: `/home2//leonard/.vimrc' -> `local-priv/vimrc'
  Size: 16              Blocks: 0          IO Block: 4096   symbolic link
Device: 802h/2050d      Inode: 6818899     Links: 1
Access: (0777/lrwxrwxrwx)  Uid: ( 1024/ leonard)   Gid: ( 1024/ leonard)
Access: 2012-06-22 16:36:45.341371003 +0300
Modify: 2012-06-22 16:36:45.341371003 +0300
Change: 2012-06-22 16:36:45.341371003 +0300

stat 实用程序没有额外的魔法。这是 strace -vvv 的输出:

lstat64("/home2//leonard/.vimrc", {st_dev=makedev(8, 2), st_ino=6818899, st_mode=S_IFLNK|0777, st_nlink=1, st_uid=1024, st_gid=1024, st_blksize=4096, st_blocks=0, st_size=16, st_atime=2012/06/22-16:36:45, st_mtime=2012/06/22-16:36:45, st_ctime=2012/06/22-16:36:45}) = 0

0x0802 是主要的 8(sd) 分区 2,所以 /dev/sda2

为了将其映射到实际分区,您可以迭代 /proc/mounts 并统计所有设备(第一列)。 /proc/mounts 的内容就像 mount(1) 的输出一样,只是它直接来自内核。一些发行版将 /etc/mtab 符号链接到 /proc/mounts。

或者你可以解析/proc/partitions:

$ cat /proc/partitions
major minor  #blocks  name

   8        0  976762584 sda
   8        1    3998720 sda1
   8        2  972762112 sda2

当然 /dev/sda 可能实际上并不存在,该设备可能正在使用长 udev 名称,例如 /dev/disk/by-uuid/c4181217-a753-4cf3-b61d-190ee3981a3f。主要/次要编号应该是分区的可靠唯一标识符。

【讨论】:

  • 谢谢,我从 stat 中得到了major/minor(8,2) 编号 - 如何获取其对应的分区名称(/dev/sda2)?
  • 已编辑以解释映射到分区或设备名称。
  • 感谢 cdleonard 的帮助,我可以使用 /proc/partitions 文件了。
【解决方案2】:

你可以这样做

df <file_name>

这将为您提供特定文件的设备和分区

【讨论】:

  • 谢谢,它适用于 shell 脚本,我正在寻找 C 编程的解决方案。
  • 你不能只从 C 中调用 shell 命令并将输出流式传输到变量中吗?
  • 我正在寻找任何库/系统调用解决方案(因为当前代码库不使用任何 shell 命令),如果它不可用,我会接受你的建议。采取 shell 命令输出并解析得到想要的结果。
猜你喜欢
  • 1970-01-01
  • 2010-11-09
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多