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。主要/次要编号应该是分区的可靠唯一标识符。