2013-05-02 4 views
3

좋아, 그래서 리눅스 시스템에서 사용자 할당량 내에서 작업해야하므로 주어진 경로에 대해 장치 이름 (예 : /dev/md2)을 찾을 수 있어야합니다. 그 경로에 대한 정확한 쿼터를 조회 할 수 있습니다.경로 또는 볼륨 식별자에 대한 장치 이름 가져 오기

지금, 나는 사용하여 충분히 쉽게 마운트 포인트를 얻을 수 있습니다 :

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

을 내가 그 지점을 마운트 장치 이름으로 변환 취할 수있는 가장 좋은 방법의 확실하지 않다 그러나? 문제를 더욱 복잡하게

, 나는 위의 명령에서 얻을 마운트 지점은 사실 내가처럼 보이는 뭔가가있을 수있는 경우에 암호화 된 폴더가 될 수 있습니다 의미

/dev/md2 -> /volume1 
/volume1/@[email protected] -> /volume1/Foo 

을 위 df 그 명령은/volume1/Foo의 마운트 지점을 식별합니다. 그러나 마운트 지점을 통해 작업하면서 안정적인 플랫폼 독립적 인 방법이 필요하며 quota과 함께 사용해야하는 실제 장치 이름을 찾으십시오.

구체적으로; 마운트 위치를/Volumes /에 넣는 OS X와 ​​같이 특정 위치에 볼륨을 마운트하는 환경에서 작업 할 수 있으므로 장치의 마운트 지점 인 경로의 첫 번째 부분에만 의존 할 수 없습니다.

+1

실제로 마운트 지점을 찾을 필요는 없습니다. 'stat -c % d/volume1/foo/bar'로 직접 얻을 수있는 대상 파일이있는 장치 번호가 필요합니다. 그런 다음 장치 번호가있는 특수 노드를'/ dev'에서 찾아야합니다. 내가 마지막 부분을 담당하는 훌륭한 스크립트 도구를 찾을 수는 없지만 grub를 설치했다면'grub-probe '를 사용하여 질문을 하나의 명령 줄에서 해결할 수 있습니다 :'/ usr/sbin/grub-probe --target = device/volume1/foo/bar' – Celada

+0

'di'프로그램을 사용해 볼 수도 있습니다 : http://gentoo.com/di/. 할당량 정보를 조회하여 사용 가능한 공간 표시에 사용합니다. –

+0

불행히도 나는 grub 또는 di를 사용할 수 없습니다. 가능한 한 일반적인 목적으로 스크립트를 유지해야합니다. df와 할당량이 다른 플랫폼에서 동일한 형식을 보장하지는 않기 때문에 큰 두통입니다, bah! 나는 심지어 내가 stat를 위해 -c 매개 변수에 의존 할 수 있다고 확신하지 않는다. 내가 사용하고있는 하나의 장치는 그것을 지원하지 않는다. 그것은 grep과 awk를 의미한다. 나는 장치 ID를 stat로부터 어떻게 처리해야할지 모르겠다. 나는 어디에서나 인식 할 수없는 "어/14d"중 하나를 가지고있다. – Haravikk

답변

1

좋아, 그래서 나는 다음과 같은 해결책을 생각해 냈다. 필사적으로 예쁜 것은 아니지만, 대부분의 유닉스 환경에서 mount와 df를 사용할 수 있어야하며, 더 이상 갈 수 없을 때까지 볼륨을 통해 올바른 장치 식별자를 반환해야합니다. 대부분의 경우 하나 또는 두 번의 반복 만 필요합니다.

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

큰 스크립트의 내용이므로 오타를 용서하십시오. 동일한 디스크/파티션으로 해석되는 여러 장치 쿼리가 수행되는 경우 매우 간단한 캐싱을 사용합니다.