Como verificar o número do dispositivo de um dispositivo em /proc/1/ns/{ns}
?
Eu li o código para uma biblioteca Go (veja abaixo), que afirma que é possível determinar se um contêiner está no namespace do host ou não: o número do dispositivo de um sem namespace /proc/1/ns/{ns}
é 4 e qualquer outra coisa é maior.
Agora, em um novo contêiner Debian sem namespace de usuário ou cgroup, executo o seguinte comando:
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]'
O que o 4026531837 'user:[4026531837]'
significa aqui? Não posso ser o número do dispositivo, porque o contêiner está usando o mesmo namespace de usuário que o host (verifiquei isso).
Como posso listar os números de dispositivo dos arquivos /proc/1/ns/{ns}
? O ls -la
comando mostra que esses arquivos são links simbólicos, então como eles podem ter um número de dispositivo?
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
}
Esses números são os números de inode de arquivos implementados pelo
nsfs
sistema de arquivos, que podem ser abertos e usados com osetns(2)
para associar um processo a um namespace.De acordo com uma discussão de problemas do systemd ( a detecção de virtualização via /proc/1/sched não funciona mais no Linux 4.14+ ):