装载点归属

时间:2013-10-22 09:23:26

标签: linux linux-kernel go mount

我正在阅读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
}

1 个答案:

答案 0 :(得分:5)

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

  

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

所以有问题的代码是在目录及其父目录上调用stat系统调用,并检查它们是否驻留在不同的设备上。只有在不同的文件系统上才会出现这种情况,这表明相关目录是一个挂载点。