Microsoft MVP성태의 닷넷 이야기
글쓴 사람
정성태 (techsharer at outlook.com)
홈페이지
첨부 파일
 

smigdeploy.exe를 이용한 Windows Server 2016에서 2019로 마이그레이션 방법

Azure에서의 VM은 in-place 업그레이드가 가능하지 않으므로,

Performing an in-place system upgrade is not supported on Windows-based Azure VMs
; https://docs.microsoft.com/en-us/troubleshoot/azure/virtual-machines/in-place-system-upgrade

다른 방법을 사용해야 합니다.

Method 1: Deploy a newer system and migrate the workload
Method 2: Download and upgrade the VHD

이 중에서 VHD를 다운로드해 변경 후 업그레이드하는 것은 자칫 수백 GB 단위의 데이터가 오고 갈 수 있으므로 불편할 수 있습니다. 그래서 "Windows Server migration tools"를 제공해 준다고 하니 이쪽을 기웃거리게 되는데요, ^^;

Windows Server Migration Tools Installation, Access, and Removal
; https://docs.microsoft.com/en-us/previous-versions/windows/it-pro/windows-server-2008-R2-and-2008/dd379545(v=ws.10)

이름에서 느껴지는 그동안의 "마이그레이션 도구"에 대한 관행과는 달리 이게 클릭 몇 번으로 수행되는 방식이 아니라 좀 불편합니다. 일단, 한 번 어떤 식인지 따라가 볼까요? ^^




우선, 환경을 다음과 같다고 가정했을 때,

기존 서버: Windows Server 2016 (IP: 192.168.100.5)
신규 서버: Windows Server 2019 (IP: 192.168.100.6)

2대의 서버에 모두 다음의 명령어로 "Windows Server Migration Tools" 구성 요소를 설치합니다.

Add-WindowsFeature Migration

자, 이제부터 자신이 원하는 구성 요소에 대해 "Windows Server Migration Tools"의 환경에서 실행할 수 있는 PowerShell 명령어를 구사하면 됩니다. 아마도 제일 먼저 할 일은, 기존 서버에 구성한 "Roles and Features"일 텐데요, 이것들을 마이그레이션 하기 위해 우선 그 기능들의 목록을 알아내야 합니다. 이를 위해 "기존 서버"에서 "Server Manager"의 "Tools" / "Windows Server Migration Tools" / "Windows Server Migration Tools"를 실행해 뜨는 PowerShell 환경에서 Get-SmigserverFeature 명령어를 실행하고,

// 참고: https://www.learnesl.net/migrating-roles-from-server-2012r2-to-windows-server-2016/

PS C:\Windows\system32> cd .\ServerMigrationTools
PS C:\Windows\system32\ServerMigrationTools> Get-SmigserverFeature

WindowsFeatureName ID            Installed
------------------ --            ---------
                   BranchCache        True
WoW64 Support      WoW64-Support      True

출력된 WindowsFeatures에 대한 "ID"에 대해 하나씩 설정을 export 해 줍니다.

PS C:\Windows\system32\ServerMigrationTools> Export-SmigServerSetting -FeatureID BranchCache -Path:C:\mig_settings\1

cmdlet Export-SmigServerSetting at command pipeline position 1
Supply values for the following parameters:
Password: *************

      ItemType ID          Success DetailsList
      -------- --          ------- -----------
WindowsFeature BranchCache    True {}

PS C:\Windows\system32\ServerMigrationTools> Export-SmigServerSetting -FeatureID WoW64-Support -Path:C:\mig_settings\2

cmdlet Export-SmigServerSetting at command pipeline position 1
Supply values for the following parameters:
Password: *************

      ItemType ID          Success DetailsList
      -------- --          ------- -----------
WindowsFeature WoW64-Support  True {}

그다음 이렇게 해서 출력된 디렉터리의 내용을 신규 서버로 보내고,

robocopy C:\mig_settings \\192.168.100.6\c$\mig_settings /S

신규 서버 환경에서는 마찬가지로 "Server Manager"의 "Tools" / "Windows Server Migration Tools" / "Windows Server Migration Tools"를 실행해 뜨는 PowerShell 환경으로 들어가 해당 설정들을 import 합니다.

Import-SmigServerSetting -FeatureID BranchCache -Path:C:\mig_settings\1 -verbose -Force
Import-SmigServerSetting -FeatureID WoW64-Support -Path:C:\mig_settings\1 -verbose -Force

// 이유는 알 수 없지만 제 환경에서 WoW64-Support의 경우에는 "The Windows feature with ID WoW64-Support cannot be imported to this server" 오류가 발생합니다.
// 사실, BranchCache나 WoW64-Support는 윈도우 서버가 기본적으로 Role을 구성하기 때문에 위와 같이 굳이 export/import할 필요가 없습니다.




물론, 마이그레이션 해야 할 것이 "Windows Features"만 있는 것은 아닙니다. 사용자 계정도 로컬에 만들었다면 신규 서버로 옮겨줘야 하는데요,

What is Windows Server Migration Tools and how to use it?
; https://www.ubackup.com/windows-server/how-to-use-windows-server-migration-tools-6988.html

Windows Features를 했을 때와 마찬가지로 Export-SmigServerSetting / Import-SmigServerSetting 명령어를 이용하지만 옵션이 달라집니다.

// 소스 서버
Export-SmigServerSetting -User All -Group -Path C:\SrcUsersGroups ?Verbose
robocopy C:\SrcUsersGroups \\192.168.100.6\c$\SrcUsersGroups /S

// 대상 서버
Import-SmigServerSetting -User Enabled -Group -Path C:\SrcUsersGroups -Verbose

(export/import 후에는 개별 사용자들이 모두 "User must change password at next logon", "Account is disabled" 되어 있기 때문에 필요하다면 이를 직접 활성화해야 합니다.)

참고로, SQL Server가 설치된 경우라면 다음과 같은 식의 오류가 발생하는데요,

VERBOSE: Warning 1379: Group Performance Monitor Users was not imported because the group already exists on the local
computer.
VERBOSE: Error 1379: Member NT SERVICE\SQLSERVERAGENT cannot be added to group Performance Monitor Users.
VERBOSE: Error 1379: Member NT SERVICE\MSSQLSERVER cannot be added to group Performance Monitor Users.

문제 될 것은 없지만, 저런 오류가 거슬리는 분들은 사용자/그룹을 마이그레이션하기 전에 SQL Server를 미리 설치해 두어야 합니다.




사실, 사용자/그룹 설정을 복사하는 것보다 더 중요한 것은 "User Profile"의 내용일 것입니다. 이에 대해서는 다음의 글에서 소개하고 있으니 참고하시고.

Windows Server ? Migrating Files / Folders / Shares / User Profiles
; https://www.petenetlive.com/KB/Article/0001201

그러니까, 남은 작업이라면 결국 응용 프로그램과 그에 대한 데이터를 마이그레이션 해야 하는데, 위에서 "SQL Server"에 대해 짐작할 수 있었겠지만 "Windows Server Migration Tools"에서는 응용 프로그램에 대한 마이그레이션은 지원하지 않습니다.

단지, "폴더"를 복사하는 기능을 Send-SmigServerData / Receive-SmigServerData의 조합으로 제공합니다. 방법은, "신규 서버" 측에서 Receive-SmigServerData 명령어를 실행시켜 둔 후,

PS C:\windows\system32\ServerMigrationTools> Receive-SmigServerData

cmdlet Receive-SmigServerData at command pipeline position 1
Supply values for the following parameters:
Password: *************

"기존 서버" 측에서 어떤 데이터를 보낼지 선택해 Send-SmigServerData 명령어를 실행하면 됩니다.

[형식]
Send-SmigServerData -ComputerName {destination-computer-name} -SourcePath {path-to-source-folder} -DestinationPath {path-to-destination-folder} -include all -recurse

[예제: 기존 서버의 c:\db 폴더를 신규 서버의 c:\db 폴더로 모두 복사]
Send-SmigServerData -ComputerName vm2 -SourcePath c:\db -DestinationPath c:\db -include all -recurse

그런데, (/SEC 옵션을 준) robocopy가 있는데 굳이 이 기능을 사용해야 할 이유가 있을까요? 왜냐하면, 파일 권한까지 (비교적) 잘 전달이 되기 때문입니다. 예를 들어, 기존 서버에 "kevin", "admin" 계정에 대해 권한을 준 것을 robocopy/SEC로 복사하면 다음과 같이 계정 정보가 깨지지만,

win_mig_tool_1.png

*-SmigServerData 명령어로 이전하면 계정 정보가 살아 있습니다.

win_mig_tool_2.png

(kevin 계정의 경우 "SeongTae Jeong" 계정으로 바뀌었는데 아마도 기존 서버의 로그인 계정이 "kevin"이었고, 신규 서버의 로그인 계정이 "SeongTae Jeong"이었으므로 그렇게 된 듯합니다.) 그래도 이상한 것은 "admin"이라는 계정의 아이콘을 보면 "x" 표시가 되어 있는데 이에 대한 의미는 잘 모르겠습니다.

그래도 기존 서버처럼 깨진 SID(security identifier) 형식이 아니라 마이그레이션 한 후에 적절한 계정으로 다시 대체할 수 있도록 식별이 가능하다는 점에서*-SmigServerData 명령어가 아주 의미가 없진 않을 것입니다.




보는 바와 같이 "Windows Server migration tools"가 그다지 이름값을 하고 있지는 않습니다. 따라서 이것을 이용하기보다는 네트워크 전송이 좀 부담이 되어도 "Method 2: Download and upgrade the VHD" 방법을 쓰는 것이 어찌 보면 가장 안전하고 쉽게 업그레이드하는 방법일 수 잇습니다. (그나저나, 애당초 Azure에서 in-place 업그레이드를 지원하면 될 텐데... 그걸 못해주네요. ^^;)





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



donaricano-btn



[최초 등록일: ]
[최종 수정일: 9/12/2020]

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)
12938정성태1/24/202232개발 환경 구성: 633. Docker Desktop + k8s 환경에서 local 이미지를 사용하는 방법
12937정성태1/24/202241.NET Framework: 1139. C# - ffmpeg(FFmpeg.AutoGen)를 이용해 오디오(mp2) 인코딩하는 예제(encode_audio.c)파일 다운로드1
12936정성태1/22/202235.NET Framework: 1138. C# - ffmpeg(FFmpeg.AutoGen)를 이용해 멀티미디어 파일의 메타데이터를 보여주는 예제(metadata.c)파일 다운로드1
12935정성태1/22/202231.NET Framework: 1137. ffmpeg의 파일 해시 예제(ffhash.c)를 C#으로 포팅파일 다운로드1
12934정성태1/22/202217오류 유형: 788. Warning C6262 Function uses '65564' bytes of stack: exceeds /analyze:stacksize '16384'. Consider moving some data to heap.
12933정성태1/21/202231.NET Framework: 1136. C# - ffmpeg(FFmpeg.AutoGen)를 이용해 MP2 오디오 파일 디코딩 예제(decode_audio.c)파일 다운로드1
12932정성태1/20/202284.NET Framework: 1135. C# - ffmpeg(FFmpeg.AutoGen)로 하드웨어 가속기를 이용한 비디오 디코딩 예제(hw_decode.c) [2]파일 다운로드1
12931정성태1/20/202291개발 환경 구성: 632. ASP.NET Core 프로젝트를 AKS/k8s에 올리는 과정
12930정성태1/19/202237개발 환경 구성: 631. AKS/k8s의 Volume에 파일 복사하는 방법
12929정성태1/19/202261개발 환경 구성: 630. AKS/k8s의 Pod에 Volume 연결하는 방법
12928정성태1/18/202256개발 환경 구성: 629. AKS/Kubernetes에서 호스팅 중인 pod에 shell(/bin/bash)로 진입하는 방법
12927정성태1/18/202266개발 환경 구성: 628. AKS 환경에 응용 프로그램 배포 방법
12926정성태1/17/202242오류 유형: 787. AKS - pod 배포 시 ErrImagePull/ImagePullBackOff 오류
12925정성태1/17/202274개발 환경 구성: 627. AKS의 준비 단계 - ACR(Azure Container Registry)에 docker 이미지 배포
12924정성태1/15/2022167.NET Framework: 1134. C# - ffmpeg(FFmpeg.AutoGen)를 이용한 비디오 디코딩 예제(decode_video.c) [2]파일 다운로드1
12923정성태1/15/202286개발 환경 구성: 626. ffmpeg.exe를 사용해 비디오 파일을 MPEG1 포맷으로 변경하는 방법
12922정성태1/14/202299개발 환경 구성: 625. AKS - Azure Kubernetes Service 생성 및 SLO/SLA 변경 방법
12921정성태1/14/202256개발 환경 구성: 624. Docker Desktop에서 별도 서버에 설치한 docker registry에 이미지 올리는 방법
12920정성태1/14/202223오류 유형: 786. Camtasia - An error occurred with the camera: Failed to Add Video Sampler.
12919정성태1/13/202283Windows: 199. Host Network Service (HNS)에 의해서 점유되는 포트
12918정성태1/13/202286Linux: 47. WSL - shell script에서 설정한 환경 변수가 스크립트 실행 후 반영되지 않는 문제
12917정성태1/12/202253오류 유형: 785. C# - The type or namespace name '...' could not be found (are you missing a using directive or an assembly reference?)
12916정성태1/12/202232오류 유형: 784. TFS - One or more source control bindings for this solution are not valid and are listed below.
12915정성태1/11/202269오류 유형: 783. Visual Studio - We didn't find any interpreters
12914정성태1/11/2022182VS.NET IDE: 172. 비주얼 스튜디오 2022의 파이선 개발 환경 지원
[1]  2  3  4  5  6  7  8  9  10  11  12  13  14  15  ...