파일의 경우 루트 디렉터리에 마운트된 모든 파일을 나열합니다.

파일의 경우 루트 디렉터리에 마운트된 모든 파일을 나열합니다.

컨테이너 내부에 액세스하려는 파일이 있습니다. 전체 경로는 한 디스크에서 다른 디스크로 이동합니다. 이는 시행착오를 거쳐 제대로 작동할 때까지 바인딩 포인트를 계속 추가했다는 의미입니다. 나는 더 나은 방법을 원합니다.

이 목록을 자동으로 찾는 방법이 있습니까? 시각적으로 다른 드라이브로 이동한 것을 알 수 있는데 이를 알 수 있는 속성이 있습니까? 점프는 최소한 심볼릭 링크여야 한다고 생각합니다.

예를 들어, 마운트 지점이 있고 /나열하려는 파일이 있는 경우(어느 쪽이든 상관없습니다)./var/usr/var/log/thing.log/var/

어떤 안내에도 감사드립니다.

답변1

파일의 경로 이름을 따라가면 현재 경로의 마운트 지점을 보고할 수 있습니다.

item=/var/log/thing.log
while [ -n "$item" ]      # Stop when we reach the top
do
    stat -c %m "$item"    # Report the mountpoint
    item="${item%/*}"     # Strip back one component of the path
done |
    uniq                  # Discard duplicates

원한다면 모든 내용을 한 줄로 압축할 수 있습니다.

while [ -n "$item" ]; do stat -c %m "$item"; item="${item%/*}"; done | uniq

답변2

현재 프로세스에 대한 모든 설치 정보는 다음 위치에 있습니다./proc/self/mountinfo. 자세히 살펴보는 것이 좋습니다.

# show_mounts [file_or_dir] [show_hidden]
show_mounts(){
  tac /proc/self/mountinfo |
  awk -v p=$(realpath "${1:-.}") -v h="$2" '
    mi ? mi==$1 : index(p,$5)==1 {mi=$2; if(h || !a[$5]++) printf "%-20s %s\n", $5, $9 }
  '
}

예:

$ unshare -Urm
# mkdir -p ~/junk/dir{1,2}
# cd ~/junk
# for i in 1 2 3 4; do mount -B dir1 dir2; done
# show_mounts dir2
/home2/ahq/junk/dir2 /dev/sdb9
/home2               /dev/sdb9
/                    /dev/sdb8

# show_mounts dir2 show_hidden
/home2/ahq/junk/dir2 /dev/sdb9
/home2/ahq/junk/dir2 /dev/sdb9
/home2/ahq/junk/dir2 /dev/sdb9
/home2/ahq/junk/dir2 /dev/sdb9
/home2               /dev/sdb9
/                    /dev/sdb8

물론 이는 /proc/self/mountinfo홈 디렉토리 중 하나가 아직 설치되지 않았다고 가정합니다 ;-)

관련 정보