유연한 가상화

개요

유연한 가상화 기능은 앱에서 파일 및 레지스트리 항목의 일부 세트가 다른 앱에 표시되고 앱 제거 시 지속되어야 한다고 선언하는 방법을 제공합니다. 다른 모든 파일 및 레지스트리 항목은 다른 앱에 표시되지 않으며 제거 시 제거됩니다.

선택한 위치의 가상화를 제어하는 방법

참고

이 섹션에서 설명하는 동작은 Windows 10 버전 21H1에 도입되었습니다.

Windows 10 버전 21H1부터 시스템은 unvirtualizedResources 제한된 기능의 기존 동작과 RegistryWriteVirtualizationFilesystemWriteVirtualization 속성을 유지합니다. 또한 시스템은 앱에서 가상화하지 않으려는 특정 폴더 및/또는 레지스트리 키를 선언할 수 있는 기능을 추가합니다.

  • %USERPROFILE%\AppData 내에 있는 파일 시스템 위치만 선언할 수 있습니다.
  • HKCU 내에 있는 레지스트리 위치만 선언할 수 있습니다.

예를 들면 다음과 같습니다.

<!-- Declare the desktop6 and/or virtualization XML namespace where the virtualization properties are defined, and include this in the list of ignorable namespaces. -->
<!-- Declare the XML namespace for the required restricted capability, and include it in the list of ignorable namespaces. -->
<Package
  xmlns="http://schemas.microsoft.com/appx/manifest/foundation/windows10"
  xmlns:desktop6="http://schemas.microsoft.com/appx/manifest/desktop/windows10/6"
  xmlns:rescap="http://schemas.microsoft.com/appx/manifest/foundation/windows10/restrictedcapabilities"
  xmlns:virtualization="http://schemas.microsoft.com/appx/manifest/virtualization/windows10"
  IgnorableNamespaces="rescap desktop6 virtualization">

  <!-- ... -->
  <!-- Other entries omitted for brevity. -->
  <!-- ... -->

  <Properties>
    <!-- If you don't want virtualization of registry writes to HKEY_CURRENT_USER, then include the property, and set it to disabled. -->
    <desktop6:RegistryWriteVirtualization>disabled</desktop6:RegistryWriteVirtualization>

    <!-- If you don't want virtualization of file system writes to the user's AppData folder, then include the property, and set it to disabled. -->
    <desktop6:FileSystemWriteVirtualization>disabled</desktop6:FileSystemWriteVirtualization>
    
    <!-- On Windows 10, version 21H1 and later OS versions, you can declare specific file system and/or registry locations that you want to be unvirtualized. 
    If these are recognized on the current device, then they take precedence over the old declarations. On older devices,
    the new declarations are ignored and the old ones are honored. -->
    <virtualization:FileSystemWriteVirtualization>
      <virtualization:ExcludedDirectories>
        <virtualization:ExcludedDirectory>$(KnownFolder:LocalAppData)\Fabrikam\Widgets</virtualization:ExcludedDirectory>
        <virtualization:ExcludedDirectory>$(KnownFolder:RoamingAppData)\Fabrikam\Widgets</virtualization:ExcludedDirectory>
      </virtualization:ExcludedDirectories>
    </virtualization:FileSystemWriteVirtualization>

    <virtualization:RegistryWriteVirtualization>
      <virtualization:ExcludedKeys>
        <virtualization:ExcludedKey>HKEY_CURRENT_USER\Software\Fabrikam\Widgets</virtualization:ExcludedKey>
      </virtualization:ExcludedKeys>
    </virtualization:RegistryWriteVirtualization>
  </Properties>

  <Capabilities>
    <!-- Include the required restricted capability. -->
    <rescap:Capability Name="unvirtualizedResources"/>
  </Capabilities>
</Package>

참고

앱에서 Windows 10 버전 21H1 이전 및 Windows 10 버전 21H1 구문을 모두 선언하는 경우 이전 선언은 Windows 10 버전 21H1 이전 버전에서 사용되지만 새 선언은 Windows 10 버전 21H1 이상에서 사용됩니다.

Windows 10 버전 21H1 이전의 메커니즘

기존 환경에서 앱은 파일을 대부분의 파일 시스템 위치에서 만들고, 업데이트하고, 삭제할 수 있습니다. 그리고 Windows 레지스트리에서 항목을 만들고, 업데이트하고, 삭제할 수 있습니다. 이러한 파일과 레지스트리 항목은 시스템의 다른 앱에 표시되지만, 이렇게 표시할 필요가 없는 경우도 많습니다. 또한 앱이 제거되더라도 이러한 파일과 레지스트리 항목이 남아 있는 경우가 많으며 이로 인해 복잡해집니다.

UWP(유니버설 Windows 플랫폼)에서 이러한 파일과 레지스트리 항목은 해당 파일과 항목을 작성하는 앱만 표시되도록 가상화됩니다. 그리고 앱이 제거되면 이러한 파일과 레지스트리 항목도 제거됩니다. 그러나 앱에서 이러한 파일 및 레지스트리 항목을 다른 앱에 표시하도록 하려는 유효한 시나리오가 있습니다. 또한 다른 앱에서는 이러한 파일과 항목을 작성한 앱이 제거된 후에도 해당 파일과 항목을 유지해야 할 수 있습니다.

기본 데스크톱 브리지 동작

위치 컨텍스트 설명
HKCU 설치 시간
  • 앱에는 user.dat\\ 항목을 지정하는 user.dat 파일이 포함될 수 있습니다. 이러한 항목은 실제로 사용자의 user.dat 폴더(각 앱의 하위 폴더)에 있는 user.dat 파일에 기록되고 키가 HKCU에 있는 것처럼 앱에 표시됩니다.
  • 읽기의 경우 이 프라이빗 하이브는 가상화되지 않은 HKCUSoftware와 병합되어 모든 항목이 동일한 위치에 있는 것으로 표시됩니다.
  • 앱이 제거되면 가상화된 항목은 실제로 레지스트리에 추가되지 않았으므로 더 이상 사용할 수 없습니다.
  • 가상화된 하이브의 키는 앱에만 표시됩니다.
HKCU 실행 시간
  • 쓰기는 별도의 앱별, 사용자별 프라이빗 하이브로 이동합니다.
  • 읽기의 경우 이 하이브는 가상화되지 않은 HKCU와 병합되어 모든 항목이 동일한 위치에 있는 것으로 표시됩니다.
  • 앱이 제거되면 가상화된 항목이 제거됩니다.
  • 가상화된 하이브의 키는 앱에만 표시됩니다.
HKLM 설치 시간
  • 앱에는 registry.dat\\ 항목을 지정하는 registry.dat 파일이 포함될 수 있습니다. 이러한 항목은 실제로 사용자의 user.dat 폴더(각 앱의 하위 폴더)에 있는 user.dat 파일에 기록되고 키가 HKLM에 있는 것처럼 앱에 표시됩니다.
  • 읽기의 경우 이 프라이빗 하이브는 가상화되지 않은 HKLMSoftware와 병합되어 모든 항목이 동일한 위치에 있는 것으로 표시됩니다.
  • 앱이 제거되면 가상화된 항목은 실제로 레지스트리에 추가되지 않았으므로 더 이상 사용할 수 없습니다.
  • 가상화된 하이브의 키는 앱에만 표시됩니다.
HKLM 실행 시간
  • 해당 키/값이 패키지 하이브에 없고 사용자에게 올바른 액세스 권한이 있는 경우 HKLM 아래의 쓰기가 허용됩니다(이는 실제로 관리자 권한으로 실행되는 Centennial 앱에서만 사용할 수 있음을 의미함).
잘 알려진 폴더 설치 시간
  • 앱에는 임의의 파일을 포함하는 잘 알려진 이름의 하위 폴더가 있는 VFS 폴더가 포함될 수 있습니다.
  • 읽기의 경우 이러한 하위 폴더는 가상화되지 않은 잘 알려진 위치와 병합되어 모든 파일이 동일한 위치에 있는 것으로 표시됩니다.
앱 데이터 실행 시간
  • Windows 버전 1809 이하의 경우 사용자의 AppData 폴더에 대한 모든 쓰기(만들기, 삭제 및 업데이트 포함)는 쓰기 시 사용자별, 앱별 프라이빗 위치에 복사되며, 실행 시간에 병합되어 실제 AppData 위치에 표시됩니다.
  • 1809보다 큰 Windows 버전의 경우 사용자의 AppData 폴더에 새로 만든 모든 파일과 폴더는 사용자별, 앱별 프라이빗 위치에 기록되며, 실행 시간에 병합되어 실제 AppData 위치에 표시됩니다. 기존 AppData 파일에 대한 수정은 가상화되지 않은 파일에서 수행됩니다. 읽기의 경우 시스템은 먼저 프라이빗 위치를 시도한 다음, 가상화되지 않은 AppData로 대체합니다.
  • 대체(fallback) 시 가상화되지 않은 파일에 대한 쓰기가 허용됩니다.
  • 앱이 제거되면 가상화된 항목이 제거됩니다.
  • 가상화된 위치의 파일은 앱에만 표시됩니다.
  • AppData에 대한 VFS 지원은 없습니다.
  • AppData 외에도 앱은 의 다른 부분(AppData은 이 중 한 부분에 해당)을 포함하여 사용자에게 쓰기 액세스 권한이 있는 모든 위치에 쓸 수 있습니다.

unvirtualizedResources 제한된 기능

참고

unvirtualizedResources 제한된 기능에 대한 지원은 Windows 10 2019년 5월 업데이트라고도 하는 Windows 10 버전 1903(10.0, 빌드 18362)에 도입되었습니다.

앱은 unvirtualizedResources 제한된 기능을 선언하고, unvirtualizedResources 및/또는 FilesystemWriteVirtualization 속성을 로 설정하여 HKCU 및/또는 AppData에 대한 쓰기 액세스 권한을 얻습니다. 이는 앱이 패키지 외부의 다른 프로세스에 표시되는 항목을 작성해야 하는 경우에 사용하도록 설정하기 위한 것입니다. 예를 들어 게임은 저장 데이터를 AppData에 기록하고, 해당 데이터는 게임이 제거된 후에도 유지해야 합니다.

속성 설명
RegistryWriteVirtualization=disabled HKCU에 대한 쓰기는 가상화되지 않은 위치로 이동하고, 패키지 외부의 다른 프로세스에 표시되며, 앱 제거 시 정리되지 않습니다.
FilesystemWriteVirtualization=disabled AppData에 대한 쓰기는 가상화되지 않은 위치로 이동하고, 패키지 외부의 다른 프로세스에 표시되며, 앱 제거 시 정리되지 않습니다.

이 메커니즘은 기본 목표를 위반하는 HKCU 및/또는 AppData 가상화를 모두 해제합니다. 이는 세분화된 도구가 아니며 지정된 앱의 요구 사항을 초과하는 경우가 많습니다.