装载点归属

rpb*_*ear 5 linux mount go linux-kernel

我正在阅读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
}
Run Code Online (Sandbox Code Playgroud)

Jam*_*dge 5

stat(2)Linux上的手册页:

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

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

  • 你调用`stat` on的每个文件或目录都会设置`st_dev`字段来告诉你它属于哪个设备.关键是如果两个文件/目录具有不同的`st_dev`值,则它们属于不同的设备.作为推论,如果目录属于与其父目录不同的设备,则它必须是挂载点. (2认同)