好的,所以我必须在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.
答案 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"
}
原谅任何拼写错误,因为它来自更大的剧本。它使用非常简单的缓存,以防多个设备查询解析为同一磁盘/分区。