Bagaimana cara membuat daftar namespace di Linux?

24

Apakah ada metode di Linux untuk mendaftar semua ruang nama pada host yang berjalan? Saya perlu memeriksa ruang nama untuk proses tertentu (misalnya proses yang berjalan di LXC-container dan semua proses lain di host) dan kemudian mencari tahu cgroups dari mereka.

zerospiel
sumber

Jawaban:

12

Utilitas untuk bekerja dengan ruang nama telah meningkat sejak pertanyaan ini diajukan pada 2013.

lsnsdari paket util-linux dapat mendaftar semua jenis ruang nama yang berbeda, dalam berbagai format yang bermanfaat.

# 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).

lsnshanya mencantumkan PID terendah untuk setiap proses - tetapi Anda dapat menggunakan PID itu dengan pgrepjika Anda ingin membuat daftar semua proses yang termasuk dalam namespace.

misalnya jika saya menjalankan gitlab di docker dan ingin menemukan semua proses yang berjalan di namespace itu, saya dapat:

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

dan, kemudian gunakan pid itu (459) dengan 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

Saya juga bisa menggunakan id namespace (4026532661) dengan ps, misalnya:

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

Dari halaman manual ip untuk ruang nama jaringan

ip netns - proses manajemen namespace jaringan Sebuah namespace jaringan secara logis merupakan salinan dari tumpukan jaringan, dengan rute itu sendiri, aturan firewall, dan perangkat jaringan.

   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.

Untuk spasi nama jenis lain, mungkin ada cara lain

c4f4t0r
sumber
1

Nsutils

Nsutils dapat membuat daftar namespace yang digunakan nslist, dan juga tidak memerlukan root untuk melihat ruang nama pengguna

Ruang nama jaringan :

Untuk namespace jaringan dibuat dengan ip netns, mereka dapat didaftar denganip netns list

intika
sumber
1

Namespace-Lister:

Anda dapat menggunakan listns.py

Penggunaan: ./listns.pyataupython2 listns.py

Menjelajahi sistem

Dalam pengaturan dasar / default Ubuntu 12.04 dan lebih tinggi menyediakan namespace untuk (namespace ini ditampilkan untuk setiap proses dalam sistem. Jika Anda menjalankan sebagai root)

  • ipc untuk objek IPC dan antrian pesan POSIX
  • mnt untuk mountpoint sistem file
  • net untuk abstraksi jaringan (VRF)
  • pid untuk menyediakan ruang proses nomor ID yang terpisah
  • uts untuk mengisolasi dua pengidentifikasi sistem - nodename dan domainname - untuk digunakan secara uname

Kode python

Kode python di bawah ini mencantumkan semua ruang nama non-standar dalam suatu sistem. Alur programnya adalah

  • Dapatkan ruang nama referensi dari proses init (PID = 1). Asumsi: PID = 1 ditugaskan untuk ruang nama default yang didukung oleh sistem
  • Loop melalui / var / run / netns / dan tambahkan entri ke daftar
  • Loop melalui / proc / atas semua PID dan cari entri di / proc // ns / yang tidak sama dengan untuk PID = 1 dan tambahkan kemudian ke daftar
  • Cetak hasilnya

Contoh:

Contoh python2 listns.pyoutput ... Anda dapat menyalurkannya dengan mengurutkan atau mengedit skrip untuk memenuhi kebutuhan Anda

       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

Sumber: github-mirror dan artikel ; semua kredit untuk Ralf Trezeciak

intika
sumber
Jika ini skrip Anda, Anda harus menyatakannya. (Dan di jawaban Anda yang lain, spam juga skrip ini).
muru
saya sudah menautkan sumbernya, sekarang saya menambahkan nama pengembang, saya memperbarui 2 jawaban lainnya juga, saya memposting jawaban berbeda untuk pertanyaan yang berbeda bahkan jika itu menautkan alat yang sama, tolong beri tahu saya jika saya harus memperbarui sesuatu atau hapus jawaban.
intika