Microsoft MVP성태의 닷넷 이야기
Linux: 89. pid 네임스페이스 구성으로 본 WSL 2 배포본의 계층 관계 [링크 복사], [링크+제목 복사],
조회: 5339
글쓴 사람
정성태 (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

비밀번호

댓글 작성자
 




... 106  107  108  109  110  111  [112]  113  114  115  116  117  118  119  120  ...
NoWriterDateCnt.TitleFile(s)
11124정성태1/4/201727824개발 환경 구성: 309. 3년짜리 유효 기간을 제공하는 StartSSL [2]
11123정성태1/3/201723331.NET Framework: 629. .NET Core의 dotnet.exe CLI 명령어 확장 방법 [1]
11122정성태1/3/201722797.NET Framework: 628. TransactionScope에 사용자 정의 트랜잭션을 참여시키는 방법 [2]파일 다운로드1
11121정성태1/1/201720693개발 환경 구성: 308. "ASP.NET Core Web Application (.NET Core)"와 "ASP.NET Core Web Application (.NET Framework)" 차이점
11120정성태12/25/201626553개발 환경 구성: 307. ASP.NET Core Web Application을 IIS에서 호스팅하는 방법
11119정성태12/23/201649206개발 환경 구성: 306. Visual Studio Code에서 Python 개발 환경 구성 [2]
11118정성태12/22/201635978오류 유형: 374. Python 64비트 설치 시 0x80070659 오류 발생 [3]
11117정성태12/21/201622307웹: 35. nopCommerce 예제 사이트 구성 방법
11116정성태12/21/201624242디버깅 기술: 84. NopCommerce의 Autofac 부하(CPU, Memory) [2]
11115정성태12/21/201627230Windows: 133. 윈도우 서버 2016에서 플래시가 동작하지 않는 경우 [2]
11114정성태12/19/201637227Windows: 132. 역슬래시(backslash) 문자가 왜 통화 표기 문자(한글인 경우 "\")로 보일까요? [2]
11113정성태12/6/201621118오류 유형: 373. ICOMAdminCatalog::GetCollection에서 CO_E_ISOLEVELMISMATCH(0x8004E02F) 오류 발생파일 다운로드1
11112정성태11/23/201626305오류 유형: 372. MySQL 서비스가 올라오지 않는 경우 - Error 1067
11111정성태11/23/201634762.NET Framework: 627. C++로 만든 DLL을 C#에서 사용하기 [2]
11110정성태11/17/201621453.NET Framework: 626. Commit 메모리가 낮은 상황에서도 메모리 부족(Out-of-memory) 예외 발생 [2]
11109정성태11/17/201621423.NET Framework: 625. ASP.NET에서 System.Web.HttpApplication 인스턴스는 다중으로 생성됩니다.
11108정성태11/13/201621245.NET Framework: 624. WPF - Line 요소를 Canvas에 위치시켰을 때 흐림(blur) 현상파일 다운로드1
11107정성태11/9/201625138오류 유형: 371. Post cache substitution is not compatible with modules in the IIS integrated pipeline that modify the response buffers.파일 다운로드1
11106정성태11/8/201625310.NET Framework: 623. C# - PeerFinder를 이용한 Wi-Fi Direct 데이터 통신 예제 [2]파일 다운로드1
11105정성태11/8/201619704.NET Framework: 622. PeerFinder Wi-Fi Direct 통신 시 Read/Write/Dispose 문제
11104정성태11/8/201619187개발 환경 구성: 305. PeerFinder로 Wi-Fi Direct 연결 시 방화벽 문제
11103정성태11/8/201619133오류 유형: 370. PeerFinder.ConnectAsync의 결과 값인 Task.Result를 호출할 때 System.AggregateException 예외 발생
11102정성태11/8/201619241오류 유형: 369. PeerFinder.FindAllPeersAsync 호출 시 System.UnauthorizedAccessException 예외 발생
11101정성태11/8/201622015.NET Framework: 621. 닷넷 프로파일러의 오류 코드 - 0x80131363
11100정성태11/7/201628805개발 환경 구성: 304. Wi-Fi Direct 지원 여부 확인 방법 [1]
11099정성태11/7/201630739.NET Framework: 620. C#에서 C/C++ 함수로 콜백 함수를 전달하는 예제 코드파일 다운로드1
... 106  107  108  109  110  111  [112]  113  114  115  116  117  118  119  120  ...