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

さて、私は試してみて、次の解決策を思いつきました。それほどきれいではありませんが、マウントと df はほとんどの UNIX フレーバーで利用できるはずです。これは、それ以上進むことができなくなるまでボリュームを処理することで、正しいデバイス識別子を返すはずです。ほとんどの場合、1 回か 2 回の繰り返しで十分です。

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 に答える