`/proc/1/ns/{ns}`에서 장치의 장치 번호를 확인하는 방법은 무엇입니까?

`/proc/1/ns/{ns}`에서 장치의 장치 번호를 확인하는 방법은 무엇입니까?

장치의 장치 번호를 확인하는 방법은 무엇입니까 /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

관련 정보