목차
2. 구현
三、UTS命名空间
운영 및 유지보수 리눅스 운영 및 유지 관리 Linux 네임스페이스에 대해 알아야 할 사항

Linux 네임스페이스에 대해 알아야 할 사항

Jan 25, 2022 pm 05:37 PM
linux

이 기사는 Linux 네임스페이스에 대한 관련 지식을 제공합니다. 네임스페이스는 가벼운 형태의 가상화를 제공하여 다양한 측면에서 실행 중인 시스템의 전역 속성을 볼 수 있도록 해줍니다.

Linux 네임스페이스에 대해 알아야 할 사항

1. 기본 개념

- 네임스페이스(Linux 네임스페이스)는 컨테이너 가상화 구현을 위한 리눅스 커널의 기능입니다. 우리가 만드는 각 컨테이너에는 고유한 네임스페이스가 있으며, 그 안에서 실행되는 애플리케이션은 마치 독립적인 운영 체제에서 실행되는 것처럼 보입니다. 네임스페이스는 컨테이너가 서로 영향을 미치지 않도록 합니다.

 Linux의 네임스페이스 메커니즘은 리소스 격리를 위한 솔루션을 제공합니다. PID, IPC 및 네트워크와 같은 시스템 리소스는 더 이상 전역이 아니며 특정 네임스페이스에 속합니다. 네임스페이스는 전역 시스템 리소스의 일종의 캡슐화 및 격리이므로 서로 다른 네임스페이스의 프로세스는 독립적인 전역 시스템 리소스를 갖습니다. 네임스페이스의 시스템 리소스를 변경하면 현재 네임스페이스의 프로세스에만 영향을 미치고 다른 네임스페이스의 프로세스에는 영향을 미치지 않습니다.

  전통적으로 Linux 및 기타 UNIX 파생 제품에서는 많은 리소스가 전역적으로 관리됩니다. 예를 들어, 시스템의 모든 프로세스는 일반적으로 PID로 식별됩니다. 이는 커널이 PID의 전체 목록을 관리해야 함을 의미합니다. 또한 uname 시스템 호출을 통해 모든 호출자가 반환하는 시스템 관련 정보(시스템 이름 및 커널에 대한 일부 정보 포함)는 동일합니다. 사용자 ID는 유사한 방식으로 관리됩니다. 즉, 각 사용자는 전역적으로 고유한 UID 번호로 식별됩니다.

  전역 ID를 사용하면 커널이 특정 권한을 선택적으로 허용하거나 거부할 수 있습니다. UID 0을 가진 루트 사용자는 기본적으로 모든 작업을 수행할 수 있지만 다른 사용자 ID는 제한됩니다. 예를 들어, UID n을 가진 사용자는 사용자 m(m≠ n)에 속한 프로세스를 종료할 수 없습니다. 그러나 이것이 사용자가 서로를 보는 것을 막지는 못합니다. 즉, 사용자 n은 다른 사용자 m이 컴퓨터에서 활성 상태라는 것을 볼 수 있습니다. 사용자가 자신의 프로세스만 조작할 수 있는 한 이는 괜찮습니다. 사용자가 다른 사용자의 프로세스를 보도록 허용해서는 안 될 이유가 없기 때문입니다.

  하지만 이 효과가 바람직하지 않은 상황이 있습니다. 웹 호스팅 제공업체가 사용자에게 루트 권한을 포함하여 Linux 컴퓨터에 대한 전체 액세스 권한을 제공하려는 경우. 전통적으로 이를 위해서는 각 사용자마다 컴퓨터가 필요했는데, 이는 엄청나게 비용이 많이 들었습니다. KVM이나 VMWare에서 제공하는 가상화 환경을 이용하는 것도 문제를 해결하는 방법 중 하나이지만 리소스 할당이 별로 좋지 않습니다. 컴퓨터의 각 사용자에게는 별도의 커널과 완전히 설치된 사용자 수준 응용 프로그램 지원 세트가 필요합니다.

 네임스페이스는 더 적은 리소스가 필요한 다른 솔루션을 제공합니다. 가상화된 시스템에서 물리적 컴퓨터는 여러 코어, 가능하면 여러 운영 체제를 병렬로 실행할 수 있습니다. 네임스페이스는 하나의 커널만 사용하여 하나의 물리적 컴퓨터에서 작동하며 앞서 언급한 모든 전역 리소스는 네임스페이스를 통해 추상화됩니다. 이를 통해 일련의 프로세스를 서로 격리된 컨테이너에 배치할 수 있습니다. 격리를 통해 컨테이너의 구성원은 다른 컨테이너와 관계가 없습니다. 그러나 컨테이너가 특정 양의 정보를 공유하도록 허용하여 컨테이너 간의 분리를 줄일 수도 있습니다. 예를 들어, 자체 PID 세트를 사용하도록 컨테이너를 설정하면서도 파일 시스템의 일부를 다른 컨테이너와 공유할 수 있습니다.

2. 구현

  네임스페이스 구현에는 두 부분이 필요합니다. 즉, 모든 이전 전역 구성 요소를 네임스페이스로 래핑하는 각 하위 시스템의 네임스페이스 구조와 지정된 프로세스를 해당 프로세스가 속한 각 네임스페이스에 연결하는 메커니즘입니다.

  하위 시스템의 이전 전역 속성은 이제 네임스페이스로 캡슐화되며 각 프로세스는 선택한 네임스페이스와 연결됩니다. 모든 네임스페이스 인식 커널 하위 시스템은 네임스페이스로 제공된 모든 개체를 수집하는 데이터 구조를 제공해야 합니다. struct nsproxy는 하위 시스템별 네임스페이스 래퍼에 대한 포인터를 어셈블하는 데 사용됩니다. nsproxy.h 파일에는 다음이 있습니다.

/*
 * A structure to contain pointers to all per-process
 * namespaces - fs (mount), uts, network, sysvipc, etc.
 *
 * The pid namespace is an exception -- it's accessed using
 * task_active_pid_ns.  The pid namespace here is the
 * namespace that children will use.
 *
 * 'count' is the number of tasks holding a reference.
 * The count for each namespace, then, will be the number
 * of nsproxies pointing to it, not the number of tasks.
 *
 * The nsproxy is shared by tasks which share all namespaces.
 * As soon as a single namespace is cloned or unshared, the
 * nsproxy is copied.
 */struct nsproxy {
	atomic_t count;
	struct uts_namespace *uts_ns;
	struct ipc_namespace *ipc_ns;
	struct mnt_namespace *mnt_ns;
	struct pid_namespace *pid_ns_for_children;
	struct net 	     *net_ns;
	struct time_namespace *time_ns;
	struct time_namespace *time_ns_for_children;
	struct cgroup_namespace *cgroup_ns;};
로그인 후 복사

   현재 커널의 다음 범위는 네임스페이스를 감지할 수 있습니다.

   1. UTS 네임스페이스에는 실행 중인 커널의 이름, 버전, 기본 아키텍처 유형 및 기타 정보가 포함됩니다. UTS는 UNIX Timesharing System의 약자입니다.

   2. IPC(프로세스 간 통신)와 관련된 모든 정보는 struct ipc_namespace에 저장됩니다.

  3. 마운트된 파일 시스템의 보기는 mnt_namespace 구조체에 제공됩니다.

  4. 프로세스 ID에 대한 정보는 struct pid_namespace에서 제공됩니다.

  5. struct user_namespace에 저장된 정보는 각 사용자의 리소스 사용량을 제한하는 데 사용됩니다.

  6. struct net_ns에는 모든 네트워크 관련 네임스페이스 매개변수가 포함되어 있습니다.

  해당 하위 시스템에 대해 논의할 때 각 네임스페이스 컨테이너의 내용을 소개하겠습니다. 새 프로세스를 생성할 때 포크를 사용하여 새 네임스페이스를 설정할 수 있으므로 이 동작을 제어하려면 적절한 플래그를 제공해야 합니다. 각 네임스페이스에는 sched.h 파일에 있는 해당 플래그가 있습니다.

#define CLONE_NEWCGROUP		0x02000000	/* New cgroup namespace */
#define CLONE_NEWUTS		0x04000000	/* New utsname namespace */
#define CLONE_NEWIPC		0x08000000	/* New ipc namespace */
#define CLONE_NEWUSER		0x10000000	/* New user namespace */
#define CLONE_NEWPID		0x20000000	/* New pid namespace */
#define CLONE_NEWNET		0x40000000	/* New network namespace */
로그인 후 복사

  다양한 유형의 네임스페이스의 기능:

  IPC:用于隔离进程间通讯所需的资源( System V IPC, POSIX message queues),PID命名空间和IPC命名空间可以组合起来用,同一个IPC名字空间内的进程可以彼此看见,允许进行交互,不同空间进程无法交互

  Network:Network Namespace为进程提供了一个完全独立的网络协议栈的视图。包括网络设备接口,IPv4和IPv6协议栈,IP路由表,防火墙规则,sockets等等。一个Network Namespace提供了一份独立的网络环境,就跟一个独立的系统一样。

  Mount:每个进程都存在于一个mount Namespace里面,  mount Namespace为进程提供了一个文件层次视图。如果不设定这个flag,子进程和父进程将共享一个mount Namespace,其后子进程调用mount或umount将会影响到所有该Namespace内的进程。如果子进程在一个独立的mount Namespace里面,就可以调用mount或umount建立一份新的文件层次视图。

  PID::linux通过命名空间管理进程号,同一个进程,在不同的命名空间进程号不同!进程命名空间是一个父子结构,子空间对于父空间可见。

  User:用于隔离用户

  UTS:用于隔离主机名

  每个进程都关联到自身的命名空间视图,在任务定义的结构体task_struct中有如下定义:

struct task_struct {.../* 命名空间 */struct nsproxy *nsproxy;...}
로그인 후 복사

  因为使用了指针,多个进程可以共享一组子命名空间。这样,修改给定的命名空间,对所有属于该命名空间的进程都是可见的。
  init_nsproxy定义了初始的全局命名空间,其中维护了指向各子系统初始的命名空间对象的指针。在kernel/nsproxy.c文件内有

struct nsproxy init_nsproxy = {
	.count			= ATOMIC_INIT(1),
	.uts_ns			= &init_uts_ns,#if defined(CONFIG_POSIX_MQUEUE) || defined(CONFIG_SYSVIPC)
	.ipc_ns			= &init_ipc_ns,#endif
	.mnt_ns			= NULL,
	.pid_ns_for_children	= &init_pid_ns,#ifdef CONFIG_NET
	.net_ns			= &init_net,#endif#ifdef CONFIG_CGROUPS
	.cgroup_ns		= &init_cgroup_ns,#endif#ifdef CONFIG_TIME_NS
	.time_ns		= &init_time_ns,
	.time_ns_for_children	= &init_time_ns,#endif};
로그인 후 복사

三、UTS命名空间

  UTS命名空间几乎不需要特别的处理,因为它只需要简单量,没有层次组织。所有相关信息都汇集到下列结构的一个实例中。在utsname.h文件内:

struct uts_namespace {
	struct new_utsname name;
	struct user_namespace *user_ns;
	struct ucounts *ucounts;
	struct ns_common ns;} __randomize_layout;
로그인 후 복사

  uts_namespace所提供的属性信息本身包含在struct new_utsname中:

struct oldold_utsname {
	char sysname[9];
	char nodename[9];
	char release[9];
	char version[9];
	char machine[9];};#define __NEW_UTS_LEN 64struct old_utsname {
	char sysname[65];
	char nodename[65];
	char release[65];
	char version[65];
	char machine[65];};struct new_utsname {
	char sysname[__NEW_UTS_LEN + 1];
	char nodename[__NEW_UTS_LEN + 1];
	char release[__NEW_UTS_LEN + 1];
	char version[__NEW_UTS_LEN + 1];
	char machine[__NEW_UTS_LEN + 1];
	char domainname[__NEW_UTS_LEN + 1];}
로그인 후 복사

  各个字符串分别存储了系统的名称( Linux…)、内核发布版本、机器名,等等。使用uname工具可以取得这些属性的当前值,也可以在/proc/sys/kernel/中看到

z@z-virtual-machine:~$ cat /proc/sys/kernel/ostype
Linux
z@z-virtual-machine:~$ cat /proc/sys/kernel/osrelease5.3.0-40-generic
로그인 후 복사

  初始设置保存在init_uts_ns中,在init/version.c文件内:

struct uts_namespace init_uts_ns = {
	.ns.count = REFCOUNT_INIT(2),
	.name = {
		.sysname	= UTS_SYSNAME,
		.nodename	= UTS_NODENAME,
		.release	= UTS_RELEASE,
		.version	= UTS_VERSION,
		.machine	= UTS_MACHINE,
		.domainname	= UTS_DOMAINNAME,
	},
	.user_ns = &init_user_ns,
	.ns.inum = PROC_UTS_INIT_INO,#ifdef CONFIG_UTS_NS
	.ns.ops = &utsns_operations,#endif};
로그인 후 복사

相关推荐:《Linux视频教程

위 내용은 Linux 네임스페이스에 대해 알아야 할 사항의 상세 내용입니다. 자세한 내용은 PHP 중국어 웹사이트의 기타 관련 기사를 참조하세요!

본 웹사이트의 성명
본 글의 내용은 네티즌들의 자발적인 기여로 작성되었으며, 저작권은 원저작자에게 있습니다. 본 사이트는 이에 상응하는 법적 책임을 지지 않습니다. 표절이나 침해가 의심되는 콘텐츠를 발견한 경우 admin@php.cn으로 문의하세요.

핫 AI 도구

Undresser.AI Undress

Undresser.AI Undress

사실적인 누드 사진을 만들기 위한 AI 기반 앱

AI Clothes Remover

AI Clothes Remover

사진에서 옷을 제거하는 온라인 AI 도구입니다.

Undress AI Tool

Undress AI Tool

무료로 이미지를 벗다

Clothoff.io

Clothoff.io

AI 옷 제거제

Video Face Swap

Video Face Swap

완전히 무료인 AI 얼굴 교환 도구를 사용하여 모든 비디오의 얼굴을 쉽게 바꾸세요!

뜨거운 도구

메모장++7.3.1

메모장++7.3.1

사용하기 쉬운 무료 코드 편집기

SublimeText3 중국어 버전

SublimeText3 중국어 버전

중국어 버전, 사용하기 매우 쉽습니다.

스튜디오 13.0.1 보내기

스튜디오 13.0.1 보내기

강력한 PHP 통합 개발 환경

드림위버 CS6

드림위버 CS6

시각적 웹 개발 도구

SublimeText3 Mac 버전

SublimeText3 Mac 버전

신 수준의 코드 편집 소프트웨어(SublimeText3)

VSCODE에 필요한 컴퓨터 구성 VSCODE에 필요한 컴퓨터 구성 Apr 15, 2025 pm 09:48 PM

대 코드 시스템 요구 사항 : 운영 체제 : Windows 10 이상, MacOS 10.12 이상, Linux 배포 프로세서 : 최소 1.6GHz, 권장 2.0GHz 이상의 메모리 : 최소 512MB, 권장 4GB 이상의 저장 공간 : 최소 250MB, 권장 1GB 및 기타 요구 사항 : 안정 네트워크 연결, Xorg/Wayland (LINUX)

VSCODE는 확장자를 설치할 수 없습니다 VSCODE는 확장자를 설치할 수 없습니다 Apr 15, 2025 pm 07:18 PM

VS 코드 확장을 설치하는 이유는 다음과 같습니다. 네트워크 불안정성, 불충분 한 권한, 시스템 호환성 문제, C 코드 버전은 너무 오래된, 바이러스 백신 소프트웨어 또는 방화벽 간섭입니다. 네트워크 연결, 권한, 로그 파일, 업데이트 대 코드 업데이트, 보안 소프트웨어 비활성화 및 대 코드 또는 컴퓨터를 다시 시작하면 점차 문제를 해결하고 해결할 수 있습니다.

vScode를 Mac에 사용할 수 있습니다 vScode를 Mac에 사용할 수 있습니다 Apr 15, 2025 pm 07:36 PM

VS 코드는 Mac에서 사용할 수 있습니다. 강력한 확장, GIT 통합, 터미널 및 디버거가 있으며 풍부한 설정 옵션도 제공합니다. 그러나 특히 대규모 프로젝트 또는 고도로 전문적인 개발의 경우 VS 코드는 성능 또는 기능 제한을 가질 수 있습니다.

VScode 란 무엇입니까? VScode 란 무엇입니까? Apr 15, 2025 pm 06:45 PM

VS Code는 Full Name Visual Studio Code로, Microsoft가 개발 한 무료 및 오픈 소스 크로스 플랫폼 코드 편집기 및 개발 환경입니다. 광범위한 프로그래밍 언어를 지원하고 구문 강조 표시, 코드 자동 완료, 코드 스 니펫 및 스마트 프롬프트를 제공하여 개발 효율성을 향상시킵니다. 풍부한 확장 생태계를 통해 사용자는 디버거, 코드 서식 도구 및 GIT 통합과 같은 특정 요구 및 언어에 확장을 추가 할 수 있습니다. VS 코드에는 코드에서 버그를 신속하게 찾아서 해결하는 데 도움이되는 직관적 인 디버거도 포함되어 있습니다.

vscode를 사용하는 방법 vscode를 사용하는 방법 Apr 15, 2025 pm 11:21 PM

Visual Studio Code (VSCODE)는 Microsoft가 개발 한 크로스 플랫폼, 오픈 소스 및 무료 코드 편집기입니다. 광범위한 프로그래밍 언어에 대한 가볍고 확장 성 및 지원으로 유명합니다. VSCODE를 설치하려면 공식 웹 사이트를 방문하여 설치 프로그램을 다운로드하고 실행하십시오. VScode를 사용하는 경우 새 프로젝트를 만들고 코드 편집, 디버그 코드, 프로젝트 탐색, VSCODE 확장 및 설정을 관리 할 수 ​​있습니다. VSCODE는 Windows, MacOS 및 Linux에서 사용할 수 있으며 여러 프로그래밍 언어를 지원하며 Marketplace를 통해 다양한 확장을 제공합니다. 이점은 경량, 확장 성, 광범위한 언어 지원, 풍부한 기능 및 버전이 포함됩니다.

Apr 16, 2025 pm 07:39 PM

메모장은 Java 코드를 직접 실행할 수는 없지만 다른 도구를 사용하여 명령 줄 컴파일러 (Javac)를 사용하여 Bytecode 파일 (filename.class)을 생성하면 달성 할 수 있습니다. Java Interpreter (Java)를 사용하여 바이트 코드를 해석하고 코드를 실행하고 결과를 출력하십시오.

Linux의 주요 목적은 무엇입니까? Linux의 주요 목적은 무엇입니까? Apr 16, 2025 am 12:19 AM

Linux의 주요 용도에는 다음이 포함됩니다. 1. 서버 운영 체제, 2. 임베디드 시스템, 3. 데스크탑 운영 체제, 4. 개발 및 테스트 환경. Linux는이 분야에서 뛰어나 안정성, 보안 및 효율적인 개발 도구를 제공합니다.

git의 창고 주소를 확인하는 방법 git의 창고 주소를 확인하는 방법 Apr 17, 2025 pm 01:54 PM

git 저장소 주소를 보려면 다음 단계를 수행하십시오. 1. 명령 줄을 열고 리포지토리 디렉토리로 이동하십시오. 2. "git remote -v"명령을 실행하십시오. 3. 출력 및 해당 주소에서 저장소 이름을 봅니다.

See all articles