Microsoft MVP성태의 닷넷 이야기
Windows: 141. 설치된 Windows로부터 설치 이미지를 만드는 방법 [링크 복사], [링크+제목 복사],
조회: 21417
글쓴 사람
정성태 (techsharer at outlook.com)
홈페이지
첨부 파일
 

설치된 Windows로부터 설치 이미지를 만드는 방법

"Dell Venue 8 Pro 태블릿에 USB를 이용한 윈도우 운영체제 설치 방법"을 찾다가 알게 된 내용인데,

How To Image A Computer With Windows 10 Using dism
; https://jacobsalmela.com/2016/03/30/how-to-image-a-computer-with-windows-10-using-dism/

그 방법이 재미있어서 기록으로 남깁니다. ^^




우선, "설치된 Windows"를 얻기 위해 Hyper-V에 VM을 하나 만들고 윈도우를 설치합니다. (이 글에서는 x86을 기준으로 설명하고 "Windows 8.1 with Update x86" ISO 파일로 VM을 설치했습니다.)

그다음 아래의 명령어를 해당 VM 내에서 관리자 권한의 cmd.exe를 띄워 실행합니다.

cd C:\Windows\System32\Sysprep
sysprep.exe /generalize /shutdown

*** 주의 사항: 이 명령어는 윈도우 시스템을 설치 이전의 상태로 되돌리므로 절대로 실제 사용 중인 윈도우에서 sysprep 명령어를 내려서는 안 됩니다.

* "How To Image A Computer With Windows 10 Using dism" 글에서는 이 과정에서 unattended.xml 파일을 이용해 자동 설치를 구현하고 있습니다.
* 원 글에서는 unattended.xml 파일을 "C:\Windows\System32\Sysprep" 폴더에 복사해 두고, "sysprep.exe /generalize /oobe /unattend:Unattended.xml /shutdown"으로 명령을 내립니다.

위의 작업을 마치고 나면 VM은 종료될 테고 일단 그렇게 두시면 됩니다. 이것으로 "설치 이미지"를 구하는 방법이 끝났습니다. 위의 VM에 포함된 VHD 디스크를 보면 2개의 파티션이 생성되는데, 그 파티션을 그대로 wim 이미지로 구우면 되기 때문입니다.




이제 필요한 것이 PE 부팅 이미지 파일입니다. 이를 위해 ADK를 다운로드해서 설치해야 합니다.

Windows Assessment and Deployment Kit (Windows ADK) for Windows 8.1 Update 
; https://www.microsoft.com/en-US/download/details.aspx?id=39982

ADK가 설치된 컴퓨터에서 "Deployment and Imaging Tools Environment" 명령행 도구를 관리자 권한으로 실행한 후 다음의 명령을 내리면 PE 부팅 파일들이 마련됩니다.

copype x86 D:\WinPE\x86

원한다면 이때 생성된 "D:\WinPE\x86" 폴더의 내용에 다음과 같은 명령어를 통해 원하는 device driver를 추가하는 것도 가능합니다. (물론, 원하는 device driver가 없다면 이 과정을 생략해도 됩니다.)

Dism /Mount-Image /ImageFile:"D:\WinPE\x86\media\sources\boot.wim" /index:1 /MountDir:"D:\WinPE\x86\mount"

Dism /Add-Driver /Image:"D:\WinPE\x86\mount" /Driver:"C:\...your driver's INF file..."

Dism /Unmount-Image /MountDir:"D:\WinPE\x86\mount" /commit

위의 D:\WinPE\x86 폴더에 복사된 내용을 기반으로 이제 "부팅 가능한 USB"를 다음의 명령어로 만들 수 있습니다.

// USB 드라이브가 F인 경우
MakeWinPEMedia /UFD D:\WinPE\x86 F:

또는 "부팅 가능한 ISO 파일"로 만든 후 나중에 구울 수도 있습니다.

MakeWinPEMedia /ISO D:\WinPE\x86 D:\WinPE\WinPE.iso

이렇게 마련된 PE 부팅 이미지 파일로 sysprep을 실행했던 그 VM을 부팅시킬 수 있습니다. WinPE.iso 파일을 가상 머신의 DVD 드라이브로 연결해 주고 부팅 순서를 CD로 잡아줍니다. (즉, sysprep을 했던 그 VM에서 MakeWinPEMedia로 만든 이미지로 부팅이 되어야 합니다. sysprep을 했던 C 드라이브로 부팅하면 절대 안 됩니다.) 부팅하고 재빠르게 키를 눌러줘야 "CD"로 부팅이 됩니다.

정상적으로 winpe.iso 이미지로 부팅했으면 화면에는 X 드라이브로 연결된 명령행 창이 뜨면서 (x:\windows\system32) 초기 "wpeinit" 명령어가 수행됩니다.

이 명령행 창에서 sysprep을 했던 윈도우의 환경을 설치 가능한 wim 이미지 파일로 만드는 것이 가능합니다.

기본적으로 설치된 VM의 Disk 0에는 파티션이 2개("System Reserved"와 "Primary")가 있는데 이것을 그대로 wim 이미지 파일로 만들어 주는 것입니다. 이를 위해 우선 다음의 명령어로 각각의 파티션에 드라이브 문자를 할당해 줍니다.

diskpart
select disk 0

select partition 1
active
assign letter=r

select partition 2
active
assign letter=c
exit

보는 바와 같이 "System Reserved" 파티션을 R로, VM의 운영체제가 설치되어 있던 Primary 파티션을 C 드라이브로 설정했습니다.

그다음, 각각의 드라이브를 개별 wim 파일로 저장해 둘 텐데요. 이를 위해 여기서는 Hyper-V 호스트 측에 "share"라는 공유 폴더를 만들어 주고 이를 네트워크 드라이브로 연결하겠습니다.

net use j: \\169.254.141.222\share

그 후, 다음의 명령어로 각각의 드라이브를 wim 파일로 저장할 수 있습니다.

Dism /capture-image /imagefile:j:\w10reserved.wim /CaptureDir:r:\ /Name:system_reserved
Dism /capture-image /imagefile:j:\w10.wim /CaptureDir:c:\ /Name:c_drive

즉, R 드라이브를 w10reserved.wim 파일로, C 드라이브를 w10.wim 파일로 만들었습니다.




이걸로 모든 준비는 끝났습니다. 이제 원하는 PC에서 다시 "PE 부팅 이미지 파일"로 부팅을 해줍니다. 그럼 wpeinit 명령행 윈도우가 뜰 것이고 마찬가지로 대상 컴퓨터에 동일하게 2개의 파티션을 diskpart로 잡아줍니다.

diskpart
select disk 0
clean

create partition primary size=500
select partition 1
active
format quick fs=ntfs
assign letter=r

create partition primary
select partition 2
active
format quick fs=ntfs
assign letter=c

select partition 1
active
exit

그리곤, 네트워크 드라이브에 .wim 파일들을 보관해두었기 때문에 이를 연결하고,

net use j: \\server\share /user:username

wim 이미지 파일 2개를 동일하게 대상 PC에 복원하는 것입니다.

Dism /apply-image /imagefile:j:\w10reserved.wim /index:1 /ApplyDir:r:\
Dism /apply-image /imagefile:j:\w10.wim /index:1 /ApplyDir:c:\

* "How To Image A Computer With Windows 10 Using dism" 글에서는 "copy /Y j:\SetupComplete.cmd c:\windows\setup\scripts\SetupComplete.cmd" 명령어로 SetupComplete.cmd 파일을 복사하는 과정까지 포함합니다.
* SetupComplete.cmd는 "del /f %windir%\system32\sysprep\unattended.xml" 명령어만 포함하는 간단한 명령행 스크립트 파일입니다.
* 이 명령어를 통해 윈도우 설치 후 민감한 정보를 담고 있는 unattended.xml 파일을 자동으로 삭제하는 역할을 합니다.

이렇게 wim 이미지를 적용했으면 이제 USB 드라이브를 빼고 부팅하시면 sysprep 이미지 처리한 부팅으로 진입하게 되고 정상적으로 윈도우 설치를 마무리할 수 있습니다.




참고로, 제가 원하는 상황과 맞지 않았기 때문에 저도 위의 /apply-image 단계는 실습해 보지 않았습니다. 그래도 저런 식의 설치도 가능하다는 것이 알아둘 만 했습니다. ^^




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







[최초 등록일: ]
[최종 수정일: 5/3/2017]

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)
13718정성태8/27/20247432오류 유형: 921. Visual C++ - error C1083: Cannot open include file: 'float.h': No such file or directory [2]
13717정성태8/26/20247023VS.NET IDE: 192. Visual Studio 2022 - Windows XP / 2003용 C/C++ 프로젝트 빌드
13716정성태8/21/20246766C/C++: 167. Visual C++ - 윈도우 환경에서 _execv 동작 [1]
13715정성태8/19/20247383Linux: 78. 리눅스 C/C++ - 특정 버전의 glibc 빌드 (docker-glibc-builder)
13714정성태8/19/20246759닷넷: 2295. C# 12 - 기본 생성자(Primary constructors) (책 오타 수정) [3]
13713정성태8/16/20247487개발 환경 구성: 721. WSL 2에서의 Hyper-V Socket 연동
13712정성태8/14/20247225개발 환경 구성: 720. Synology NAS - docker 원격 제어를 위한 TCP 바인딩 추가
13711정성태8/13/20248074Linux: 77. C# / Linux - zombie process (defunct process) [1]파일 다운로드1
13710정성태8/8/20248000닷넷: 2294. C# 13 - (6) iterator 또는 비동기 메서드에서 ref와 unsafe 사용을 부분적으로 허용파일 다운로드1
13709정성태8/7/20247765닷넷: 2293. C# - safe/unsafe 문맥에 대한 C# 13의 (하위 호환을 깨는) 변화파일 다운로드1
13708정성태8/7/20247548개발 환경 구성: 719. ffmpeg / YoutubeExplode - mp4 동영상 파일로부터 Audio 파일 추출
13707정성태8/6/20247791닷넷: 2292. C# - 자식 프로세스의 출력이 4,096보다 많은 경우 Process.WaitForExit 호출 시 hang 현상파일 다운로드1
13706정성태8/5/20247899개발 환경 구성: 718. Hyper-V - 리눅스 VM에 새로운 디스크 추가
13705정성태8/4/20248167닷넷: 2291. C# 13 - (5) params 인자 타입으로 컬렉션 허용 [2]파일 다운로드1
13704정성태8/2/20248126닷넷: 2290. C# - 간이 dotnet-dump 프로그램 만들기파일 다운로드1
13703정성태8/1/20247450닷넷: 2289. "dotnet-dump ps" 명령어가 닷넷 프로세스를 찾는 방법
13702정성태7/31/20247860닷넷: 2288. Collection 식을 지원하는 사용자 정의 타입을 CollectionBuilder 특성으로 성능 보완파일 다운로드1
13701정성태7/30/20248130닷넷: 2287. C# 13 - (4) Indexer를 이용한 개체 초기화 구문에서 System.Index 연산자 허용파일 다운로드1
13700정성태7/29/20247751디버깅 기술: 200. DLL Export/Import의 Hint 의미
13699정성태7/27/20248251닷넷: 2286. C# 13 - (3) Monitor를 대체할 Lock 타입파일 다운로드1
13698정성태7/27/20248208닷넷: 2285. C# - async 메서드에서의 System.Threading.Lock 잠금 처리파일 다운로드1
13697정성태7/26/20247932닷넷: 2284. C# - async 메서드에서의 lock/Monitor.Enter/Exit 잠금 처리파일 다운로드1
13696정성태7/26/20247468오류 유형: 920. dotnet publish - error NETSDK1047: Assets file '...\obj\project.assets.json' doesn't have a target for '...'
13695정성태7/25/20247455닷넷: 2283. C# - Lock / Wait 상태에서도 STA COM 메서드 호출 처리파일 다운로드1
13694정성태7/25/20247919닷넷: 2282. C# - ASP.NET Core Web App의 Request 용량 상한값 (Kestrel, IIS)
13693정성태7/24/20247244개발 환경 구성: 717. Visual Studio - C# 프로젝트에서 레지스트리에 등록하지 않은 COM 개체 참조 및 사용 방법파일 다운로드1
1  2  3  4  5  6  7  8  [9]  10  11  12  13  14  15  ...