如何获取文件的设备/分区名称?

时间:2012-11-15 18:31:52

标签: c linux filesystems

我有分区结构,如:

$ 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()并解析文件名并打印其大小。 比如来自device:/ dev / sda6并列出该分区下的文件名。 当它从/ home读取内容时 - 它应显示从/ dev / sda7读取内容并列出文件名

如果您需要更多详情/信息,请告知我们

2 个答案:

答案 0 :(得分: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。主要/次要号码应该是分区的可靠唯一标识符。

答案 1 :(得分:1)

你可以做到

df <file_name>

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