Windows는 레지스트리 변경 사항을 디스크에 언제 기록합니까?


43

TL; DR :

레지스트리를 변경 한 다음 Windows 10 시스템을 강제 종료하면 재부팅 후 레지스트리 변경이 나타나지 않습니다.

또한 최대 절전 모드 파일을 삭제하면 Linux 복구 도구가 오프라인 상태에서 Windows 레지스트리를 변경하는 기능에 영향을 줄 수 있습니다. 최대 절전 모드 파일을 삭제 한 후 도구를 영구적으로 변경할 수없는 것 같습니다. 아래에 구체적인 예가 나와 있습니다.

예 1 :

  • "HKLM \ SOFTWARE"에 "1111"이라는 키를 추가합니다. 그런 다음 전원 버튼을 5 초 동안 눌러 상자의 전원을 끕니다.
  • 테스트 키
  • 레지스트리를 다시 가져 오면 해당 키와 해당 값이 사라집니다.
  • 테스트 키 사라
  • (이 이미지들은 포맷을 위해 편집되었습니다)

예 2 :

  • regedit를 사용하여 레지스트리를 변경하십시오.
  • 시스템 최대 절전
  • 리눅스 복구 도구로 부팅
  • 디스크를 마운트하려면 최대 절전 모드 파일을 삭제하십시오.
  • 복구 도구에서 Windows 레지스트리를 읽습니다.
  • 레지스트리 변경이 사라졌습니다.

이것은 상자를 강제 종료하는 것과 같습니다.

예 3 :

다음과 같은 경우 낯선 행동이 나타납니다.

  • 상자를 동면
  • Linux 복구 도구로 부팅하고 최대 절전 모드 파일을 삭제하십시오.
  • 복구 도구에서 레지스트리를 변경하십시오.
  • 상자를 재부팅

이러한 변경 사항은 레지스트리에도 반영되지 않습니다.

무슨 일이야?

  • Windows 10은 언제 레지스트리 변경 사항을 디스크에 기록합니까?
  • 최대 절전 모드 파일을 삭제하면 (예 3) 복구 도구에서 작성된 레지스트리 변경 사항이 다음 부팅시 반영되지 않는 이유는 무엇입니까?

설명을 기대하고 있습니다!


2
"재부팅 후에 레지스트리 변경이 나타나지 않습니다." -재부팅 할 때까지 레지스트리 변경 사항이 적용되지 않으며 일반적으로 파일 탐색기 만 다시 시작해야합니다. 재부팅이 실제로 필요한 경우 레지스트리 변경의 의도에 따라 다릅니다. 실제 키는 수정되면 수정되어 질문에 답변합니다.
Ramhound 2016 년

8
하드 셧다운이란 무엇입니까? 종료 될 때까지 전원 버튼을 잡고 있습니까? 이 프로세스는 보류중인 디스크 캐시 쓰기를 기록하지 않습니다.
DavidPostill

2
@Ramhound 효과가 발생하지 않지만 디스크에 기록되지 않은 이유는 무엇입니까? 편집을하고 전원을 끈 다음 더 이상 변경이 없습니다. 그것이 메모리에 적용되는지 여부는 그 시점에서 중요하지 않습니다
Shrout1

2
@ Shrout1-기계를 안전하게 종료하는 대신 기계를 강제로 끄는 이유는 무엇입니까?
Ramhound 2016 년

6
@Ramhound 시스템이 정상적으로 종료되지 않으면 어떻게되는지 확인하기 위해 테스트를 진행하고 있습니다. 무작위, 나는 알고 있지만, 이것이 올바르게 처리되지 않으면 시스템에서 아무것도 잃지 않도록 메모리에 어떻게 커밋되는지 정확하게 알아야합니다.
Shrout1 2018 년

답변:


54

TL; DR : 시스템을 올바르게 종료하십시오.


최대 절전 모드는 종료와 아무 관련이 없습니다. RAM을 디스크에 푸시하고 시스템이 중단 된 곳에서 정확히 작업을 재개하기 위해 디스크에 푸시 된 RAM 내용을 제외하고는 RAM 일시 중지 (절전)와 밀접한 관련이 있습니다. .

변경 사항을 유지하려면 최대 절전 모드 Windows Fastboot (최대 절전 모드의 하위 집합) 를 비활성화해야합니다 . 또는 실제로 최대 절전 모드가 아닌 다시 부팅 할 수 있습니다 .

변경 사항이 유지되지 않는 이유 는 최대 절전 모드 파일을 제외하고 디스크에 아직 기록되지 않았기 때문 입니다. 파일 시스템 자체를 복구하고 "마지막으로 성공한"상태로 돌아 가야 할 수도 있습니다.

시스템이 최대 절전 모드 인 동안 디스크에 기록되지 않고 대신 RAM에있는 몇 가지 주요 파일 시스템 구조가 있습니다. 최대 절전 모드에서 다시 시작하면 시스템은 디스크가 매우 특정한 상태에있을 것으로 예상하고 디스크 캐시와 중요한 시스템 파일이 실제 디스크가 아닌 최대 절전 모드 파일에 저장 될 수 있습니다.

당신이 할 경우 적절한 종료를 디스크에 다음 Windows 것이다 제대로 세척 작업 메모리를 한 다음 전원을 끄기 전에 깨끗하게 디스크를 마운트 해제합니다.

제대로 종료하려면 명령 프롬프트를 열고 다음을 입력하십시오.

shutdown /s /f /t 0

/s"종료", /f강제 및 /t 0"지금"을 의미합니다 (시간 = 0 초)

또는 빠른 부팅 및 최대 절전 모드를 비활성화 할 수 있습니다.

이상에서 읽기 HowtoGeek : 종료 아래합니까 완전 다운 윈도우 10를 종료하지 (그러나 다시 시작 않음)


하드 셧다운을 수행하는 것과 관련하여 문제는 Windows가 변경 한 것과 동일한 밀리 초 (또는 1 분) 동안 디스크에 변경 내용을 기록 할 수 없다는 것입니다. 거의 확실하게 몇 분 안에 쓰여질 것이지만 실제로 쓰여진 확률은 시간이 지남에 따라 증가 할 것입니다. 그것은 즉시 쓰여질 것 같지 않다. 그리고 당신이 변경을 할 시간에 가까워 질 수록 확률은 급격히 증가하며 거의 1 시간 안에 쓰여질 것이다.

그러나 하드 셧다운을 강제함으로써 시스템에 디스크 변경 사항을 안전하게 쓸 수있는 기회를주지는 않습니다.

대부분의 최신 파일 시스템은 가장 안전한 방법으로 변경하도록 작성되었습니다. 과거에는 변화가 일어 났거나 그렇지 않은 것처럼 "원자"라고 불렸다.

오늘 우리는 그들을 알고 저널링 파일 시스템 들이 작업의 로그 유지하기 때문에 것입니다 그 중 복귀 또는 시스템 오류 및 재부팅의 경우에 앞으로 출시 될 수있는 일이 있습니다. 정전시 시스템은 저널을 점검하고 각 트랜잭션에 대해 실제 파일 데이터가 디스크에 기록되고 "양호한"상태인지 점검합니다. 이 경우 변환이 롤 포워드되고 완료된 경우 이전 데이터로 롤백됩니다.

이 순서를 사용하면 디스크는 거의 항상 복구하기 쉬운 상태입니다.

그러나 시스템 전원이 갑자기 꺼 지도록하면 복구시 롤 포워드 할 정도로 트랜잭션이 충분히 진행되었는지 여부를 보장 할 수 없으며 Linux와 같은 운영 체제가 트랜잭션 히스토리에 대해 Windows만큼 신경 쓰지 않을 가능성이 높습니다. 모든 것을 앞으로 돌리는 것이 아니라 뒤로 돌리는 변화를 만드는 것이 아닙니다.

Windows로 재부팅 한 경우 파일 시스템에 대한보다 친숙한 지식을 가지고 있으므로 디스크를 올바르게 복구하려고 할 수 있습니다.


감사합니다! 귀하의 답변에 감사드립니다 :) 최대 절전 모드를 해제하고 재부팅 한 다음 동일한 테스트를 다시 실행했습니다. 예제 1은 동일한 결과를 나타내며 최대 절전 모드 파일이 없습니다. 레지스트리 변경 내용은 로그 오프 / 종료 중 특정 시점에만 기록 된 것 같습니다. 또한 최대 절전 모드에서 깨어날 때 시스템이 "최종 양호"상태를 찾고있을 수 있다는 데 동의합니다. 무결성 검사를 실행하는 경향이 있습니다.
Shrout1 2018 년

1
흠 ... 그래서 sysinternals "sync"를 다운로드하여 쓰기 캐시를 디스크에 강제로 보내고 아무것도하지 않았습니다 (아직 하드 셧 오프시 키 / 값을 잃어 버림). 또한 프로세스 탐색기를 실행하고 Regedit의 속성에서 디스크 I / O를 확인했습니다. I / O를 읽었지만 쓰기 I / O는 없었습니다. 이 날이라고 생각하게 할 수 당신이 이것을 노골적으로 배치 할 수있는 대단히 건조 M의 $ 문서 알고 계십니까 ... 종료 기다리고? 모든 도움에 다시 한번 감사드립니다!
Shrout1

11
NTFS 저널은 파일 데이터를 보증하지 않습니다. NTFS 메타 데이터의 일관성을 유지하기 위해 파일 시스템 이 손상되지 않습니다 . 개별 파일에는 여전히 부분 변경 내용이 기록되어 파일이 손상 될 수 있습니다. 이 트랜잭션 NTFS는 하지만하지 않는 것이 좋습니다 매우 거의 사용하지 않습니다. 이것이 데이터베이스 엔진이 데이터 일관성을 위해 자체 저널을 유지하는 이유이기도합니다. 또한 참조 : blogs.msdn.microsoft.com/oldnewthing/20130101-00/?p=5673
Bob

2
@ Shrout1 다시 쓰기 캐시에 레지스트리 변경 사항이 보류중인 것으로 가정합니다. 그것들이 대신 개별적으로 관리되고 이것이 파일 시스템, 캐싱 또는 기타와 관련이 없다는 것이 전적으로 가능합니다. 예를 들어, 마지막으로 성공한 구성은 성공적인 시작시에만 업데이트됩니다. (변경 사항이 저장 될 때 레지스트리 내부에 대해 충분히 알지 못합니다. 그런 다음 TxR 이 관련 될 수 있습니다.)
Bob

1
강제 종료 이유가 있습니까? AFAIK는 실행중인 응용 프로그램을 강제로 종료합니다. 다른 방법으로는 닫을 수없는 응용 프로그램을 죽이는 것 외에 다른 일을하지 않으며 자신이 무엇인지 모르는 경우 저장하지 않은 변경 사항을 잃을 가능성이 높습니다 또는 일부 응용 프로그램을 복구 할 수없는 상태로 만들거나 실제로 "적절한"종료라고 부르지는 않습니다.
NotThatGuy

39

MSDN 페이지에RegFlushKey 설명 된대로 :

RegFlushKey 호출 은 디스크 대역폭을 소비하고 플러시 작업이 완료 될 때까지 플러시되는 레지스트리 하이브의 모든 프로세스에 의해 모든 키에 대한 수정을 차단하므로 시스템 전체 성능에 큰 영향을 미치는 비싼 작업입니다. RegFlushKey 는 응용 프로그램이 수정 후 즉시 디스크에 레지스트리 변경 사항이 유지되도록해야하는 경우에만 명시 적으로 호출해야합니다. 키에 대한 모든 수정 사항은 디스크로 플러시 할 필요없이 다른 프로세스에서 볼 수 있습니다.

또는 레지스트리에는 정기적으로 디스크에 레지스트리 수정 내용을 플러시하는 '게으른 플러시'메커니즘이 있습니다. 이 정기적 인 플러시 작업 외에도 시스템 종료시 레지스트리 변경 내용이 디스크로 플러시됩니다. 'lazy flush'가 레지스트리 변경 사항을 플러시하도록 허용하는 것은 디스크의 레지스트리 저장소에 대한 레지스트리 쓰기를 관리하는 가장 효율적인 방법입니다.

즉, 특정 키를 디스크로 즉시 플러시하는 것 (플러시가 완료 될 때까지 레지스트리에서 다른 모든 사람을 잠그는 것) 외에 레지스트리가 자동으로 플러시됩니다. 시간이 제공되지는 않지만 적어도 키 쓰기와 강제 종료 사이에 대기 한 시간 또한 이미 알아 낸 것처럼 종료시 플러시됩니다.

당신은 사용할 수 RegFlushKey를 조작 키 말했다 소프트웨어에 기능을, 또는이 귀하의 사용 사례에 중요한 경우, 즉시 디스크에 레지스트리 키를 작성 강제로 함께 추가 도구를 만들 수 있습니다.


야! Windows 8 또는 Windows Server 2012에서 응용 프로그램 레지스트리 변경 사항을 저장 하고 짧은 인용 부호를 추가 하면 다음 MSDN 문서에 대한 링크를 던질 때이 내용을 알려 드리겠습니다 . 귀하의 답변으로 토끼 구멍을 해당 기사로 안내했으며 기본적으로 귀하가 한 것과 동일한 내용을 말합니다. 대단히 감사합니다!
Shrout1

그러나 아무도 사용자RegFlushKey 를 호출 하는 방법을 알고 있습니까?
Scott

@Scott 그것은 코드에서 수행되어야하는 것으로 보입니다 ... 게시물에 나열된 MSDN 기사에는 C ++ 예제가 있으며 다른 곳에서는 C #으로 구현 된 것을 보았습니다. 명령 행에서 수행 할 수 있는지 확실하지 않습니다.
Shrout1

3
@Scott은 다음과 같은 경우에 나는 충격을받을 것이라고 sync 했다 플러시 디스크에 레지스트리. 이해가되지 않습니다. 왜 세척한다 파일 시스템 (사용되는 캐시 구성 관리자가 아닌 다른 방법의 주위에) 갑자기 구성 관리자의 자체 캐시를 플러시를? 심지어 최상위 캐시의 구조가 무엇인지조차 알지 못합니다.
Mehrdad 2016 년

1
@Scott 방법이 있습니다. API가 이미 연결되었습니다. 임의의 Win32 함수를 호출하는 GUI를 제공하는 도구가 있습니다. 것은 ... 구현 세부 사항입니다. 당신이 그것을 노출하면, 사람들은 그것에 의존하고 당신은 그것을 변경할 수 없습니다. 또한 시스템 디스크는 이동식 미디어와 완전히 다른 짐승입니다. 시스템 디스크는 항상 핸들을 열어야하는 많은 것들 (예 : 페이지 파일)에 사용됩니다. Windows는 시스템 파티션 마운트 해제를 지원하지 않으므로이 "기능"이 필요하지 않습니다. 또한 ... 댓글을 중립으로 유지하십시오. 당신은 Windows를 싫어합니다.
기본

14

TL; DR : 적시 에이 작업을 수행하는 것이 매우 신중합니다 .

에 대한 설명서 FSCTL_MARK_AS_SYSTEM_HIVE는 다음과 같습니다.

FSCTL_MARK_AS_SYSTEM_HIVE제어 코드는 지정된 파일이 레지스트리의 시스템 하이브를 포함하는 파일 시스템을 알려줍니다. 교착 상태를 피하고 데이터 무결성을 보장하기 위해 파일 시스템은 적절한 시점 에 시스템 하이브 데이터를 디스크로 플러시해야합니다 .

나는 이것보다 더 많은 세부 사항이 공개적으로 있다고 생각하지 않습니다.

레지스트리가 파일 시스템 위에서 캐싱을 수행 할 수 있기 때문에 파일 시스템 을 플러시 한다고해서 레지스트리가 플러시되는 것은 아닙니다 . 먼저 레지스트리를 플러시하려면 원하는 키를 발생 시키거나 호출해야합니다.NtFlushKeyZwFlushKey


잘 잡아라! 이것이 제가 가장 좋아하는 MSDN-ism입니다. 바로 그 순간 입니다. 내 이전 좋아했다 "는 UNION, UNION ALL은 EXCEPT 또는 INTERSECT 연산자를 포함하는 쿼리에서 TOP 절을 지정할 때주의하십시오.하는 쿼리를 작성할 수 있습니다 반환 예기치 않은 결과 " "의 완곡 한 표현이었다이 기능입니다 나쁘게 부서지고 합리적인 사람이 기대하는 것을하지 않고 그것을 고치는 대신 문서화 할 것입니다. "
davidbak

@ davidbak : lol, MSDN의 방어 측면에서, 사용자가 의존 해야하는 세부 정보가 무엇인지 실제로 알지 못합니다.
Mehrdad

아 맞아; 분명히 이것은 내부 API에 관계없이 Microsoft가 모든 API를 문서화해야했던 오래 전 EU 합의의 실패로 문서화 된 것입니다. 링크 한이 페이지에는 "커널 수준의 구성 요소 만이 파일 시스템 제어 코드를 사용할 수 있습니다"라고 표시되어 있습니다. 그럼에도 불구하고, " 다만 적당한 순간 "- 언젠가는 "이 방법 만에서 전화와 내 일부 API 문서 것이다 단지 바로 그 순간 ...."어떻게되는지를
davidbak

@ davidbak : 나는 당신이 조금 ... 흥분 생각합니다. :-P 필자의 추측 은 파일 시스템 드라이버가 어떤 파일에 SYSTEM 레지스트리 하이브가 포함되어 있는지 알려주기 위해 문서화되었다는 것입니다.이 파일은 해당 파일과 동시에 레지스트리에 아무것도 쓰려고 시도하지 않을 것입니다. 디스크로 플러시되고 있습니다. 나는 이것에 대한 증거가 없다. 내가 생각할 수있는 이유 중 하나입니다. 그래도 한 가지 의심되는 이유는 디스크 드라이버가 이것을 알 필요가없는 이유입니다.
Mehrdad 2016 년
당사 사이트를 사용함과 동시에 당사의 쿠키 정책개인정보 보호정책을 읽고 이해하였음을 인정하는 것으로 간주합니다.
Licensed under cc by-sa 3.0 with attribution required.