【问题标题】:Checking local filesystem fsid from osx kernel extension (kext)从 osx 内核扩展 (kext) 检查本地文件系统 fsid
【发布时间】:2017-07-23 07:34:43
【问题描述】:

我有 WA 来检查 kext 上下文中的本地 fsid 是什么,只需读取预定义的本地文件状态。

static inline uint64_t get_fsid(const vfs_context_t ctx, const vnode_t vp) {
    struct vnode_attr vap;
    VATTR_INIT(&vap);
    VATTR_WANTED(&vap, va_fsid);
    vnode_getattr(vp, &vap, ctx);
    return (uint64_t)vap.va_fsid;
}

另一种选择是从用户空间计算 fsid 并将此信息传递给驱动程序(使用 getmntinfo

但是,我更喜欢直接从内核空间获取这些数据,而不依赖于当前存在的任何文件。是否有任何 KPI 来支持此请求?

【问题讨论】:

  • 你所说的“WA”是什么意思?
  • @pmdj,我不确定是否有适当的 KPI 来观察挂载信息...感谢您的准确回答!

标签: macos filesystems kernel-extension xnu


【解决方案1】:

您可以使用该函数遍历系统中的所有挂载点

int vfs_iterate(int, int (*)(struct mount *, void *), void *);

对于每个 mount 对象,您可以使用检查其 fsid

struct vfsstatfs *  vfs_statfs(mount_t);

vfsstatfs 有一个 f_fsid 字段。

函数和结构都在<sys/mount.h> 中声明和记录。函数在 BSD KPI 中导出。

【讨论】:

  • 是否可以从vfs_iterate 中判断出挂载点所代表的文件系统是本地的还是可弹出的(插入钥匙上的磁盘)还是远程网络设备?
  • struct vfsstatfs * vfs_statfs(mount_t); 返回的结构包含一些相关信息,例如f_mntfromname 应该是例如/dev/disk0s2 用于基于块设备的挂载点,f_flags 应该设置 MNT_LOCAL
猜你喜欢
  • 1970-01-01
  • 2018-08-08
  • 2012-09-11
  • 1970-01-01
  • 1970-01-01
  • 2022-11-08
  • 2014-02-17
  • 2010-12-15
  • 1970-01-01
相关资源
最近更新 更多