바인드 마운트란 무엇입니까?

바인드 마운트란 무엇입니까?

"번들 설치"란 무엇입니까? 어떻게 만드나요? 이점은 무엇입니까?

뭔가를 하기 위해 바인드 마운트를 사용하라는 말을 들었지만 그것이 무엇인지, 어떻게 사용하는지 이해가 되지 않습니다.

답변1

바인드 마운트란 무엇입니까?

바인드 마운트디렉토리 트리의 또 다른 보기입니다. 일반적으로 설치 시 저장 장치 보기가 디렉터리 트리로 생성됩니다. 대조적으로 바인드 마운트는 기존 디렉토리 트리를 가져와 다른 지점에 복사합니다. 바인드 마운트의 디렉터리와 파일은 원본과 동일합니다. 두 보기 모두 동일한 데이터를 표시하므로 한 쪽의 수정 사항은 다른 쪽에도 즉시 반영됩니다.

예를 들어, Linux 명령을 실행한 후 -

mount --bind /some/where /else/where

디렉토리 /some/where/else/where동일한 내용, 즉 /some/where. ( /else/where비어있지 않으면 이전 내용은 숨겨집니다.)

하드 링크나 심볼릭 링크와 달리 바인드 마운트는 파일 시스템에 저장된 내용에 영향을 주지 않습니다. 이는 실시간 시스템의 속성입니다.

번들 설치를 어떻게 생성합니까?

파일 시스템 바인딩

이것bindfs파일 시스템은퓨즈파일 시스템의 디렉터리 트리 보기를 만듭니다. 예를 들어 다음 명령은

bindfs /some/where /else/where

마운트 지점을 생성 /else/where하고 마운트 지점 아래의 콘텐츠를 /some/where표시합니다.

bindfs는 별도의 파일 시스템이므로 파일 /some/where/foo/else/where/foo응용 프로그램은 응용 프로그램에 대해 다른 파일로 나타납니다(bindfs 파일 시스템에는 고유한 st_dev값이 있음). 한 쪽의 변경 사항은 다른 쪽에도 "마법처럼" 반영되지만, 파일이 동일하다는 사실은 바인드가 어떻게 작동하는지 아는 경우에만 분명해집니다.

Bindfs는 마운트 지점을 인식하지 못하므로 그 아래에 마운트 지점이 있으면 /some/where그 아래에 다른 디렉터리로 나타납니다 /else/where. 아래 파일 시스템을 마운트하거나 마운트 해제하면 해당 디렉터리에 대한 변경 사항이 /some/where표시됩니다 ./else/where

Bindfs는 특정 파일 메타데이터를 변경할 수 있습니다. 즉, 파일의 가짜 권한과 소유권을 드러낼 수 있습니다. 보다수동자세한 내용은 아래 예를 참조하세요.

binfs 파일 시스템은 루트가 아닌 사용자로 마운트할 수 있으며 FUSE 파일 시스템을 마운트하기 위한 권한만 필요합니다. 배포에 따라 fuse그룹에 속해야 하거나 모든 사용자에게 허용되어야 할 수도 있습니다. FUSE 파일 시스템을 마운트 해제하려면 fusermount -u대신 umount를 사용하세요.

fusermount -u /else/where

빈 파일 시스템

FreeBSD는 다음을 제공합니다.nullfs파일 시스템의 대체 보기를 생성하는 파일 시스템입니다. 다음 두 명령은 동일합니다.

mount -t nullfs /some/where /else/where
mount_nullfs /some/where /else/where

두 명령 중 하나를 실행하면 해당 내용에 대한 마운트 지점이 표시 /else/where됩니다 ./some/where

nullfs는 별도의 파일 시스템이므로 파일 /some/where/foo/else/where/foo애플리케이션은 애플리케이션에 대해 다른 파일로 표시됩니다(nullfs 파일 시스템에는 고유한 st_dev값이 있음). 한쪽에 대한 모든 변경 사항은 다른쪽에 "마법처럼" 반영되지만 파일이 동일하다는 사실은 nullfs가 어떻게 작동하는지 아는 경우에만 분명해집니다.

디렉터리 트리 수준에서 작동하는 FUSE binfs와 달리 FreeBSD의 nullfs는 커널 깊숙이 작동하므로 아래 마운트 지점은 /else/where표시되지 않습니다. /some/where아래에 반영된 것과 동일한 마운트 지점의 일부인 트리 만 표시됩니다 /else/where.

nullfs 파일 시스템은 다른 BSD 변형(OS X, OpenBSD, NetBSD)에서 사용할 수 있지만 기본 시스템의 일부로 컴파일되지는 않습니다.

Linux 바인드 마운트

Linux에서는 바인드 마운트를 커널 기능으로 사용할 수 있습니다. 다음 명령을 사용하여 만들 수 있습니다mount--bind명령줄 옵션이나 bind설치 옵션을 전달하여 명령을 실행합니다 . 다음 두 명령은 동일합니다.

mount --bind /some/where /else/where
mount -o bind /some/where /else/where

여기서 "장치" /some/where는 디스크 파일 시스템과 같은 디스크 파티션이 아니라 기존 디렉터리입니다. 평소와 같이 마운트 지점은 /else/where기존 디렉터리여야 합니다. 파일 시스템 유형은 어느 쪽이든 지정되지 않습니다. 바인드 마운트를 수행하는 데는 원래 마운트에서 커널 데이터 구조를 복사하는 파일 시스템 드라이버가 포함되지 않습니다.

mount --bind또한 비디렉토리를 비디렉토리에 마운트하는 기능도 지원됩니다. /some/where이는 일반 파일일 수 있습니다(이 경우 일반 파일이어야 함 /else/where).

Linux 번들 설치는 원시 설치와 거의 구별할 수 없습니다. 이 명령은 df -T /else/where동일한 장치와 동일한 파일 시스템 유형을 표시합니다 df -T /some/where. 이러한 파일은 마치 하드 링크인 것처럼 서로 구별할 수 없습니다 /some/where/foo. /else/where/foo제거될 수 있으며 /some/where, 이 경우 /else/where설치된 상태로 유지됩니다.

이전 커널의 경우(정확히 언제인지는 모르겠습니다. 일부 3.x까지는 생각합니다) 번들 설치와 원래 커널 사이에는 실제로 차이가 없습니다. 최신 커널은 바인드 마운트를 추적하고 <code/proc/를 통해 정보를 노출합니다.PID/mountinfo: 다음을 허용합니다.findmnt번들 설치를 지시합니다..

에 바인드 마운트 항목을 넣을 수 있습니다 /etc/fstab. 원하는 다른 옵션과 함께 옵션에 포함 bind(또는 등)하면 됩니다. rbind"장치"는 기존 트리입니다. 파일 시스템 열에는 none또는 가 포함될 수 있습니다 bind(무시되지만 파일 시스템 이름을 사용하면 혼동될 수 있음). 예를 들어:

/some/where /readonly/view none bind,ro

아래에 마운트 지점이 있으면 /some/where그 내용은 아래에 표시되지 않습니다 /else/where. 대신 아래 복사된 마운트 지점을 사용할 수도 bind있습니다 . 예를 들어 마운트 지점인 경우rbind/some/where/some/where/mnt

mount --rbind /some/where /else/where

동등하다

mount --bind /some/where /else/where
mount --bind /some/where/mnt /else/where/mnt

또한 Linux에서는 마운트를 다음과 같이 선언할 수 있습니다.공유됨,노예,사적인또는바인딩할 수 없음. 이는 마운트 지점을 복제하는 바인드 마운트에 마운트 작업이 반영되는지 여부에 영향을 줍니다. 자세한 내용은 다음을 참조하세요.커널 문서.

Linux는 또한 마운트 이동 방법( 마운트 지점 --bind복사 및 이동)을 제공합니다.--move

두 번들 설치 디렉터리에는 서로 다른 설치 옵션이 있을 수 있습니다. 그러나 특이한 점이 있습니다. 바인드 마운트를 수행하고 마운트 옵션을 설정하는 것은 원자적으로 수행할 수 없으며 두 번의 연속 작업을 수행해야 합니다. (이전 커널에서는 이를 허용하지 않습니다.) 예를 들어 다음 명령은 읽기 전용 보기를 생성하지만 /else/where짧은 시간 동안 읽기/쓰기가 가능합니다.

mount --bind /some/where /else/where
mount -o remount,ro,bind /else/where

바인드 마운트를 작동시킬 수 없습니다!

시스템이 FUSE를 지원하지 않는 경우 동일한 효과를 얻는 일반적인 방법은 NFS 서버를 실행하고 노출하려는 파일을 내보내고(액세스 허용 localhost) 이를 동일한 시스템에 마운트하는 것입니다. 이는 메모리 및 성능 측면에서 상당한 오버헤드를 가지므로 바인드 마운트는 사용 가능한 경우 분명한 이점을 갖습니다(FUSE로 인해 대부분의 Unix 변형에 있음).

읽기 전용 보기

보안상의 이유로 또는 실수로 수정하지 않도록 보안 계층으로 파일 시스템의 읽기 전용 보기를 생성하는 것이 유용할 수 있습니다.

바인드를 사용하세요:

bindfs -r /some/where /mnt/readonly

Linux의 경우 쉬운 방법은 다음과 같습니다.

mount --bind /some/where /mnt/readonly
mount -o remount,ro,bind /mnt/readonly

/mnt/readonly이로 인해 읽기와 쓰기 사이에 짧은 간격이 생깁니다. 이것이 보안 문제인 경우 먼저 루트만 액세스할 수 있는 디렉터리에 바인드 마운트를 생성하고 이를 읽기 전용으로 만든 다음 공용 마운트 지점으로 이동합니다. 아래 코드 조각에서 /root/private마운트 지점 위의 디렉터리는 비공개라는 점에 유의하는 것이 중요합니다. 원래 권한은 /root/private/mnt마운트 지점 뒤에 숨겨져 있으므로 관련이 없습니다.

mkdir -p /root/private/mnt
chmod 700 /root/private
mount --bind /some/where /root/private/mnt
mount -o remount,ro,bind /root/private/mnt
mount --move /root/private/mnt /mnt/readonly

사용자 및 그룹 다시 매핑

파일 시스템은 숫자 ID로 사용자와 그룹을 기록합니다. 때로는 동일한 사람에게 서로 다른 사용자 ID를 할당하는 여러 시스템이 발생하는 경우도 있습니다. 이는 네트워크 액세스 문제는 아니지만 디스크의 데이터를 한 시스템에서 다른 시스템으로 전송할 때 사용자 ID가 의미가 없게 됩니다. Alice의 사용자 ID가 1000이고 Bob의 사용자 ID가 1001인 다중 사용자 파일 시스템(예: ext4, btrfs, zfs, UFS 등)을 사용하여 시스템에 디스크를 만들고 디스크를 사용 가능하게 만들고 싶다고 가정해 보겠습니다. Alice의 사용자 ID가 1001이고 Bob의 사용자 ID가 1000인 시스템에서. 디스크가 직접 마운트되면 Alice의 파일은 Bob이 소유한 것으로 나타나고(사용자 ID는 1001이므로) Bob의 파일은 Alice가 소유한 것으로 나타납니다(사용자 ID가 1000이므로).

Bindfs를 사용하여 사용자 ID를 다시 매핑할 수 있습니다. 먼저 루트만 액세스할 수 있도록 개인 디렉터리에 디스크 파티션을 마운트합니다. 그런 다음 공개 영역에 binfs 뷰를 만들고 사용자 ID와 그룹 ID를 다시 매핑하여 Alice와 Bob의 사용자 ID와 그룹 ID를 교환합니다.

mkdir -p /root/private/alice_disk /media/alice_disk
chmod 700 /root/private
mount /dev/sdb1 /root/private/alice_disk
bindfs --map=1000/1001:1001/1000:@1000/1001:@1001/1000 /root/private/alice_disk /media/alice_disk

바라보다시스템을 시작하지 않는 사용자의 홈 폴더에 있는 파일에 대한 액세스를 허용하는 방법은 무엇입니까?그리고mount --다른 사용자를 나 자신으로 바인딩다른 예시.

감옥이나 컨테이너에 설치됨

chroot 감옥또는컨테이너시스템 디렉터리 트리의 하위 트리에서 프로세스를 실행합니다. 이는 자체 파일과 제공되는 파일에만 액세스할 수 있고 동일한 컴퓨터에 저장된 다른 데이터에는 액세스할 수 없는 네트워크 서버를 실행하는 등 액세스가 제한된 프로그램을 실행하는 데 유용합니다. chroot의 한 가지 제한 사항은 프로그램이 하위 트리로 제한된다는 것입니다. 즉, 독립적인 하위 트리에 액세스할 수 없습니다. 바인드 마운트를 사용하면 다른 하위 트리를 기본 트리에 접목할 수 있습니다. 이는 Linux에서 컨테이너를 가장 실용적으로 사용하기 위한 기반이 됩니다.

예를 들어, 머신이 /usr/sbin/somethingd에만 액세스할 수 있는 서비스를 실행한다고 가정합니다 /var/lib/something. 이 두 파일을 포함하는 가장 작은 디렉터리 트리는 루트 디렉터리입니다. 서비스를 어떻게 제한하나요? 한 가지 가능성 /usr/sbin/somethingd/var/lib/something. 더 나은 해결책은 임시 루트를 생성하고 설치로 채우는 것입니다./var/lib/something/usr

mkdir /run/something
cd /run/something
mkdir -p etc/something lib usr/lib usr/sbin var/lib/something
mount --bind /etc/something etc/something
mount --bind /lib lib
mount --bind /usr/lib usr/lib
mount --bind /usr/sbin usr/sbin
mount --bind /var/lib/something var/lib/something
mount -o remount,ro,bind etc/something
mount -o remount,ro,bind lib
mount -o remount,ro,bind usr/lib
mount -o remount,ro,bind usr/sbin
chroot . /usr/sbin/somethingd &

리눅스마운트 네임스페이스chroot를 일반화합니다. 바인드 마운트는 유연한 방식으로 네임스페이스를 채우는 방법입니다. 바라보다프로세스가 동일한 파일 이름을 가진 다른 파일을 읽도록 합니다.예를 들어.

다양한 배포판 실행

chroot의 또 다른 용도는 기본 시스템에 존재하지 않거나 다른 내용을 가진 하드코딩된 경로에 파일이 필요한 경우에도 디렉터리에 다른 배포판을 설치하고 그 배포판에서 프로그램을 실행하는 것입니다. 예를 들어, 혼합 패키지를 지원하지 않는 64비트 시스템에 32비트 배포판을 설치하거나, ​​이전 버전의 배포판이나 다른 배포판을 설치하여 호환성을 테스트하거나, 최신 버전을 설치하여 테스트할 때 유용할 수 있습니다. 최신 기능을 탑재함과 동시에 안정적인 기반 시스템 유지 등 보다64비트 Debian/Ubuntu에서 32비트 프로그램을 어떻게 실행하나요?데비안/우분투를 예로 들어보겠습니다.

배포판의 최신 패키지가 디렉토리에 설치되어 있다고 가정하면 를 /f/unstable사용하여 해당 디렉토리로 전환하여 프로그램을 실행할 수 있습니다 chroot /f/unstable. 이 설치에서 홈 디렉토리를 사용할 수 있게 하려면 해당 홈 디렉토리를 chroot에 바인드 마운트하십시오.

mount --bind /home /f/unstable/home

프로그램슈루트이 작업은 자동으로 수행됩니다.

마운트 지점 뒤에 숨겨진 파일에 액세스

디렉토리에 파일 시스템을 마운트하면 디렉토리 뒤의 내용이 숨겨집니다. 이 디렉터리의 파일은 디렉터리가 마운트 해제될 때까지 액세스할 수 없습니다. BSD nullfs 및 Linux 바인드 마운트는 마운트 인프라보다 낮은 수준에서 작동하므로 파일 시스템의 nullfs 마운트 또는 바인드 마운트는 원래 하위 마운트 뒤에 숨겨진 디렉터리를 노출합니다.

예를 들어 tmpfs 파일 시스템이 에 마운트되어 있다고 가정합니다 /tmp. /tmptmpfs 파일 시스템이 생성될 때 파일이 존재했다면 해당 파일은 그대로 남아 사실상 액세스할 수 없지만 디스크 공간을 차지할 수 있습니다 . 달리기

mount --bind / /mnt

(리눅스) 또는

mount -t nullfs / /mnt

(FreeBSD) 에 루트 파일 시스템의 보기를 만듭니다 /mnt. 이 디렉터리 /mnt/tmp는 루트 파일 시스템의 디렉터리입니다.

다른 경로로 NFS 내보내기

일부 NFS 서버(예: NFSv4 이전 Linux 커널 NFS 서버)는 디렉터리를 내보낼 때 항상 실제 디렉터리 위치를 광고합니다. 즉, 클라이언트가 요청할 때 server:/requested/location서버는 해당 위치에서 트리를 제공합니다 /requested/location. 때때로 클라이언트 요청을 허용 /request/location하지만 실제로는 제공하는 것이 바람직 /actual/location할 경우 NFS 서버가 대체 위치 제공을 지원하지 않는 경우 예상되는 요청에 대한 바인드 마운트를 생성할 수 있습니다.

/requested/location *.localdomain(rw,async)

그리고 /etc/exports다음 /etc/fstab:

/actual/location /requested/location bind bind

심볼릭 링크의 대안

/some/where/is/my/file때로는 파일이 아래에 나타나 도록 심볼릭 링크를 만들고 싶지만 /else/where사용 중인 응용 프로그램이 file심볼릭 링크를 확장하고 거부하는 경우가 있습니다 /some/where/is/my/file. 바인드 마운팅은 이 문제를 해결할 수 /some/where/is/my있습니다 /else/where/is/my.realpath다운 이 아닌 다운 /else/where/is/my/file으로 보고됩니다 ./else/where/some/where

바인드 마운팅의 부작용

재귀적 디렉터리 탐색

바인드 마운트를 사용하는 경우 백업 및 인덱스와 같이 파일 시스템 트리를 반복적으로 탐색하는 애플리케이션을 처리해야 합니다(예:위치데이터 베이스).

일반적으로 각 디렉토리 트리가 원래 위치에서 한 번만 탐색되도록 바인드 마운트를 재귀 디렉토리 탐색에서 제외해야 합니다. 가능하다면 binfs 및 nullfs를 사용하고 이러한 파일 시스템 유형을 무시하도록 탐색 도구를 구성하십시오. Linux 번들 마운트는 이 방식으로 인식되지 않습니다. 새 위치는 원래 위치와 동일합니다. Linux 바인드 마운트를 사용하거나 경로만 제외할 수 있고 파일 시스템 유형은 제외할 수 없는 도구를 사용하는 경우 바인드 마운트에 대한 마운트 지점을 제외해야 합니다.

파일 시스템 경계(예 find -xdev: rsync -x, du -x, ...)에서 중지되는 탐색은 마운트 지점이 다른 파일 시스템이기 때문에 binfs 또는 nullfs 마운트 지점을 만나면 자동으로 중지됩니다. Linux 바인드 마운트의 경우 상황은 좀 더 복잡합니다. 파일 시스템 경계는 바인드 마운트가 동일한 파일 시스템의 다른 부분을 접목하는 것이 아니라 다른 파일 시스템을 접목할 때만 존재합니다.

번들 설치 그 이상

번들 마운트는 다양한 위치의 디렉터리 트리 보기를 제공합니다. 다른 마운트 옵션과 (bindfs 사용) 다른 소유권 및 권한을 사용하여 동일한 파일을 노출합니다. 디렉토리 트리의 변화하는 보기를 제공하는 파일 시스템을파일 시스템 덮어쓰기또는스택형 파일 시스템. 고급 변환을 수행할 수 있는 다른 오버레이 파일 시스템이 많이 있습니다. 다음은 몇 가지 일반적인 사항입니다. 필요한 사용 사례가 여기에서 다루어지지 않은 경우 확인하십시오.FUSE 파일 시스템 저장소.

표시되는 파일 필터링

  • 조개— 파일을 읽는 동안 바이러스 스캐너를 통해 파일을 실행하십시오.

  • 필터— 파일 시스템의 일부 숨기기

  • 로프스— 읽기 전용 보기입니다. 와 유사하며 bindfs -r더 가볍습니다.

  • 얼라이언스 마운트— 파일 시스템이 여러 개 있습니다(나뭇가지) 단일 디렉터리에: 및 가 tree1포함되어 있으면 통합 뷰에도 및 가 포함됩니다 . 새 파일은 특정 분기 또는 더 복잡한 규칙에 따라 선택된 분기에 기록됩니다. 이 개념은 다음을 포함하여 다양한 방법으로 구현될 수 있습니다.footree2barfoobar

파일 이름 및 메타데이터 수정

  • CIOPFS— 대소문자를 구분하지 않는 파일 이름(Windows 파일 시스템을 마운트하는 데 유용함)
  • 파일 시스템 변환— 문자 집합 간에 파일 이름을 변환합니다()
  • 포지쇼브르— Unix 파일 이름과 기타 메타데이터(권한, 소유권 등)를 VFAT()

변경된 파일 내용 보기

콘텐츠 저장 방법 수정

답변2

다음 설명은 실제로 데이터를 복사/복제하는 개념을 생성하지 않기 때문에 매우 유용하다는 것을 알았습니다.

바인드 마운트는 파일 시스템 수준의 심볼릭 링크로 생각할 수 있습니다. 를 사용하면 mount --bind기존 파일 시스템에 대한 두 번째 마운트 지점을 생성하여 해당 파일 시스템을 네임스페이스의 다른 위치에 표시할 수 있습니다.

따라서 바인드 마운트는 파일 시스템 네임스페이스의 특정 보기를 생성하는 데 유용합니다. 예를 들어 바인드 마운트를 생성하면 chroot().

원천:https://lwn.net/Articles/281157/

답변3

간단히 말해서, 바인드 마운트를 사용하면 호스트의 파일이나 디렉터리가 컨테이너에 마운트되므로 호스트의 파일 디렉터리 내에서 변경된 내용은 자동으로 디렉터리의 컨테이너 내에서 사용할 수 있습니다.

관련 정보