리눅스 격리에 사용되는기술 3가지 (chroot , namespace , cgroups)
리눅스 격리에 사용되는기술 3가지 (chroot , namespace , cgroups)
Summary 리눅스 격리에 사용되는 주요 기술은 chroot(파일 시스템 격리), namespaces(자원 격리), cgroups(자원 제한)으로, 이 세 가지 기술이 결합되어 현대적인 컨테이너 기술의 기반을 형성합니다. chroot는 프로세스의 루트 디렉토리를 변경하여 파일 시스템 접근을 제한하고, namespaces는 시스템 자원을 독립적으로 관리하며, cgroups는 자원 사용량을 제어하여 각 컨테이너가 독립적으로 동작하도록 합니다.
🔗 https://github.com/p8952/bocker
https://www.youtube.com/watch?v=JexfNPWyeQA
100줄로 도커구현하기 재밌네~
리눅스 격리에 사용되는 주요 기술은 다음과 같습니다:
- chroot (Filesystem 격리)
- 프로세스의 루트 디렉토리를 변경하여 파일 시스템 접근을 제한합니다.
- 컨테이너 기술의 초기 형태로, 호스트 시스템의 파일 시스템과 격리된 환경을 제공합니다.
- Namespaces (자원 격리)
- 프로세스, 네트워크, 사용자, 마운트 포인트 등 시스템 자원을 격리합니다.
- PID, Network, Mount, UTS, IPC, User 네임스페이스 등으로 세분화됩니다.
- 예: PID 네임스페이스는 컨테이너 내부에서 독자적인 프로세스 ID를 가집니다.
- cgroups (Control Groups, 자원 제한)
- CPU, 메모리, 디스크 I/O, 네트워크 대역폭 등 자원 사용량을 제어합니다.
- 호스트의 자원 과사용을 방지하고 컨테이너 간 공평한 자원 분배를 가능하게 합니다.
요약
- chroot → 파일 시스템 격리
- Namespaces → 프로세스/네트워크 등의 논리적 격리
- cgroups → 물리적 자원 할당 제어 이 세 기술이 결합되어 현대적인 컨테이너 기술(도커 등)의 기반을 형성합니다.
아래의 시나리오를 통해 chroot
, namespace
, cgroup
이라는 세 가지 리눅스 격리 기술이 각각 어떤 역할을 하는지, 그리고 어떻게 서로 연관되어 있는지를 좀 더 쉽게 이해해봅시다.
1. 시나리오로 살펴보기
1) 공동 작업실에 세 입주자
어느 날, 세 명의 개발자가 함께 일할 수 있는 작업실을 구했습니다. 이 작업실(서버)은 세 명이 동시에 들어가서, 서로의 자원 사용을 방해하지 않으면서도 각각 독립적으로 개발 및 테스트를 진행해야 합니다. 하지만 단순히 책상만 나누어 놓고 “서로 건드리지 말자”고 해서는 안전성도 떨어지고, 누군가가 자원을 과도하게 쓰면 다른 사람도 피해를 볼 수 있습니다.
이 문제를 해결하기 위해 건물주(운영체제)는 건물 구조를 조금씩 변경하기 시작합니다.
(a) chroot
: 작업 공간의 1차 분리
건물주는 먼저 각 개발자가 자신의 방(파일 시스템 루트)을 갖도록 해줍니다. 예를 들어, 1번 개발자가 A라는 방에서 쓰레기통부터 문서 보관함까지 독립적으로 관리하고, 2번 개발자는 B라는 방에서, 3번 개발자는 C라는 방에서 각각 자신만의 구조를 갖추도록 한 것입니다. 이때, 문서 보관함 위치(파일 시스템 루트 디렉터리) 자체가 서로 다른 공간으로 바뀌어, 다른 사람이 어디에 무슨 파일을 두고 있는지 직접 접근하기가 어려워집니다.
즉, chroot
는 “내가 사용하는 파일 시스템 루트를 특정 디렉터리(나만의 방)로 바꿔버리는” 방식으로 작동합니다. 예전에는 /
디렉터리가 한 군데뿐이라 모두가 공유했지만, chroot
를 쓰면 특정 폴더(예: /home/user/container_root
)를 새로운 루트처럼 인식하게 하여, 겉보기에는 완전히 독립된 파일 시스템을 갖게 되는 것처럼 느껴지게 하는 것이죠.
- 장점: 비교적 간단하게 구현할 수 있으며, 각 사용자가 파일을 잘못 접근하거나 실수로 건드리는 것을 막아 안전성을 높입니다.
- 한계: 파일시스템 관점에서만 격리해줄 뿐, 프로세스나 네트워크 등 다른 자원에 대한 격리는 처리해주지 못합니다.
(b) namespace
: 자원별 독립적 관리
건물주는 다음 단계로, 명찰(이름공간, namespace) 제도를 도입합니다. 예를 들어, 각 개발자는 자신만의 문서함 이름, 책상 이름 등을 갖게 되며, 다른 개발자의 이름공간과는 충돌이 일어나지 않도록 해줍니다. 이는 곧 프로세스, 네트워크, 마운트, UTS(호스트이름), IPC, 사용자 등 다양한 리눅스 자원을 독립적인 ‘이름공간’ 안에서 사용할 수 있게 만듭니다.
- 프로세스(namespace 예시) 예를 들어, 1번 개발자는 자신만의 “프로세스 목록”을 보고, 2번 개발자의 프로세스는 보이지 않습니다. 서로 다른 방에서 작업 중인 모습을 상상하면 이해하기 쉽습니다.
- 네트워크(namespace 예시) 1번 개발자에게는 가상의 네트워크 인터페이스가 따로 부여되어, 자기끼리만 통신할 수 있고 외부와 연결되는 통로도 독립적으로 갖게 됩니다.
- IPC, UTS, 마운트 등
공유 메모리나 메시지 큐, 시스템 식별자(호스트 이름), 디렉터리 마운트 정보 역시도 각자의 이름공간 안에서만 유효하게 만들어 충돌을 막고 독립성을 높입니다.
결국,
namespace
는 “서로 다른 자원을 공용으로 두되, 각 사용자마다(혹은 컨테이너마다) 이 자원들을 볼 수 있는 범위와 이름을 다르게 처리해주는 기능”입니다. 덕분에 한 물리 서버 안에서 여러 ‘격리된 환경’을 동시에 운영할 수 있게 되었습니다.
(c) cgroup
: 자원 사용량 제한
마지막으로, 건물주는 개발자들이 쓰는 전기, 컴퓨팅 자원, 메모리 등을 서로 간섭 없이 균등하게(or 제한된 범위 안에서) 쓸 수 있도록 정책을 세웁니다. 이를 리눅스에서 구현한 것이 cgroup(Control Group)
입니다.
- CPU 사용량 제한: 1번 개발자가 테스트를 잘못 돌려서 CPU를 100% 쓰더라도, 2번 개발자와 3번 개발자가 일정 성능을 확보할 수 있게 합니다.
- 메모리 제한: 특정 개발자가 메모리를 무한정 할당해버려서 다른 개발자에게 피해가 가지 않도록, 미리 정해둔 메모리 한계치를 넘어설 수 없게 만듭니다.
- 디스크 I/O, 네트워크 대역폭 제한 등도 가능하여, 한 사용자가 과도한 자원을 독식하는 상황을 방지합니다.
즉,
cgroup
은 “그룹(컨테이너 단위 혹은 사용자 단위)마다 할당할 수 있는 리소스 용량을 정해놓고, 그 한계를 넘지 못하도록 제어”하는 역할을 합니다.
2. 세 기술의 연계와 실제 컨테이너
위와 같이 세 가지가 잘 결합되면, “파일 시스템은 chroot
로 분리되고, 프로세스·네트워크 등은 namespace
로 이름공간을 분리하며, 자원 사용 한도는 cgroup
으로 제어”하게 됩니다.
이런 구조 덕분에 한 물리 서버(또는 VM)에서 여러 개의 ‘컨테이너’를 구축해도, 서로 독립적으로 동작하면서도 각자의 자원 한계를 확실하게 정할 수 있어 효율적인 운영이 가능해집니다.
- Docker 컨테이너: 대표적인 컨테이너 기술로, 내부적으로 리눅스의
namespace
와cgroup
, 그리고chroot
와 비슷한 파일 시스템 격리 기법(UnionFS, OverlayFS 등)을 이용해 구현되어 있습니다. - LXC(Linux Containers): 리눅스 컨테이너의 사실상 시초 격으로,
namespace
,cgroup
등을 통해 기존의 VM보다 훨씬 가볍고 빠른 격리 환경을 제공해왔습니다.
3. 요약
**chroot**
- 특정 디렉터리를 시스템의 루트로 바꿔서, 다른 경로로 넘어가지 못하게 만듦.
- 파일 시스템 격리에 주로 초점을 맞춤.
**namespace**
- 프로세스, 네트워크, 마운트, UTS, IPC, 사용자 등 각종 자원을 ‘이름공간’으로 분리.
- 각 컨테이너(혹은 사용자)가 서로 독립된 자원 환경을 가지게 하여 충돌을 최소화.
**cgroup**
- CPU, 메모리, 디스크 I/O, 네트워크 대역폭 등 다양한 리소스를 그룹 단위로 제한 또는 모니터링.
- 한 컨테이너가 과도하게 자원을 점유하지 못하도록 통제. 이 세 가지가 서로 어우러지면서, 오늘날 우리가 사용하는 리눅스 기반의 컨테이너 기술(예: Docker, LXC, Podman 등)이 탄생하게 된 것입니다.
쉽게 말하면, 같은 집(서버) 안에서 각자 독립된 방(파일시스템+네임스페이스)을 쓰고, 각 방마다 수도세·전기세(자원 사용량)를 따로 체크한다(cgroup
)고 생각하면 됩니다. 이렇게 함으로써 단일 서버에서 여러 격리 환경을 쉽고, 안전하며, 효율적으로 운영할 수 있습니다.
💬 댓글
GitHub 계정으로 로그인하여 댓글을 남겨보세요. GitHub 로그인
🔧 댓글 시스템 설정이 필요합니다
GitHub Discussions 기반 댓글 시스템을 활성화하려면:
GISCUS_SETUP_GUIDE.md
파일의 안내를 따라 설정 완료Repository 관리자만 설정할 수 있습니다. 설정이 완료되면 모든 방문자가 댓글을 남길 수 있습니다.