デバイスのデバイス番号を確認するには/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/vendor/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
}
答え1
ここで、「ユーザー:[4026531837]」の4026531837とはどういう意味ですか?
これは、ファイルシステムで実装され、名前空間に関連付けられて開くことができるnsfs
ファイルのinode番号です。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