获取路径或卷标识符的设备名称

时间:2013-05-02 13:50:07

标签: shell filesystems mount quota

好的,所以我必须在linux系统上的用户配额内工作,并且需要能够找到给定路径的设备名称(例如 - /dev/md2),以便我可以查找该路径的正确配额。

现在,我可以使用以下方法轻松获得挂载点:

df -k "/volume1/foo/bar" | tail -1 | awk '{ print $6 }'

但是,我不确定采用该挂载点并将其转换为设备名称的最佳方法?

更复杂的是,我从上面的命令获得的挂载点实际上可能是一个加密的文件夹,在这种情况下,我可能会有类似的东西:

/dev/md2 -> /volume1
/volume1/@Foo@ -> /volume1/Foo

意味着上面的df命令将标识/ volume1 / Foo的挂载点。但是,我需要一种可靠的,独立于平台的方式,以便通过挂载点工作,并找到我需要与quota一起使用的实际设备名称。

具体而言;我不能仅仅依赖路径的第一部分作为设备的安装点,因为我可能正在使用在更具体位置安装卷的环境,例如将挂载放入/ Volumes /的OS X.

1 个答案:

答案 0 :(得分:1)

好的,所以我去了,并提出了以下解决方案;它并不是非常漂亮,但mount和df应该可用于大多数unix版本,这应该通过处理卷返回正确的设备标识符,直到它不再进一步。在大多数情况下,它只需要一次或两次迭代。

function get_device() {
    fs=$(df -k "$1" | tail -1)

    # Determine the device for the file-system
    device=
    mnt=$(echo "$fs" | awk '{ print $6 }')
    if [ "$cached_mnt" != "$mnt" ] 
        then
            cached_mnt="$mnt"

            mnts=$(mount)
            newmnt="$mnt"

            # Try to get a root mount point (for encrypted folders etc.)
            while [ -n "$newmnt" ] 
            do
                newmnt=$(echo "$mnts" | grep " on $mnt " | awk '{ print $1 }')
                [ "$newmnt" = "$mnt" ] && break

                if [ -n "$newmnt" ] 
                    then
                        device="$newmnt"
                        mnt=$(df "$newmnt" 2> /dev/null | tail -1 | awk '{print $6 }')

                        [ "$mnt" = "$device" -o "$mnt" = "$last" ] && break
                        last="$mnt"
                fi
            done

            cached_device="$device"
        else
            device="$cached_device"
    fi

    echo "$device"
}

原谅任何拼写错误,因为它来自更大的剧本。它使用非常简单的缓存,以防多个设备查询解析为同一磁盘/分区。

相关问题