ln -s와 mount --bind의 차이점은 무엇입니까?


36

내가 사용 사이의 차이를 이해하려고 노력하고 ln -smount --bind. 기본 시나리오에서는 둘 다를 사용하여 다른 곳에서 하나의 디렉토리에 액세스 할 수 있습니다. 어떤 시나리오에서이 두 가지가 다르게 작동합니까?


7
에 대해 경고해야 rm -r합니다 mount --bind. 를 사용 ln하면 링크가 제거되는 반면 에는 대상에서 --bind실행하는 것과 동일한 효과가 rm -r있습니다. 안 좋아, 내 서버 중 하나를 다시 작성 직전에 발견 ...
마크 K 코완

@MarkKCowan 하드 링크 를 만들지 않는 한 사실 입니다.
JohnnyQ

@JohnnyQ 디렉토리를 하드 링크 할 수 없음
Mark K Cowan

답변:


33

적어도 두 가지 경우에 다르게 작동합니다.

  • A의 chroot를 링크 대상이 chroot를 벗어나면, 링크가 죽었을 것입니다. 바인드 마운트는 여전히 액세스 가능합니다.
  • 여러 프로그램이 기호 링크와 실제 디렉토리 또는 파일을 구별 할 수 있습니다. 디렉토리 또는 파일과 마운트 된 디렉토리를 구별 할 수있는 경우는 거의 없습니다. 이것은 또한 무언가 ( A)가 B장착 된 무언가 ( )에 대한 심볼릭 링크로 확장됩니다 . 링크 B에는 원본 ( A) 대신 마운트 대상 ( ) 의 내용이 표시됩니다 .

또한 기존 디렉토리 또는 파일에 디렉토리 또는 파일을 바인드 마운트하여 원래 컨텐츠를 마스킹합니다 (원본이 다른 곳에 바인드 마운트되어 있지 않으면 원래 컨텐츠에 액세스 할 수 없음). 심볼릭 링크를 사용하려면 원본을 이동하거나 삭제해야합니다.


16

글쎄, ln -s심볼릭 링크를 mount --bind만드는 반면 마운트를 만듭니다.

심볼릭 링크는 특수한 유형의 파일입니다. 당신이 할 경우 ln -s /var/target /var/link, 다음 /var/link의 경로 "를 포함하는 파일 될 것 /var/target"그것에. 심볼릭 링크와 일반 파일의 유일한 차이점은 프로그램이 심볼릭 링크에서 작업을 수행하려고 할 때 일반적으로 파일 대신 대상에서 작업이 수행된다는 것입니다. 그래서 지금 당신이 할 경우 ls /var/linkls프로그램에 대한 디렉토리 목록을 얻을 것을 시도 할 것이다 /var/link, 그러나 실제로에 대한 디렉토리 목록을 얻을 것이다 /var/target대신.

하지만 심볼릭 링크는 여전히 파일 일뿐입니다. 이름을 바꾸고 삭제할 수 있으며 모든 재즈가 가능합니다. /var/link이미 호출 된 파일이 있으면 호출 된 기호 링크 (또는 그 문제에 대한 일반 파일)를 작성할 수 없습니다 /var/link. 먼저 제거해야합니다.

마운트는 파일이 아닙니다. 커널이 메모리에 보관하는 기록입니다. 그렇게 mount --bind /var/target /var/mount하면 커널 /var/mount은 이제 새로운 이름 인 사실을 기록합니다 /var/target. (필자는 세부 사항을 알고하지 않습니다 특히, 내가의 하위 디렉토리에 뭔가를 설치하는 경우 모르는 /var/target이에 표시 할 것입니다 /var/mount. 물론, 또는 왜 또는 왜이 대답에 편집을 감상 할 수 없습니다.) 그래서 지금 당신이 경우에 ls /var/mount, 같은 것은 당신이했던 것처럼 일어날 것 ls /var/target때문에 /var/mount/var/target같은 디렉토리입니다.

마운트는 파일이 아닙니다. 이름을 바꾸거나 삭제하려고하면 어떻게 될지 모르겠습니다 /var/mount. 당신이에 아무것도를 마운트 할 수 없습니다 /var/mount 하지 않는 한 이미에서 디렉토리있다 /var/mount.


1
mount --bind를 사용하지는 않았지만 같은 심볼릭 링크의 동작을 복제 할 수는 없습니다 ln -s ../../myfile .. 이 디렉토리를 다른 디렉토리로 옮기면 상대 링크이므로 다른 곳을 가리 킵니다. 하위 트리를 백업해야하지만 여전히 백업에서 링크가 작동하는 경우 유용 할 수 있습니다.
Joe

10

또한 ln -s는 재부팅 후에도 유지됩니다. / etc / fstab을 편집하여 영구적으로 만들지 않으면 mount --bind는 작동하지 않습니다.


2

다른 답변 외에도. 시스템은 디렉토리에 대한 하드 링크를 허용하지 않습니다.

# ln mydir mpoint
ln: `mydir': hard link not allowed for directory

마운트를 사용하면 하나의 inode에 대해 두 개 이상의 이름을 하드 링크처럼 만들 수 있습니다 .

# mount -B mydir/ mpoint/
# ls -d -i *
807175  mpoint/  807175  mydir/

(이전 버전의 rsync를 사용하면 스냅 샷 백업에 도움이됩니다.)

또한이 마운트가 완료되지 않았습니다.

# mount -B -oro mydir/ mpoint/
mount: warning: mpoint/ seems to be mounted read-write.
# mount | grep mpoint
/root/learn/mydir on /root/learn/mpoint type none (rw,bind)

따라서 옵션 ro (읽기 전용)를 요청한 경우에도 마운트를 계속 읽고 씁니다.

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