심볼릭 링크를 대신하여 mount --bind를 사용하면 단점이 있습니까?


55

심볼릭 링크 같은 방법 기능에 제한이 ls, mv그리고 cp쉘이 같은 명령을 시작 달리하기 때문에 그들에 작동 할 수 있습니다 cd, 이러한 기능은 사용자가 논리적 경로에 대한 디렉토리에 액세스하는 방법에 대한 정보가없는 (관련 참조 포스트 ). mount --bind마운트 된 디렉토리는 링크 대신 두 개의 독립적 인 물리적 경로를 가지기 때문에 옵션을 대신 사용하면이 문제 를 해결할 수있어 삼바 및 기타 파일 서버와의 기능 및 호환성이 향상됩니다.

mount --bind옵션을 사용하여 모든 심볼릭 링크를 참조로 바꾸고 싶지만 fstab에서 150 포인트 이상을 마운트해야합니다. 이 문제 나 고려해야 할 다른 단점으로 인해 발생할 수있는 성능 문제가 있습니까?


하드 링크 사용을 고려 했습니까 ?
ire_and_curses

1
@ire_and_curses 대부분의 유닉스 계열 시스템은 타당한 이유 때문에 하드 링크를 금지 합니다 (같은 이유로 사실상 가능한 시스템에서도 사용해서는 안됩니다).
Eliah Kagan

3
@ire_and_curses : Eliah의 진술을 명확하게하기 위해 디렉토리에 대한 하드 링크를 만들 수 없습니다 (HFS +가 지원하는 방식 임). 그리고 하드 링크의 재귀 트리를 만들면 두 디렉토리 경로가 동기화되지 않습니다.
bahamat

답변:


62

를 사용 mount --bind하면 디렉토리 트리에서 디렉토리 트리가 둘 이상의 위치에 존재합니다. 여러 가지 문제가 발생할 수 있습니다. 백업 및 기타 파일 사본이 모든 사본을 선택합니다. 파일 시스템을 복사하도록 지정하기가 어려워집니다. 바인드 마운트 된 파일을 두 번 복사하게됩니다. 와 검색 find, grep -r, locate, 등, 등 모든 사본을 통과하고 있습니다.

바인드 마운트와 함께 "향상된 기능 및 호환성"을 얻을 수 없습니다. 그들은 다른 디렉토리처럼 보이지만 대부분의 경우 바람직하지 않은 동작입니다. 예를 들어 Samba는 기본적으로 심볼릭 링크를 디렉토리로 노출합니다. 바인드 마운트를 사용하면 얻을 수있는 것이 없습니다. 반면, 바인드 마운트는 NFS를 통해 디렉토리 계층을 노출시키는 데 유용 할 수 있습니다.

바인드 마운트와 관련된 성능 문제는 없습니다. 당신이 가진 것은 관리 두통입니다. 바인드 마운트는 chroot에서 디렉토리 트리에 액세스 할 수 있도록하거나 마운트 포인트에 의해 숨겨진 디렉토리를 노출하는 등의 용도로 사용됩니다 (일반적으로 디렉토리 구조를 리모델링하는 동안 일시적으로 사용됨). 필요하지 않은 경우 사용하지 마십시오.

루트 만이 바인드 마운트를 조작 할 수 있습니다. 그것들은 일반적인 수단으로 움직일 수 없습니다. 위치와 상위 디렉토리를 잠급니다.

일반적으로 명령에 심볼릭 링크를 전달하면 명령은 파일에서 작동하면 링크 자체에서 작동하고 파일 내용에서 작동하면 링크 대상에서 작동합니다. 이것은 디렉토리에도 적용됩니다. 이것은 일반적으로 옳은 일입니다. 일부 명령에는 기호 링크를 다르게 처리하는 옵션이 있습니다 (예 : ls -L, cp -d) rsync -l. 무엇을하려고하더라도 바인드 마운트가 올바른 도구 인 것보다 심볼릭 링크가 올바른 도구 일 가능성이 훨씬 높습니다.


감사. 백업, 사본 및 파일 검색에 대한 영향을 고려하지 않은 것 같습니다. smb.conf에 'follow symlinks = yes'를 추가하여 Samba가 심볼릭 링크를 따르도록 할 수 있었지만 모든 samba 사용자가 쓰기 가능한 폴더에서 'ln -s / etc'를 실행할 수 있다는 점에서 보안을 손상시킵니다. 시스템 파일에 액세스합니다. 이 문제를 해결할 방법을 찾고 있습니다. 알고 계시면 알려주십시오.
mrtrujiyo

2
@mrtrujiyo이 요구 사항을 충족시키기 위해 samba 서버를 chroot에서 실행하고 해당 chroot 내로 내보내려는 디렉토리를 바인드 마운트하는 것이 합리적이라고 생각합니다. chroot의 루트를 백업 등에서 제외해야합니다 (이 조직에서는 하나의 최상위 디렉토리 만 제외하면되므로 유지 관리 문제가 거의 없습니다).
Gilles

14

뿐만 아니라 @Gilles가 쓴 이전, 일부 유틸리티가 있음을 주목할 필요가 있습니다 별도의 파일 시스템으로 바인드 마운트 디렉토리를 고려한다. 프로그램이 더 이상 동일한 inode 번호가 동일한 파일 (다른 파일 시스템에있는 경우 그렇지 않은 파일)을 참조한다고 가정 할 수없는 경우 성능에 영향을 줄 수 있습니다. target-then-unlink-source 등


감사. df 및 du와 같은 간단한 유틸리티가 바인드 마운트가있는 파일 시스템에서 디렉토리 크기 계산을 처리하는 방법이 궁금합니다.
mrtrujiyo

1
df내 시스템의 적어도 GNU 는 기본적으로 바인드 마운트 디렉토리를 고려하지 않지만 특별히 요청하면 동일한 파일 시스템의 다른 마운트로 취급됩니다. (당신이 나에게 묻는다면, df의 목적을 가진 도구에 대해 예상되는 동작입니다.)
CVn

6

항상 존재하지 않을 수있는 지원 (예 : 외부 디스크)에 의존하고 지원하는 경우에도 원래 디렉토리 구조가 있는지 확인하려는 경우 심볼릭 링크 대신 바인드 마운트를 사용해야합니다. 실패하거나 제거되었습니다.

예를 들어, sd 카드에 / var / tmp를 유지하려면 바인드 마운트를 사용합니다. 일부 프로그램에서는 카드를 제거하더라도 / var / tmp가 유효한 디렉토리가 될 것으로 예상하기 때문입니다.


1

나는 몇 가지 패키지를 설치하는 문제를 해결하기 위해 마운트 바인드를 시도 pacman(아치 리눅스, 그 여기에 대한 자세한 시스템에서) /var(뿐만 아니라 /home/usr/local)이었다 심볼릭 링크 (: SSD SATA에 파일 시스템에서).

Gilles가 지적했듯이 처음에는 멋지게 보였지만 locatePRUNE_BIND_MOUNTS = "yes"행 에도 불구하고 항상 단일 파일에 대해 여러 개의 결과를 제공 했습니다 /etc/updatedb.conf.

$ locate \*/findutils-4.4.2 | xargs ls -ldiog
33816600 drwxr-xr-x 12 4096 Dec  3 00:05 /SHARED/LOCALS/Manjaro/src/findutils-4.4.2
33816600 drwxr-xr-x 12 4096 Dec  3 00:05 /usr/local/src/findutils-4.4.2

조금 더 파고 더 복잡한 바인드 마운트가 올바르게 정리 될 수 있음을 발견했습니다.

$ sudo mount --bind /SHARED/LOCALS/common/ /usr/local/common
$ findmnt | fgrep -n sdb
34:├─/SHARED/LOCALS                  /dev/sdb5           ext4           rw,relatime,data=ordered
35:│ └─/SHARED/LOCALS/Manjaro/common /dev/sdb5[/common]  ext4            rw,relatime,data=ordered
36:├─/usr/local                      /dev/sdb5[/Manjaro] ext4            rw,relatime,data=ordered
37:│ └─/usr/local/common             /dev/sdb5[/common]  ext4            rw,relatime,data=ordered
38:├─/SHARED/HOMES                   /dev/sdb4           ext4            rw,relatime,data=ordered
39:├─/home                           /dev/sdb4[/Manjaro] ext4            rw,relatime,data=ordered
40:├─/SHARED/VARS                    /dev/sdb3           ext4            rw,relatime,data=ordered
41:├─/var                            /dev/sdb3[/Manjaro] ext4            rw,relatime,data=ordered
42:└─/opt                            /dev/sdb5[/opt]     ext4            rw,relatime,data=ordered

$ sudo updatedb --debug-pruning 2>&1 >/dev/null | grep bind
prune_bind_mounts\000
Rebuilding bind_mount_paths:
Matching bind_mount_paths:
Skipping `/SHARED/LOCALS/Manjaro/common': bind mount
Skipping `/usr/local/common': bind mount

$ locate \*/mmedia
/SHARED/LOCALS/common/mmedia

PRUNE_BIND_MOUNT 옵션이 없으면 3 가지 결과가 나타납니다.

$ sudo sed -i '1 s/yes/no/' /etc/updatedb.conf 
$ sudo updatedb --debug-pruning 2>&1 >/dev/null | grep bind
prune_bind_mounts\000
$ locate \*/mmedia
/SHARED/LOCALS/Manjaro/common/mmedia
/SHARED/LOCALS/common/mmedia
/usr/local/common/mmedia
$ sudo sed -i '1 s/no/yes/' /etc/updatedb.conf 

바인드 마운트의 또 다른 문제 :

물론 바인드 마운트 (mounpoint 또는 target)를 PRUNEPATHSin에 수동으로 추가 할 수 있습니다 /etc/updatedb.conf.

또한 mountpoint다양한 stat명령 또는 기능을 여기에 제안 된대로 파일 시스템 탐색을 향상시키는 도구에 사용할 수 있습니다.

당사 사이트를 사용함과 동시에 당사의 쿠키 정책개인정보 보호정책을 읽고 이해하였음을 인정하는 것으로 간주합니다.
Licensed under cc by-sa 3.0 with attribution required.