Docker —— 隔離的基本操作(2)

Docker —— 隔離的基本操作(2)

  • unshare
  • `unshare` 命令詳解
    • 基本語法
    • 常用選項
    • 常用示例
    • 實際應用場景
    • 注意事項
    • 與 Docker 的關系
      • 1. 執行命令
      • 2. 修改主機名
      • 3. 退出命名空間
      • 4. 驗證宿主機主機名
      • 關鍵原理
      • 類比 Docker 容器
      • 總結
  • 實戰操作一(PID 隔離)
      • 關于 `unshare --pid --fork --mount-proc` 的深入解釋
        • 1. `--fork` 的作用
        • 2. `--pid` 的隔離特性
        • 3. `--mount-proc` 的必要性
      • 完整命令的意義
      • 常見問題
        • Q1:不加 `--fork` 會怎樣?
        • Q2:不加 `--mount-proc` 會怎樣?
        • Q3:為什么需要 `sudo`?
      • 總結
  • 實戰操作二(Mount 隔離)

我們上次簡單介紹了一些關于隔離的一些基本操作,如果不熟悉的小伙伴可以點擊這里:

https://blog.csdn.net/qq_67693066/article/details/147712428

我們今天主要來操作一下隔離,如何實現:

unshare

unshare 命令詳解

unshare 是 Linux 系統中用于創建新命名空間(namespace)并運行程序的命令,它是 Linux 容器技術(如 Docker)的基礎工具之一。通過 unshare 可以創建隔離的運行環境。

基本語法

unshare [選項] [--] [程序 [參數...]]

常用選項

短參數長參數含義
-i--ipc不共享 IPC 空間(隔離進程間通信:消息隊列、共享內存等)
-m--mount不共享 Mount 空間(隔離文件系統掛載點)
-n--net不共享 Net 空間(隔離網絡棧:IP、端口、路由等)
-p--pid不共享 PID 空間(隔離進程 ID,需配合 --fork--mount-proc 使用)
-u--uts不共享 UTS 空間(隔離主機名和域名)
-U--user不共享用戶命名空間(隔離用戶和組 ID,普通用戶可用)
-V--version查看版本信息
--fork創建子進程并在子進程中執行 unshare(通常與 --pid 共用,使子進程成為 PID 1)
--mount-proc在新 PID 命名空間中掛載 /proc 文件系統(確保 pstop 等命令正常工作)

常用示例

  1. 創建新的 mount 命名空間

    unshare --mount
    

    在這個新命名空間中的掛載操作不會影響主系統

  2. 創建 PID 命名空間(類似容器環境)

    sudo unshare --pid --fork --mount-proc bash
    

    在這個新環境中,bash 將成為 PID 1 的進程

  3. 創建網絡命名空間

    sudo unshare --net
    

    這個新環境將有獨立的網絡棧

  4. 創建完整的隔離環境

    sudo unshare --pid --fork --mount-proc --net --mount --uts bash
    
  5. 創建用戶命名空間(不需要 root 權限)

    unshare --user --map-root-user
    
  6. 在新命名空間中運行特定程序

    unshare --pid --fork --mount-proc -- sleep 1000
    

實際應用場景

  1. 測試軟件安裝

    unshare --mount bash
    mkdir /tmp/testroot
    mount --bind /tmp/testroot /tmp/testroot
    mount --make-private /tmp/testroot
    mount --bind /path/to/package /tmp/testroot
    chroot /tmp/testroot /bin/bash
    
  2. 創建臨時網絡環境

    sudo unshare --net
    ip link set lo up
    ip addr add 192.168.1.100/24 dev lo
    
  3. 安全測試

    unshare --user --map-root-user --pid --fork --mount-proc bash
    

注意事項

  1. 大多數命名空間需要 root 權限,除了用戶命名空間
  2. 使用 --pid 時通常需要同時使用 --fork--mount-proc
  3. 命名空間中的修改不會影響主系統
  4. 可以使用 nsenter 命令進入已存在的命名空間

與 Docker 的關系

Docker 等容器技術底層就是使用 unshare 類似的機制創建隔離環境。例如:

# 類似于 Docker 容器的基礎隔離
sudo unshare --pid --fork --mount-proc --net --mount --uts --ipc bash

unshare 是理解 Linux 容器技術的重要工具,通過它可以深入了解 Linux 的命名空間隔離機制。

我們來簡單使用一下:
在這里插入圖片描述
這段命令演示了使用 unshare 創建 UTS 命名空間(主機名隔離)的過程。以下是逐步解釋:


1. 執行命令

sudo unshare -u /bin/bash
  • -u--uts):創建新的 UTS 命名空間,隔離主機名和域名。
  • /bin/bash:在新命名空間中啟動 Bash shell。
  • 需要 sudo 因為 UTS 命名空間默認需要 root 權限。

2. 修改主機名

hostname test1
hostname
  • 在新 UTS 命名空間中,將主機名修改為 test1
  • hostname 命令驗證修改成功,此時 僅影響新命名空間

3. 退出命名空間

exit
  • 退出 Bash shell 后,回到原來的 UTS 命名空間(宿主機環境)。

4. 驗證宿主機主機名

hostname
  • 顯示 localhost.localdomain,證明宿主機的主機名 未被修改
  • 因為之前的 hostname test1 只在新創建的 UTS 命名空間中生效。

關鍵原理

  1. UTS 命名空間隔離

    • 每個 UTS 命名空間維護獨立的主機名和域名。
    • 子命名空間的修改不會影響父命名空間(宿主機)。
  2. 作用域

    • unshare -u 創建的子進程及其后代進程會繼承新的 UTS 命名空間。
    • 退出子進程后,命名空間自動銷毀(除非使用 --persistent 等選項)。

類比 Docker 容器

Docker 容器啟動時也會創建獨立的 UTS 命名空間:

# 在容器內修改主機名不影響宿主機
docker run -it --hostname mycontainer alpine sh

總結

  • 發生了什么
    通過 unshare -u 創建了一個臨時的隔離環境,在其中修改的主機名僅在該環境內有效,退出后宿主機環境保持不變。
  • 為什么需要
    這種隔離機制是容器技術的基礎,允許不同環境擁有獨立的主機名配置,避免沖突。

實戰操作一(PID 隔離)

在主機上執行 ps -ef,可以看到進程列表如下,其中啟動進程 PID 1 為 init 進程:

在這里插入圖片描述
我們打開另外一個 shell ,執行下面命令創建一個 bash 進程,并且新建一個 PID
Namespace:

unshare --fork --pid --mount-proc /bin/bash

在這里插入圖片描述
執行 exit 退出進程
在這里插入圖片描述

關于 unshare --pid --fork --mount-proc 的深入解釋

1. --fork 的作用
  • 核心問題
    當使用 --pid 創建新的 PID 命名空間時,新命名空間需要有一個獨立的進程樹,且第一個進程(PID 1)必須是該命名空間內的進程。

    • 如果不加 --forkunshare 自身進程(父進程)會作為新命名空間的初始進程,但該父進程 并不屬于新命名空間,導致內核無法正確初始化 PID 命名空間,報錯 Cannot allocate memory
  • 解決方案
    --fork 會讓 unshare 先創建一個子進程(fork),再在該子進程中調用 unshare 創建新命名空間。此時子進程成為新命名空間的 PID 1(類似 init 進程),符合內核要求。

2. --pid 的隔離特性
  • 僅隔離 PID
    --pid 僅隔離進程 ID 視圖,其他資源(如網絡、掛載點等)仍與宿主機共享

    • 新命名空間內的進程無法看到宿主機其他進程,但宿主機仍能看到新命名空間內的進程(只是 PID 不同)。
  • 對比完整容器
    若需完全隔離,需組合其他命名空間(如 --net --mount --uts)。

3. --mount-proc 的必要性
  • /proc 文件系統的特殊性
    Linux 的 /proc 是一個虛擬文件系統,動態反映當前命名空間的進程信息。

    • 默認情況下,/proc 顯示 宿主機全局進程信息,與新 PID 命名空間隔離的視圖沖突。
  • 掛載新 /proc 的作用
    --mount-proc 會自動在新命名空間中重新掛載 /proc,使其僅包含 當前命名空間及其子命名空間的進程信息

    • 這樣,pstop 等命令才能正確顯示當前命名空間內的進程。
  • --mount 的關系
    --mount-proc 隱含了掛載點隔離(類似 --mount),但專門針對 /proc 優化,避免手動掛載的復雜性。


完整命令的意義

sudo unshare --pid --fork --mount-proc bash
  • 流程
    1. --fork 創建子進程作為 PID 1。
    2. --pid 在新子進程中初始化獨立的 PID 命名空間。
    3. --mount-proc 掛載隔離后的 /proc,確保進程工具正常工作。
    4. 啟動 bash,成為新命名空間的主進程。

常見問題

Q1:不加 --fork 會怎樣?
  • 內核拒絕初始化 PID 命名空間,報錯 Cannot allocate memory,因為缺少合法的 PID 1 進程。
Q2:不加 --mount-proc 會怎樣?
  • ps/top 仍顯示宿主機所有進程,破壞 PID 隔離的語義。
Q3:為什么需要 sudo
  • 創建 PID 命名空間默認需要 root 權限(涉及系統級進程管理)。

總結

參數作用必要性
--pid創建獨立的 PID 命名空間核心功能
--fork確保新命名空間有合法的 PID 1 進程必須配合 --pid 使用
--mount-proc掛載隔離后的 /proc,使進程工具正常工作強烈推薦(否則隔離不完整)

這種機制是 Linux 容器(如 Docker)的基礎:通過組合多個命名空間(--pid --net --mount 等)和 --mount-proc,實現進程、網絡、文件系統等資源的隔離。

實戰操作二(Mount 隔離)

打開第一個 shell 窗口 A,執行命令, df -h ,查看主機默認命名空間的磁盤掛載情
況:
在這里插入圖片描述
打開一個新的 shell 窗口 B,執行 Mount 隔離命令

unshare --mount --fork /bin/bash

在窗口 B 中添加新的磁盤掛載

dd if=/dev/zero of=fdimage.img bs=8k count=10240
mkfs -t ext4 ./fdimage.img
mount ./fdimage.img 文件路徑

在這里插入圖片描述

在這里插入圖片描述
在窗口 B 掛載的磁盤中添加文件

echo "Hello world!" > ./tmpmount/hello.txt

在這里插入圖片描述
查看窗口 A 中的磁盤掛載信息
在這里插入圖片描述
查看窗口 B 中的文件信息
在這里插入圖片描述
查看窗口 A 中的文件信息,可以看到窗口 B 中新建的文件和磁盤掛載在主機的窗
口中并沒有,說明我們實現了文件系統隔離。
在這里插入圖片描述
窗口 B 執行 exit,退出
在這里插入圖片描述

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

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

相關文章

Java List分頁工具

PageUtil.java import com.google.common.collect.Lists; import com.jd.platform.hotkey.dashboard.common.domain.Page; import org.springframework.util.CollectionUtils;import java.util.ArrayList; import java.util.List;public class PageUtil {/*** 通用分頁工具類*…

中陽策略:如何從K線行為中提取交易邏輯信號?

中陽策略:如何從K線行為中提取交易邏輯信號? 在量化趨勢研究中,中陽形態常被視作市場動能變化的重要標志。它不僅代表價格的強勢上行,更隱含著主力資金換手與情緒轉換的信號。將“中陽”這一結構元素抽象為模型中的“強動能突破”…

Java SE(8)——繼承

1.繼承的概念&作用 在Java中,繼承是面向對象編程的三大基本特性之一(還有封裝和多態),允許一個類(子類/繼承類)繼承另一個類(父類/基類)的屬性和方法 繼承的核心目的是&#xf…

Python爬蟲(18)反爬攻防戰:動態IP池構建與代理IP實戰指南(突破95%反爬封禁率)

目錄 引言一、背景:為什么代理IP是爬蟲的“第二生命”?1.1 反爬系統的IP檢測三把刀1.2 代理IP的核心價值 二、基礎實戰:快速搭建代理IP系統2.1 免費代理IP的獲取與篩選2.2 代理IP的智能容錯機制 三、高階攻防:突破企業級反爬封鎖3…

LFU算法解析

文章目錄 LFU緩存中關鍵變量的訪問與更新機制1. min_freq - 最小頻率訪問時機更新時機更新示例 2. capacity - 緩存容量訪問時機更新時機訪問示例 3. key_to_node - 鍵到節點的映射訪問時機更新時機更新示例 4. freq_to_dummy - 頻率到鏈表啞節點的映射訪問時機更新時機更新示例…

ByteArrayInputStream 類詳解

ByteArrayInputStream 類詳解 ByteArrayInputStream 是 Java 中用于從字節數組讀取數據的輸入流,位于 java.io 包。它允許將內存中的字節數組當作輸入流來讀取,是處理內存數據的常用工具。 1. 核心特性 內存數據源:從字節數組(b…

rvalue引用()

一、先確定基礎:左值(Lvalue)和右值(Rvalue) 理解Rvalue引用,首先得搞清楚左值和右值的概念。 左值(Lvalue):有明確內存地址的表達式,可以取地址。比如變量名、引用等。 復制代碼 int a = 10; // a是左值 int& ref = a; // ref也是左值右值(Rval…

吳恩達深度學習作業 RNN模型——字母級語言模型

一. 簡單復習一下RNN RNN RNN適用于處理序列數據,令是序列的第i個元素,那么就是一個長度為的序列,NLP中最常見的元素是單詞,對應的序列是句子。 RNN使用同一個神經網絡處理序列中的每一個元素。同時,為了表示序列的…

基于python的哈希查表搜索特定文件

Python有hashlib庫,支持多種哈希算法,比如MD5、SHA1、SHA256等。通常SHA256比較安全,但MD5更快,但可能存在碰撞風險,得根據自己需求決定。下面以SHA256做例。 import hashlib import os from typing import Dict, Lis…

idea創建springboot項目無法創建jdk8原因及多種解決方案

idea創建springboot項目無法創建jdk8原因及多種解決方案 提示:幫幫志會陸續更新非常多的IT技術知識,希望分享的內容對您有用。本章分享的是springboot的使用。前后每一小節的內容是存在的有:學習and理解的關聯性。【幫幫志系列文章】&#x…

【C++進階十】多態深度剖析

【C進階十】多態深度剖析 1.多態的概念及條件2.虛函數的重寫3.重寫、重定義、重載區別4.C11新增的override 和final5.抽象類6.虛表指針和虛表6.1什么是虛表指針6.2指向誰調用誰,傳父類調用父類,傳子類調用子類 7.多態的原理8.單繼承的虛表狀態9.多繼承的…

面向網絡安全的開源 大模型-Foundation-Sec-8B

1. Foundation-Sec-8B 整體介紹 Foundation-Sec-8B 是一個專注于網絡安全領域的大型語言模型 (LLM),由思科的基礎人工智能團隊 (Foundation AI) 開發 。它基于 Llama 3.1-8B 架構構建,并通過在一個精心策劃和整理的網絡安全專業語料庫上進行持續預訓練而得到增強 。該模型旨在…

Python爬蟲的基礎用法

Python爬蟲的基礎用法 python爬蟲一般通過第三方庫進行完成 導入第三方庫(如import requests ) requests用于處理http協議請求的第三方庫,用python解釋器中查看是否有這個庫,沒有點擊安裝獲取網站url(url一定要解析正確&#xf…

WHAT - Tailwind CSS + Antd = MetisUI組件庫

文章目錄 Tailwind 和 Antd 組件庫MetisUI 組件庫 Tailwind 和 Antd 組件庫 在 WHAT - Tailwind 樣式方案(不寫任何自定義樣式) 中我們介紹了 Tailwind,至于 Antd 組件庫,我們應該都耳熟能詳,官網地址:htt…

Day 4:牛客周賽Round 91

好久沒寫了,問題還蠻多的。聽說這次是苯環哥哥出題 F題 小苯的因子查詢 思路 考慮求因子個數,用質因數分解;奇數因子只需要去掉質數為2的情況,用除法。 這里有個比較妙的細節是,提前處理出數字x的最小質因數&#xff0…

使用直覺理解不等式

問題是這個: 題目 探究 ∣ max ? b { q 1 ( z , b ) } ? max ? b { q 2 ( z , b ) } ∣ ≤ max ? b ∣ q 1 ( z , b ) ? q 2 ( z , b ) ∣ |\max_b\{q_1(z,b)\}-\max_b\{q_2(z,b)\}|\le\max_b|q_1(z,b)-q_2(z,b)| ∣maxb?{q1?(z,b)}?maxb?{q2?(z,b)}∣≤…

惡心的win11更新DIY 設置win11更新為100年

?打開注冊表編輯器?:按下Win R鍵,輸入regedit,然后按回車打開注冊表編輯器。?12?導航到指定路徑?:在注冊表編輯器中,依次展開HKEY_LOCAL_MACHINE\SOFTWARE\Microsoft\WindowsUpdate\UX\Settings?新建DWORD值?&…

嵌入式驅動學習

時鐘 定義 周期型的0、1信號 時鐘信號由“心臟”時鐘源產生,通過“動脈”時鐘樹傳播到整個芯片中。 SYSCLK系統時鐘,由HSI、HSE、PLLCLK三選一。 HCLK是AHB總線時鐘, PCLK是APB總線時鐘。 使用某個外設,必須要先使能該外設時鐘系統…

Java:從入門到精通,你的編程之旅

Java,一門歷久彌新的編程語言,自誕生以來就以其跨平臺性、面向對象、穩定性和安全性等特性,在企業級應用開發領域占據著舉足輕重的地位。無論你是初學者還是經驗豐富的開發者,Java 都能為你提供強大的工具和廣闊的舞臺。 為什么選…

Linux:深入理解數據鏈路層

實際上一臺主機中,報文并沒有通過網絡層直接發送出去,而是交給了自己的下一層協議——數據鏈路層!! 一、理解數據鏈路層 網絡層交付給鏈路層之前,會先做決策再行動(會先查一下路由表,看看目標網…