리눅스 격리에 사용되는기술 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줄로 도커구현하기 재밌네~


리눅스 격리에 사용되는 주요 기술은 다음과 같습니다:

  1. chroot (Filesystem 격리)
  • 프로세스의 루트 디렉토리를 변경하여 파일 시스템 접근을 제한합니다.
  • 컨테이너 기술의 초기 형태로, 호스트 시스템의 파일 시스템과 격리된 환경을 제공합니다.
  1. Namespaces (자원 격리)
  • 프로세스, 네트워크, 사용자, 마운트 포인트 등 시스템 자원을 격리합니다.
  • PID, Network, Mount, UTS, IPC, User 네임스페이스 등으로 세분화됩니다.
  • 예: PID 네임스페이스는 컨테이너 내부에서 독자적인 프로세스 ID를 가집니다.
  1. 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 컨테이너: 대표적인 컨테이너 기술로, 내부적으로 리눅스의 namespacecgroup, 그리고 chroot와 비슷한 파일 시스템 격리 기법(UnionFS, OverlayFS 등)을 이용해 구현되어 있습니다.
  • LXC(Linux Containers): 리눅스 컨테이너의 사실상 시초 격으로, namespace, cgroup 등을 통해 기존의 VM보다 훨씬 가볍고 빠른 격리 환경을 제공해왔습니다.

3. 요약

  1. **chroot**
  • 특정 디렉터리를 시스템의 루트로 바꿔서, 다른 경로로 넘어가지 못하게 만듦.
  • 파일 시스템 격리에 주로 초점을 맞춤.
  1. **namespace**
  • 프로세스, 네트워크, 마운트, UTS, IPC, 사용자 등 각종 자원을 ‘이름공간’으로 분리.
  • 각 컨테이너(혹은 사용자)가 서로 독립된 자원 환경을 가지게 하여 충돌을 최소화.
  1. **cgroup**
  • CPU, 메모리, 디스크 I/O, 네트워크 대역폭 등 다양한 리소스를 그룹 단위로 제한 또는 모니터링.
  • 한 컨테이너가 과도하게 자원을 점유하지 못하도록 통제. 이 세 가지가 서로 어우러지면서, 오늘날 우리가 사용하는 리눅스 기반의 컨테이너 기술(예: Docker, LXC, Podman 등)이 탄생하게 된 것입니다.

쉽게 말하면, 같은 집(서버) 안에서 각자 독립된 방(파일시스템+네임스페이스)을 쓰고, 각 방마다 수도세·전기세(자원 사용량)를 따로 체크한다(cgroup)고 생각하면 됩니다. 이렇게 함으로써 단일 서버에서 여러 격리 환경을 쉽고, 안전하며, 효율적으로 운영할 수 있습니다.

💬 댓글

GitHub 계정으로 로그인하여 댓글을 남겨보세요. GitHub 로그인

🔧 댓글 시스템 설정이 필요합니다

GitHub Discussions 기반 댓글 시스템을 활성화하려면:

  1. Giscus 설정 페이지에서 설정 생성
  2. GISCUS_SETUP_GUIDE.md 파일의 안내를 따라 설정 완료
  3. Repository의 Discussions 기능 활성화

Repository 관리자만 설정할 수 있습니다. 설정이 완료되면 모든 방문자가 댓글을 남길 수 있습니다.