我在看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 上的 stat(2)
手册页:
The
st_dev
field describes the device on which this file resides. (Themajor(3)
andminor(3)
macros may be useful to decompose the device ID in this field.)
所以有问题的代码正在做的是对目录及其父目录调用 stat
系统调用,并检查它们是否驻留在不同的设备上。这只有在它们位于不同的文件系统上时才是正确的,这表明所讨论的目录是一个挂载点。
关于linux - 挂载点归属,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/19513874/