리눅스 네임스페이스(namespace)는 프로세스를 격리된 환경에서 실행하기 위한 리눅스 커널의 기능입니다. 네임스페이스는 프로세스 간에 리소스를 격리하고, 각각의 독립적인 환경을 제공하여 서로 영향을 주지 않고 실행할 수 있도록 합니다. 이를 통해 컨테이너와 같은 가상화 기술이 가능해지며, 애플리케이션의 배포와 관리를 단순화하고 시스템 자원을 효율적으로 사용할 수 있습니다.
리눅스에서 제공하는 주요 네임 스페이스 유형은 다음과 같습니다.
PID 네임 스페이스 (pid): 각 프로세서 그룹에 대해 고유한 프로세서 ID(PID) 공간을 제공하여 프로세서 간의 상호 작용 및 식별성을 분리합니다.
네트워크 네임 스페이스 (net): 독립된 네트워크 스택, IP 주소, 포트 번호 등의 정보를 가지며, 다른 컨테이너와 완전히 격리된 네트워크 환경을 제공합니다.
마운트 네임 스페이스 (mnt): 파일 시스템 마운트 포인트를 격리하여 각 컨테이너마다 독립적인 파일 시스템 환경을 제공합니다.
UTS 네임 스페이스 (uts): 호스트 이름과 도메인 이름을 격리하여 각 컨테이너마다 독립적인 호스트 이름을 가질 수 있도록 합니다.
IPC 네임 스페이스 (ipc): System V IPC(Inter-Process Communication) 자원(예: 메시지 큐, 세마포어 등)을 격리하여 프로세서 간의 통신을 분리합니다.
유저 네임 스페이스 (user): 사용자와 그룹 ID를 격리하여 각 컨테이너에서 고유한 사용자 및 그룹 ID를 가질 수 있도록 합니다.
각 네임 스페이스는 해당하는 리소스에 대한 격리와 관련된 설정 및 정보를 포함하는 구조체로 구성됩니다. 이러한 네임 스페이스들은 unshare 명령어나 clone 시스템 호출과 함께 사용되어 프로세서의 네임 스페이슬르 변경하고, setns 시도호출을 사용하여 다른 프로세서가 생성한 namespace에 접근할 수 있습니다.
코드 예시:
#include <sys/types.h>
#include <sys/stat.h>
#include <fcntl.h>
#include <sched.h>
int main() {
// PID 네임 스페이스 생성
int pid_ns = open("/proc/self/ns/pid", O_RDONLY);
// 다른 프로세스의 PID 네임 스페이스에 접근
setns(pid_ns, CLONE_NEWPID);
// 파일 디스크립터 닫기
close(pid_ns);
// ...
}
위의 코드 예시는 C 언어를 사용하여 PID 네임 스페이스에 접근하는 방법을 보여줍니다. open 함수를 사용하여 현재 프로세서의 PID 네임 스페이스에 대한 파일 디스크립터를 가져온 후, setns 함수를 사용하여 다른 프로세서가 생성한 PID 네임 스페이슬르 변경합니다. 이렇게 함으로써 현재 프로세서는 다른 네임 스페이슬르 가진 프로세서와 상호 작용할 수 있습니다.
네임 스페이싱은 컨테이너와 같은 가상화 기술에서 핵심적인 개념입니다. 각 컨테이너는 독립된 환경을 제공하기 위해 여러 개의 네임 스페이싱을 사용하며, 이를 통해 애플리케이션의 격리 및 자원 관리가 가능해집니다.