1 释放网络命名空间
内核中对于要释放的网络命名空间,都会通过struct net的cleanup_list成员链入全局释放链表cleanup_list中:
加入cleanup_list全局链表后,将net_clean_up工作交给netns_wq工作队列,唤醒worker thread执行释放网络命名空间的操作。其中net_clean_up和netns_wq的定义如下:
static DECLARE_WORK(net_cleanup_work,cleanup_net);
static struct workqueue_struct *netns_wq;
网络命名空间具体的释放由cleanup_net()函数执行:
该函数主要做了几件事:
1. 用net_kill_list链表代替要释放的网络命名空间链表cleanup_list(也就清空了cleanup_list)
2. 遍历net_kill_list上的所有命名空间,将其从全局的网络命名空间net_namespace_list链表中删除,并加入net_exit_list链表中
3. 执行net_exit_list中网络命名空间子系统的exit函数
4. 释放网络命名空间的gen变量
5. 从net_exit_list中删除网络命名空间并进行释放
2 与proc关系
proc下与网络相关的主要是两个目录:/proc/net/ 和/proc/sys/net。那么这两个目录是如何和网络命名空间关联起来的呢?
/proc/net目录主要是记录了网络相关的统计信息,/proc/net的初始化如下:
start_kernel ——》 proc_root_init ——》 proc_net_init
proc_net_init函数如下:
int __init proc_net_init(void)
{
proc_symlink("net",NULL, "self/net"); //把net连到self/net上
returnregister_pernet_subsys(&proc_net_ns_ops);//注册网络命名空间中的proc子系统
}
static struct pernet_operations__net_initdata proc_net_ns_ops = {
.init= proc_net_ns_init,
.exit= proc_net_ns_exit,
};
当