윈도우 시스템 파일이 손상 되었을 때, 복구하는 방법

 

1. 윈도우 설치 파일 준비 

마이크로소프트 홈페이지에서 설치 파일을 다운받는다.

USB에 설치 미디어로 만들거나, iso 를 다운받아서 가상 시디로 마운트 시켜도 된다.

당연히 현재 설치된 버젼과 동일한 윈도우를 준비해야 한다.

 

2. install.esd를 install.wim으로 변환하기

cmd를 관리자 권한으로 실행시킨다.

명령 프롬프트에 다음과 같이 입력한다.

dism.exe /esport-image /sourceImageFile:E:\source\install.esd /sourceIndex:3 /DestinationImageFile:d:\wim\install.wim

 

여기서,

E:\source\install.esd 는 바로 위에서 다운받은 설치 미디어 파일이 있는 드라이브다. iso를 다운받아 마운트 시키지 않고 압축을 풀어도 되는데, 여튼, 설치 미디어의 source 폴더 밑에 install.esd 가 있는 것을 확인할 수 있다. 3메가 정도 파일이다.

 

그리고,

/sourceIndex:3 

에서 3번 인덱스는 win pro 버젼을 가리킨다. 경우에 따라 pro 버젼이 아니거나 인덱스가 달라질 수도 있는데, 그 인덱스는  역시 명령프롬프트에서 아래의 명령어로 확인하면 된다.

 

dism.exe /Get-Wiminfo /Wimfile:e:\sources\install.esd

 

설치 파일 정보를 읽으면서 몇번 인덱스에 어떤 운영체제가 들어있는지 화면에 출력해준다.

 

그리고,

d:\wim\install.wim 부분은 esd를 wim으로 변환시킨 후 저장할 폴더와 파일명이다. 3GB 정도 쓰기 가능한 폴더를 만들어주고 지정해주면 된다.

다음의 절차에서 이 파일을 참조하게 된다.

 

3. 이미지 읽어서 복구하기

 

위의 작업을 거쳐 wim 파일을 만들었으면, 아래처럼 명령 프롬프트에 써 준다.

dism.exe /online /cleanup-image /restorehealth /source:wim:d:\wim\install.wim:1

 

마지막의 1번은, 저 위에서 sourceIndex를 3번 하나만 택했기 때문에, 그 3번이 첫번째인 1번으로 등록되어 있어서 그렇다.

궁금하면, 아래의 명령으로 번호에 대한 정보를 확인할 수 있다.

dism.exe /Get-Wiminfo /Wimfile:d:\wim\install.wim

 

자체 파일을 보유하고 있지 않을 때, 미리 준비한 install.wim으로 복구하게 된다. 

이제 손상된 파일을 복구한다.

 

 

4. 마지막으로 sfc 

 

이제 마지막으로 명령 프롬프트에서,

sfc /scannow를 해준다.

 

그러면 끝.

 

 

참고 글

https://blasker.tistory.com/entry/%EC%9C%88%EB%8F%84%EC%9A%B010-ISO-%EC%9D%B4%EB%AF%B8%EC%A7%80%EC%9D%98-ESDElectronic-Software-Delivery%EB%A5%BC-WIMWindows-Imaging-Format%EC%9C%BC%EB%A1%9C-%EB%B3%80%ED%99%98-%EB%B0%A9%EB%B2%95-DISM%EC%9D%84-%EC%9D%B4%EC%9A%A9

 

https://www.wintips.org/how-to-extract-an-install-wim-file-that-contains-several-install-wim-files/

 

윈도우 원격 데스크톱으로 작업하다보면, 종종 호스트 컴퓨터의 인터넷 접속속도가 느려질 때가 있다. 그로 인해 호스트 컴퓨터의 화면이 부드럽게 넘어오지 못하는 등 여러가지 불편을 겪기도 한다.


랜카드의 설정을 바꾸어 이 문제를 해결해보자.



1. 문제 발생


내가 이용하는 환경은 호스트 컴퓨터와 클라이언트 컴퓨터 모두 KT의 500Mbps 플랜을 사용중이며, 양쪽 모두 4k 모니터를 사용한다.


이 플랜의 경우, 네트워크 속성에서 조회해보면 링크 속도(송신/수신)가 1000/1000 Mbps로 표시가 된다.

그런데, 원격접속시 종종 호스트 컴퓨터의 이더넷 접속속도가 10/10 Mbps로 떨어질 때가 있다. 원인은 잘 모르겠다.


일반적으로 사용하는 모니터가 1920 x 1080 해상도라고 할 때, 원격 데스크톱은 네 배 크기의 화면 이미지를 압축해서 보내주어야 하므로 대략 네 배 정도의 대역폭이 필요하다.(항상 화면의 모든 부분을 업데이트 하는 것 같지는 않으므로 아마도 네 배 보다는 적을 것이다)

정상적인 속도에서는 큰 불편함이 없지만 접속속도가 낮아지면 화면이 부드럽지 못해 여간 불편한 것이 아니다.


2. 간단하지만 말도 안되는 방법


호스트 컴퓨터의 이더넷 속성에서 "사용안함"을 하면 인터넷이 끊긴다.



그리고 아이콘이 회색(비활성화)으로 변해서 접속이 끊긴 것을 확인했으면 다시 "사용함"으로 바꾼다.


이 방법의 최대 단점은, 접속이 끊기는 순간 원격 데스크톱도 (당연히) 종료되고,

누군가 호스트 컴퓨터 앞에 앉아 "사용함"으로 바꾸기 전에는 다시 접속할 방법이 없다는 점이다.




3. 쉽게 할 수 있지만 매번 번거로운 해결 방법


이 때, 원격 접속 상태로 호스트 컴퓨터를 재부팅하면 된다.

죄를 지었으면 죄부팅을 해야겠지.

당연히 자동적으로 원격접속이 끊길 것이고, 호스트 컴퓨터가 재부팅 될 때 쯤 다시 원격 접속을 하면 링크 속도가 정상으로 되돌아간다.


단점은 사용하던 프로그램을 모두 닫아야 한다는 점.

그리고 재부팅 후 약간 뒤에 또 접속 속도가 떨어진다는 점

그리고 만에 하나, 재부팅하면서 그 순간에 호스트 컴퓨터의 IP가 변하면 다시 접속할 수가 없다.(이런 일은 거의 일어나지 않는다)


이런 재부팅이 귀찮았던 차에 혹시나 해서,

cmd 창에서 ipconfig /renew 등으로 해결을 시도 해보았지만 링크 속도는 변하지 않는다.


매번 이렇게 문제를 해결하다가 너무 소모적인지라, 맘먹고 이것 저것 시도해보고 찾던 도중 드디어 해결을 했다.



4. 쉽게 할 수 있고 영구적인 해결방법




호스트 컴퓨터의 랜카드 속성에서 <구성>을 클릭






랜카드마다 설정이 다르겠지만 위와 같은 비슷한 내용을 찾아본다.

"시스템이 절전 중인 동안 링크 속도를 줄입니다"를 해제




링크 속도에서 <속도 및 이중> 값은 기본이 "자동 설정"으로 되어 있을 것이다.

"이걸 1.0Gbps 전이중"으로 변경



문제가 해결되었다!





사실 둘 중의 하나 덕분인지 두 설정 모두 문제 해결에 기여했는지는 잘 모르겠다.

 하나씩 바꿔가면서 실험해보면 알겠지만, 귀찮으므로 여기서 끝.







윈도우 원격 데스크톱으로 A 컴퓨터에 접속해서 A 컴퓨터의 네이버 클라우드 탐색기를 실행시키려고 하면 "pc를 재시작하라"는 창이 뜬다. pc를 재시작해도 마찬가지다. 


해결방법은 간단하다.

관리자모드로 실행시키면 된다.


실행 파일은 일반적인 경우 다음의 경로에 있다.


C:\Program Files\naver\NaverNDrive


여기서 NDrive.exe 를 우클릭, 관리자 권한으로 실행하면 끝.

2020.08.10 내용 업데이트


엔비디아에서 지포스계열의 윈도우 RDP실행시 opengl 지원 프로그램을 지난 4월부터 배포하기 시작했다. 

즉, 아래 내용 다 필요없고 엔비디아 홈피에서 해당 프로그램을 받으면 된다.


아래에 설명이 있다.

https://www.opengl.org/news/comments/nvidia-provides-opengl-accelerated-remote-desktop-for-geforce


VGA 드라이버는 440 버젼 이후이면 되고

호스트가 되는 컴퓨터에서 위의 링크에서 다시 링크로 걸어준 프로그램을 내려받아 실행시킨 후 재부팅 한번 해주면 된다.


그러면 그 다음에 rdp로 접속하는 컴퓨터에서 아래처럼 복잡한 절차 없이 opengl 프로그램을 실행시킬 수 있다.


이렇게 간단한걸, 진작에 좀 해주지.


프로그램을 다운받으려면 엔비디아 계정이 있어야 하기 때문에 좀 귀찮다. 용량이 매우 적으므로 여기 직접 첨부해놓았다.


nvidiaopenglrdp.zip



끝.




----------------------------------------------------------------------------------------------



코딩을 하다보면 성능이 좋고 데이터가 저장되어 있는 PC를 서버로 두고, 외부에서 클라이언트로 접속해 서버 컴퓨터의 코드를 실행시켜야 할 경우가 있다. 물론 데이터의 용량이 작고 구동이 가벼울 경우 온전히 복사하거나 클라우드 동기화를 통해 직접 눈 앞에 있는 컴퓨터로 실행시키면 그만이지만, 그렇지 못한 경우도 있다.


예를 들어 몇기가의 데이터를 읽어서 OpenGL로 구동시켜야 할 경우에는 클라우드 동기화보다는 원격 접속이 편하다. 


그런데 문제가 있다. 윈도우 원격 데스크톱을 활용한 원격 접속의 경우에는 OpenGL이 1.1 버젼까지만 구동가능하므로 대부분 에러를 내뱉고 실행되지 않는다.



해결 방법은 여러가지가 있다.


1. windows RDP 대신 다른 원격 접속 프로그램을 사용한다. (어떤 것에서 OpenGL이 실행 되는지는 확인하지 못했다)


2. 엔비디아 vga 기준으로 할 때, Quadro 계열을 구입한다.


엔비디아에서는 GTX나 RTX 계열의 vga를 꽂은 PC에 원격 접속을 할 때, OpenGL의 사용을 막아놓았다. 그런데 쿼드로 계열은 된다. 당연히 소프트웨어적으로 막아놓은 것이라 엔비디아에서 풀어주면 되는데 그렇게 하지 않는다. 다른 어떤 이유가 있는지는 모르겠지만 여하튼 지원하지 않는다.


그렇지만 cuda core 기준으로 볼 때, 같은 쿠다코어 수의 vga를 구입하려면 가격이 다섯배 이상 뛰므로 추천하지 않는다.



3. 그래서 해결방법은 다음과 같다. 


요약해서 말하자면 원격 접속을 끊고, 기본 계정 상태에서 코드를 실행시킨 뒤 다시 원격 접속하는 방법이다. 그러면 OpenGL 창이 떠 있을 것이다!!!


그러면 그걸 어떻게 할까?


아래의 코드로 .bat 파일을 만들어 "관리자 모드"로 실행하면 된다.


1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
@echo off
echo.
echo Remote Desktop will be temporarily disconnected . . . please reconnect after a few seconds.
echo.
pause
@echo on
REM The active session has an arrow as the first character
setlocal EnableDelayedExpansion
FOR /F %%A in ('qwinsta'do (
    set tempSessionName=%%A
    if "!tempSessionName:~0,1!"==">"  ( 
        @echo on
        tscon.exe !tempSessionName:~1! //dest:console 
        @echo off
    )    
)
@echo off
echo.
@echo on
rundll32.exe user32.dll, LockWorkStation
@echo off
echo.
echo Starting MyProgram.exe . . .
@echo on
REM 여기서 컴파일된 코드를 실행시킨다.
D:\user_folder\folder1\.execution.exe
@echo off
echo.
pause
cs


OpenGL 코드를 작성할 정도면 그 밖의 궁금한 부분은 스스로 해결 할 수 있을 것이라 생각한다.

예를 들어 실행했을 때, dll을 못찾는다거나 등등의 부분은 bat 파일에서 exe를 실행시키기 전에 디렉토리를 변경하거나 필요한 부분을 path에 등록하는 방식 등으로 해결할 수 있다.



*.

처음에 원격 접속으로 OpenGL 실행이 되지 않았을 때 의구심이 들었던 부분이 있었다.

코드와 데이터가 있는 PC에서 opengl 코드를 실행시켜 OpenGL이 작동하는 창을 띄운 뒤, 옆의 아무 PC로 가서 원격접속을 해보았더니 창이 그대로 떠 있고 OpenGL도 문제없이 구동되었었다. 그렇지만 원격접속 상태에서 창을 닫은 후 다시 실행하려면 되지 않았다. 즉, 원격 접속 상태에서 아예 불가능한게 아니라 처음 구동시킬 때의 계정이 원격접속 계정이면 안되게 막아놓았다는 점을 알 수 있었다.


*.

아래 질문의 답변에서 힌트를 찾았고, 몇 군데 더 참고해서 위의 글을 작성하였다.

https://stackoverflow.com/questions/41833949/opengl-and-remote-desktop



+ Recent posts