마운트 지점의 이름을 바꾸거나 이동할 수 없는 이유는 무엇입니까?

마운트 지점의 이름을 바꾸거나 이동할 수 없는 이유는 무엇입니까?

다음과 같이 마운트 지점의 상위 디렉터리를 이동할 수 있습니다.

$ mkdir -p f/mnt
$ bindfs --no-allow-other f/mnt f/mnt
$ mv f g
$

하지만 마운트 지점 자체의 이름을 바꿀 수는 없습니다.

$ mv g/mnt g/m
mv: cannot move 'g/mnt' to 'g/m': Device or resource busy

이러한 차이점에 대한 보안, 호환성 또는 구현 이유가 있습니까?

내 커널 버전은 4.17.19-200.fc28.x86_64입니다.

답변1

이것이 작동하지 않는 이유에 대한 Healy의 대답은 정확합니다.

그러나 당신은 실제로할 수 있는Linux에서 마운트 지점 자체를 이동합니다. 질문의 예를 빌리면 올바른 방법은 다음과 같습니다.

mount --move g/mnt g/m

대상 디렉터리(이 경우 g/m)는 마운트 지점의 유효한 위치여야 하며(디렉터리가 존재해야 함 등) 루트 권한(또는 CAP_MOUNT)으로 실행해야 하지만 그 외에는 기본적으로 제한이 없습니다.

이 작업을 수행하면 모두 업데이트됩니다.커널 관리마운트 테이블 항목(현재 마운트 네임스페이스 내), 열린 파일 설명자, 실행 중인 프로그램의 루트 디렉토리 및 현재 작업 디렉토리 등을 포함하여 마운트 지점을 참조하는 데이터 구조이므로 마운트 지점은 사용 중입니다.

파일 설명자 대신 경로를 실행하고 사용하는 것은 이를 올바르게 처리하지 못할 수 있다는 점에 유의하십시오. 예를 들어 웹사이트의 루트를 이런 방식으로 이동하면 사이트가 손상될 수 있습니다. 모든 콘텐츠) 사이트의 파일).

이 명령은 흥미로울 수도 있습니다 pivot_root. 이는 마운트 지점을 이동하는 특별한 경우이며(두 개의 마운트 지점을 교환하고 시스템에 있는 모든 항목의 루트 디렉터리와 현재 작업 디렉터리를 업데이트합니다) 대부분의 최신 Linux 시스템에서 사용됩니다. initramfs에서 실제 루트 파일 시스템으로 전환하기 위한 시작입니다.

답변2

파일 시스템의 루트 이름을 바꿀 수는 없지만, 그것이 바로 여러분이 원하는 일입니다.

기본 마운트 지점 NFS를 사용하여 파일 시스템을 마운트하는 경우 이름을 바꾸면 발견되지 않은 마운트 지점을 볼 수 있습니다.

배경: 파일 시스템의 항목에 무언가를 설치하면 원본 파일은 숨겨지지만 원본 파일의 이름을 바꿔야 합니다. 보이는 것은 마운트된 파일 시스템의 루트 디렉터리이며 이름을 바꿀 수 없습니다.

답변3

예: 호환성 이유가 보안에 영향을 미칩니다.

LWN.net의 충실한 보고로 인해 이 제한 사항은 의도적으로 해제되지 않았습니다. 이 제한을 제거하면 일부 버전에서 작동합니다 fusermount. fusermount이전에는 이를 추가하여 개선되었으므로 UMOUNT_NOFOLLOW안전합니다. 그러나 이전 버전은 fusermount여전히 ​​우려할 만큼 널리 퍼져 있습니다.

바라보다마운트 지점 삭제 및 이름 바꾸기, LWN.net 2016.

연결된 스레드에서 알 수 있듯이 패치 1-3에서는 마운트 지점 이동을 허용합니다. 그런 다음 이를 비활성화하기 위해 패치 4가 추가되었습니다 :-).

이것은 완전한 증거가 아닙니다. 그러나 이는 패치 4의 제한이 내부적인 이유 때문이 아님을 시사합니다.구현하다이유. 또한 커널 개발자들이 아이디어가 있으면 언급할 것이라고 확신합니다.사용자 기대이동이 허용되면 마운트 지점이 삭제됩니다.

그러나 @schily는 지적했습니다.마운트 지점 이동(또는 연결 해제)을 허용하는 것은 약간 이상합니다. 것 같다가능한장착 지점을 허용합니다 rename(). 그러나 이는 마운트된 파일 시스템의 기본 파일 이름을 바꾸는 것으로 해석되기 때문입니다.

rename(oldpath, newpath)이는 이전 경로와 새 경로가 동일한 파일 시스템에 있어야 하는 현재 규칙에 대한 이상한 예외입니다 . 그렇지 않으면 EXDEV가 실패합니다. (사실 그들은 그래야만 한다.파일 시스템의 동일한 마운트에).

나는 Linux에서 추가적인 작은 특징을 생각했습니다. 기본 파일에 Linux "불변 비트"를 설정하면 rename()이 거부되어야 한다고 생각합니다. 그러나 마운트 지점에서 불변 비트를 확인하면 기본 파일의 불변 비트가 표시되지 않습니다! 효과가 있기를 바랍니다. 문제를 해결해야 한다면 꽤 짜증나는 일입니다.

관련 정보