Saturday, January 11, 2020

adding drivers to Windows PE boot.wim

필요에 따라 Windows 설치, 복구 등을 위해 인터넷에서 이리저리 다운로드한 windows PE를 usb boot 드라이브로 사용한다.
윈도우 10도 나온지가 좀 되다보니 일부  WLAN이나  SAS RAID 등이 인식되지 않는 경우가 있다.
해당 드라이버는 제조사 홈페잊 등에서 받으면 되지만, PE 부팅 상태에서 잡아주는 것은 쉽지가 않다.
그나마 이전 버젼의 윈도우 10 (THreshold)까지는 dpinst (https://docs.microsoft.com/ko-kr/archive/blogs/svengruenitz/driver-installation-and-updating-made-easy-dpinst-exe)를 이용해 설치할 수는 있었다.
하지만  윈도우 10 RedStone 버전 이 후부터는 그마저 사용이 되지 않아서 PE 이미지 자체에 드라이버를  injection  해야 하는 것으로 알고있다.

드라이버 파일을 PE image (iso 파일)에 있는 boot.wim 파일에 주입하는 방법을 시도해 보았다.

*인터넷에서 다운받은  DISM-GUI를  사용하려고 했으나, 이유를 알수 없는 에러가 한번씩 나타나서 결국 오리지널 dism 명령어를 사용하는 것이 낫다 싶었다....

1. 일단 dism (https://docs.microsoft.com/en-us/windows-hardware/manufacture/desktop/what-is-dism)일 이용하여 작업하기 위한 환경이다.

a. wim 이미지를 마운트하여 풀기 위한 폴더를 준비
   여기서는 c:\wimmnt
b. 드라이버 파일을 다운로드 받아와 압축을 풀어둘 폴더 준비
   여기서는 c:\wimdrv

2. 작업 대상 wim 파일은 e:\sources\boot.wim 파일이다.
   먼저 커맨더 프롬프트 또는 PowerShell을 관리자 계정으로 띄워준다.
3.  wim 파일을 마운트 (wim 파일 내의 내용을 특정 폴더에 풀어주어 내부 파일 작업을 하도록 하는 것) 한다.

 C:\Windows\system32> Dism /Mount-wim /wimFile:"e:\sources\boot.wim" /index:1 /MountDir:"c:\wimmnt"

배포 이미지 서비스 및 관리 도구
버전: 10.0.18362.1


오류: 0xc1420127

지정한 wim의 지정한 이미지가 읽기/쓰기 액세스용으로 이미 탑재되어 있습니다.

DISM 로그 파일은 C:\Windows\Logs\DISM\dism.log에 있습니다.

DISM-GUI 툴을 사용하다가 마운트된 상태에서 오류가 생겨 리부팅 했더니 해당 정보가 시스템에 locked 된 모양이다.
 PS C:\Windows\system32> dism /unmount-wim /mountdir:"c:\wimmnt" /discard

배포 이미지 서비스 및 관리 도구
버전: 10.0.18362.1

이미지 파일: E:\sources\boot.wim
이미지 색인: 1
이미지를 탑재 해제하는 중
[==========================100.0%==========================]
작업을 완료했습니다.

언마운트 한 후 다시 마운트

 C:\Windows\system32> Dism /Mount-wim /wimFile:"e:\sources\boot.wim" /index:1 /MountDir:"c:\wimmnt"

배포 이미지 서비스 및 관리 도구
버전: 10.0.18362.1

이미지를 탑재하는 중
[==========================100.0%==========================]
작업을 완료했습니다.

4.  드라이버 주입
  C:\Windows\system32> dism /Image:C:\wimmnt /Add-Driver /Driver:c:\wimdrv /Recurse /forceunsigned

배포 이미지 서비스 및 관리 도구
버전: 10.0.18362.1


오류: 50

DISM은 Windows Vista RTM 또는 이전 운영 체제 서비스를 지원하지 않습니다.
운영 체제가 지원되는 경우 SSShim.DLL이 있는지 확인하십시오.

DISM 로그 파일은 C:\Windows\Logs\DISM\dism.log에 있습니다.

이런 원인을 알수 없는 에러는 wim 파일 생성 과정에 있지 않나 싶은데...


dism /online /cleanup-image /checkhealth 
dism /online /cleanup-image /restorehealth

명령으로 확인한다.


PS C:\Windows\system32> DISM /Online /Cleanup-Image /RestoreHealth /source:WIM:c:\Sources\boot.wim:1 /LimitAccess

배포 이미지 서비스 및 관리 도구
버전: 10.0.18362.1

이미지 버전: 10.0.18362.535

[==========================100.0%==========================] 복원 작업을 완료했습니다.

그렇게 했음에도 여전히 동일한 오류를 내뱉는다...
PS C:\Windows\system32> DISM /Online /Cleanup-Image /RestoreHealth /source:WIM:c:\Sources\boot.wim:1 /LimitAccess

배포 이미지 서비스 및 관리 도구
버전: 10.0.18362.1

이미지 버전: 10.0.18362.535

[==========================100.0%==========================] 복원 작업을 완료했습니다.

PS C:\Windows\system32> SFC /SCANNOW /OFFBOOTDIR=C:\wimmnt /OFFWINDIR=C:\Wimmnt\windows

Windows 리소스 보호에서 복구 서비스를 시작할 수 없습니다.



 RESTOREHEALTH와 sfc 명령을 수행해도 동일한 오류가 발생되는 경우는, 윈도우 10 ADK를 설치해야만 한다는 인터넷 Q&A도 있다.

For those looking for the Windows 10 Assessment and Deployment Kit (ADK a.k.a. Windows 10 ADK) it’s available here:
Download kits and tools for Windows 10
https://msdn.microsoft.com/en-us/windows/hardware/dn913721(v=vs.8.5).aspx
Way at the bottom, you will see:
”Learn about what's new in the Windows ADK for Windows 10”
“Download the Windows ADK for Windows 10”
Click on "Download the Windows ADK for Windows 10"
http://go.microsoft.com/fwlink/p/?LinkId=526740
or just use “http://download.microsoft.com/download/8/1/9/8197FEB9-FABE-48FD-A537-7D8709586715/adk/adksetup.exe


할수없이 ADK를 다운받아 설치하니 6.7 GB 용량 정도를 다운로드 받아 설치한다.

설치 후  "windows kit" 시작 메뉴에서 "윈도우 배포 및 이미징 도구 환경"으로 들어가서 재수행.
C:\Program Files (x86)\Windows Kits\10\Assessment and Deployment Kit\Deployment Tools>Dism /Mount-wim /wimFile:"e:\sources\boot.wim" /index:1 /MountDir:"c:\wimmnt"

배포 이미지 서비스 및 관리 도구
버전: 10.0.14393.0

이미지를 탑재하는 중
[==========================100.0%==========================]
작업을 완료했습니다.

C:\Program Files (x86)\Windows Kits\10\Assessment and Deployment Kit\Deployment Tools>dism /Image:C:\wimmnt /Add-Driver /Driver:c:\wimdrv /Recurse /forceunsigned

배포 이미지 서비스 및 관리 도구
버전: 10.0.14393.0


오류: 50

DISM은 Windows Vista RTM 또는 이전 운영 체제 서비스를 지원하지 않습니다.
운영 체제가 지원되는 경우 SSShim.DLL이 있는지 확인하십시오.

DISM 로그 파일은 C:\Windows\Logs\DISM\dism.log에 있습니다.

마찬가지 오류가 계속 발생한다.

결국 WIndows PE를 새로 만들어야 하나......
windows-PE 만들기를 찾아보니 아래 microsoft 사이트를 안내한다.
 https://docs.microsoft.com/en-us/windows-hardware/manufacture/desktop/download-winpe--windows-pe

말인즉, 앞서 설치한 windows ADK에 winpe add-on을 설치해야 한다.
https://go.microsoft.com/fwlink/?linkid=2022233
역시나 적은 용량의 설치 파일을 다운로드 받아 실행해 보니,
무려 5.7 GB에 달하는 파일을 다운로드해 설치한다.

앞서 설치한  ADK가 약 6.7 GB이니, 이것까지 설치하면 12.4 GB 가까운 용량이다.
재미삼아 간단히 PE 를 만들어 보려는 사람은 엄두도 못 낼 용량과 시간이다....

아무튼 아래 사이트의 Create bootable WinPE media 절차를 따라해 본다.
https://docs.microsoft.com/ko-kr/windows-hardware/manufacture/desktop/winpe-create-usb-bootable-drive

    Step 1: 작업 파일 만들기

    제일 먼저 할 일이 winPE 작업세트를 만드는 것이다. 이때 어떤 하드웨어 환경인지 정해야 한다.
    1. 배포 및 이미징 도구 환경 (Deployment and Imaging Tools Environment )을 관리자 권한으로 실행.
    2. Run copype 명령을 이용해 작업 WinPE 파일을 만든다.
      C:\Program Files (x86)\Windows Kits\10\Assessment and Deployment Kit\Deployment Tools>copype amd64 c:\winpe

      ===================================================
      Creating Windows PE customization working directory

          c:\winpe
      ===================================================

      C:\Program Files (x86)\Windows Kits\10\Assessment and Deployment Kit\Windows Preinstallation Environment\amd64\Media\bootmgr
      C:\Program Files (x86)\Windows Kits\10\Assessment and Deployment Kit\Windows Preinstallation Environment\amd64\Media\bootmgr.efi 
      ...
      C:\Program Files (x86)\Windows Kits\10\Assessment and Deployment Kit\Windows Preinstallation Environment\amd64\Media\zh-tw\bootmgr.efi.mui
      153개 파일이 복사되었습니다.
              1개 파일이 복사되었습니다.
              1개 파일이 복사되었습니다.
              1개 파일이 복사되었습니다.

      Success
       

    Step 2: WinPE 커스터마이징 (통상 불필요)

    WinPE에 이런저런 패키지를 추가하면 성능과 부팅 시간이 안 좋아지므로 꼭 필요한 것만 반영하자..

    일반적인 커스터마이징

    • update 추가.
    • 비디오나 네트웍 드라이버 추가. (WinPE에 기본적인 드라이버가 있지만 경우에 따라 추가할 필요가 있다. WinPE: Add drivers.

    • PowerShell 스크립팅 지원 추가.
    • 고성능을 위한 전원 규칙 지정.
    • WinPE 최적화: 램이나 저장 용량이 작은 장비에만 권고 ( 1GB RAM/16GB 용량 등).

    Step 3: 부팅 미디어 생성

    작업 파일 세트를 만들고 나면  MakeWinPEMedia 를 이용해 부팅 가능한 WinPE 미디어 생성.

    WinPE USB drive

    1.  USB 드라이브를  PC에 꽂고.
    2.  배포 및 이미징 도구 환경을 관리자 권한으로 실행.
    3. MakeWinPEMedia 실행 전에 포맷하는 옵션도 있음. FAT32로 포맷함. WinPE USB 에서 4GB 이상 파일을 저장하고 싶다면 NTFS로 포맷된 추가 파티션을 가지는 다중 파티션 드라이브도 만들 수 있음.
    4. MakeWinPEMedia/UFD 옵션과 함께 사용해 포맷과 설치:
    1. MakeWinPEMedia /UFD C:\WinPE_amd64 P:
      

    Create a WinPE ISO, DVD, or CD

    1. MakeWinPEMedia/ISO 옵션과 함께 사용하면 윈도우  PE 파일을 담은 iso파일 생성:
  1. MakeWinPEMedia /ISO C:\WinPE_amd64 C:\WinPE_amd64\WinPE_amd64.iso
    
     
위 절차에 따라 드라이버를 설치하려고 하니 결국 다시  dism을 이용해 wim 파일에 드라이버를 추가하는 방식으로 돌아간다.
copype 명령으로 만들어진 c:\winpe 폴더에 아래와 같이 폴더가 생성된다.
fwfiles\
media\
mount\
이 중 c:\winpe\media\sources\boot.wim 파일을 마운트 한다.
C:\Program Files (x86)\Windows Kits\10\Assessment and Deployment Kit\Deployment Tools>dism /mount-wim /wimfile:c:\winpe\media\sources\boot.wim /index:1 /mountdir:c:\winpe\mount

배포 이미지 서비스 및 관리 도구
버전: 10.0.14393.0

이미지를 탑재하는 중
[==========================100.0%==========================]
작업을 완료했습니다.

***근데, 썅... ADK 설치 후 dism 파일의 버젼이 오히려 더 내려갔다.
버전 10.0.18362.1에서 "오류: 50 DISM은 Windows Vista RTM 또는 이전 운영 체제 서비스를 지원하지 않습니다."라고 예전 운영체제를 지원하지 않는다는 메시지 때문에 이만큼 왔는데 더 낮은 버젼이라니....

근데...아무튼 드라이브 추가가 된다....


C:\Program Files (x86)\Windows Kits\10\Assessment and Deployment Kit\Deployment Tools>Dism /Image:c:\winpe\mount /Add-Driver /Driver:c:\wimdrv /Recurse

배포 이미지 서비스 및 관리 도구
버전: 10.0.14393.0

이미지 버전: 10.0.17763.1

Searching for driver packages to install...
Found 23 driver package(s) to install.
Installing 1 of 23 - c:\wimdrv\Display.Driver\nv_dispwi.inf: The driver package was successfully installed.
...
Installing 23 of 23 - c:\wimdrv\RTWLANE\netrtwlane.inf: The driver package was successfully installed.
작업을 완료했습니다.


추가로 몇가지 실행 app들을 복사.
c:\winpe\ mount 폴더 아래에 파일 복사

나머지 세세한 최적화나 app 추가 등등은 필요한 사람이 시간 투자해서 할 일이고...
C:\Program Files (x86)\Windows Kits\10\Assessment and Deployment Kit\Deployment Tools>dism /unmount-wim /mountdir:"c:\winpe\mount" /commit

배포 이미지 서비스 및 관리 도구
버전: 10.0.14393.0

이미지 파일: c:\winpe\media\sources\boot.wim
이미지 색인: 1
이미지를 저장하는 중
[==========================100.0%==========================]
이미지를 탑재 해제하는 중
[==========================100.0%==========================]
작업을 완료했습니다.

C:\Program Files (x86)\Windows Kits\10\Assessment and Deployment Kit\Deployment Tools>MakeWinPEMedia /ISO C:\WinPE C:\WinPE\WinPE.iso

Creating C:\WinPE\WinPE.iso...

100% complete

Success

결과적으로 인터넷에서 다운로드 받은 여러 윈도우 10 PE 이미지들이 최신 윈도우 ADK를 이용해서 만든 것이 아니라, 예전의 windows vista나 windows 7 환경을 기반으로 만들어져서 드라이버 추가가 안되는 건 아닌가...조심스래 추측해 본다.

이 iso 파일을 rufus를 써서 usb 부팅 디스크를 만들어 부팅해 보았다.


젠장...일반적인 데스크탑 바탕화면이 아니다.
cmd prompt만 나타나며 wpeinit이라는 스크립트가 수행된 후 더이상 진행되지 않는다.
종료조차 별도로 스크립트를 써서 종결해야 한다

앞의 드라이버 추가 과정 다음에  app등 패키지 추가를 더 해야 한다.

http://dateno1.egloos.com/1471510에 소개된 대로 해보았다.

현재 이미지에 설치된 패키지 확인.
C:\Program Files (x86)\Windows Kits\10\Assessment and Deployment Kit\Deployment Tools>Dism /Get-Packages /Image:c:\winpe\mount

배포 이미지 서비스 및 관리 도구
버전: 10.0.14393.0

이미지 버전: 10.0.17763.1

Packages listing:

Package Identity : Microsoft-Windows-WinPE-LanguagePack-Package~31bf3856ad364e35~amd64~en-US~10.0.17763.1
State : Installed
Release Type : Language Pack
Install Time : 2018-09-15 오전 6:39

Package Identity : Microsoft-Windows-WinPE-Package~31bf3856ad364e35~amd64~~10.0.17763.1
State : Installed
Release Type : Foundation
Install Time : 2018-09-15 오전 6:37

작업을 완료했습니다.
 그 다음으로
참고로 추가한 패키지 목록은...
FontSupport-KO-KR.cab
HTA.cab
WMI.cab
Scripting.cab
NetFx.cab
PowerShell.cab
SecureBootCmdlets.cab
DismCmdlets.cab
StorageWMI.cab
SecureStartup.cab
EnhancedStorage.cab

Dot3Svc.cab
ko-kr\lp.cab
ko-kr\HTA_ko-kr.cab
ko-kr\WMI_ko-kr.cab
ko-kr\Scripting_ko-kr.cab
ko-kr\NetFx_ko-kr.cab
ko-kr\PowerShell_ko-kr.cab
ko-kr\DismCmdlets_ko-kr.cab
ko-kr\StorageWMI_ko-kr.cab
ko-kr\SecureStartup_ko-kr.cab
ko-kr\EnhancedStorage_ko-kr.cab

ko-kr\Dot3Svc_ko-kr.cab
를 추가하였습니다 (패키지도 의존성 (위의 MS가 제공하는 문서 참조)이 있으므로 이 목록을 쓰실분들은 반드시 순서대로 병합해주세요)
 
그대로 수행하니 오류가 나온다.
 C:\Program Files (x86)\Windows Kits\10\Assessment and Deployment Kit\Deployment Tools>Dism /Add-Package /Image:c:\winpe\mount /PackagePath:FontSupport-KO-KR.cab

배포 이미지 서비스 및 관리 도구
버전: 10.0.14393.0

이미지 버전: 10.0.17763.1

An error occurred trying to open - FontSupport-KO-KR.cab Error: 0x80070003
An error occurred trying to open - C:\Program Files (x86)\Windows Kits\10\Assessment and Deployment Kit\Deployment Tools\FontSupport-KO-KR.cab Error: 0x80070003

오류: 3

An error occurred trying to open - C:\Program Files (x86)\Windows Kits\10\Assessment and Deployment Kit\Deployment Tools\FontSupport-KO-KR.cab Error: 0x80070003

DISM 로그 파일은 C:\Windows\Logs\DISM\dism.log에 있습니다.
 
결국 이 패키지들을 다 다운로드 받아서 밀어넣어야 한단다....
adkwinpesetup.exe를 다시 실행하여 PE에 추가할 Optional components를 추가 설치한다.
 
설치하고 보니 c:\Program Files (x86)\Windows Kits\10\Assessment and Deployment Kit\Windows Preinstallation Environment\arm64\WinPE_OCs\ 폴더에 cab 파일들이 들어와 있다.
 
다시 재시도...
 C:\Program Files (x86)\Windows Kits\10\Assessment and Deployment Kit\Deployment Tools>Dism /Add-Package /Image:c:\winpe\mount /PackagePath:"c:\Program Files (x86)\Windows Kits\10\Assessment and Deployment Kit\Windows Preinstallation Environment\arm64\WinPE_OCs\WinPE-FontSupport-KO-KR.cab"

배포 이미지 서비스 및 관리 도구
버전: 10.0.14393.0

이미지 버전: 10.0.17763.1

Processing 1 of 1 - Adding package Microsoft-Windows-WinPE-FontSupport-KO-KR-Package~31bf3856ad364e35~arm64~~10.0.17763.1
[==========================100.0%==========================]
An error occurred - Microsoft-Windows-WinPE-FontSupport-KO-KR-Package Error: 0x80070057

오류: 87

명령을 처리하는 동안 오류가 발생했습니다.
명령줄 인수가 올바른지 확인하십시오. 자세한 내용은 로그 파일을 검토하십시오.

DISM 로그 파일은 C:\Windows\Logs\DISM\dism.log에 있습니다.
 
C:\Program Files (x86)\Windows Kits\10\Assessment and Deployment Kit\Deployment Tools>Dism /Add-Package /Image:c:\winpe\mount /PackagePath:"c:\Program Files (x86)\Windows Kits\10\Assessment and Deployment Kit\Windows Preinstallation Environment\arm64\WinPE_OCs\WinPE-Dot3Svc.cab"

배포 이미지 서비스 및 관리 도구
버전: 10.0.14393.0

이미지 버전: 10.0.17763.1

Processing 1 of 1 - Adding package WinPE-Dot3Svc-Package~31bf3856ad364e35~arm64~~10.0.17763.1
[==========================100.0%==========================]

오류: 0x800f081e

The specified package is not applicable to this image.

DISM 로그 파일은 C:\Windows\Logs\DISM\dism.log에 있습니다.
 
 
일단 포기하고 다른 방법을 찾아봐야 겠다.