심볼릭 링크에서 마운트를 바인딩하는 방법

심볼릭 링크에서 마운트를 바인딩하는 방법

이는 다음과 유사합니다.심볼릭 링크를 통해 바인드 마운트를 수행하는 방법은 무엇입니까?

그러나 여기서 질문은 심볼릭 링크에서 --bind를 마운트하는 방법입니다.

나는 /linux-4.13.0과 그것을 가리키는 심볼릭 링크 linux를 가지고 있습니다: /linux -> /linux-4.13.0

아니요, 저는 mount --bind /linux /current 를 선호하지만 실제로는 심볼릭 링크가 아닌 /linux-4.13.0 대상을 마운트합니다. 이는 나중에 기호 링크를 변경해도 더 이상 설치에 영향을 미치지 않음을 의미합니다. 이 상황을 바꿀 수 있는 방법이 있나요?

답변1

아쉽게도 마운트의 기본으로 인해 원하는 것은 불가능합니다.

"mount AB"를 호출하여 "A" 디렉터리를 얻고 "B" 대신 커널 디렉터리 계층 구조에 추가합니다. 일반적인 경우 "A"는 "B"에 연결된 FS의 루트가 있는 파일 시스템을 포함하는 블록 장치입니다. 바인드 마운팅은 단순히 "A" 디렉토리를 얻습니다. (모바일 마운트는 기본적으로 바운드 마운트와 동일하며 원래 위치에서 "A"를 추가로 분리할 뿐입니다.)

따라서 제공하는 "A" 및 "B" 경로는 먼저 모든 기호 링크 및 관련 구성 요소를 탐색하여 두 개의 실제 디렉터리를 가져옴으로써 해결됩니다. 커널에는 더 이상 원래 경로가 없습니다. (이것이 바로 어떤 시스템이 호출된 "mount" 명령을 정확히 기억하기 위해 /etc/mtab 파일을 사용하는 이유이기도 합니다.)

이 모든 것은 디렉터리가 아닌 다른 디렉터리가 아닌 디렉터리(예: 일반 파일)를 설치할 때도 적용됩니다. 디렉토리가 아닌 디렉토리에 디렉토리를 마운트할 수 없으며 그 반대의 경우도 마찬가지입니다.

답변2

Linux v5.12+ 커널을 사용하면 새로운 마운트 API를 사용하여 심볼릭 링크에서 바인드 마운트를 생성할 수 있습니다. 예는 다음과 같습니다.

$ unshare --mount
$ mount --types tmpfs tmpfs /tmp
$ cd /tmp
$ echo TEST1 > test1
$ echo TEST2 > test2
$ ln --symbolic test1 symlink1
$ ln --symbolic test2 symlink2
$ cat symlink1
TEST1
$ cat symlink2
TEST2
$ bindmount-v2 symlink1 symlink2
Mounting symlink1 into symlink2
$ cat symlink2
TEST1
$ cat /proc/self/mountinfo | grep symlink
2221 2323 0:120 /symlink1 /tmp/symlink2 rw,relatime - tmpfs tmpfs rw,inode64

이것은 간단한 C 프로그램을 사용합니다bindmount-v2. 표준 설치 유틸리티에 이를 추가하려는 시도는 본 적이 없습니다.

추가는 AT_SYMLINK_NOFOLLOW심볼릭 링크에서 바인드 마운트를 생성하는 핵심 부분입니다.

노트:

  • 제가 드린 답변과 거의 같습니다서버 장애에 대해Bindmount의 "심볼릭 링크를 통해" 및 "심볼릭 링크에서" 사례에 적합하기 때문입니다.
  • 기호 링크는 디렉토리에 바인드 마운트하거나 디렉토리에서 마운트할 수 없습니다.

관련 정보