Skip to content

antony@notes:~/container$ cat "Namespace.md"

Namespace

2021-10-24· container ·Container

Namespace

  • 隔離技術isolation
  • Windows沒有提供Namespace
  • 隔離的對象是Process(PID)
  • 目前8大項(上面的) ,且陸續增加中

ls -l /proc/self/ns/ 看proc中的namespace

sudo unshare --uts sh 是來隔離sh這個process的,其中的–uts 就是(UNIX Time-Sharing),而(UNIX Time-Sharing)跟時間沒關係,是用來隔離電腦名字。 讓sh這個程式,自己擁有一個uts的隔離空間,可以自己設定電腦的主機名稱,而且絕對不會影響到alp虛擬主機的電腦名稱。

root@alp:/home/bigred$ hostname ssn763 root@ssn763:/home/bigred$ hostname ssn763 與 ALP 虛擬主機的 uts Namespace ID 不一樣, 代表 sh 這個 Process 有啟動 uts namespace

ps aux

  • 是到/proc 目錄抓process的資料
  • /proc 全名: process,裡面記錄這台電腦裡面所有在執行的process資訊 ↑由Linux Kernel產生的(維護維運)

ls -l /proc/self/ns/

  • ns 全名就是Namespace

root@sn7763:/home/bigred/ov2$ ls -l /proc/self/ns/ total 0 lrwxrwxrwx 1 root root 0 Sep 30 10:28 cgroup -> ‘cgroup:[4026531835]’ lrwxrwxrwx 1 root root 0 Sep 30 10:28 ipc -> ‘ipc:[4026531839]’ lrwxrwxrwx 1 root root 0 Sep 30 10:28 mnt -> ‘mnt:[4026531840]’ lrwxrwxrwx 1 root root 0 Sep 30 10:28 net -> ’net:[4026532000]' lrwxrwxrwx 1 root root 0 Sep 30 10:28 pid -> ‘pid:[4026531836]’ lrwxrwxrwx 1 root root 0 Sep 30 10:28 pid_for_children -> ‘pid:[4026531836]’ lrwxrwxrwx 1 root root 0 Sep 30 10:28 time -> ’time:[4026531834]' lrwxrwxrwx 1 root root 0 Sep 30 10:28 time_for_children -> ’time:[4026531834]' lrwxrwxrwx 1 root root 0 Sep 30 10:28 user -> ‘user:[4026531837]’ lrwxrwxrwx 1 root root 0 Sep 30 10:28 uts -> ‘uts:[4026532551]’

  • /proc怎麼來: linux啟動後,在memory中isolate PID的區域,存放所有執行中process的資訊,並mount(掛載)至/proc中

  • cgroup、ipc、mnt、net、pid、pid_for_children、time、time_for_children,以上這些隔離空間都在記憶體

  • pid隔離空間 裡面存放的是linux系統所run的process資訊 為了要讓人讀取到,所以就把這個記憶體掛載(mmount)到/proc 目錄

  • net隔離空間 是一個記憶體區塊 裡面存放這台電腦的網路系統資訊 root@sn7763:/home/bigred/ov2$ ifconfig eth0 (網卡)
    Link encap:Ethernet
    HWaddr(網卡的硬體位置) 00:0C:29:75:3B:F5 inet addr(ip位置):192.168.188.181
    Bcast(廣播位置):192.168.188.255
    Mask:255.255.255.0 UP BROADCAST RUNNING MULTICAST
    MTU(傳遞封包的大小):1500 Metric:1 RX packets:26838 errors:0 dropped:0 overruns:0 frame:0 TX packets:9675 errors:0 dropped:0 overruns:0 carrier:0 collisions:0 txqueuelen:1000 RX bytes:1751104 (1.6 MiB) TX bytes:962677 (940.1 KiB)

sudo unshare --pid --fork sh 主角一樣是sh,讓他產生一個自己的pid隔離空間 –fork | 問題: sh的pid隔離空間裡面存放甚麼? 答: 放sh這個process以及

  • Default 是network namespace的名字
  • linux一開機就會自動產生Default的隔離空間 net 的隔離空間,名稱叫 default

創建網卡: sudo ip link add ve1 netns 1 type veth peer name ve2 netns 4582

  • 「ve1」、「ve2」:是我們要新增的網卡的名字

  • 「netns」:network namespace

  • 接的是"PID"!!!接的是"PID"!!!接的是"PID"!!!(針對process,很重要所以要說三次)

  • 再來可以在回到原先 命令提示字元 視窗, 執行以下命令 sudo lsns -t net

  • 數字1是 4026532000 net 122 1 root unassigned /sbin/init 是原本虛擬主機的net的PID

  • 數字69839是 4026532558 net 2 69839 root unassigned unshare –pid –fork –mount-proc –net –uts sh 是sh這個process的net的PID

  • 「type」:規格

  • 「veth」:Virtual ethernet乙太網路

  • 「peer」:對接

sudo unshare --pid --fork --mount-proc --net --uts sh –mount-proc 是專門針對pid這個隔離空間的,不適用在其他隔離空間。

ip使用規則:

  • 去頭(192.168.166.0): 網路代號
  • 去尾(192.168.166.255): 廣播
  • 前10(192.168.166.0~192.168.166.10): server網站伺服器
  • 後5(192.168.166.250~192.168.166.254): 網路設備 router
  • 剩下切一半
  • 後半由dhcp自動配發(192.168.166.128~192.168.166.249)
  • 前半由我們手動配發(192.168.166.11~192.168.166.127)
bigred@alp:~/c3po$ ls -al /dev/zero
crw-rw-rw- 1 root root 1, 5 Sep 29 19:21 /dev/zero

c 是character

sudo mount --bind -o ro /dev rootfs/dev –bind: 允許/dev這個目錄,蓋過rootfs/dev目錄 -o: 下參數 ro: read only

</dev/zero head -c 200m | tail

tags: Container