나는 기본적으로 다음과 같은 작업을 하고 싶습니다. 이라는 유틸리티를 상상해 봅시다 layer
.
# sudo layer somefile apt install gcc
layer
apt는 일종의 컨테이너에서 시작됩니다. Apt는 실제 파일 시스템에 gcc가 설치되어 있다고 생각하지만 실제로는 전체 파일 시스템에 계속 액세스할 수 있습니다 somefile
. apt
그래서 도커와는 다릅니다.
그러면 다음과 같은 작업을 수행할 수 있습니다.
# sudo layer somefile bash
bash# gcc -c foo.c
bash
실제로 시스템에 설치되지는 않았지만 일종의 gcc
컨테이너/감옥이지만 파일 시스템의 나머지 부분에 액세스할 수 있습니다. 내 목적은 파일 시스템을 오염시키지 않고 가상 개발 환경을 만드는 것입니다.apt
gcc
somefile
이를 수행할 수 있는 방법이 있습니까?
답변1
일부 사용자 정의 스크립팅이 마음에 들지 않으면 다음을 사용할 수 있습니다.파일 시스템 덮어쓰기(2014년부터 Linux 커널에 포함됨)
OverlayFS는 두 개의 파일 시스템 위치를 서로 겹쳐서 표시합니다. lower
즉, 마운트 지점의 어떤 항목에 의해 수정되거나 숨겨지지 않은 한 마운트 지점 표시의 모든 내용을 덮어씁니다 upper
. 재정의하는 마운트 지점에 대한 모든 수정 사항은 기록되지 upper
않습니다 lower
.
또한 OverlayFS에는 work
명시적으로 문서화되지 않았지만 수정 사항이 upper
.
이를 사용하면 찾고 있는 컨테이너 유형을 만들 수 있습니다(아래에서 가능한 극단적인 경우 참조).
mkdir -p /var/tmp/myoverlay/{upper,work,mount}
mount -t overlay -o lowerdir=/,upperdir=/var/tmp/myoverlay/upper,workdir=/var/tmp/myoverlay/work overlayfs /var/tmp/myoverlay/mount
컨테이너를 "침입"하려면 chroot
("change root") 명령을 사용하여 새로 생성된 컨테이너에서 명령(셸 또는 기타)을 실행할 수 있습니다 /var/tmp/myoverlay/mount
.
chroot /var/tmp/myoverlay/mount
# or
chroot /var/tmp/myoverlay/mount /usr/bin/apt moo # paths are relative to the new root directory
하드웨어 장치, 의사 터미널, 프로세스 또는 시스템 기능에 액세스하려는 프로그램의 경우 이는 충분하지 않을 수 있습니다. 이러한 기능은 커널에서 특수 설치 가능한 파일 시스템으로 제공됩니다. 아래 출력을 참조하세요 mount
.
proc on /proc type proc
sysfs on /sys type sysfs
udev on /dev type devtmpfs
devpts on /dev/pts type devpts
마운트 지점을 재정의하기 위해 설치할 수 있습니다(입력하기 전).
mount -t proc proc /var/tmp/myoverlay/mount/proc
mount -t sysfs sys /var/tmp/myoverlay/mount/sys
mount -t devtmpfs dev /var/tmp/myoverlay/mount/dev
mount -t devpts devpts /var/tmp/myoverlay/mount/dev/pts
이렇게 하면 컨테이너가 원하는 것보다 시스템에 더 많은 액세스 권한을 부여할 수 있습니다. 궁극적으로 오버레이 파일 시스템이 특정 사용 사례에 대해 일반 시스템과 충분히 분리되어 있는지 확인하려면 정확한 사용 사례를 알아야 합니다.
파일 시스템 레이아웃에 따라 추가적인 어려움이 있을 수 있습니다. 디렉토리는 lower
그 아래에 마운트된 다른 파일 시스템을 고려하지 않고 있는 그대로 사용됩니다. 예를 들어 /home
별도의 파일 시스템이 있는 경우 OverlayFS는 에 있는 빈 마운트 지점만 표시합니다 /home
.
이러한 경우 각 탑재 지점에 대해 별도의 오버레이를 만든 다음 다른 오버레이를 루트 오버레이에 설치해야 합니다.
이 시점에서는 적절한 가상화가 더 현명한 선택인 경우가 많습니다.
답변2
overlay
파일 시스템을 사용할 수 있습니다 .
modprobe overlay
mkdir -p /path/data /path/work /path/mount
mount -t overlay overlay -o lowerdir=/,upperdir=/path/data,workdir=/path/work /path/mount
이제 루트 디렉터리의 모든 항목에 chroot
액세스 /path/mount
하고 볼 수 있지만 변경 사항은 기록됩니다 . 나중에 동일한 옵션을 사용하여 제거하고 다시 설치할 /path/data
수 있습니다 ./path/mount