Microsoft MVP성태의 닷넷 이야기
Windows: 22. 가상화에 대해서. [링크 복사], [링크+제목 복사],
조회: 19292
글쓴 사람
정성태 (techsharer at outlook.com)
홈페이지
첨부 파일
 


가상화(Virtualization)에 대해서.



원래, 저는 "가상화"에 대해서는 별다른 언급을 하고 싶지 않았습니다. 어차피 없어질 기술이고, 그 취지 자체가 "사용할 만한 것"이 아니고 어쩔 수 없이 "사용되어지는 기술"이기 때문에 아래의 토픽에서 잠깐 다루고 지나가는 정도로 그치려고 했습니다.

UAC 이모저모 - 10. 가상화는 지양
; https://www.sysnet.pe.kr/2/0/449

그래도, 간단한 개념이라도 다른 분들이 잡는데 도움이 되지 않을까 해서 한번 써봅니다.^^ (음... 그래도 역시나 쓰기가 싫군요.)




자, 그럼 "가상화"가 뭔지 간략하게 설명해 볼까요?

가상화는, "관리자" 권한임을 가정하고 작성된 "기존 응용 프로그램들"이 비스타에서 실행이 되는 경우, "medium" 신뢰도 등급에서는 정상적으로 실행이 되지 않는 부분으로 인해 오동작 하는 것을 최대한 막기 위해 비스타에서 구현된 "임시" 조치입니다. 가상화는 "파일 시스템"과 "레지스트리"에 대해서만 제공이 되며, 그로 인해 최대한 "가상"으로 호환성을 제공해 주겠다는 취지인 것입니다. 즉... "비스타용으로 업그레이드될 예정이 없는 프로그램"들을 위한 "호환성" 측면에서 만들어진 기술로써, 최근에 대대적으로 행해지고 있는 비스타 호환성을 위한 업그레이드 작업을 진행중인 프로그램, 또는 신규 개발되는 응용 프로그램을 위한 기술이 아닙니다.

따라서, 모든 "프로그램"들이 가상화 기능의 혜택을 받는 것은 아니고, "UAC 이모저모 - 10. 가상화는 지양"에서도 밝혔지만, 해당 응용 프로그램이 다음과 같은 조건을 만족하지 않는 경우에만 비스타 운영체제에 의한 "가상화" 기능이 제공됩니다.

[표1: 가상화를 제공받지 못하는 프로세스 조건]
  • 64비트 프로세스
  • 사용자와의 상호작용 인터페이스가 없는 프로세스
  • 가장된(impersonate) 프로세스
  • 커널 모드 호출자
  • requestedExecutionLevel 값이 지정된 실행 파일

이로 인해 "%ProgramFiles%" (예를 들어, "C:\Program Files") 폴더에 파일을 저장하려고 하면, 실제로는 "%LOCALAPPDATA%\VirtualStore\Program Files" 폴더 하위에 저장이 되어집니다. 물론, 반대로 가상화가 되어진 해당 폴더를 "파일 열기 대화창" 등으로 보게 되면, 운영체제에 의해서 가상화된 폴더 내용과 병합되어져서 보이게 됩니다.

한 가지 유의 사항이 있다면, 이러한 가상화 서비스는 모든 폴더 및 레지스트리에 제공이 되는 것은 아닙니다. 시스템에 의해 제공되는 "%ProgramFiles%", "%SystemRoot%" 폴더나 "HKEY_LOCAL_MACHINE\SOFTWARE" 하위에 대해서만 제공이 되어집니다.

음... 이쯤 되면... 마이크로소프트의 노력이 참 "가상"하지요?




그럼, 한번 ... 재미삼아서 간단히 확인해 볼까요?

지금 "메모장"을 실행시키고 "C:\Program Files" 폴더에 아무 파일이나 저장해 보십시오. (Save든, Save As든 상관이 없습니다.) 아마도 권한 문제로 인해 저장이 안될 것입니다. 왜냐하면, "메모장" 프로그램은 "가상화"를 제공받기 위한 조건을 만족하지 않은 데다, 해당 폴더에 대한 쓰기 권한이 없는 "medium" 신뢰도 등급으로 실행되기 때문입니다.

자, 그럼 메모장에 "가상화"를 적용시켜 볼까요? "작업 관리자"를 띄워서 "notepad.exe" 프로그램을 선택한 다음 오른쪽 마우스 버튼을 눌러서 나오는 메뉴의 "가상화"를 선택합니다.

vista_virtualization_2.png

이제, 다시 "저장"과 관련된 동작을 "C:\Program Files"에 해봅니다. 이전의 시도와는 달리 정상적으로 파일 저장이 되는 것을 확인할 수 있습니다. 또한 저장이 된 다음, "열기" 대화창에서 "C:\Program Files"에 저장된 파일을 확인해 보면, 방금 저장한 파일이 있는 것을 확인할 수 있습니다. 하지만, "탐색기"로 "C:\Program Files" 내용을 확인해 보면 해당 파일이 존재하지 않습니다. 대신에, "C:\Users\[사용자 로그인 계정]\AppData\Local\VirtualStore\Program Files" 폴더에 그 파일이 있습니다.




여기서 한 가지 ... 제가 모르는 사항이 나타났습니다. "작업관리자"에 의해 확인된 사항으로 봐서는 메모장이 "가상화" 서비스를 받지 않는 조건이 있을 텐데, 저로서는 그 조건을 찾아내지 못했습니다. 왜냐하면 제 노트북의 "메모장" 프로그램은 위의 "[표1: 가상화를 제공받지 못하는 프로세스 조건]"에 해당하는 조건에 하나도 해당이 안되기 때문입니다. 즉, 테스트되어진 메모장은 32비트, 상호작용 인터페이스이며, 가장되지 않았고, 커널 모드 호출자도 아니며, requestedExecutionLevel 값이 정해져 있지도 않습니다. 실제로 notepad.exe의 리소스를 살펴봐도 "RT_MANIFEST"라는 것조차도 찾을 수 없었습니다.

vista_virtualization_1.png

단순히, 마이크로소프트에 의해서 만들어진 것이기 때문에 애당초 가상화에서 벗어난다는 추측만을 해볼 뿐 정확한 설명은 찾지 못했습니다. 비단, 메모장뿐만 아니라 system32에서 제공되는 대부분의(아니면 모든) 응용 프로그램이 그렇다는 것뿐.



^^ 사실, 제가 이 글을 굳이 쓰게 된 데에는 사연이 좀 있습니다. 바로, 다음의 댓글에 달린 내용이나 전체적인 내용을 보고 해당 토픽에 대해서 댓글로 설명을 부가한 것인데, 그 내용이 지워지는 바람에... ^^; 써놓은 글이 아까워서 제 게시판에 다시 써보는 것입니다. (내용이 좀 길어서 그냥 흘려보내기 아까워서. ^^;)

「UAC에 대해」
; http://vista.golbin.net/index.php?pl=774

아래는 제가 대략 달았던 내용을 원문이 사라진 관계로 다시 한번 정리를 해본 글입니다.

오류 정정 1: 지나가다님의 의견에서의 오류
이미 위에서 제가 설명한 내용을 대충 이해하신 분들이라면 아래의 댓글에 어떤 오류가 있는지 아실 수 있습니다.

지나가다 님.
"
사용자가 직접 저장 경로를 정해 저장하는 경우엔 Virtualization이 동작하지 않습니다. Virtualization의 경우, 응용 프로그램이(사용자의 액션없이 - 만약 메모장이 실행시 저장할 경로를 가지고, 사용자가 저장을 누르면 저장하도록되어져 있다면 메모장도 가상화경로에 저장됩니다. 그러나 지금의 예제는 부적절합니다. 사용자가 SaveAS API를 사용하였으므로, 가상화랑은 상관없습니다. 저건 권한 문제입니다.) 응용 프로그램내 저장 함수를 이용하여, 권한이 없는 특정 위치(%windir%, %programfiles%, HKLM와 같은)에 저장을 시도할 경우에 가상화가 되죠..(권한이 없다는건 잘아실것입니다.)
"



원글을 쓴 블로거.
"
그런데 리치 에딧에서 저장을 하였을 때 가상폴더로 갔었던 것 같은데요? 제가 잘못 본 건가요?
"


그쵸... 이건 완전히 틀린 댓글입니다. 그것은 "가상화"랑 연관된 것이 맞습니다. 댓글을 달았던 분의 말에 오류가 있음을 아시겠지요! 또한 그것에 대해 다시 물어보는 원글의 블로거도 "가상화"에 대한 개념을 제대로 잡지 못한 상태에서 글을 쓰신 것이 아닌가 생각되어지는데요.

"SaveAs API"라고 했는데... 그건 사용자 입장에서일 뿐, 개발 단계에서는 "Save"와 "SaveAs" API 같은 것은 없습니다. 모두 다 "CreateFile" API 하나로 생성되기 때문에 그것과 "가상화"는 별개의 문제입니다. 사용자가 파일 저장 대화창에서 "C:\Program Files"로 지정했다고 해도 "가상화가 적용된" 응용 프로그램은 "C:\Users\[사용자이름]\AppData\Local\VirtualStore\Program Files"로 저장이 됩니다.

하지만, 위에서 그렇게 테스트가 되지 않은 것은 "메모장"이 가상화에 해당하는 규칙을 만족하지 않기 때문에, 가상화 혜택을 받지 않고 실행되어 나타나는 현상입니다.




오류 정정 2: 원글에서의 오류
사실, 원글에서의 오류는 굳이 지적하고 싶지는 않습니다. 그런대로 잘 맞는 글이기 때문입니다. 하지만, 정확히 "가상화"에 대한 이해 없이 썼기 때문에 억지로 수정해야 할 부분이 보이긴 합니다.

예를 들어, "5번 IE에서 인터넷 뱅킹이 Run as adminstrator로 실행해야만 가능한 이유는?"을 설명하면서 "이 부분은 Virtualization 부분과 더 관련이 있지만"이라고 부가 설명을 하고 있지만, 그것과 가상화는 그다지 연관성이 없습니다.

IE는 기본적으로 가상화를 지원하게 되어 있지만(위에서 알려드린 작업 관리자를 통해서 확인해 보시면 알 수 있습니다.), "Run as administrator"로 실행을 할 수밖에 없는 것은 인터넷 뱅킹이 가상화에 대한 혜택을 받았다고 하더라도 그 신뢰도 등급(MIC)이 일반 데스크톱 응용프로그램이 가진 "medium" 수준도 아닌, "low" 레벨에 있기 때문입니다. 따라서 이 내용은 가상화와 관계가 있다기보다는 "보호 모드"와 더 연관이 있는 것입니다.

실제로, 기존 인터넷 뱅킹 관련 프로그램들을 포함한 웹 사이트들이 "신뢰할 수 있는 사이트"로 등록이 되어 "보호 모드"가 해제되면, 'low'가 아닌 'medium' 레벨로 동작되어 가상화 혜택과 함께 정상적으로 실행될 수 있는 가능성이 높아집니다.

하지만... 그래도 실행이 안되는 경우라면... 이런 경우를 들 수 있습니다.
"가상화"는 "파일 시스템"과 "레지스트리"에만 적용될 뿐, 그 이외의 자원에 대해서는 적용되지 않습니다. 따라서, 그 외의 관리 권한을 필요로 하는 동작을 해야 하는 경우라면 그 응용 프로그램은 실패하고 맙니다.



휴... 대강 위와 같은 댓글을 나름대로 타자 열심히 쳐 가면서 남겼었는데... ^^; 지워지니 허탈하군요. 암튼 ... 리바이벌이란~~~.

최근 들어서 너무 많은 기술이 쏟아져 나와서 배워야 할 것이 참 많아졌습니다. 또한 그 와중에서 다소 의미가 정상적으로 전달되지 않는 경우가 있을 수 있지만... 서로간에 댓글을 통해서 좀 더 올바른 정보들이 퍼지길 바랍니다.



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







[최초 등록일: ]
[최종 수정일: 6/28/2021]

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

비밀번호

댓글 작성자
 




[1]  2  3  4  5  6  7  8  9  10  11  12  13  14  15  ...
NoWriterDateCnt.TitleFile(s)
13611정성태4/29/2024145닷넷: 2252. C# - GUID 타입 전용의 UnmanagedType.LPStruct - 두 번째 이야기파일 다운로드1
13610정성태4/28/2024246닷넷: 2251. C# - 제네릭 인자를 가진 타입을 생성하는 방법 - 두 번째 이야기
13609정성태4/27/2024268닷넷: 2250. PInvoke 호출 시 참조 타입(class)을 마샬링하는 [IN], [OUT] 특성파일 다운로드1
13608정성태4/26/2024507닷넷: 2249. C# - 부모의 필드/프로퍼티에 대해 서로 다른 자식 클래스 간에 Reflection 접근이 동작할까요?파일 다운로드1
13607정성태4/25/2024753닷넷: 2248. C# - 인터페이스 타입의 다중 포인터를 인자로 갖는 C/C++ 함수 연동
13606정성태4/24/2024847닷넷: 2247. C# - tensorflow 연동 (MNIST 예제)파일 다운로드1
13605정성태4/23/2024900닷넷: 2246. C# - Python.NET을 이용한 파이썬 소스코드 연동파일 다운로드1
13604정성태4/22/2024925오류 유형: 901. Visual Studio - Unable to set the next statement. Set next statement cannot be used in '[Exception]' call stack frames.
13603정성태4/21/2024990닷넷: 2245. C# - IronPython을 이용한 파이썬 소스코드 연동파일 다운로드1
13602정성태4/20/2024991닷넷: 2244. C# - PCM 오디오 데이터를 연속(Streaming) 재생 (Windows Multimedia)파일 다운로드1
13601정성태4/19/20241011닷넷: 2243. C# - PCM 사운드 재생(NAudio)파일 다운로드1
13600정성태4/18/20241022닷넷: 2242. C# - 관리 스레드와 비관리 스레드
13599정성태4/17/2024955닷넷: 2241. C# - WAV 파일의 PCM 사운드 재생(Windows Multimedia)파일 다운로드1
13598정성태4/16/20241003닷넷: 2240. C# - WAV 파일 포맷 + LIST 헤더파일 다운로드2
13597정성태4/15/20241008닷넷: 2239. C# - WAV 파일의 PCM 데이터 생성 및 출력파일 다운로드1
13596정성태4/14/20241126닷넷: 2238. C# - WAV 기본 파일 포맷파일 다운로드1
13595정성태4/13/20241077닷넷: 2237. C# - Audio 장치 열기 (Windows Multimedia, NAudio)파일 다운로드1
13594정성태4/12/20241102닷넷: 2236. C# - Audio 장치 열람 (Windows Multimedia, NAudio)파일 다운로드1
13593정성태4/8/20241097닷넷: 2235. MSBuild - AccelerateBuildsInVisualStudio 옵션
13592정성태4/2/20241239C/C++: 165. CLion으로 만든 Rust Win32 DLL을 C#과 연동
13591정성태4/2/20241212닷넷: 2234. C# - WPF 응용 프로그램에 Blazor App 통합파일 다운로드1
13590정성태3/31/20241092Linux: 70. Python - uwsgi 응용 프로그램이 k8s 환경에서 OOM 발생하는 문제
13589정성태3/29/20241199닷넷: 2233. C# - 프로세스 CPU 사용량을 나타내는 성능 카운터와 Win32 API파일 다운로드1
13588정성태3/28/20241566닷넷: 2232. C# - Unity + 닷넷 App(WinForms/WPF) 간의 Named Pipe 통신 [2]파일 다운로드1
13587정성태3/27/20241403오류 유형: 900. Windows Update 오류 - 8024402C, 80070643
[1]  2  3  4  5  6  7  8  9  10  11  12  13  14  15  ...