Linux의 계층형 또는 가상 파일 시스템

Linux의 계층형 또는 가상 파일 시스템

나는 기본적으로 다음과 같은 작업을 하고 싶습니다. 이라는 유틸리티를 상상해 봅시다 layer.

# sudo layer somefile apt install gcc

layerapt는 일종의 컨테이너에서 시작됩니다. Apt는 실제 파일 시스템에 gcc가 설치되어 있다고 생각하지만 실제로는 전체 파일 시스템에 계속 액세스할 수 있습니다 somefile. apt그래서 도커와는 다릅니다.

그러면 다음과 같은 작업을 수행할 수 있습니다.

# sudo layer somefile bash
bash# gcc -c foo.c

bash실제로 시스템에 설치되지는 않았지만 일종의 gcc컨테이너/감옥이지만 파일 시스템의 나머지 부분에 액세스할 수 있습니다. 내 목적은 파일 시스템을 오염시키지 않고 가상 개발 환경을 만드는 것입니다.aptgccsomefile

이를 수행할 수 있는 방법이 있습니까?

답변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

관련 정보