Debian

如何在/proc/1/ns/{ns}中查看設備的設備號?

  • March 4, 2020

如何查看設備的設備號/proc/1/ns/{ns}

我已經閱讀了 Go 庫的程式碼(見下文),其中指出可以確定容器是否在主機命名空間中:未命名空間的設備號/proc/1/ns/{ns}是 4,其他任何東西都更高。

現在,在沒有使用者命名空間或 cgroup 的新 Debian 容器中,我執行以下命令:

root@54d74f795843:/# ls -la /proc/1/ns
total 0
dr-x--x--x 2 root root 0 Feb 29 17:18 .
dr-xr-xr-x 9 root root 0 Feb 29 17:18 ..
lrwxrwxrwx 1 root root 0 Feb 29 17:18 cgroup -> 'cgroup:[4026531835]'
lrwxrwxrwx 1 root root 0 Feb 29 17:18 ipc -> 'ipc:[4026532290]'
lrwxrwxrwx 1 root root 0 Feb 29 17:18 mnt -> 'mnt:[4026532288]'
lrwxrwxrwx 1 root root 0 Feb 29 17:18 net -> 'net:[4026532293]'
lrwxrwxrwx 1 root root 0 Feb 29 17:18 pid -> 'pid:[4026532291]'
lrwxrwxrwx 1 root root 0 Feb 29 17:18 user -> 'user:[4026531837]'
lrwxrwxrwx 1 root root 0 Feb 29 17:18 uts -> 'uts:[4026532289]'

**這裡的 4026531837 是什麼'user:[4026531837]'意思?**我不能是設備號,因為容器使用與主機相同的使用者命名空間(我已經驗證過)。

如何列出文件的設備號/proc/1/ns/{ns}?該ls -la命令顯示這些文件是符號連結,那麼它們怎麼會有設備號呢?

amicontained/供應商/github.com/jessfraz/bpfd/proc/proc.go/

// HasNamespace determines if a container is using a particular namespace or the
// host namespace.
// The device number of an unnamespaced /proc/1/ns/{ns} is 4 and anything else is
// higher.
// Only works from inside a container.
func HasNamespace(ns string) (bool, error) {
   file := fmt.Sprintf("/proc/1/ns/%s", ns)

   // Use Lstat to not follow the symlink.
   var info syscall.Stat_t
   if err := syscall.Lstat(file, &info); err != nil {
       return false, &os.PathError{Op: "lstat", Path: file, Err: err}
   }

   // Get the device number. If it is higher than 4 it is in a namespace.
   if info.Dev > 4 {
       return true, nil
   }

   return false, nil
}

‘user: 中的 4026531837 是什麼意思?

$$ 4026531837 $$‘意思是這裡?

這些數字是文件系統實現的文件的 inode 編號,nsfs可以打開並使用它們將setns(2)程序與命名空間相關聯。

如何列出文件 /proc/1/ns/{ns} 的設備號?

根據 systemd 問題討論(通過 /proc/1/sched 進行虛擬化檢測不再適用於 Linux 4.14+):

在我可以測試的系統上(核心 4.15.1 的 Arch、核心 4.9.65 的 Debian Jessie 和核心 4.13.0 的 Ubuntu Artful),未命名空間的設備號/proc/1/ns/pid似乎總是 4,而在 PID 命名空間中它是一個不同的、更高的數字,顯然與(PID?)命名空間的數量有關。您可以使用以下命令進行嘗試:

stat --format %d /proc/1/ns/pid
4
sudo unshare --pid --fork --mount-proc stat --format %d /proc/1/ns/pid
36

引用自:https://unix.stackexchange.com/questions/570418