所以,问题是:我有一个 block 设备,例如/dev/sdd1,其中包含一个文件系统,例如EXT3 或 XFS,安装在/mnt/testdisk 下。
还有一个文件,/mnt/testdisk/somefile.bin。
我想要的是获取该文件所在的设备,在本例中为“/dev/sdd1”。而且,更糟糕的是,我必须在用户空间和内核模块中都这样做(它是一个 linux 驱动程序。它不必是可移植的)。
在用户空间: 我目前的尝试是打开
/proc/mounts
并逐行解析以找到路径名的最佳匹配。它有效,但我认为必须有更好的方法...
在内核驱动中: 我正在尝试使用 linux/fs.h header 中的 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
所以我无法从中提取 block 设备路径:(
我知道理论上从内核空间打开文件是一件坏事,但是,无论如何,不在乎。
那么,对于每种情况,解决该难题的最佳方法是什么?
最佳答案
我认为您通过访问 /proc/mounts
在用户空间中走上了正确的道路。
但是您不能从内核空间访问用户空间目录(例如。/mnt/...
)。我建议您看一下内核如何填充 /proc/mount
并将其用作实现您的功能的起点。
看看 kernel source ,那将是 proc_namespace.c
给你。查看 show_vfsstat
函数。
关于c - 如何获取包含文件的底层挂载 block 设备?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/24075294/