ฉันได้ถามคำถามเกี่ยวกับวิธีการแสดงรายการ namespaces ทั้งหมดใน Linuxแต่ไม่มีคำตอบที่ถูกต้องและแน่นอนดังนั้นฉันต้องการค้นหาวิธีที่สามารถช่วยฉันค้นหา namespace ของ PID ของกระบวนการหรือกลุ่มของ กระบวนการ จะทำอย่างไรใน Linux?
ฉันได้ถามคำถามเกี่ยวกับวิธีการแสดงรายการ namespaces ทั้งหมดใน Linuxแต่ไม่มีคำตอบที่ถูกต้องและแน่นอนดังนั้นฉันต้องการค้นหาวิธีที่สามารถช่วยฉันค้นหา namespace ของ PID ของกระบวนการหรือกลุ่มของ กระบวนการ จะทำอย่างไรใน Linux?
คำตอบ:
ฉันจะลองตอบคำถามทั้งสองนี้และคำถามก่อนหน้าของคุณเนื่องจากพวกเขาเกี่ยวข้องกัน
ประตู namespaces เป็นไฟล์ในและ/proc/*/ns/*
/proc/*/task/*/ns/*
เนมสเปซถูกสร้างขึ้นโดยกระบวนการที่ไม่เปิดเผยฮับสเปซ namespace นั้นจะสามารถทำให้ถาวรโดยผูกติดns
ไฟล์บางสถานที่อื่น ๆ
นั่นคือสิ่งที่ip netns
จะทำเช่นสำหรับเนมสเปซสุทธิ มัน unshares ของnet
namespace และผูกม้าไป/proc/self/ns/net
/run/netns/netns-name
ใน/proc
เมาท์ในเนมสเปซ pid รูทคุณสามารถแสดงรายการเนมสเปซทั้งหมดที่มีกระบวนการในรูมได้โดยทำดังนี้
# readlink /proc/*/task/*/ns/* | sort -u
ipc:[4026531839]
mnt:[4026531840]
mnt:[4026531856]
mnt:[4026532469]
net:[4026531956]
net:[4026532375]
pid:[4026531836]
pid:[4026532373]
uts:[4026531838]
ตัวเลขในวงเล็บเหลี่ยมคือหมายเลขไอโหนด
เพื่อรับสิ่งนั้นสำหรับกระบวนการที่กำหนด:
# ls -Li /proc/1/ns/pid
4026531836 /proc/1/ns/pid
ตอนนี้อาจมีเนมสเปซถาวรที่ไม่มีกระบวนการใด ๆ ในพวกเขา การค้นหาพวกเขาออกมาอาจเป็นเรื่องที่ยุ่งยากมาก
ก่อนอื่นคุณต้องจำไว้ว่าอาจมีเนมสเปซเมานต์หลายรายการ
# awk '$9 == "proc" {print FILENAME,$0}' /proc/*/task/*/mountinfo | sort -k2 -u
/proc/1070/task/1070/mountinfo 15 19 0:3 / /proc rw,nosuid,nodev,noexec,relatime - proc proc rw
/proc/19877/task/19877/mountinfo 50 49 0:3 / /run/netns/a rw,nosuid,nodev,noexec,relatime shared:2 - proc proc rw
/proc/19877/task/19877/mountinfo 57 40 0:3 / /proc rw,nosuid,nodev,noexec,relatime - proc proc rw
/proc/1070/task/1070/mountinfo 66 39 0:3 / /run/netns/a rw,nosuid,nodev,noexec,relatime shared:2 - proc proc rw
/proc/19877/task/19877/mountinfo 68 67 0:3 / /mnt/1/a rw,nosuid,nodev,noexec,relatime unbindable - proc proc rw
บรรดา/mnt/1/a
, /run/netns/a
อาจจะเป็นไฟล์ namespace
เราสามารถรับหมายเลขไอโหนด:
# nsenter --mount=/proc/19877/task/19877/ns/mnt -- ls -Li /mnt/1/a
4026532471 /mnt/1/a
แต่นั่นไม่ได้บอกอะไรเรามากไปกว่ามันไม่ได้อยู่ในรายการที่คำนวณข้างต้น
เราสามารถลองและป้อนเป็นประเภทต่างๆ:
# nsenter --mount=/proc/19877/task/19877/ns/mnt -- nsenter --pid=/mnt/1/a true
nsenter: reassociate to namespace 'ns/pid' failed: Invalid argument
# nsenter --mount=/proc/19877/task/19877/ns/mnt -- nsenter --mount=/mnt/1/a true
nsenter: reassociate to namespace 'ns/mnt' failed: Invalid argument
# nsenter --mount=/proc/19877/task/19877/ns/mnt -- nsenter --net=/mnt/1/a true
#
ตกลงนั่นคือnet
ไฟล์เนมสเปซ
ดังนั้นดูเหมือนว่าเรามีวิธีการในการแสดงรายการชื่อพื้นที่: รายการns
ไดเรกทอรีของงานทั้งหมดจากนั้นหาproc
จุดเมานท์ทั้งหมดในทั้งหมด/proc/*/task/*/mountinfo
และหาประเภทของพวกเขาโดยพยายามป้อน
หากคุณมีutil-linux v2.28 ขึ้นไปคุณสามารถใช้lsns :
# lsns
NS TYPE NPROCS PID USER COMMAND
4026531836 pid 78 1 root /sbin/init
4026531837 user 79 1 root /sbin/init
4026531838 uts 78 1 root /sbin/init
4026531839 ipc 78 1 root /sbin/init
4026531840 mnt 75 1 root /sbin/init
4026531857 mnt 1 12 root kdevtmpfs
4026531957 net 79 1 root /sbin/init
4026532393 mnt 1 1214 root /lib/systemd/systemd-udevd
4026532415 mnt 1 2930 systemd-timesync /lib/systemd/systemd-timesyncd
4026532477 mnt 1 32596 root -bash
4026532478 uts 1 32596 root -bash
4026532479 ipc 1 32596 root -bash
4026532480 pid 1 32596 root -bash
การแก้ไข: lsns ไม่สามารถใช้ได้ใน util-linux v2.27 ตามคำตอบนี้ ดูhttps://www.kernel.org/pub/linux/utils/util-linux/v2.28/v2.28-ReleaseNotes
lsns
มีประโยชน์มาก แต่จะแสดง PID ที่ต่ำที่สุดในแต่ละเนมสเปซ - เช่นไม่สามารถบอกเนมสเปซสำหรับ PID ที่กำหนดเองได้ +1 อยู่ดีเพราะนี่ยังเป็นคำตอบที่มีประโยชน์แม้ว่าจะไม่ได้ตอบคำถามโดยตรง
$ ip netns identify $PID
โดยที่$PID
เป็น ID กระบวนการของกระบวนการซึ่งคุณสามารถรับได้หลายวิธี
ip netns
(หรืออย่างน้อยสร้างโดยบางสิ่งที่ผูกติดกับเนมสเปซประตูใน / run / netns เช่นip netns
นั้น) มันเป็นพื้นในลักษณะ / วิ่ง / netns /proc/$PID/ns/net
สำหรับไฟล์ที่เป็นเช่นเดียวกับ
/run/netns
ไม่มีแม้แต่ในคอมพิวเตอร์ของฉัน
/run/netns
หรือที่ใดก็ตามที่ip
เชื่อมโยงไฟล์พิเศษเนมสเปซ findmnt -t nsfs
อาจบอกคุณว่ามันอยู่ในระบบของคุณ OTOH ถ้าคุณทำunshare -n sleep 1000 & ip netns identify "$!"
คุณจะไม่ได้อะไรเลย
findmnt -t nsfs
- ไม่มีอะไร unshare -n sleep 1000 & ip netns identify "$!"
- ยกเลิกการแชร์: ยกเลิกการแชร์ไม่สำเร็จ: ไม่อนุญาตให้ใช้งาน
findmnt -t nsfs
ไม่มีอะไรส่งกลับแสดงให้เห็นว่าคุณไม่มีเน็ตบนเครื่อง ATM ของคุณ
ps
ตอนนี้มีตัวเลือกออกสำหรับชนิดที่แตกต่างกันของ namespaces ที่เกี่ยวข้องกับกระบวนการ: ipcns
, mntns
, netns
, pidns
, และuserns
utsns
สำหรับคำถามนี้อย่างใดอย่างหนึ่งที่เกี่ยวข้องคือ namespace PID pidns
หรือ
ดังนั้นหากคุณต้องการค้นหา PID namespace id สำหรับเช่น pid 459:
# ps -h -o pidns -p 459
4026532661
และเพื่อแสดงรายการกระบวนการทั้งหมดในเนมสเปซนั้น:
ps -o pidns,pid,cmd | awk '$1==4026532661'
หรือด้วยpgrep
, คุณสามารถไปจาก PID โดยตรงไปยังรายการกระบวนการทั้งหมดที่แชร์เนมสเปซ PID เดียวกัน:
pgrep -a --ns 459
ซึ่งแตกต่างps
, pgrep
สามารถ จำกัด การส่งออกไปยัง namespace เฉพาะ (ถ้าคุณรู้ว่า PID หนึ่งของกระบวนการในนั้น) แต่มีการจัดรูปแบบการส่งออกความสามารถที่ จำกัด มาก (PIDs เท่านั้นหรือ PIDs และบรรทัดคำสั่งของพวกเขา)
คุณสามารถไพพ์เอาต์พุตของpgrep --ns 459
ถึงxargs ps -f
แม้ว่าเพื่อดึงข้อมูลที่คุณต้องการเกี่ยวกับกระบวนการ
คุณสามารถใช้listns.py
การใช้งาน: ./listns.py
หรือpython2 listns.py
เพื่อตอบคำถามนี้อย่างแม่นยำคุณสามารถ grep ผลลัพธ์เช่นนี้python2 listns.py | grep $PID
(แทนที่ตัวแปร pid)
ที่มา: github-mirrorและบทความมอบ เครดิตให้กับRalf Trezeciak
สำหรับเนมสเปซเครือข่ายip netns identify $PID
สามารถใช้ได้
จัดเตรียมpidnslist
ที่ส่งคืน pid เนมสเปซของกระบวนการ
$ pidnslist -ss 8782
pid:[4026531836]