"번들 설치"란 무엇입니까? 어떻게 만드나요? 이점은 무엇입니까?
뭔가를 하기 위해 바인드 마운트를 사용하라는 말을 들었지만 그것이 무엇인지, 어떻게 사용하는지 이해가 되지 않습니다.
답변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
. /tmp
tmpfs 파일 시스템이 생성될 때 파일이 존재했다면 해당 파일은 그대로 남아 사실상 액세스할 수 없지만 디스크 공간을 차지할 수 있습니다 . 달리기
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
포함되어 있으면 통합 뷰에도 및 가 포함됩니다 . 새 파일은 특정 분기 또는 더 복잡한 규칙에 따라 선택된 분기에 기록됩니다. 이 개념은 다음을 포함하여 다양한 방법으로 구현될 수 있습니다.foo
tree2
bar
foo
bar
- 오브—Linux 커널 구현, 그러나업스트림에서 여러 번 거부됨
- 기능— 퓨즈 구현
- 멀티미디어 파일 시스템— FUSE, 사용 가능한 공간을 기반으로 브랜치에 파일을 씁니다.
- 씌우다— Linux 커널 구현, Linux v3.18에서 업스트림 병합
- UnionFS 퓨즈— FUSE, 캐싱 및 쓰기 시 복사 기능 포함
파일 이름 및 메타데이터 수정
- CIOPFS— 대소문자를 구분하지 않는 파일 이름(Windows 파일 시스템을 마운트하는 데 유용함)
- 파일 시스템 변환— 문자 집합 간에 파일 이름을 변환합니다(예)
- 포지쇼브르— Unix 파일 이름과 기타 메타데이터(권한, 소유권 등)를 VFAT(예)
변경된 파일 내용 보기
- AVFS— 각 아카이브 파일에 대해 아카이브 내용이 포함된 디렉터리(예,더 많은 예시). 더 많은 것이 있습니다특정 아카이브를 디렉터리로 노출하는 FUSE 파일 시스템.
- 퓨즈— 텍스트 파일이나 미디어 파일을 다시 인코딩하는 등 파일을 읽을 때 파이프를 통해 파일을 실행합니다(예)
- 리조프— 압축 파일의 투명한 압축 풀기
- mp3fs— FLAC 파일을 읽고 MP3로 트랜스코딩합니다(예)
- 스크립트 파일 시스템— 콘텐츠(일종의 기본 CGI)를 제공하는 스크립트를 실행합니다(예)
콘텐츠 저장 방법 수정
답변2
다음 설명은 실제로 데이터를 복사/복제하는 개념을 생성하지 않기 때문에 매우 유용하다는 것을 알았습니다.
바인드 마운트는 파일 시스템 수준의 심볼릭 링크로 생각할 수 있습니다. 를 사용하면
mount --bind
기존 파일 시스템에 대한 두 번째 마운트 지점을 생성하여 해당 파일 시스템을 네임스페이스의 다른 위치에 표시할 수 있습니다.따라서 바인드 마운트는 파일 시스템 네임스페이스의 특정 보기를 생성하는 데 유용합니다. 예를 들어 바인드 마운트를 생성하면
chroot()
.
답변3
간단히 말해서, 바인드 마운트를 사용하면 호스트의 파일이나 디렉터리가 컨테이너에 마운트되므로 호스트의 파일 디렉터리 내에서 변경된 내용은 자동으로 디렉터리의 컨테이너 내에서 사용할 수 있습니다.