Sysfs 标签¶
(几乎逐字摘自 Eric Biederman 的 netns 标签补丁提交消息)
问题。网络设备出现在 sysfs 中,并且在网络命名空间处于活动状态时,多个具有相同名称的设备可能会出现在同一目录中,糟糕!
为了避免这个问题,并允许网络命名空间中现有的应用程序看到当前在 sysfs 中呈现的相同接口,sysfs 现在具有标签目录支持。
通过使用网络命名空间指针作为标签来分隔 sysfs 目录条目,我们确保目录中没有冲突,并且应用程序只能看到有限的一组网络设备。
每个 sysfs 目录条目都可以通过其 kernfs_node
的 void *ns 成员
用命名空间标记。如果目录条目被标记,则 kernfs_node->flags
将具有 KOBJ_NS_TYPE_NONE 和 KOBJ_NS_TYPES 之间的标志,并且 ns 将指向它所属的命名空间。
每个 sysfs 超级块的 kernfs_super_info 包含一个数组 void *ns[KOBJ_NS_TYPES]
。当标记命名空间 kobj_nstype 中的任务首次挂载 sysfs 时,会创建一个新的超级块。它将通过将其 s_fs_info->ns[kobj_nstype]
设置为新命名空间来与其他 sysfs 挂载区分开来。请注意,通过绑定挂载和挂载传播,任务可以轻松查看其他命名空间的 sysfs 挂载的内容。因此,当命名空间退出时,它将调用 kobj_ns_exit() 来使任何指向它的 kernfs_node->ns 指针无效。
此接口的用户
在
kobj_ns_type
枚举中定义一个类型。使用其
kobj_ns_type_operations
调用 kobj_ns_type_register(),它具有current_ns(),它返回当前的命名空间
netlink_ns(),它返回套接字的命名空间
initial_ns(),它返回初始命名空间
当单个标签不再有效时,调用 kobj_ns_exit()