【问题标题】:How to know the partition?如何知道分区?
【发布时间】:2012-01-01 21:12:39
【问题描述】:

我使用的是 Linux (Ubuntu 11.10)。 好吧,当我调用系统调用 open 时,例如在 C 程序中:

size_t filedesc = open("testfile.txt",O_CREAT | O_WRONLY,0640);

如何访问分区,我的意思是有没有办法返回使用的分区?

系统调用open就是上面定义的:

SYSCALL_DEFINE3(open, const char __user *, filename, int, flags, int, mode)

如果我愿意,我可以输入printk("%s",filename) 并查看路径。但是我怎样才能访问分区呢?

一个例子:我在两个不同的分区中有两个档案 example.txt(例如 /dev/sda1 和 /dev/sda2)。

然后我调用系统调用 open:假设我调用了分区 /dev/sda2 中的 example.txt。 有没有办法使用 open 系统调用访问分区(例如,printk(KERN_ALERT "%s",partition))?

【问题讨论】:

  • 我不明白你说的是用户领域还是内核领域。我猜它是用户领域(从应用程序中可以看出),但那为什么还要打扰 printk 呢?
  • 你为什么要做所有这些事情?你的解释令人困惑!
  • @Basile 是对的,我对您要完成的工作感到困惑。我想我们在这里有一个XY problem——你问的是如何为一个问题实施解决方案,但如果我们知道你要解决的问题,我们可能会提出更好的建议。那么:您真正想解决什么问题?谢谢

标签: c linux kernel system-calls


【解决方案1】:

没有什么比你希望的那么简单。

do_sys_open() 函数中,紧接在return fd; 之前,struct file *f 指向一个合法的、打开的struct file

struct file 包含一个 struct path f_path

struct path 包含一个 struct vfsmount *mntstruct vfsmount 代表系统上每个挂载的文件系统。

struct vfsmount 包含一个 struct super_block *mnt_sb

struct super_block 包含一个 struct block_device *s_bdev

struct block_device 包含一个 struct hd_struct *bd_part

struct hd_struct 包含一个 struct device __dev 和一个 int partno。这两者一起定义了您的文件所在的分区。

更新

当我找到设备和分区号引用时,我最初停止查找,因为我认为这就是将人类友好的字符串组合在一起所需的全部内容。但是当我用新的眼光再看时,我发现还有更多:

struct hd_struct 包含一个 struct partition_meta_info *info

struct partition_meta_info 包含一个字段:

    u8 volname[PARTITION_META_INFO_VOLNAMELTH];

此字段是您要查找的设备的名称。

【讨论】:

  • 以上大概是从内核内部看到的。在应用程序内部,只涉及系统调用。
  • 问题标记为kernel
  • 内核没有open 函数,它作为对应用程序的系统调用提供。
  • 如果他在内核中编程,他最好学得快:)当你搞砸时,它不是很宽容。
  • @UserJ 内核有许多不同的层,系统调用或文件系统不知道或不关心分区,这通常由块层处理(在某些情况下,文件系统可以分布在许多分区和驱动器上)。您必须经过一些步骤才能解决分区问题。查看 statvfs() 并将其与挂载点交叉引用。
【解决方案2】:

通过外壳,df /some/dir 为您提供相关的文件系统。以编程方式,通过stat 系统调用,您将获得st_dev 字段。

已添加:)我不知道您到底想做什么,但使用FUSE 可能会更简单。

【讨论】:

    猜你喜欢
    • 2021-07-14
    • 2020-12-25
    • 1970-01-01
    • 2019-11-29
    • 2018-03-11
    • 2019-11-22
    • 1970-01-01
    • 2022-08-24
    相关资源
    最近更新 更多