所以,问题是:我有一个块设备,例如,/ dev / sdd1,包含一个文件系统,例如: EXT3或XFS,安装在/ mnt / testdisk下。
还有一个文件/mnt/testdisk/somefile.bin。
我想要的是获取该文件所在的设备,在本例中为“/ dev / sdd1”。并且,为了使事情变得更糟,我必须在用户空间和内核模块中执行它(它是一个Linux驱动程序。它不必是可移植的)。
在用户空间中: 我目前的尝试是打开
/proc/mounts
并逐行解析以找到路径名的最佳匹配项。它有效,但我认为必须有更好的方法......
在内核驱动程序中: 我正在尝试使用linux / fs.h标题中的filp_open打开文件“/mnt/testdisk/somefile.bin”。
struct file *testfile;
struct inode *inode;
testfile = filp_open("/mnt/testdisk/somefile.bin", (O_RDWR | O_LARGEFILE), OP_FLAGS);
inode = testfile->f_mapping->host;
然而,出于某种原因
inode->i_bdev == NULL
所以我无法从中提取块设备路径:(
我知道理论上从内核空间打开文件是件坏事,但是,不管怎样,不关心。
那么,对于每个案例,解决这个难题的最佳方法是什么?
答案 0 :(得分:0)
我认为您通过访问/proc/mounts
在用户空间中采用正确的方式。
但是,您无法从内核空间访问用户空间目录(例如/mnt/...
)。我建议你看看内核如何填充/proc/mount
并将其作为实现功能的起点。
查看kernel source,proc_namespace.c
为您。看一下show_vfsstat
函数。
答案 1 :(得分:0)
对于用户空间部分,我会使用df -h:
df -h /mnt/testdisk/somefile.bin
对于内核部分,您可以使用以下命令获取struct block_device:
struct file *testfile;
struct block_device *bdev;
testfile = filp_open("/mnt/testdisk/somefile.bin", (O_RDWR | O_LARGEFILE), OP_FLAGS);
bdev = testfile->f_inode->i_sb->s_bdev;
还有一个相关问题here。