【问题标题】:Mount point attribution挂载点归属
【发布时间】:2013-10-31 02:06:05
【问题描述】:

我在看docker的源码,通过这样的测试条件,它会检查一个目录是否已经挂载,它的原理是什么?

func Mounted(mountpoint string) (bool, error) {
    mntpoint, err := os.Stat(mountpoint)
    if err != nil {
        if os.IsNotExist(err) {
                return false, nil
        }
        return false, err
    }
    parent, err := os.Stat(filepath.Join(mountpoint, ".."))
    if err != nil {
        return false, err
    }
    mntpointSt := mntpoint.Sys().(*syscall.Stat_t)
    parentSt := parent.Sys().(*syscall.Stat_t)
    return mntpointSt.Dev != parentSt.Dev, nil
}

【问题讨论】:

    标签: linux linux-kernel go mount


    【解决方案1】:

    来自 Linux 上的 stat(2) 手册页:

    st_dev 字段描述了此文件所在的设备。 (major(3)minor(3) 宏可能有助于分解该字段中的设备 ID。)

    因此,有问题的代码正在对目录及其父目录调用stat 系统调用,并检查它们是否位于不同的设备上。只有当它们位于不同的文件系统上时才会出现这种情况,这表明有问题的目录是一个挂载点。

    【讨论】:

    • 你的意思是每个挂载的目录都有不同的st_dev,还是只有挂载的目录和它的父目录在不同的st_dev上?
    • 您调用stat 的每个文件或目录都将设置st_dev 字段来告诉您它属于哪个设备。关键是如果两个文件/目录有不同的st_dev 值,那么它们属于不同的设备。作为推论,如果一个目录与其父目录属于不同的设备,那么它必须是一个挂载点。
    猜你喜欢
    • 1970-01-01
    • 2020-02-19
    • 1970-01-01
    • 2017-04-22
    • 1970-01-01
    • 2022-12-18
    • 2021-07-03
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多