首页 | 新闻 | 新品 | 文库 | 方案 | 视频 | 下载 | 商城 | 开发板 | 数据中心 | 座谈新版 | 培训 | 工具 | 博客 | 论坛 | 百科 | GEC | 活动 | 主题月 | 电子展
返回列表 回复 发帖

应用挂载名称空间(4)

应用挂载名称空间(4)

可以选择性共享每个用户专用的挂载树我们已经讨论了每个用户专用的挂载树;现在讨论如何允许用户选择一部分挂载树在用户之间共享。下面是一个用于系统引导的脚本。
清单 7. 用于系统引导的脚本
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
init_per_user_namespace {
    mkdir -p /user/slave_tree
    mkdir -p /user/share_tree

    #start with a clean state. Set all mounts to private.
    mount --make-rprivate /

    mount --bind /user /user
    mount --bind /user/share_tree /user/share_tree
    mount --bind /user/slave_tree /user/slave_tree

    mount --make-rshared  /

    mount --make-unbindable /user

    for user in `cat /etc/user_list`; do
        sh /bin/create_user_tree $user
    done
}




首先创建一个 /user 挂载,它包含每个用户的根目录。然后,在 /user 下面创建另一个称为 /user/share_tree 的目录,其中包含每个用户可以与其他用户共享的挂载。还创建一个 /user/slave_tree 目录,其中的挂载由每个用户共享,但是不接受来自其他用户的任何修改。当然,为了包含非绑定挂载,我们将 /user 下面的挂载标为不可绑定的。最后,调用 create_user_tree 为每个用户创建挂载树。
清单 8 给出了创建挂载树并允许其他用户共享挂载涉及的步骤。
清单 8. 用于创建用户的脚本
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
create_user_tree {

        user = $1
    mkdir -p /user/$user

    #copy over the entire mount tree under /user/$user
    mount --rbind / /user/$user
    make --make-rslave /user/$user
    make --make-rshared /user/$user

    cd /user/$user/home/$user

    #export my shared exports
    mkdir -p my_shared_exports
    chown $user my_shared_exports
    mount --bind my_shared_exports my_shared_exports
    mount --make-private my_shared_exports
    mount --make-shared my_shared_exports
    mkdir -p /user/share_tree/$user
    mount --bind my_shared_exports /user/share_tree/$user

    #export my slave exports
    mkdir -p my_slave_exports
    chown $user my_slave_exports
    mount --bind my_slave_exports my_slave_exports
    mount --make-private my_slave_exports
    mount --make-shared my_slave_exports
    mkdir -p /user/slave_tree/$user
    mount --bind my_slave_exports /user/slave_tree/$user

    cd /user/$user

    #import everybody's shared exports
    mkdir -p others_shared_exports
    mount --rbind /user/share_tree others_shared_exports

    #import everybody's slave exports
    mkdir -p others_slave_exports
    mount --rbind /user/slave_tree others_slave_exports
    mount --make-rslave others_slave_exports

    #setup a private mount in the user's tree, This is to facilitate
    # pivot_mount executed later, during new user-logins.
    mkdir -p __my_private_mnt__
    mount --bind __my_private_mnt__ __my_private_mnt__
    mount --make-private __my_private_mnt__
}




首先,在 /user/$user 下复制整个挂载树。在用户的树中,创建一个共享的挂载 my_shared_exports,在 /user/share_tree/$user 下复制它,从而导出给所有用户。同样,在用户的树中创建 my_slave_exports,在 /user/slave_tree/$user 下复制它,从而导出给所有用户。这里的关键思想是,用户可以选择在 my_shared_tree 下挂载的内容,所有其他用户会自动地共享这些挂载。
接下来,复制 /user/share_tree 下的挂载树并将它挂载在正在登录的用户的 others_shared_exports 下,这样就导入了所有其他用户的共享挂载。同样,复制 /user/slave_tree 下的挂载树并将它挂载在 others_slave_exports 下,这样就导入了所有其他用户的从属挂载。当然,因为这些挂载由导出者以从属挂载的形式导出,所以我们将它们转换为从属挂载。
完成了实现共享所需的设置步骤之后,用户登录算法就与  中一样了。在每次登录时,用户会获得一个完全相同的挂载树;同时,用户会在 /others_shared_export 和 /others_slave_exports 下分别看到其他所有用户导出的所有共享挂载和从属挂载。
如果用户希望向其他用户导出某些内容,那么只需将这些内容挂载在 my_shared_exports 下,所有用户就能够自动地看到它们。
返回列表