findmnt는 어떻게 바인드 마운트를 나열 할 수 있습니까?


11

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

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

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

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

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

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

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

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


어떤 버전을 findmnt실행하고 있으며 어떤 옵션을 제공하고 있습니까? Mine은 그것을 인쇄하지 않고 소스 코드를 보고이 정보를 가지고 있지 않은 것으로 _PATH_PROC_MOUNTINFO보입니다 /proc/self/mountinfo.
Bratchley

좋아, 나는 /proc/self/mountinfo비교적 최근에 재구성 된 것 같아 . 나는 경로 정보가 없었지만 RHEL7 컴퓨터가 있고 링크에서 언급했듯이 Wheezy 가하는 것처럼 RHEL6 컴퓨터에있었습니다.
Bratchley

말도 안되는 것은 아닙니다. 구형 커널에서는 사실이지만 최신 커널에서는 정보를 추적합니다.
Gilles 'SO- 악마

@Gilles 그렇다면 한 디렉토리가 다른 디렉토리에 마운트 된 정보를 추적하지 않으면 어떻게 바인드 마운트가 지속될 수 있습니까?
Melab

@Melab 사실, 바인드 마운트임을 추적하지 않으면 바인드 마운트가 지속되기가 더 쉽습니다. 경우 /dev/A에 장착 /B하고 당신이 mount --bind /B /C오래된 커널은 기억 /B → /dev/A하고 /C → /dev/A그들 사이의 관계를 기억하지 않는다, /B/C. 따라서 마운트 해제는 /B자연스럽게 아무런 영향을 미치지 않습니다 /C. 최신 커널 /C은의 바인드 마운트 /B였지만 마운트가 해제 /C되어도 계속 작동 하지 못하게하는 방법을 /B정확히 알고 있습니다.
Gilles 'SO- 악마 그만해

답변:


12

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

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

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


9

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"에 대한 답변을 참조하십시오 .


경우 /proc/self/mountinfo포함 할 수 있습니다 라인이 좋아 2 1 8:1 /a /b rw - ext4 /dev/sda1 rw,errors=remount-ro, 다음 리눅스는 가장 확실하게 수행 바인드 마운트에 대한 정보를 유지한다.
Melab

아니요. 두 번째 예를보십시오. 마운트 된 파일 시스템 및 마운트 된 파일 시스템 루트에 대한 경로를 정보로 유지합니다 . 그래서 대한 mount --bind /home/melab /mnt결과 라인은 다음에 따라 어떤처럼 보일 수 있습니다 /home/home/melab: 마운트 지점입니다 3 1 8:1 /home/melab /mnt rw - ext4 /dev/sda1 rw, 3 1 8:2 /melab /mnt rw - ext4 /dev/sda2 rw,3 1 8:3 / /mnt rw - ext4 /dev/sda3 rw
cg909

/네 번째 열과 다른 것이 종종 바인드 마운트를 나타내는 것은 사실입니다 . 그러나 Btrfs 하위 볼륨 일 수도 있습니다.
cg909

/dev/sda3장착해야 /home/melab합니까?
Melab

예. 내 예제에서 나는 사용 /dev/sda1으로 /, /dev/sda2같은 /home/dev/sda3같은/home/melab
cg909
당사 사이트를 사용함과 동시에 당사의 쿠키 정책개인정보 보호정책을 읽고 이해하였음을 인정하는 것으로 간주합니다.
Licensed under cc by-sa 3.0 with attribution required.