Linux namespace概述

操作系統通過虛擬內存技術,使得每個用戶進程都認為自己擁有所有的物理內存,這是操作系統對內存的虛擬化。操作系統通過分時調度系統,每個進程都能被【公平地】調度執行,即每個進程都能獲取到CPU,使得每個進程都認為自己在進程活動期間擁有所有的CPU時間,這是操作系統對CPU的虛擬化。

從這兩種虛擬化方式可推知,當使用某種虛擬化技術去管理進程時,進程會認為自己擁有某種物理資源的全部。

虛擬內存和分時系統均是對「物理資源」進行虛擬化,其實操作系統中還有很多「非物理資源」,比如用戶權限系統資源、網絡協議棧資源、文件系統掛載路徑資源等。通過Linux的namespace功能,可以對這些非物理全局資源進行虛擬化。

Linux namespace是在當前運行的系統環境中創建(隔離)另一個進程的運行環境出來,并在此運行環境中將一些必要的系統全局資源進行【虛擬化】。進程可以運行在指定的namespace中,因此,namespace中的每個進程都認為自己擁有所有這些虛擬化的全局資源。

目前,Linux已經支持8種全局資源的虛擬化(每種資源都是隨著Linux內核版本的迭代而逐漸加入的,因此有些內核版本可能不具備某種namespace):

  • cgroup namespace:該namespace可單獨管理自己的cgroup

  • ipc namespace:該namespace有自己的IPC,比如共享內存、信號量等

  • network namespace:該namespace有自己的網絡資源,包括網絡協議棧、網絡設備、路由表、防火墻、端口等

  • mount namespace:該namespace有自己的掛載信息,即擁有獨立的目錄層次

  • pid namespace:該namespace有自己的進程號,使得namespace中的進程PID單獨編號,比如可以PID=1

  • time namespace:該namespace有自己的啟動時間點信息和單調時間,比如可設置某個namespace的開機時間點為1年前啟動,再比如不同的namespace創建后可能流逝的時間不一樣

  • user namespace:該namespace有自己的用戶權限管理機制(比如獨立的UID/GID),使得namespace更安全

  • uts namespace:該namepsace有自己的主機信息,包括主機名(hostname)、NIS domain name

用戶可以同時創建具有多種資源類型的namespace,比如創建一個同時具有uts、pid和user的namespace。

理解Linux namespace

用戶可以創建指定類型的namespace并將程序放入該namespace中運行,這表示從當前的系統運行環境中隔離一個進程的運行環境,在此namespace中運行的進程將認為自己享有該namespace中的獨立資源。

實際上,即使用戶沒有手動創建Linux namespace,Linux系統開機后也會創建一個默認的namespace,稱為「root namespace」,所有進程默認都運行在root namespace中,每個進程都認為自己擁有該namespace中的所有系統全局資源。

回顧一下Linux的開機啟動流程,內核加載成功后將初始化系統運行環境,這個運行環境就是root namespace環境,系統運行環境初始化完成后,便可以認為操作系統已經開始工作了。

「每一個namespace都基于當前內核」,無論是默認的root namespace還是用戶創建的每一個namespace,都基于當前內核工作。所以可以認為namespace是內核加載后啟動的一個特殊系統環境,用戶進程可以在此環境中獨立享用資源。更嚴格地說,「root namespace直接基于內核,而用戶創建的namespace運行環境基于當前所在的namespace」。之所以用戶創建的namespace不直接基于內核環境,是因為每一個namespace可能都會修改某些運行時內核參數。

比如,用戶創建的uts namespace1中修改了主機名為ns1,然后在namespace1中創建uts namespace2時,namespace2默認「將共享namespace1的其他資源并拷貝namespace1的主機名資源」,因此namespace2的主機名初始時也是ns1。當然,namespace2是隔離的,可以修改其主機名為ns2,這不會影響其他namespace,修改后,將只有namespace2中的進程能看到其主機名為ns2。

可以通過如下方式查看某個進程運行在哪一個namespace中,即該進程享有的獨立資源來自于哪一個namespace。

#?ls?-l?/proc/<PID>/ns
$?ls?-l?/proc/$$/ns?|?awk?'{print?$1,$(NF-2),$(NF-1),$NF}'
lrwxrwxrwx??cgroup????????????->??cgroup:[4026531835]
lrwxrwxrwx??ipc???????????????->??ipc:[4026531839]
lrwxrwxrwx??mnt???????????????->??mnt:[4026531840]
lrwxrwxrwx??net???????????????->??net:[4026531992]
lrwxrwxrwx??pid???????????????->??pid:[4026531836]
lrwxrwxrwx??pid_for_children??->??pid:[4026531836]
lrwxrwxrwx??user??????????????->??user:[4026531837]
lrwxrwxrwx??uts???????????????->??uts:[4026531838]$?sudo?ls?-l?/proc/1/ns?|?awk?'{print?$1,$(NF-2),$(NF-1),$NF}'
lrwxrwxrwx??cgroup????????????->??cgroup:[4026531835]
lrwxrwxrwx??ipc???????????????->??ipc:[4026531839]
lrwxrwxrwx??mnt???????????????->??mnt:[4026531840]
lrwxrwxrwx??net???????????????->??net:[4026531992]
lrwxrwxrwx??pid???????????????->??pid:[4026531836]
lrwxrwxrwx??pid_for_children??->??pid:[4026531836]
lrwxrwxrwx??user??????????????->??user:[4026531837]
lrwxrwxrwx??uts???????????????->??uts:[4026531838]

這些文件表示當前進程打開的namespace資源,每一個文件都是一個軟鏈接,所指向的文件是一串格式特殊的名稱。冒號后面中括號內的數值表示該namespace的inode。如果不同進程的namespace inode相同,說明這些進程屬于同一個namespace。

從結果上來看,每個進程都運行在多個namespace中,且pid=1和pid=$$(當前Shell進程)兩個進程的namespace完全一樣,說明它們運行在相同的環境下(root namespace)

本文來自互聯網用戶投稿,該文觀點僅代表作者本人,不代表本站立場。本站僅提供信息存儲空間服務,不擁有所有權,不承擔相關法律責任。
如若轉載,請注明出處:http://www.pswp.cn/news/535448.shtml
繁體地址,請注明出處:http://hk.pswp.cn/news/535448.shtml
英文地址,請注明出處:http://en.pswp.cn/news/535448.shtml

如若內容造成侵權/違法違規/事實不符,請聯系多彩編程網進行投訴反饋email:809451989@qq.com,一經查實,立即刪除!

相關文章

Zookeeper:Zookeeper的主從選舉機制

ZAB 協議&#xff0c;全稱 Zookeeper Atomic Broadcast&#xff08;Zookeeper 原子廣播協議&#xff09;&#xff0c;是為分布式協調服務 ZooKeeper 專門設計的一種支持崩潰恢復的一致性協議。基于該協議&#xff0c;ZooKeeper 實現了一種主從模式的系統架構來保持集群中各個副…

Linux namespace之:uts namespace

理解uts namespace uts(UNIX Time-Sharing System) namespace可隔離hostname和NIS Domain name資源&#xff0c;使得一個宿主機可擁有多個主機名或Domain Name。換句話說&#xff0c;可讓不同namespace中的進程看到不同的主機名。 例如&#xff0c;使用unshare命令(較新版本L…

Zookeeper:事件監聽和通知機制

Zookeeper 允許客戶端向服務端的某個 Znode 注冊一個 Watcher 監聽&#xff0c;當服務端的一些指定事件觸發了這個 Watcher&#xff0c;服務端會向指定客戶端發送一個事件通知來實現分布式的通知功能&#xff0c;然后客戶端根據 Watcher 通知狀態和事件類型做出業務上的改變。 …

Linux namespace之:mount namespace

理解mount namespace 用戶通常使用mount命令來掛載普通文件系統&#xff0c;但實際上mount能掛載的東西非常多&#xff0c;甚至連現在功能完善的Linux系統&#xff0c;其內核的正常運行也都依賴于掛載功能&#xff0c;比如掛載根文件系統/。其實所有的掛載功能和掛載信息都由內…

Linux namespace之:network namespace

理解network namespace network namespace用來隔離網絡環境&#xff0c;「在network namespace中&#xff0c;網絡設備、端口、套接字、網絡協議棧、路由表、防火墻規則等都是獨立的」。 因network namespace中具有獨立的網絡協議棧&#xff0c;因此每個network namespace中都…

Kubernetes 的原理

kubernetes 已經成為容器編排領域的王者&#xff0c;它是基于容器的集群編排引擎&#xff0c;具備擴展集群、滾動升級回滾、彈性伸縮、自動治愈、服務發現等多種特性能力。 本文將帶著大家快速了解 kubernetes &#xff0c;了解我們談論 kubernetes 都是在談論什么。 kuberne…

Zookeeper:實現“分布式鎖”的 Demo

Zookeeper 能保證數據的強一致性&#xff0c;用戶任何時候都可以相信集群中每個節點的數據都是相同的。一個用戶創建一個節點作為鎖&#xff0c;另一個用戶檢測該節點&#xff0c;如果存在&#xff0c;代表別的用戶已經鎖住&#xff0c;如果不存在&#xff0c;則可以創建一個節…

JavaIO流:案例

java.io 包下需要掌握的流有 16 個&#xff0c;本篇內容包括&#xff1a;java.io包下需要掌握的流、Java IO 案例。 文章目錄一、java.io包下需要掌握的流二、Java IO 案例1、Demo 1&#xff08;FileInputStream&#xff09;2、Demo 2&#xff08;FileInputStream&#xff09;3…

比對excel數據

#!/usr/bin/env pythonimport openpyxl from openpyxl.styles import PatternFill from openpyxl.styles import colors from openpyxl.styles import Font, Color aD:/測算單位設置/比對/吉林/tmp001.xlsx bD:/測算單位設置/比對/吉林/國網吉林電力.xlsx cD:/測算單位設置/比對…

CPU 是如何執行任務的

前言 你清楚下面這幾個問題嗎&#xff1f; 有了內存&#xff0c;為什么還需要 CPU Cache&#xff1f; CPU 是怎么讀寫數據的&#xff1f; 如何讓 CPU 能讀取數據更快一些&#xff1f; CPU 偽共享是如何發生的&#xff1f;又該如何避免&#xff1f; CPU 是如何調度任務的&a…

Ansible 的自動化運維

1、Ansible 特點 Ansible 自 2012 年發布以來&#xff0c;很快在全球流行&#xff0c;其特點如下&#xff1a; Ansible 基于 Python 開發&#xff0c;運維工程師對其二次開發相對比較容易&#xff1b; Ansible 豐富的內置模塊&#xff0c;幾乎可以滿足一切要求&#xff1b; …

Shell 信號發送與捕捉

1、Linux信號類型 信號&#xff08;Signal&#xff09;&#xff1a;信號是在軟件層次上對中斷機制的一種模擬&#xff0c;通過給一個進程發送信號&#xff0c;執行相應的處理函數。 進程可以通過三種方式來響應一個信號&#xff1a; 1&#xff09;忽略信號&#xff0c;即對信…

運維面試題總結

集群相關 簡述 ETCD 及其特點&#xff1f; etcd 是 CoreOS 團隊發起的開源項目&#xff0c;是一個管理配置信息和服務發現&#xff08;service discovery&#xff09;的項目&#xff0c;它的目標是構建一個高可用的分布式鍵值&#xff08;key-value&#xff09;數據庫&#x…

詳解設計模式:建造者模式

建造者模式&#xff08;Builder Pattern&#xff09;也叫做生成器模式&#xff0c;是 GoF 的 23 種設計模式的一種&#xff0c;它將一個復雜對象的構建與它的表示分離&#xff0c;使得同樣的構建過程可以創建不同的表示。 當我們需要實列化一個復雜的類&#xff0c;以得到不同結…

圖文并茂 VLAN 詳解,讓你看一遍就理解 VLAN

一、為什么需要VLAN 1.1、什么是VLAN? VLAN(Virtual LAN)&#xff0c;翻譯成中文是“虛擬局域網”。LAN可以是由少數幾臺家用計算機構成的網絡&#xff0c;也可以是數以百計的計算機構成的企業網絡。VLAN所指的LAN特指使用路由器分割的網絡——也就是廣播域。 在此讓我們先復習…

認識VLAN,并學會VLAN的劃分和網絡配置實例

VLAN的劃分和網絡的配置實例 1、VLAN基礎知識 VLAN&#xff08;Virtual Local Area Network&#xff09;的中文名為&#xff1a;“虛擬局域網”&#xff0c;注意和VPN&#xff08;虛擬專用網&#xff09;進行區分。 VLAN是一種將局域網設備從邏輯上劃分&#xff08;不是從物…

VLAN劃分及配置注意事項

VLAN&#xff08;Virtual Local Area Network&#xff09;即虛擬局域網&#xff0c;是將一個物理的LAN在邏輯上劃分成多個廣播域的通信技術。VLAN內的主機間可以直接通信&#xff0c;而VLAN間不能直接通信&#xff0c;從而將廣播報文限制在一個VLAN內。VLAN之間的通信是通過第3…

Docker原理剖析

一、簡介 1、了解Docker的前生LXC LXC為Linux Container的簡寫。可以提供輕量級的虛擬化&#xff0c;以便隔離進程和資源&#xff0c;而且不需要提供指令解釋機制以及全虛擬化的其他復雜性。相當于C中的NameSpace。容器有效地將由單個操作系統管理的資源劃分到孤立的組中&#…

獲取Linux內存、cpu、磁盤IO等信息

#!/bin/bash # 獲取要監控的本地服務器IP地址 IPifconfig | grep inet | grep -vE inet6|127.0.0.1 | awk {print $2} echo "IP地址&#xff1a;"$IP# 獲取cpu總核數 cpu_numgrep -c "model name" /proc/cpuinfo echo "cpu總核數&#xff1a;"$c…

Docker容器網絡解析

Docker 容器網絡的發展歷史 在 Dokcer 發布之初&#xff0c;Docker 是將網絡、管理、安全等集成在一起的&#xff0c;其中網絡模塊可以為容器提供橋接網絡、主機網絡等簡單的網絡功能。 從 1.7 版本開始&#xff0c;Docker正是把網絡和存儲這兩部分的功能都以插件化形式剝離出來…