Skip to main content

Namespace

이 문서는 리눅스 커널 기능Namespace의 개요를 살피고, 리눅스 커널 네임스페이스를 출력해봅니다.

lx-namespace

Namespace is Linux Kernel feature :
A namespace wraps a global system resource in an abstraction that makes it appear to the processes within the namespace that they have their own isolated instance of the global resource.

리눅스는 커널 기능이다.
네임스페이스는 전역 시스템의 리소스를 추상화로 감싸서wrap 네임스페이스 내부의 프로세스가 전역 리소스에 격리화된 인스턴스를 갖는 것처럼 보이게 합니다.

출처: Overview of Linux Namespace

정의부터 어렵습니다.

Namespace = What You Can See

도커 마스터즈에서 학습한 내용에 따르면,
namespace는 격리된 컨테이너에서 자신에게 속하는 뷰만을 볼 수 있다-고 학습했습니다. 강의에서 학습한 내용을 넘어서, 리눅스 네임스페이스 개요와 각 타입의 구조 및 명령어를 간략히 살펴보겠습니다.

출처: Overview of Linux Namespace

Docker에서 중요하게 활용되는 내용이어서 위의 문서를 직접 번역하고, 도커 마스터즈의 내용을 참조하여 직접 네임스페이스를 출력해보며 학습했습니다.


구조와 형태

리눅스 네임스페이스는 객체 배열 형태로 namespaces 루트 필드에 저장됩니다.

// 예시
"namespaces": [
{
"type": "pid",
"path": "/proc/1234/ns/pid"
},
{
"type": "network",
"path": "/var/run/netns/neta"
},
{
"type": "mount"
},
{
"type": "ipc"
},
{
"type": "uts"
},
{
"type": "user"
},
{
"type": "cgroup"
}
]

리눅스 커널 v4.4.07가지 타입의 네임스페이스를 제공합니다.
각 네임스페이스 필드의 각 타입 특성을 간략히 알아보겠습니다:

  • pid: 프로세스 ID. 독립적인 프로세스 공간을 할당. 프로세스의 PID 네임스페이스를 위한 핸들.
    • PID 네임스페이스는 프로세스 ID number space를 격리함. -> 다른 PID 네임스페이스에 있는 프로세스들은 같은 PID를 갖을 수 있다.
    • PID 네임스페이스는 프로세스가 실제론 같은 PID에 속하면서, 컨테이너에 속한 프로세스들을 중단/재개하거나 마이그레이션하는 기능을 수행할 수 있게 해준다.
  • net: ip netns는 네트워크 네임스페이스 관리를 처리하는 데 사용
    • 프로세스의 네트워크 네임스페이스를 위한 핸들
    • 네트워킹과 관련된 시스템 리소스를 분리하고 네트워크 장치를 분리
    • namespace간에 network 충돌 방지 (중복 포트 바인딩 등)
  • mount: 마운트는 프로세스의 마운트 네임스페이스를 위한 핸들이며 마운트 지점을 분리
    • 호스트 파일시스템에 구애 받지 않고 독립적으로 파일시스템을 마운트하거나 언마운트 가능
  • uts: 프로세스의 UTS 네임스페이스를 위한 핸들이며 호스트 이름과 NIS 도메인 이름을 구분
  • ipc: 프로세스간의 독립적인 통신통로 할당 (SystemV IPC)
    • 프로세스의 IPC 네임스페이스를 위한 핸들이며 System Vs IPCPOSIX 메시지 큐를 분리
  • user: 프로세스의 사용자 네임스페이스를 위한 핸들
    • 독립적인 사용자 할당
  • cgroup: (최신 추가 기능) 컨테이너는 cgroup 계층 구조를 독립적으로 볼 수 있음
    • 리눅스 커널 4.6(2016년)부터 도입

Namespace Commands

  • lsns : 현재 리눅스의 네임스페이스(namespace) 목록
  • unshare : --pid, --mount 등의 옵션으로 새로운 네임스페이스 생성
  • nsenter : -t {PID} 로 해당 네임스페이스 PID에 접속
vagrant ssh # vagrant로 debian 리눅스에 접속
docker start nx-cont # nginx 컨테이너를 실행합니다
lsns

lx-ns

도커 컨테이너와 리눅스 OS의 네임스페이스를 확인할 수 있습니다. nsenter로 도커 nginx 컨테이너에 들어가 간단한 커맨드를 실행해보겠습니다.

nsenter -t {컨테이너 PID} --uts # 혹은 -u
# 현재 PID로 nginx 컨테이너에 enter한 상태입니다.
hostname
ff084*** # id 해시 값 출력
exit # uts 네임스페이스에서 exit
hostname
debian-12 # 리눅스 호스트 uts 네임스페이스 출력

출력 결과

ns-enter-nx