0. 개요
이 글은 아래 글과 이어집니다.
https://ksb-dev.tistory.com/375
리눅스에서는 일반 디렉토리를 피봇(Pivot)을 통해 루트 파일시스템으로 전환할 수 있습니다.
하지만, 루트 파일시스템에는 bin, lib, etc 등 시스템 동작에 중요한 폴더들이 마운트 되어있습니다.
따라서, 함부로 루트 파일시스템을 바꾸게 되면 시스템 자체에 문제가 발생할 수 있습니다.
host의 루트 파일시스템은 그대로 두고, mount namespace로 격리한 후에 피봇과 마운트를 하면 격리된 환경을 구성할 수 있습니다.
위 그림에서 중요한 부분은 unshare와 mount입니다.
1. unshare
아래 명령어를 통해 mount namesapce를 만들면서 격리시킬 수 있습니다.
unshare --mount /bin/sh
💡 참고로 mount namespace는 최초의 네임스페이스입니다.
격리된 환경의 파일시스템을 조회하겠습니다.
df -h
또, ls 명령어를 사용해보겠습니다.
기존의 host에서 명령어를 실행했을 때와 같은 결과물을 보실 수 있습니다.
그 이유는, unshare가 격리하면서 루트 파일시스템의 자원을 그대로 복사하기 때문입니다.
2. mount
격리된 환경에서 new_root라는 폴더를 만들어 mount해 보겠습니다.
mkdir new_root
mount -t tmpfs none new_root
격리된 환경이지만, 폴더를 만들면 루트 파일시스템에서도 폴더가 생성됩니다.
이제 격리된 환경과 host 각각 폴더에 mount된 정보를 확인해보겠습니다.
mount | grep new_root
차이점이 보이시나요?
격리된 환경 내부에서는 마운트 정보를 확인할 수 있지만, 루트 파일시스템에서는 확인할 수 없습니다.
파일을 복사해 보겠습니다.
cp -r myroot/* new_root/
격리된 환경에서는 복사된 파일이 보이지만, host에서는 볼 수 없습니다.
3. pivot_root
put_old 폴더를 만들어 host와 마운트해보겠습니다.
우선 폴더를 만듭니다.
mkdir new_root/put_old
격리된 환경에서 루트는 new_root이기 때문에, new_root 내부로 들어가야 합니다.
cd new_root
아래 명령어를 실행합니다.
# pivot_root : pivot_root 명령어를 동작시킵니다.
# . : 현재 위치를 루트 디렉토리로 설정합니다.
# put_old : 기존 host의 루트 파일시스템을 put_old에 마운트합니다.
pivot_root . put_old
루트의 폴더를 확인합니다.
cd /
ls
put_old의 폴더를 확인해봅니다.
보시다싶이, 정상적으로 격리된 것을 확인할 수 있고, 기존 루트 파일시스템과 put_old가 마운트된 것을 볼 수 있습니다.
이전 글에서 만든 escape_chroot를 실행해도 격리된 환경 외부로 나갈 수 없다는 것을 알 수 있습니다.
./escape_chroot
ls /
4. pivot_root의 문제점
pivot_root로 nginx, mysql, tomcat과 같은 서비스를 격리된 환경으로 구성하고 싶으면 어떻게 해야할까요?
전부 별도의 네임스페이스로 만들어야 하기 때문에 3번의 복사를 해야합니다.
즉, 중복이 발생한다는 것입니다.
서비스 운영에 필요하지 않는 자원도 복사가 발생하기 때문에 리소스 낭비의 문제가 발생합니다.
pivot_root는 이런 중복의 문제로 과도한 비용을 야기합니다.
'삽질' 카테고리의 다른 글
도커 없이 컨테이너 만들기 - 7 (0) | 2024.08.23 |
---|---|
도커 없이 컨테이너 만들기 - 6 (0) | 2024.08.23 |
도커 없이 컨테이너 만들기 - 4 (0) | 2024.08.23 |
도커 없이 컨테이너 만들기 - 3 (0) | 2024.08.19 |
도커 없이 컨테이너 만들기 - 2 (0) | 2024.08.19 |