개요

cgroups(control groups의 약자)는 프로세스들의 자원의 사용(CPU, 메모리, 디스크 입출력, 네트워크 등)을 제한하고 격리시키는 리눅스 커널 기능이다. Cgroups들은 여러 리눅스의 자원들을 계층적인 gruops들로 나누어서, 하위 계층이 상위계층에 접근 할 수 없도록 하는 등의 보안적인 제한을 걸게 된다. Cgruops인터페이스는 pseudo-filesystem인 cgruopfs를 통해서 제공되며, core features들은 linux kernel에 직접적으로 implemented되어 있다.

Cgruop

cgroup이란 process들의 집합으로 각각의 프로세스는 cgroup filesystem에 의해서 부여받은 limits와 parameters을 가지게 된다. 이러한 제한된 기능을 가지는 kernel componenets들을 subsystem이라고 하며, 각각의 subsystem들은 메모리 제한, CPU제한, 혹인 system call access제한과 같은 여러 제한을 가하게 된다. cgroup controller은 계층적으로 구현되어 있으며, 각각의 계층은 하위 계층에 대한 access권한만을 가지고 있다.

  • Resource limits: Cgroup은 리소스들을 제한할 수 있다. (Memory, CPU혹은 hardwares)
  • Prioritization: 각 리소스들이 어떻게 contention환경에서 사용될지 결정할 수 있다.
  • Accounting: 리소스 구성들은 cgroup level에 의해서 보고된다.
  • Control: command을 통해서 이러한 limitaion들을 구성할 수 있다.

다음 커맨드는 cgroupfs에 foo란 memory group을 만들고 50MB의 메모리 리소스 제한을 건다.

root # mkdir -p /sys/fs/cgroup/memory/foo
root # echo 50000000 > /sys/fs/cgroup/memory/foo/memory.limit_in_bytes  

Linux namespace

네임스페이스는 동일한 시스템에서 별개의 독립된 환경을 만들어서 운영하는 가상화 기술이다. 각 운영체제 커널은 각각의 domain즉 리눅스에서의 process를 구별하기 위해서 hostname, pid와 같은 idenfication방법들을 운영한다. 네임스페이스는 이러한 것들이 분리되어 보일 수 있도록 한다. 네임스페이스는 다음과 같이 6개로 다른 네임스페이스 group으로 구성된다.

  • UTS namespace: hostname을 isolate한다.
  • IPC namespace: IPC 리소스를 분할한다. 즉 프로세스간의 통신을 격리한다. (이를 통해서 mutex나 file locking과 같은 것도 격리 가능하다.)
  • PID namespace: PID를 분리한다. 즉 같은 OS에서 같은 PID를 가지더라도 분리된 환경에서 실행 될 수 있게 된다.
  • NS namespace: 파일시스템의 mount포인트를 분리한다.
  • NET namespace: 네트워크 인터페이스, iptables와 같은 네트워크 리소스를 분리힌다.
  • USER namespace: user 와 group ID를 분리하고 격리한다.

다음 커맨드는 새로은 namespace를 만들어서 격리된 환경에서 bash를 실행 시킨다.

unshare --user --pid --map-root-user --mount-proc --fork bash

cgroups와 namespace

Cgruops은 리소스 격리를, namespace는 분리된 isolated환경을 applications에게 제공한다.