Linux namespace之:uts namespace

理解uts namespace

uts(UNIX Time-Sharing System) namespace可隔離hostname和NIS Domain name資源,使得一個宿主機可擁有多個主機名或Domain Name。換句話說,可讓不同namespace中的進程看到不同的主機名。

例如,使用unshare命令(較新版本Linux內核還支持nscreate命令)創建一個新的uts namespace:

#?-u或--uts表示創建一個uts?namespace
#?這個namespace中運行/bin/bash程序
$?hostname
longshuai-vm??????#?當前root?namespace的主機名為longshuai-vm
$?sudo?unshare?-u?/bin/bash
root@longshuai-vm:/home/longshuai#???#?進入了新的namespace中的shell#?其主機名初始時也是longshuai-vm,#?其拷貝自上級namespace資源

上面指定運行的是/bin/bash程序,這會進入交互式模式,當執行exit時,bash退出,回到當前的namespace中。也可以指定在namespace中運行其他程序,例如unshare -u sleep 3表示在uts namespace中睡眠3秒后退出并回到當前namespace。

因為是uts namespace,所以可在此namespace中修改主機名:

#?修改該namespace的主機名為ns1
#?修改后會立即生效,但不會顯示在當前Shell提示符下
#?需重新加載Shell環境
root@longshuai-vm:/home/longshuai#?hostname?ns1
root@longshuai-vm:/home/longshuai#?hostname
ns1
root@longshuai-vm:/home/longshuai#?exec?$SHELL
root@ns1:/home/longshuai#

namespace中修改的主機名不會直接修改主機名配置文件(如/etc/hostname),而是修改內核屬性/proc/sys/kernel/hostname:

root@ns1:/home/longshuai#?cat?/proc/sys/kernel/hostname
ns1
root@ns1:/home/longshuai#?cat?/etc/hostname?
longshuai-vm

創建了新的namespace并在其中運行/bin/bash進程后,再去關注一下進程關系:

#?ns1中的bash進程PID
root@ns1:/home/longshuai#?echo?$$
14279#?bash進程(PID=14279)和grep進程運行在ns1?namespace中,
#?其父進程sudo(PID=14278)運行在ns1的上級namespace即root?namespace中
root@ns1:/home/longshuai#?pstree?-p?|?grep?$$|-sshd(10848)---bash(10850)---sudo(14278)---bash(14279)-+-grep(14506)#?運行在ns1中當前bash進程(PID=14279)的namespace
root@ns1:/home/longshuai#?ls?-l?/proc/14279/ns
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:[4026532588]'??#?注意這一行,和sudo進程的uts?inode不同#?父進程sudo(PID=14278)不在ns1中,它的namespace信息
root@ns1:/home/longshuai#?ls?-l?/proc/14278/ns
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]'???#?注意這一行,和PID=1的uts?inode相同

回到創建uts namespace時敲下的unshare命令:

sudo?unshare?-u?/bin/bash

從進程關系...---sudo(14278)---bash(14279)可知兩個進程PID是連續的,說明unshare程序對應的進程被/bin/bash程序通過execve()替換了。

詳細的過程如下:「sudo進程運行在當前namespace中,它將fork一個新進程來運行unshare程序,unshare程序加載完成后,將創建一個新的uts namespace,unshare進程自身將加入到這個uts namespace中,unshare進程內部再exec加載/bin/bash,于是unshare進程被替換為/bin/bash進程,/bin/bash進程也將運行在uts namespace中」

當namespace中的/bin/bash進程退出,該namespace中將沒有任何進程,該namespace將自動銷毀。注意,在默認情況下,namespace中必須要有至少一個進程,否則將被自動被銷毀。但也有一些手段可以讓namespace持久化,即使已經沒有任何進程在其中運行。

如果在ns1中再創建一個namespace ns2,這個ns2初始時將共享ns1的其他資源并拷貝ns1的主機名資源,其初始主機名也為ns1。

$?sudo?unshare?-u?/bin/bash????#?在root?namespace環境下創建一個namespace
root@longshuai-vm:/home/longshuai#?hostname?ns1?#?修改主機名為ns1
root@longshuai-vm:/home/longshuai#?hostname
ns1#?在ns1中創建一個namespace
############?注意沒有sudo
root@longshuai-vm:/home/longshuai#?unshare?-u?/bin/bash?
root@ns1:/home/longshuai#?hostname????#?初始主機名拷貝自上級namespace的主機名ns1
ns1
root@ns1:/home/longshuai#?hostname?ns2
root@ns1:/home/longshuai#?hostname??#?修改主機名為ns2
ns2
root@ns1:/home/longshuai#?exit
exitroot@longshuai-vm:/home/longshuai#?hostname??#?ns2修改主機名不影響ns1
ns1
root@longshuai-vm:/home/longshuai#?exit
exit[~]->$?hostname??????#?ns1修改主機名不影響root?namespace
longshuai-vm

注意,即使root namespace當前用戶為longshuai,但因為使用了sudo創建ns1,進入ns1后其用戶名為root,所以在ns1中執行unshare命令創建新的namespace不需要再使用sudo。

$?echo?$USER??????#?當前root?namespace的用戶為longshuai
longshuai$?sudo?unshare?-u?/bin/bash
root@longshuai-vm:/home/longshuai#?echo?$USER??#?ns中的用戶名變為root
root
root@longshuai-vm:/home/longshuai#?id;echo?$HOME;echo?~
uid=0(root)?gid=0(root)?groups=0(root)
/root
/root

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

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

相關文章

Zookeeper:事件監聽和通知機制

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

Linux namespace之:mount namespace

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

Linux namespace之:network namespace

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

Kubernetes 的原理

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

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

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

JavaIO流:案例

java.io 包下需要掌握的流有 16 個,本篇內容包括:java.io包下需要掌握的流、Java IO 案例。 文章目錄一、java.io包下需要掌握的流二、Java IO 案例1、Demo 1(FileInputStream)2、Demo 2(FileInputStream)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 是如何執行任務的

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

Ansible 的自動化運維

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

Shell 信號發送與捕捉

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

運維面試題總結

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

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

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

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

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

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

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

VLAN劃分及配置注意事項

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

Docker原理剖析

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

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

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

Docker容器網絡解析

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

將指定excel的一列數據提取到另一個excel的指定列

#!/usr/bin/env python import openpyxl bjD:/地市縣公司/西藏臺賬數據分析-設備臺帳分析.xlsx wb openpyxl.load_workbook (bj) get_sheets wb.sheetnames #print(get_sheets) TA01TA01 TA02TA02 TA03TA03 TE01TE01 YG201YG201 YG202YG202 YG203YG203 YG204YG204 YG205YG205…

Docker 數據管理介紹

默認容器的數據是保存在容器的可讀寫層,當容器被刪除時其上的數據也會丟失,所以為了實現數據的持久性則需要選擇一種數據持久技術來保存數據。官方提供了三種存儲方式:Volumes、Bind mounts和tmpfs。前面還介紹了:Docker 服務終端…