Microsoft MVP성태의 닷넷 이야기
Windows: 22. 가상화에 대해서. [링크 복사], [링크+제목 복사],
조회: 19392
글쓴 사람
정성태 (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)
13504정성태12/27/20232840닷넷: 2188. C# - ASP.NET Core SignalR로 구현하는 채팅 서비스 예제파일 다운로드1
13503정성태12/27/20232759Linux: 67. WSL 환경 + mlocate(locate) 도구의 /mnt 디렉터리 검색 문제
13502정성태12/26/20232765닷넷: 2187. C# - 다른 프로세스의 환경변수 읽는 예제파일 다운로드1
13501정성태12/25/20232576개발 환경 구성: 700. WSL + uwsgi - IPv6로 바인딩하는 방법
13500정성태12/24/20232719디버깅 기술: 194. Windbg - x64 가상 주소를 물리 주소로 변환
13498정성태12/23/20233402닷넷: 2186. 한국투자증권 KIS Developers OpenAPI의 C# 래퍼 버전 - eFriendOpenAPI NuGet 패키지
13497정성태12/22/20232717오류 유형: 885. Visual Studiio - error : Could not connect to the remote system. Please verify your connection settings, and that your machine is on the network and reachable.
13496정성태12/21/20232923Linux: 66. 리눅스 - 실행 중인 프로세스 내부의 환경변수 설정을 구하는 방법 (gdb)
13495정성태12/20/20232856Linux: 65. clang++로 공유 라이브러리의 -static 옵션 빌드가 가능할까요?
13494정성태12/20/20233014Linux: 64. Linux 응용 프로그램의 (C++) so 의존성 줄이기(ReleaseMinDependency) - 두 번째 이야기
13493정성태12/19/20233127닷넷: 2185. C# - object를 QueryString으로 직렬화하는 방법
13492정성태12/19/20232790개발 환경 구성: 699. WSL에 nopCommerce 예제 구성
13491정성태12/19/20232530Linux: 63. 리눅스 - 다중 그룹 또는 사용자를 리소스에 권한 부여
13490정성태12/19/20232668개발 환경 구성: 698. Golang - GLIBC 의존을 없애는 정적 빌드 방법
13489정성태12/19/20232440개발 환경 구성: 697. GoLand에서 ldflags 지정 방법
13488정성태12/18/20232384오류 유형: 884. HTTP 500.0 - 명령행에서 실행한 ASP.NET Core 응용 프로그램을 실행하는 방법
13487정성태12/16/20232699개발 환경 구성: 696. C# - 리눅스용 AOT 빌드를 docker에서 수행 [1]
13486정성태12/15/20232509개발 환경 구성: 695. Nuget config 파일에 값 설정/삭제 방법
13485정성태12/15/20232378오류 유형: 883. dotnet build/restore - error : Root element is missing
13484정성태12/14/20232555개발 환경 구성: 694. Windows 디렉터리 경로를 WSL의 /mnt 포맷으로 구하는 방법
13483정성태12/14/20232748닷넷: 2184. C# - 하나의 resource 파일을 여러 프로그램에서 (AOT 시에도) 사용하는 방법파일 다운로드1
13482정성태12/13/20233387닷넷: 2183. C# - eFriend Expert OCX 예제를 .NET Core/5+ Console App에서 사용하는 방법 [2]파일 다운로드1
13481정성태12/13/20232752개발 환경 구성: 693. msbuild - .NET Core/5+ 프로젝트에서 resgen을 이용한 리소스 파일 생성 방법파일 다운로드1
13480정성태12/12/20233131개발 환경 구성: 692. Windows WSL 2 + Chrome 웹 브라우저 설치
13479정성태12/11/20232652개발 환경 구성: 691. WSL 2 (Ubuntu) + nginx 환경 설정
13477정성태12/8/20232890닷넷: 2182. C# - .NET 7부터 추가된 Int128, UInt128 [1]파일 다운로드1
1  2  3  4  5  [6]  7  8  9  10  11  12  13  14  15  ...