Dieser Artikel vermittelt Ihnen relevantes Wissen über Linux-Namespaces, die es uns ermöglichen, die globalen Eigenschaften des laufenden Systems aus verschiedenen Blickwinkeln zu betrachten.
1. Grundkonzepte
– Namespace (Linux-Namespace) ist eine Funktion des Linux-Kernels zur Implementierung der Containervirtualisierung. Jeder von uns erstellte Container verfügt über einen eigenen Namensraum und die darin ausgeführten Anwendungen laufen so, als würden sie in einem unabhängigen Betriebssystem ausgeführt. Der Namensraum stellt sicher, dass sich die Container nicht gegenseitig beeinflussen.
Der Namespace-Mechanismus von Linux bietet eine Lösung für die Ressourcenisolation. Systemressourcen wie PID, IPC und Netzwerk sind nicht mehr global, sondern gehören zu einem bestimmten Namespace. Namespace ist eine Art Kapselung und Isolierung globaler Systemressourcen, sodass Prozesse in verschiedenen Namespaces über unabhängige globale Systemressourcen verfügen. Das Ändern von Systemressourcen in einem Namespace wirkt sich nur auf Prozesse im aktuellen Namespace aus und hat keine Auswirkungen auf Prozesse in anderen Namespaces.
Traditionell werden in Linux und anderen Derivaten von UNIX viele Ressourcen global verwaltet. Beispielsweise werden alle Prozesse im System herkömmlicherweise durch PID identifiziert, was bedeutet, dass der Kernel eine globale Liste von PIDs verwalten muss. Darüber hinaus sind die systembezogenen Informationen (einschließlich des Systemnamens und einiger Informationen über den Kernel), die von allen Aufrufern über den Systemaufruf uname zurückgegeben werden, dieselben. Benutzer-IDs werden auf ähnliche Weise verwaltet, d. h. jeder Benutzer wird durch eine weltweit eindeutige UID-Nummer identifiziert.
Mit der globalen ID kann der Kernel bestimmte Berechtigungen selektiv zulassen oder verweigern. Während der Root-Benutzer mit UID 0 grundsätzlich alles tun darf, sind andere Benutzer-IDs eingeschränkt. Beispielsweise darf der Benutzer mit der UID n den Prozess des Benutzers m (m≠ n) nicht beenden. Dies hindert die Benutzer jedoch nicht daran, sich gegenseitig zu sehen, d. h. Benutzer n kann sehen, dass auch ein anderer Benutzer m auf dem Computer aktiv ist. Solange Benutzer nur ihre eigenen Prozesse manipulieren können, ist dies in Ordnung, da es keinen Grund gibt, warum Benutzern nicht erlaubt werden sollte, die Prozesse anderer Benutzer zu sehen.
In manchen Fällen kann dieser Effekt jedoch unerwünscht sein. Wenn der Anbieter von Webhosting beabsichtigt, Benutzern vollen Zugriff auf einen Linux-Computer einschließlich Root-Rechten zu gewähren. Traditionell war hierfür für jeden Benutzer ein Computer erforderlich, was unerschwinglich teuer war. Die Verwendung der von KVM oder VMWare bereitgestellten Virtualisierungsumgebung ist eine Möglichkeit, das Problem zu lösen, die Ressourcenzuweisung ist jedoch nicht sehr gut. Jeder Benutzer des Computers benötigt einen separaten Kernel und einen vollständig installierten Satz unterstützender Anwendungen auf Benutzerebene.
Namespaces bieten eine andere Lösung, die weniger Ressourcen erfordert. In einem virtualisierten System kann ein physischer Computer mehrere Kerne und möglicherweise mehrere verschiedene Betriebssysteme parallel ausführen. Der Namespace verwendet nur einen Kernel für den Betrieb auf einem physischen Computer, und alle oben genannten globalen Ressourcen werden über den Namespace abstrahiert. Dadurch ist es möglich, eine Reihe von Prozessen in voneinander isolierten Containern zu platzieren. Durch die Isolation können Mitglieder eines Containers keine Beziehung zu anderen Containern haben. Sie können die Trennung zwischen Containern aber auch verringern, indem Sie ihnen erlauben, bestimmte Informationsmengen gemeinsam zu nutzen. Beispielsweise kann ein Container so eingerichtet werden, dass er seinen eigenen Satz von PIDs verwendet, aber dennoch Teile des Dateisystems mit anderen Containern teilt.
2. Implementierung
Die Implementierung des Namespace erfordert zwei Teile: die Namespace-Struktur jedes Subsystems, die alle vorherigen globalen Komponenten in den Namespace einschließt; und den Mechanismus, der einen bestimmten Prozess jedem Namespace zuordnet, zu dem er gehört.
Frühere globale Eigenschaften von Subsystemen sind jetzt in Namespaces gekapselt und jeder Prozess ist einem ausgewählten Namespace zugeordnet. Jedes Namespace-fähige Kernel-Subsystem muss eine Datenstruktur bereitstellen, die alle als Namespaces bereitgestellten Objekte sammelt. struct nsproxy wird verwendet, um Zeiger auf subsystemspezifische Namespace-Wrapper zusammenzustellen. In der Datei nsproxy.h gibt es:
/* * 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;};
Die folgenden Bereiche des aktuellen Kernels können den Namespace erkennen
1. Der UTS-Namespace enthält den Namen, die Version, den zugrunde liegenden Architekturtyp und andere Informationen des laufenden Kernels. UTS ist die Abkürzung für UNIX Timesharing System.
2. Alle Informationen zur Interprozesskommunikation (IPC) werden in der Struktur ipc_namespace gespeichert.
3. Die Ansicht des gemounteten Dateisystems ist in der Struktur mnt_namespace angegeben.
4. Informationen über die Prozess-ID werden von der Struktur pid_namespace bereitgestellt.
5. Die von struct user_namespace gespeicherten Informationen werden verwendet, um die Ressourcennutzung jedes Benutzers zu begrenzen.
6. struct net_ns enthält alle netzwerkbezogenen Namespace-Parameter.
Wenn ich das entsprechende Subsystem bespreche, werde ich den Inhalt jedes Namespace-Containers vorstellen. Da fork beim Erstellen eines neuen Prozesses zum Einrichten eines neuen Namensraums verwendet werden kann, müssen entsprechende Flags bereitgestellt werden, um dieses Verhalten zu steuern. Jeder Namespace verfügt über ein entsprechendes Flag, das sich in der Datei sched.h befindet:
#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 */
Die Funktionen verschiedener Arten von Namespaces:
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视频教程》
Das obige ist der detaillierte Inhalt vonSie müssen Linux-Namespaces verstehen. Für weitere Informationen folgen Sie bitte anderen verwandten Artikeln auf der PHP chinesischen Website!

linux设备节点是应用程序和设备驱动程序沟通的一个桥梁;设备节点被创建在“/dev”,是连接内核与用户层的枢纽,相当于硬盘的inode一样的东西,记录了硬件设备的位置和信息。设备节点使用户可以与内核进行硬件的沟通,读写设备以及其他的操作。

区别:1、open是UNIX系统调用函数,而fopen是ANSIC标准中的C语言库函数;2、open的移植性没fopen好;3、fopen只能操纵普通正规文件,而open可以操作普通文件、网络套接字等;4、open无缓冲,fopen有缓冲。

端口映射又称端口转发,是指将外部主机的IP地址的端口映射到Intranet中的一台计算机,当用户访问外网IP的这个端口时,服务器自动将请求映射到对应局域网内部的机器上;可以通过使用动态或固定的公共网络IP路由ADSL宽带路由器来实现。

在linux中,eof是自定义终止符,是“END Of File”的缩写;因为是自定义的终止符,所以eof就不是固定的,可以随意的设置别名,linux中按“ctrl+d”就代表eof,eof一般会配合cat命令用于多行文本输出,指文件末尾。

在linux中,可以利用“rpm -qa pcre”命令判断pcre是否安装;rpm命令专门用于管理各项套件,使用该命令后,若结果中出现pcre的版本信息,则表示pcre已经安装,若没有出现版本信息,则表示没有安装pcre。

linux查询mac地址的方法:1、打开系统,在桌面中点击鼠标右键,选择“打开终端”;2、在终端中,执行“ifconfig”命令,查看输出结果,在输出信息第四行中紧跟“ether”单词后的字符串就是mac地址。

在linux中,rpc是远程过程调用的意思,是Reomote Procedure Call的缩写,特指一种隐藏了过程调用时实际通信细节的IPC方法;linux中通过RPC可以充分利用非共享内存的多处理器环境,提高系统资源的利用率。

手机远程linux工具有:1、JuiceSSH,是一款功能强大的安卓SSH客户端应用,可直接对linux服务进行管理;2、Termius,可以利用手机来连接Linux服务器;3、Termux,一个强大的远程终端工具;4、向日葵远程控制等等。


Heiße KI -Werkzeuge

Undresser.AI Undress
KI-gestützte App zum Erstellen realistischer Aktfotos

AI Clothes Remover
Online-KI-Tool zum Entfernen von Kleidung aus Fotos.

Undress AI Tool
Ausziehbilder kostenlos

Clothoff.io
KI-Kleiderentferner

AI Hentai Generator
Erstellen Sie kostenlos Ai Hentai.

Heißer Artikel

Heiße Werkzeuge

ZendStudio 13.5.1 Mac
Leistungsstarke integrierte PHP-Entwicklungsumgebung

WebStorm-Mac-Version
Nützliche JavaScript-Entwicklungstools

Notepad++7.3.1
Einfach zu bedienender und kostenloser Code-Editor

mPDF
mPDF ist eine PHP-Bibliothek, die PDF-Dateien aus UTF-8-codiertem HTML generieren kann. Der ursprüngliche Autor, Ian Back, hat mPDF geschrieben, um PDF-Dateien „on the fly“ von seiner Website auszugeben und verschiedene Sprachen zu verarbeiten. Es ist langsamer und erzeugt bei der Verwendung von Unicode-Schriftarten größere Dateien als Originalskripte wie HTML2FPDF, unterstützt aber CSS-Stile usw. und verfügt über viele Verbesserungen. Unterstützt fast alle Sprachen, einschließlich RTL (Arabisch und Hebräisch) und CJK (Chinesisch, Japanisch und Koreanisch). Unterstützt verschachtelte Elemente auf Blockebene (wie P, DIV),

MinGW – Minimalistisches GNU für Windows
Dieses Projekt wird derzeit auf osdn.net/projects/mingw migriert. Sie können uns dort weiterhin folgen. MinGW: Eine native Windows-Portierung der GNU Compiler Collection (GCC), frei verteilbare Importbibliotheken und Header-Dateien zum Erstellen nativer Windows-Anwendungen, einschließlich Erweiterungen der MSVC-Laufzeit zur Unterstützung der C99-Funktionalität. Die gesamte MinGW-Software kann auf 64-Bit-Windows-Plattformen ausgeführt werden.