3

好的,所以我必须在 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。

4

1 回答 1

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"
}

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

于 2013-05-04T14:00:44.873 回答