linux - 挂载点归属

标签 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
}

最佳答案

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

The st_dev field describes the device on which this file resides. (The major(3) and minor(3) macros may be useful to decompose the device ID in this field.)

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

关于linux - 挂载点归属,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/19513874/

相关文章:

regex - 如何使用 pcregrep 排除多个目录?

python - Windows 批处理脚本中的 URL 编码

linux - 是否可以关闭 linux 内核并在实模式下恢复?

c - 检查地址范围是否在进程地址空间中的石蕊测试?

linux - 关闭内核中的功能会导致内核模块(使用功能)行为不端吗?

go - 在debian armv7l上安装Go的最新版本[保留]

linux - 如何查找相同大小的文件?

c - fork() 的工作

go - 如何为Stormpath生成Oauth2.0 token

去解析XML文件