วิธีการแสดงรายการเนมสเปซใน Linux


24

มีวิธีใดบ้างใน Linux ที่จะแสดงรายการเนมสเปซทั้งหมดในโฮสต์ที่ทำงานอยู่? ฉันต้องการตรวจสอบ namespaces สำหรับกระบวนการเฉพาะ (เช่นกระบวนการที่ทำงานใน LXC-container และกระบวนการอื่น ๆ ทั้งหมดบนโฮสต์) จากนั้นหากลุ่ม cg ของพวกเขา


คำตอบ:


12

ยูทิลิตี้สำหรับการทำงานกับ namespaces ได้รับการปรับปรุงตั้งแต่คำถามนี้ถูกถามในปี 2013

lsnsจากแพ็กเกจutil-linuxสามารถแสดงรายการเนมสเปซทุกประเภทในรูปแบบที่มีประโยชน์หลากหลาย

# lsns --help

Usage:
 lsns [options] [<namespace>]

List system namespaces.

Options:
 -J, --json             use JSON output format
 -l, --list             use list format output
 -n, --noheadings       don't print headings
 -o, --output <list>    define which output columns to use
 -p, --task <pid>       print process namespaces
 -r, --raw              use the raw output format
 -u, --notruncate       don't truncate text in columns
 -t, --type <name>      namespace type (mnt, net, ipc, user, pid, uts, cgroup)

 -h, --help     display this help and exit
 -V, --version  output version information and exit

Available columns (for --output):
          NS  namespace identifier (inode number)
        TYPE  kind of namespace
        PATH  path to the namespace
      NPROCS  number of processes in the namespace
         PID  lowest PID in the namespace
        PPID  PPID of the PID
     COMMAND  command line of the PID
         UID  UID of the PID
        USER  username of the PID

For more details see lsns(8).

lsnsแสดงรายการ PID ที่ต่ำที่สุดสำหรับแต่ละกระบวนการ - แต่คุณสามารถใช้ PID นั้นได้pgrepหากคุณต้องการแสดงรายการกระบวนการทั้งหมดที่เป็นของเนมสเปซ

เช่นถ้าฉันใช้ gitlab ใน docker และต้องการหากระบวนการทั้งหมดที่ทำงานใน namespace นั้นฉันสามารถ:

# lsns  -t pid -o ns,pid,command  | grep gitlab
  4026532661   459 /opt/gitlab/embedded/bin/redis-server 127.0.0.1:0

และจากนั้นใช้ pid นั้น (459) กับpgrep:

# pgrep --ns 459 -a
459 /opt/gitlab/embedded/bin/redis-server 127.0.0.1:0
623 postgres: gitlab gitlabhq_production [local] idle
[...around 50 lines deleted...]
30172 nginx: worker process

ฉันยังสามารถใช้ namespace id (4026532661) กับpsเช่น:

ps -o pidns,pid,cmd | awk '$1==4026532661'
[...output deleted...]

3

จากหน้า man สำหรับพื้นที่ชื่อเครือข่าย

ip netns - กระบวนการจัดการเนมสเปซเครือข่ายเนมสเปซเครือข่ายเป็นอีกหนึ่งสำเนาสแต็กเครือข่ายที่มีเหตุผลซึ่งมีเส้นทางของตัวเองกฎไฟร์วอลล์และอุปกรณ์เครือข่าย

   By  convention  a   named   network   namespace   is   an   object   at
   /var/run/netns/NAME  that can be opened.  The file descriptor resulting
   from opening /var/run/netns/NAME refers to the specified network names-
   pace.   Holding  that  file descriptor open keeps the network namespace
   alive.  The file descriptor can be used with the setns(2)  system  call
   to change the network namespace associated with a task.

   The  convention for network namespace aware applications is to look for
   global network configuration files first in  /etc/netns/NAME/  then  in
   /etc/.    For   example,   if   you   want   a   different  version  of
   /etc/resolv.conf for a network namespace used to isolate your  vpn  you
   would name it /etc/netns/myvpn/resolv.conf.

สำหรับช่องว่างชื่อประเภทอื่น ๆ อาจมีวิธีอื่น


1

Nsutils

Nsutilsสามารถแสดงรายการเนมสเปซที่ใช้ด้วยnslistและไม่ต้องการรูทเพื่อดูเนมสเปซของผู้ใช้

เนมสเปซเครือข่าย :

สำหรับเนมสเปซเครือข่ายที่สร้างขึ้นip netnsสามารถแสดงได้ด้วยip netns list


1

namespace-Lister:

คุณสามารถใช้listns.py

การใช้งาน: ./listns.pyหรือpython2 listns.py

สำรวจระบบ

ในการตั้งค่าพื้นฐาน / เริ่มต้น Ubuntu 12.04 และสูงกว่าให้เนมสเปซสำหรับ (เนมสเปซเหล่านี้จะปรากฏขึ้นสำหรับทุกขั้นตอนในระบบหากคุณดำเนินการในฐานะรูท)

  • ipc สำหรับวัตถุ IPC และคิวข้อความ POSIX
  • mnt สำหรับจุดเมานต์ระบบไฟล์
  • สุทธิสำหรับเครือข่ายนามธรรม (VRF)
  • pid เพื่อจัดเตรียมพื้นที่หมายเลข ID กระบวนการที่แยกและแยก
  • ใช้เพื่อแยกตัวระบุระบบสองรายการ - ชื่อโหนดและชื่อโดเมน - ที่จะใช้โดย uname

รหัสหลาม

รหัสไพ ธ อนด้านล่างแสดงรายการเนมสเปซที่ไม่ใช่ค่าเริ่มต้นทั้งหมดในระบบ การไหลเวียนของโปรแกรมคือ

  • รับเนมสเปซอ้างอิงจากกระบวนการเริ่มต้น (PID = 1) ข้อสันนิษฐาน: PID = 1 ถูกกำหนดให้กับเนมสเปซเริ่มต้นที่ระบบรองรับ
  • วนรอบ / var / run / netns / และเพิ่มรายการลงในรายการ
  • วนซ้ำ / proc / over PID ทั้งหมดและค้นหารายการใน / proc // ns / ซึ่งไม่เหมือนกับ PID = 1 แล้วเพิ่มลงในรายการ
  • พิมพ์ผลลัพธ์

ตัวอย่าง:

ตัวอย่างของpython2 listns.pyเอาต์พุต ... คุณสามารถไพพ์ด้วยการเรียงลำดับหรือแก้ไขสคริปต์เพื่อให้ตรงกับความต้องการของคุณ

       PID  Namespace             Thread/Command
        --  net:[4026533172]      created by ip netns add qrouter-c33ffc14-dbc2-4730-b787-4747
        --  net:[4026533112]      created by ip netns add qrouter-5a691ed3-f6d3-4346-891a-3b59
       297  mnt:[4026531856]      kdevtmpfs 
      3429  net:[4026533050]**    dnsmasq --no-hosts --no-resolv --strict-order --bind-interfa
      3429  mnt:[4026533108]      dnsmasq --no-hosts --no-resolv --strict-order --bind-interfa
      3486  net:[4026533050]**    /usr/bin/python /usr/bin/neutron-ns-metadata-proxy --pid_fil
      3486  mnt:[4026533107]      /usr/bin/python /usr/bin/neutron-ns-metadata-proxy --pid_fil

ที่มา: github-mirrorและบทความ ; เครดิตทั้งหมดให้กับRalf Trezeciak


หากนี่คือสคริปต์ของคุณคุณควรระบุสิ่งนั้น (และในคำตอบอื่น ๆ ของคุณสแปมสคริปต์นี้เช่นกัน)
muru

ฉันเชื่อมโยงแหล่งที่มาแล้วตอนนี้ฉันเพิ่มชื่อของนักพัฒนาแล้วฉันได้อัปเดตคำตอบอีก 2 คำตอบด้วยเช่นกันฉันโพสต์คำตอบต่าง ๆ สำหรับคำถามที่แตกต่างกันแม้ว่ามันจะเชื่อมโยงเครื่องมือเดียวกันโปรดแจ้งให้ฉันทราบ หรือลบคำตอบ
intika
โดยการใช้ไซต์ของเรา หมายความว่าคุณได้อ่านและทำความเข้าใจนโยบายคุกกี้และนโยบายความเป็นส่วนตัวของเราแล้ว
Licensed under cc by-sa 3.0 with attribution required.