5

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

1 回答 1

5

stat(2)Linux 的手册页:

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

所以有问题的代码正在做的是stat在目录及其父目录上调用系统调用,并检查它们是否驻留在不同的设备上。仅当它们位于不同的文件系统上时才会如此,这表明所讨论的目录是挂载点。

于 2013-10-22T09:37:11.923 回答