마운트 지점의 inode가 변경되면 Linux 바인드 마운트가 사라지는 이유는 무엇입니까?

마운트 지점의 inode가 변경되면 Linux 바인드 마운트가 사라지는 이유는 무엇입니까?

요약하자면, 새 마운트 네임스페이스 위에 파일을 바인드 마운트한 후 상위 네임스페이스의 inode가 변경되면 /tmp/a바인드 마운트가 하위 네임스페이스에서 사라집니다. 이유를 이해하려고 노력 중입니다./tmp/b/tmp/b

mount(8)는 단일 파일(디렉토리만)을 바인드 마운트하는 기능을 공개하지 않으므로 이 작업을 재현하려면 필요한 mount(2) 시스템 호출을 실행하는 추가 실행 파일이 필요합니다. 다음은 간단한 예입니다(아래 참조 bmount).

#include <sys/mount.h>
#include <errno.h>
#include <stdio.h>
#include <string.h>

int main(int argc, char *argv[]) {
    if (argc != 3) {
        printf("requires exactly 2 args\n");
        return 1;
    }

    int err = mount(argv[1], argv[2], "none", MS_BIND, NULL);
    if (err == 0) {
        return 0;
    } else {
        printf("mount error (%d): %s\n", errno, strerror(errno));
        return 1;
    }
}

테스트 케이스 설정:

# echo a > /tmp/a; echo b > /tmp/b; echo c > /tmp/c;
# ls -ldi /tmp/a /tmp/b /tmp/c
11403315 -rw-r--r-- 1 root root 2 Jan 19 13:34 /tmp/a                                                               
11403422 -rw-r--r-- 1 root root 2 Jan 19 13:34 /tmp/b
11403452 -rw-r--r-- 1 root root 2 Jan 19 13:34 /tmp/c

이제 별도의 셸에서 다음을 수행합니다.

# unshare -m /bin/bash
# bmount /tmp/a /tmp/b
# ls -ldi /tmp/a /tmp/b /tmp/c
11403315 -rw-r--r-- 1 root root 2 Jan 19 13:34 /tmp/a
11403315 -rw-r--r-- 1 root root 2 Jan 19 13:34 /tmp/b
11403452 -rw-r--r-- 1 root root 2 Jan 19 13:34 /tmp/c
# cat /tmp/b
a
# grep "\/tmp\/" /proc/self/mounts
[redacted] /tmp/b ext4 rw,relatime,errors=remount-ro,data=ordered 0 0

원래 쉘에서:

# mv /tmp/c /tmp/b
# ls -ldi /tmp/a /tmp/b /tmp/c
ls: cannot access '/tmp/c': No such file or directory                                                               
11403315 -rw-r--r-- 1 root root 2 Jan 19 13:34 /tmp/a                                                               
11403452 -rw-r--r-- 1 root root 2 Jan 19 13:34 /tmp/b

unshare셸 에서 :

# ls -ldi /tmp/a /tmp/b /tmp/c
ls: cannot access '/tmp/c': No such file or directory
11403315 -rw-r--r-- 1 root root 2 Jan 19 13:34 /tmp/a
11403452 -rw-r--r-- 1 root root 2 Jan 19 13:34 /tmp/b
# cat /tmp/b
c
# grep "\/tmp\/" /proc/self/mounts
#

바인드 마운트가 조용히 사라지고 /tmp/b이제 기본 파일 시스템의 파일이 네임스페이스 내에서 표시됩니다.

내가 하나 찾았어lwn.net 기사의미 체계의 변경 사항은 다음과 같습니다. 2013 이전에는 mv마운트 지점에 대한 명령이 표시와 함께 실패했지만 성공하고 마운트가 제거되도록 동작이 변경되었습니다. 관련 커널 커밋은 다음과 같습니다.rename(2)EBUSY8ed936b5671.

내 질문은 다음과 같습니다

  1. inode 변경 시 마운트가 제거되는 이유는 무엇입니까? 마운트 지점이 단순한 경로가 아닌 덴트리로 식별되는 마운트 시스템의 구현 세부 사항입니까?
  2. 네임스페이스 외부의 파일 시스템 작업으로 덮어쓰거나 삭제할 수 없다는 점에서 바인드 마운트를 덜 "취약"하게 만드는 방법이 있습니까?

실습과 관련된 상황은 다음과 같습니다.IP-넷(8); 의 ip netns exec바인드를 통해 설치됩니다 . resolvconf(8) 또는 systemd-resolved에 의해 inode가 변경되면 업데이트된 내용이 네임스페이스 내에서 실행되는 프로세스에 표시됩니다./etc/netns/${NAMESPACE}/resolv.conf/etc/resolv.conf/etc/resolv.conf/etc/resolv.conf

답변1

이것이 설치 전파입니다. Linux에서는 기본적으로 이를 활성화하지 않지만 systemd에서는 활성화합니다. 설치 및 제거가 새 네임스페이스에 전파되는 것을 원하지 않으면 mount --make-rprivate /해당 네임스페이스에서 실행할 수 있습니다.. 내레이터: 이것은 마운트 전파가 아닙니다.

inode 변경 시 마운트가 제거되는 이유는 무엇입니까? 마운트 지점이 단순한 경로가 아닌 덴트리로 식별되는 마운트 시스템의 구현 세부 사항입니까?

나는 당신이 기대할 수 있는 것과 존재하지 않는 한 언제든지 관찰하는 것이 불가능하다는 것 rm b; mv c b사이의 유일한 차이점을 말하고 싶습니다 . 나는 그것을 잘 설계되었거나 유지 관리되는 기능이라고 설명하고 싶습니다... 이것이 역사적으로 다중 사용자 Unix 시스템에서 어느 정도 사실인지는 확실하지 않지만 예를 들어 실행 중인 시스템에서 소프트웨어 업데이트를 지원하기 위해 확실히 의존했습니다. .mv c bb

나는...생각해 볼 수 있어"inode 변경"이라고 부르는 또 다른 특정 기능이 구현되었습니다.- 이것은 마지 못해 수행되며 파일 시스템에 따라 다릅니다.

관련 정보