Microsoft MVP성태의 닷넷 이야기
Linux: 89. pid 네임스페이스 구성으로 본 WSL 2 배포본의 계층 관계 [링크 복사], [링크+제목 복사],
조회: 5304
글쓴 사람
정성태 (seongtaejeong at gmail.com)
홈페이지
첨부 파일
 

(시리즈 글이 7개 있습니다.)
개발 환경 구성: 713. "WSL --debug-shell"로 살펴보는 WSL 2 VM의 리눅스 환경
; https://www.sysnet.pe.kr/2/0/13650

개발 환경 구성: 715. Windows - WSL 2 환경의 Docker Desktop 네트워크
; https://www.sysnet.pe.kr/2/0/13659

Linux: 88. WSL 2 리눅스 배포본 내에서의 pid 네임스페이스 구성
; https://www.sysnet.pe.kr/2/0/13771

Linux: 89. pid 네임스페이스 구성으로 본 WSL 2 배포본의 계층 관계
; https://www.sysnet.pe.kr/2/0/13772

Linux: 90. pid 네임스페이스 구성으로 본 WSL 2 + docker-desktop
; https://www.sysnet.pe.kr/2/0/13773

Linux: 91. Container 환경에서 출력하는 eBPF bpf_get_current_pid_tgid의 pid가 존재하지 않는 이유
; https://www.sysnet.pe.kr/2/0/13774

개발 환경 구성: 729. WSL 2 - Mariner VM 커널 이미지 업데이트 방법
; https://www.sysnet.pe.kr/2/0/13779




pid 네임스페이스 구성으로 본 WSL 2 배포본의 계층 관계

지난 글의 마지막 즈음에,

// Mariner VM 내에서 실행

# cat /proc/83194/status | grep NSpid
NSpid:  83194   3116    3059

리눅스 배포본 내에 뜬 프로세스가 3개의 네임스페이스를 거쳐 격리된 것이라고 설명했습니다. 이번 글에서는 이에 대해 좀 더 자세하게 살펴보겠습니다.




테스트를 위해 Ubuntu 20.04 WSL 인스턴스에서 sleep을 하나 실행해 둡니다.

// Ubuntu WSL 인스턴스 내에서 실행

$ sleep 680001 &
[1] 4419

// 4419 프로세스의 pid namespace 확인
$ ls -l /proc/4419/ns/pid
lrwxrwxrwx 1 testusr testusr 0 Oct 17 14:46 /proc/4419/ns/pid -> 'pid:[4026532257]'

그다음 debug shell로 연결한 환경에서 저 프로세스를 확인하면,

c:\temp> wsl --debug-shell

// 현재 환경의 pid namespace 확인
# ls -l /proc/1/ns/pid
lrwxrwxrwx 1 root root 0 Oct 17 01:11 /proc/1/ns/pid -> 'pid:[4026531836]'

// Ubuntu WSL 인스턴스 내에서 실행한 프로세스 확인
# ps aux | grep [s]leep
wslg       48950  0.0  0.0   7240   588 ?        S    05:40   0:00 sleep 680001

# cat /proc/48950/status | grep NSpid
NSpid:  48950   4578    4419

이렇게 정리가 됩니다.

pid:[4026531836] Mariner VM에 속한 pid namespace
  |- 48950 (sleep의 pid)
  ㄴ pid:[????????] (unknown)
       |- 4578 (sleep의 pid)
       ㄴ pid:[4026532257] Ubuntu WSL 인스턴스에 속한 pid namespace
            ㄴ 4419 (sleep의 pid)

그렇다면 4578 pid로 나타난 네임스페이스는 뭘까요?




예전에, wsl --debug-shell과 함께 wsl --system을 언급한 적이 있습니다.

c:\temp> wsl --help
...[생략]..
    --system
        Launches a shell for the system distribution.
...[생략]..

이걸로 들어가 보면,

c:\temp> wsl --system

$ ps aux | grep [s]leep
wslg        4578  0.0  0.0   7240   588 ?        S    14:40   0:00 sleep 680001

오호~~~ 우리가 찾던 바로 그 4578 프로세스가 나왔습니다. 그리고 그 사이에 낀 네임스페이스 격리를 Mariner VM 수준에서 다음과 같이 추적할 수 있습니다.

// Mariner VM 내에서 실행

# lsns -t pid 4026532257
  PID  PPID USER COMMAND
  226   221 root /sbin/init
  227   226 root |-/init
  248   227 root | |-plan9 --control-socket 6 --log-level 4 --server-fd 7 --pipe
  939   227 root | |-/bin/login -f
 1132   939 root | | `--bash
 1363   227 root | |-/init
...[생략]...

보면, 226 PID의 부모로 221이 나오는데요, 그것의 pid namespace를 살펴보면,

// Mariner VM 내에서 실행

# ls -l /proc/221/ns/pid
lrwxrwxrwx 1 root root 0 Oct 17 01:11 /proc/221/ns/pid -> 'pid:[4026532245]'

다른 값이 나왔습니다. 따라서 pid namespace 계층을 정리하면 대충 다음과 같이 나옵니다.

pid:[4026531836] Mariner VM에 속한 pid namespace
  |- 48950 (sleep의 pid)
  ㄴ pid:[4026532245] WSLg 격리
       |- 4578 (sleep의 pid)
       ㄴ pid:[4026532257] Ubuntu WSL 인스턴스에 속한 pid namespace
            ㄴ 4419 (sleep의 pid)




참고로, WSL 리눅스 인스턴스들이 언제나 저렇게 WSLg 쪽 네임스페이스에 속해 있지는 않습니다. 추가로 새롭게 설치한 Ubuntu 18.04의 경우에는,

$ sleep 180000 &
[1] 32

$ ls -l /proc/32/ns/pid
lrwxrwxrwx 1 testusr testusr 0 Oct 17 15:24 /proc/32/ns/pid -> 'pid:[4026532784]'

wsl --system 환경에서는 보이지 않았습니다.

c:\temp> wsl --system

$ ps aux | grep [s]leep
$

Mariner VM에서 확인해 보면,

// Mariner VM 내에서 실행

# ps aux | grep [s]leep
wslg       56564  0.0  0.0   7936   824 ?        S    06:24   0:00 sleep 180000

# cat /proc/56564/status | grep NSpid
NSpid:  56564   87      32

역시 3개의 격리 공간이 나오는데요, 이번에도 WSLg 레벨과 유사한 별도의 네임스페이스가 Ubuntu 18.04 인스턴스의 중간에 존재하는 것을 ppid를 추적해 살펴볼 수 있습니다.

// Mariner VM 내에서 실행

# lsns -t pid 4026532784
   PID   PPID USER COMMAND
 56297  56291 root /init
 ...[생략]...
56564  56336 wslg |     `-sleep 180000
 ...[생략]...

# ls -l /proc/56291/ns/pid
lrwxrwxrwx 1 root root 0 Oct 17 06:32 /proc/56291/ns/pid -> 'pid:[4026532771]'

이를 감안해 적용해 보면, 대충 이런 식의 WSL 2 배포본의 계층 구조를 유추할 수 있을 것입니다.

Mariner VM
   |- WSLg 격리
   |    |- 리눅스 배포본 A
   |    |- 리눅스 배포본 B
   |    .
   |    .
   |    ㄴ 리눅스 배포본 N
   |- Non-WSLg 격리
   |    ㄴ 리눅스 배포본 N
   .
   .
   ㄴ Non-WSLg 격리
        ㄴ 리눅스 배포본 N




또 한 가지 유의해야 할 점이 있다면, WSLg를 설정을 통해 아예 비활성화시킬 수 있다는 점입니다. (옵션 변경 후 "wsl --shutdown" 명령을 실행해야 적용됩니다.)

// 혹은, wslsettings.exe를 이용해 GUI 환경에서 편집할 수 있습니다.

C:\temp> type %USERPROFILE%\.wslconfig
[wsl2]
guiApplications=false

그리고 이 옵션을 false로 설정한 경우 "wsl --system" 명령어가 동작하지 않습니다. (사실, 거의 쓸 일이 없어 전혀 불편하지 않겠지만.)

C:\temp> wsl --system
GUI application support is disabled via C:\Users\testusr\.wslconfig or /etc/wsl.conf.
Error code: Wsl/Service/CreateInstance/WSL_E_GUI_APPLICATIONS_DISABLED




[이 글에 대해서 여러분들과 의견을 공유하고 싶습니다. 틀리거나 미흡한 부분 또는 의문 사항이 있으시면 언제든 댓글 남겨주십시오.]







[최초 등록일: ]
[최종 수정일: 11/11/2024]

Creative Commons License
이 저작물은 크리에이티브 커먼즈 코리아 저작자표시-비영리-변경금지 2.0 대한민국 라이센스에 따라 이용하실 수 있습니다.
by SeongTae Jeong, mailto:techsharer at outlook.com

비밀번호

댓글 작성자
 




... 76  77  78  79  [80]  81  82  83  84  85  86  87  88  89  90  ...
NoWriterDateCnt.TitleFile(s)
11936정성태6/10/201918413Math: 58. C# - 최소 자승법의 1차, 2차 수렴 그래프 변화 확인 [2]파일 다운로드1
11935정성태6/9/201919989.NET Framework: 843. C# - PLplot 출력을 파일이 아닌 Window 화면으로 변경
11934정성태6/7/201921328VC++: 133. typedef struct와 타입 전방 선언으로 인한 C2371 오류파일 다운로드1
11933정성태6/7/201919639VC++: 132. enum 정의를 C++11의 enum class로 바꿀 때 유의할 사항파일 다운로드1
11932정성태6/7/201918829오류 유형: 544. C++ - fatal error C1017: invalid integer constant expression파일 다운로드1
11931정성태6/6/201919340개발 환경 구성: 441. C# - CairoSharp/GtkSharp 사용을 위한 프로젝트 구성 방법
11930정성태6/5/201919878.NET Framework: 842. .NET Reflection을 대체할 System.Reflection.Metadata 소개 [1]
11929정성태6/5/201919449.NET Framework: 841. Windows Forms/C# - 클립보드에 RTF 텍스트를 복사 및 확인하는 방법 [1]
11928정성태6/5/201918218오류 유형: 543. PowerShell 확장 설치 시 "Catalog file '[...].cat' is not found in the contents of the module" 오류 발생
11927정성태6/5/201919447스크립트: 15. PowerShell ISE의 스크립트를 복사 후 PPT/Word에 붙여 넣으면 한글이 깨지는 문제 [1]
11926정성태6/4/201919945오류 유형: 542. Visual Studio - pointer to incomplete class type is not allowed
11925정성태6/4/201919832VC++: 131. Visual C++ - uuid 확장 속성과 __uuidof 확장 연산자파일 다운로드1
11924정성태5/30/201921490Math: 57. C# - 해석학적 방법을 이용한 최소 자승법 [1]파일 다운로드1
11923정성태5/30/201921085Math: 56. C# - 그래프 그리기로 알아보는 경사 하강법의 최소/최댓값 구하기파일 다운로드1
11922정성태5/29/201918560.NET Framework: 840. ML.NET 데이터 정규화파일 다운로드1
11921정성태5/28/201924418Math: 55. C# - 다항식을 위한 최소 자승법(Least Squares Method)파일 다운로드1
11920정성태5/28/201916071.NET Framework: 839. C# - PLplot 색상 제어
11919정성태5/27/201920336Math: 54. C# - 최소 자승법의 1차 함수에 대한 매개변수를 단순 for 문으로 구하는 방법 [1]파일 다운로드1
11918정성태5/25/201921170Math: 53. C# - 행렬식을 이용한 최소 자승법(LSM: Least Square Method)파일 다운로드1
11917정성태5/24/201922164Math: 52. MathNet을 이용한 간단한 통계 정보 처리 - 분산/표준편차파일 다운로드1
11916정성태5/24/201919975Math: 51. MathNET + OxyPlot을 이용한 간단한 통계 정보 처리 - Histogram파일 다운로드1
11915정성태5/24/201923101Linux: 11. 리눅스의 환경 변수 관련 함수 정리 - putenv, setenv, unsetenv
11914정성태5/24/201922149Linux: 10. 윈도우의 GetTickCount와 리눅스의 clock_gettime파일 다운로드1
11913정성태5/23/201918787.NET Framework: 838. C# - 숫자형 타입의 bit(2진) 문자열, 16진수 문자열 구하는 방법파일 다운로드1
11912정성태5/23/201918734VS.NET IDE: 137. Visual Studio 2019 버전 16.1부터 리눅스 C/C++ 프로젝트에 추가된 WSL 지원
11911정성태5/23/201917504VS.NET IDE: 136. Visual Studio 2019 - 리눅스 C/C++ 프로젝트에 인텔리센스가 동작하지 않는 경우
... 76  77  78  79  [80]  81  82  83  84  85  86  87  88  89  90  ...