findmnt는 어떻게 바인드 마운트를 나열 할 수 있습니까? 답변 : 따라서 마운트 마운트가 바인드 마운트

많은 사람들이 리눅스가 바인드 마운트에 대한 정보를 보관하지 않는다고 말하면서, 그 소스와 소스 목록을 얻을 방법이 없습니다. 여기 몇 가지 예가 있어요.

  • 에서 여기에 코멘트 중 하나 :

    IIRC는이 정보를 어디에도 보관하지 않습니다. 이후 mount --bind두 사본이 동등하며 다른 것보다 “원본”인 것은 없습니다. 이미 마운트 해제했다면 원본이 없을 수 있습니다 /mnt.

  • 에서 이 사이트에 대한 답변 :

    따라서 마운트 마운트가 바인드 마운트 인 것을 기억하는 유일한 방법은에 마운트 명령 로그가 남아있는 것 /etc/mtab입니다. 바인드 마운트 조작은 바인드 마운트 옵션으로 표시됩니다 (파일 시스템 유형이 무시되도록 함). 그러나 mount에는 특정 옵션 세트로 마운트 된 파일 시스템 만 나열하는 옵션이 없습니다.

  • 에서 데비안 버그 리포트 :

    이것은 의도적 인 것입니다. 두 마운트 지점은 모든면에서 완전히 동일하므로 커널은이를 구별하기위한 플래그를 유지하지 않습니다.

위의 내용은 말도 안됩니다. 이 도구 findmnt는 바인드 마운트의 소스 경로를 나열 할 수 있습니다 (의 형식으로 device[source-path]; 또한 장치가 아닌 소스 경로 나열하려고합니다 ). Linux 커널이 바인드 마운트를 유지 관리하는 경우 해당 정보를 어딘가에 저장해야합니다 . 그렇지 않으면 이 정보 /home가 바인딩되어 있음을 알 수 없습니다 /users. 이 데이터는 어디에 있습니까? RAM의 모호한 영역에 저장되어 있습니까? 합니까 findmnt에서 보면 /proc어딘가?



답변

당신은 조금 오해했습니다; 바인드는 한 경로에서 다른 경로로 액세스를 효과적으로 리디렉션하기 때문에 권한, 플래그 등의 관점에서 두 마운트 지점이 동일 합니다. 그러나 그들은 여전히 독특하다 .

살펴보면 /proc/self/mountinfo이 프로세스에 대한 마운트 월드의 커널 뷰를 볼 수 있습니다 (네임 스페이스로 인해 작업이 더 복잡해집니다. 마운트 테이블에 대한 하나의 뷰만있는 것은 아닙니다 ).

man 5 proc이 파일의 형식을 설명하지만 트리 계층 구조와 바인드 마운트에 “부모”가있는 위치를 볼 수 있습니다. 이것은 findmnt파싱 되는 파일입니다 .


답변

Linux는 어느 마운트가 바인드 마운트인지에 대한 정보를 유지하지 않습니다 . 바인드 마운트를 포함한 모든 마운트 에 대한 정보를 유지합니다 .

하드 링크와 매우 유사합니다. 마운트는 파일 이름이 inode에 연결되는 것과 같은 파일 시스템에 연결됩니다. 유일한 차이점은 마운트는 마운트 지점마다 플래그를 가지며 파일 시스템 루트 대신 대상 파일 시스템의 서브 디렉토리를 참조 할 수 있다는 것입니다.

하드 링크를 만들 때 파일 시스템은 어떤 파일 이름이 원래 파일 이름이고 어떤 파일이 하드 링크인지 저장하지 않습니다. 둘 다 단순히 동일한 inode를 나타냅니다. 원본 파일을 연결 해제하면 두 번째 파일 이름으로 파일을 직접 작성한 경우와 상황을 구분할 수 없습니다.

마운트 바인드로 돌아 가기 : 커널은 파일 시스템 (주 : 부 숫자 쌍으로 식별), 마운트 포인트, 파일 시스템 루트에 상대적인 경로 및 일부 플래그를 포함하는 테이블을 유지합니다. 에서이 목록에 액세스 할 수 있습니다 /proc/self/mountinfo. @ stephen-harris가 언급했듯이 네임 스페이스가 관련되면 더 복잡해집니다. findmnt이리스트를 해석합니다.

루트가 /dev/sda1major : minor 8:1와 함께 있고 run mount --bind /a /b /proc/self/mountinfo에 다음과 유사한 행이 포함 된 경우 :

1 0 8:1 / / rw - ext4 /dev/sda1 rw,errors=remount-ro
2 1 8:1 /a /b rw - ext4 /dev/sda1 rw,errors=remount-ro

당신 /home/dev/sda2major : minor에 8:2있고 실행 mount --bind /home /users하면 다음과 같이 보일 것입니다 :

1 0 8:1 / / rw - ext4 /dev/sda1 rw,errors=remount-ro
2 1 8:2 / /home rw - ext4 /dev/sda2 rw
3 1 8:2 / /users rw - ext4 /dev/sda2 rw

귀하의 질문과 관련된 열은 세 번째, 네 번째 및 다섯 번째 열입니다. 이것들은 파일 시스템 ID입니다 ( 실제 파일 시스템의 경우 장치 major : minor와 동일합니다. tmpfs와 같은 가상 파일 시스템의 경우 [0 : 카운터 ]), 마운트 지점에 바인딩 된 파일 시스템 루트에 상대적인 경로 (일반적으로 / 일반의 경우) 마운트, 바인드 마운트에 대한 것일 수 있음) 및 마운트 지점.
나머지 열의 의미는 Linux 커널 설명서를 참조하십시오 .

findmnt파일 시스템 루트 “FSROOT”에 상대적인 소스 경로를 호출합니다. 당신은 findmnt -o TARGET,FSROOT그것을 얻을 수 있습니다. 절대 소스 경로를 원한다면 아마도 /proc/self/mountinfo직접 파싱 하고 동일한 파일 시스템의 마운트에 대한 정보를 결합 해야합니다 .

자세한 내용은 “List only bind mounts”에 대한 답변을 참조하십시오 .