Linux'ta ad alanları nasıl listelenir?


24

Linux'ta çalışan ana bilgisayardaki tüm ad alanlarını listelemek için herhangi bir yöntem var mı? Belli işlemler için (örneğin LXC-container'da çalışan işlemler ve ana bilgisayardaki tüm diğer işlemler) ad alanlarını kontrol etmem ve sonra bunların gruplarını bulmam gerekiyor.


Yanıtlar:


12

Bu soruyu 2013 yılında sorduğundan bu yana ad alanları ile çalışmak için yardımcı programlar geliştirildi.

lsnsdan util-linux paketinin çeşitli yararlı biçimlerde, ad farklı türleri listeleyebilirsiniz.

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

lsnsyalnızca her işlem için en düşük PID'yi listeler - ancak pgrepbir ad alanına ait tüm işlemleri listelemek istiyorsanız bu PID'yi kullanabilirsiniz .

Örneğin, docker'da gitlab kullanıyorum ve bu ad alanında çalışan tüm işlemleri bulmak istiyorsanız, şunları yapabilirim:

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

ve daha sonra şu pid'i (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

Ayrıca ps, örneğin ad alan kimliğini (4026532661) kullanabilirim :

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

3

Ağ adı alanı için ip man sayfasından

ip ağları - ağ ad alanı yönetimi süreci Ağ ad alanı, kendi yollarını, güvenlik duvarı kurallarını ve ağ aygıtlarını içeren, ağ yığınının mantıksal olarak başka bir kopyasıdır.

   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.

Diğer türlerin ad alanları için, belki başka yollar vardır.


1

Nsutils

Nsutils , kullanılan ad alanını listeleyebilir nslist, ayrıca kullanıcı ad alanlarını görmek için kök gerektirmez

Ağ ad alanları :

İle oluşturulan ağ ad alanı için ip netnsbunlar ile listelenebilirip netns list


1

Ad alanı-Lister:

Listns.py kullanabilirsiniz

Kullanım: ./listns.pyveyapython2 listns.py

Sistemi keşfetmek

Temel / varsayılan kurulumda Ubuntu 12.04 ve daha üstü, aşağıdakiler için isim alanları sağlar (Bu isim alanları sistemdeki her işlem için gösterilir. Kök olarak çalıştırıyorsanız).

  • IPC nesneleri ve POSIX mesaj kuyrukları için ipc
  • dosya sistemi mountpoints için mnt
  • ağ soyutlama için net (VRF)
  • ayrı, izole edilmiş bir işlem kimlik numarası alanı sağlamak için
  • uname tarafından kullanılacak iki sistem tanımlayıcısını (nodename ve domainname) ayırmak için uts

Python kodu

Aşağıdaki python kodu bir sistemdeki varsayılan olmayan tüm ad alanlarını listeliyor. Program akışı

  • Referans ad alanlarını init işleminden alın (PID = 1). Varsayım: PID = 1, sistem tarafından desteklenen varsayılan ad alanlarına atanmıştır.
  • / Var / run / netns / ile dolaşın ve girişleri listeye ekleyin
  • Tüm PID'ler üzerinden / proc / üzerinden döngü yapın ve / proc // ns / içindeki PID = 1 ile aynı olmayan girişleri arayın ve listeye ekleyin
  • Sonucu yazdır

Örnek:

python2 listns.pyÇıktı örneği ... İhtiyaçlarınıza uyacak şekilde betiği sıralama ile düzenleyebilir veya düzenleyebilirsiniz.

       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

Kaynak: Github ayna ve makale ; tüm kredi Ralf Trezeciak'a


Bu sizin senaryonuz ise, bunu belirtmelisiniz. (Ve diğer cevaplarınızda bu betiği spam olarak da yazınız).
muru,

Ben zaten kaynağını bağladım, şimdi geliştiricinin adını ekledim, diğer 2 cevabı da güncelledim, aynı aracı bağlasam bile farklı sorulara farklı cevaplar verdim, lütfen bir şeyi güncellemem gerekiyorsa bana bildirin veya bir cevabı sil.
intika
Sitemizi kullandığınızda şunları okuyup anladığınızı kabul etmiş olursunuz: Çerez Politikası ve Gizlilik Politikası.
Licensed under cc by-sa 3.0 with attribution required.