[ntdebugging]Windows 가 어떻게 시작되는지 ( 첫 번째 이야기 )
"이 문서는 https://blogs.msdn.com/ntdebugging blog 의 번역이며 원래의 자료가 통보 없이 변경될 수 있습니다. 이 자료는 법률적 보증이 없으며 의견을 주시기 위해 원래의 blog 를 방문하실 수 있습니다. ( https://blogs.msdn.com/ntdebugging/archive/2007/06/19/how-windows-starts-up-part-1-of-4.aspx )
Windows 가 어떻게 시작되는지 ( 첫 번째 이야기 )
안녕하세요 저의 이름은 David 이고 마이크로소프트에서 Escalation Engineer로 일하고 있습니다. Bryan 이 작성한 Windows가 어떻게 종료되는가? 를 작성하였는데 Windows 가 어떻게 시작되는지를 알려 드리는 것도 좋은 아이디어라고 생각 되었습니다.
이 정보는 Windows 2000, Windows XP 그리고 Windows Server 2003에만 해당되는 것으로 Windows Vista 에서 부팅 과정에 변경된 것은 다음 번에 알려 드리도록 하겠습니다.
추가 정보는 Russinovich 와 Solomon 이 작성한 Windows Internals 5장과 TechNet 정보를 참조할 수 있습니다.
https://technet.microsoft.com/en-us/library/bb457123.aspx
방법론
시스템 시작과 관련된 문제를 이해하고 해결하기 위해서는 장애가 어디서 발생하는지 확인해야 합니다. 장애 지점을 확인하는 것을 쉽게 하기 위해 부팅 과정을 아래 4 단계로 나누어 보았습니다.
1. 초기화
2. 부트 로더
3. 커널
4. 로그온
앞으로 몇 주 동안 각 단계를 자세하게 살펴보고 문제 해결을 위한 가이드 라인을 제공해 드리도록 하겠습니다.
초기 단계
부팅의 초기 단계는 Power-On Self Test(POST) 와 초기 디스크 접근으로 나눌 수 있습니다.
Power-On 자체테스트
POST 동작은 컴퓨터의 제조사에 의해 바이오스에 구현되어 있습니다. 자세한 내용은 하드웨어 정보를 참고 하시기 바랍니다. 하지만 제조사에 상관 없이 일반적으로 전압 체크, 램 체크, 시스템이 사용하는 인터럽트 설정, 비디오 카드 초기화, 주변 장치 카드 검색 그리고 메모리 테스트 등을 실행 합니다. 제조사 또는 구성에 따라 다르기는 하지만 POST 가 성공할 경우 삐 소리가 한번 발생 합니다.
POST 문제해결
- 최신 버전의 바이오스 및 펌웨어로 업데이트되었는지 확인
- CMOS 베터리에 문제가 있을 경우 교체
- 가장 최근에 추가한 하드웨어 확인( 램, 비디오 카드, SCSI 어뎁터 등)
- 가장 최근에 추가한 RAM 제거
- 모든 어뎁터 카드 제거 후 하나씩 다시 설치
- 마더보드의 다른 슬롯으로 어뎁터 옮기기
- 계속 POST 에서 실패할 경우 제조사에 연락
초기디스크접근
컴퓨터 바이오스에 설정 되어 있는 부트 순서에 따라 CD-ROM, 네트워크 카드, 플로피 카드, USB 디바이스 또는 하드 디스크에 의해 부팅 될 수 있습니다. 이 문서에서는 하드 디스크에서 부팅되는 일반적인 상황에 대해서 이야기 하고자 합니다.
이번 시작 단계에서 발생하는 이벤트를 이야기 하기 전에 부트 디스크에 대해서 먼저 이해 해야 합니다. 하드 디스크는 아래 그림과 같이 나타낼 수 있습니다. (아래 그림의 각 블럭들이 크기를 나타내지는 않습니다. )
하드 디스크는 실린더, 헤드, 섹터로 나뉘어 집니다. 섹터는 디스크의 가작 작은 저장 단위로 보통 512 바이트 입니다. 하드 디스크의 물리적 구조에 대한 보다 자세한 정보는 아래 리소스를 참고 하시기 바랍니다.
아래 두개의 섹터는 컴퓨터가 시작되는데 아주 중요한 것으로 뒤에서 보다 자세히 다루도록 하겠습니다.
- 마스터 부트 레코드 (MBR)
- 부트 섹터
MBR은 언제나 물리 디스크의 섹터1, 실린더 0, 헤드 0에 위치 합니다. 부트 섹터는 각 파티션의 첫 번째 섹터에 위치 합니다. 이 섹터들은 실행 코드와 코드가 실행되는데 필요한 정보를 가지고 있습니다.
섹터 숫자를 표시하는데 약간 모호함은 실린더/헤드/섹터(CHS)는 C0/H0/S1이 시작 이라는 것 입니다. 절대적인 섹터의 숫자는 0에서 시작하고 DskProbe 와 같은 툴에서도 0을 사용 합니다. 아래 문서에서 이 모호함을 설명하고 있습니다.
Q97819 Ambiguous References to Sector One and Sector Zero
https://support.microsoft.com/default.aspx?scid=kb;EN-US;Q97819
언제 디스크에서 정보를 얻어오게 될까요? MBR 은 디스크가 파티션 될 때 만들어 집니다. 부트 섹터는 볼륨을 포맷할 때 생성 됩니다. MBR은 Master Boot Code로 불리는 약간의 실행 코드, 디스크 시그니쳐 그리고 파티션 테이블을 가지고 있습니다. MBR 의 마지막에는 0x55AA 2바이트의 시그니쳐로 불리는 섹터의 마지막을 나타내는 구조체가 있습니다. 이 시그니쳐는 또는 확장 부트 레코드(EBR)과 부트 섹터의 마지막에도 있습니다.
0x1B8에 위치하는 디스크 시그니쳐는 디스크를 운영체제에 인식 시킵니다. Windows 2000 이상의 운영체제에서 이 시그니쳐를 아래 레지스트리 키의 인덱스로 사용하여 정보를 저장 합니다. (역자주 해당 위치를 확인해 보면 c, f 와 같이 설정되어 있거나 아래 레지스트리 키의 index 값을 가집니다.)
HKLM\System\MountedDevices
파티션 테이블은 MBR내의 64Byte 의 데이터 구조로 타입과 하드 디스크에서의 위치 정보를 가지고 있습니다. 각 파티션 테이블은 16Byte길이로 (최대 4개의 파티션까지 지원) 각 항목은 아래와 같이 미리 정해진 위치에서 시작 됩니다.
Partition 1 0x1BE (446)
Partition 2 0x1CE (462)
Partition 3 0x1DE (478)
Partition 4 0x1EE (494)
아래는 MBR의 샘플로 3개의 파티션 테이블이 사용되어 있고 하나가 비어 있는 상태 입니다.
000001B0: 80 01
000001C0: 01 00 07 FE BF 09 3F 00 - 00 00 4B F5 7F 00 00 00
000001D0: 81 0A 07 FE FF FF 8A F5 – 7F 00 3D 26 9C 00 00 00
000001E0: C1 FF 05 FE FF FF C7 1B – 1C 01 D6 96 92 00 00 00
000001F0: 00 00 00 00 00 00 00 00 – 00 00 00 00 00 00
파티션의 각 항목을 살펴 보기 위해 노란 색으로 강조 되어 있는 첫 번째 파티션을 살펴 보도록 하겠습니다. 꼭 기억하고 있어야 할 것은 이 값들이 리틀 엔디안 이라는 것 입니다.
필드위치 |
필드길이 |
예제의값 |
필드설명 |
0x1BE |
8 Bits |
0x80 |
부트표지 00=부팅에 사용 안됨 80=활성 파티션(부팅에 사용) |
000001B0: 80 01
000001C0: 01 00 07 FE BF 09 3F 00 - 00 00 4B F5 7F 00
0x1BF |
8 Bits |
0x01 |
시작헤드 |
000001B0: 80 01
000001C0: 01 00 07 FE BF 09 3F 00 - 00 00 4B F5 7F 00
|
|
|
|
|
|
000001B0: 80 01
000001C0: 01 00 07 FE BF 09 3F 00 - 00 00 4B F5 7F 00
0x1C2 |
8 Bits |
0x07 |
시스템 ID 볼륨의 타입 0x07=NTFS |
000001B0: 80 01
000001C0: 01 00 07 FE BF 09 3F 00 - 00 00 4B F5 7F 00
다른 System ID 값들 :
Partition Type |
ID Value |
0x01 |
FAT12 주 파티션 또는 논리적 드라이브(하나의 볼륨에32,680 섹터 이하) |
0x04 |
FAT16 파티션 또는 논리적 드라이브(32,680-65,535 섹터 또는 16MB-33MB) |
0x05 |
확장 파티션 |
0x06 |
BIGDOS FAT16 파티션 또는 논리 드라이브 (33 MB–4 GB) |
0x07 |
설치 가능한 파일 시스템 (NTFS 파티션 또는 논리 드라이브) |
0x0B |
FAT32 파티션 또는 논리 드라이브 |
0x0C |
BIOS INT 13h 확장을 지원하는 FAT32 파티션 또는 논리 드라이브 |
0x0E |
BIOS INT 13h 확장을 지원하는 BIGDOS FAT16 파티션 또는 논리 드라이브 |
0x0F |
BIOS INT 13h 확장을 사용하는 확장 파티션 |
0x12 |
EISA 파티션 |
0x42 |
동적 디스크 볼륨 |
0x86 |
레거시 FT FAT16 디스크 * |
0x87 |
레거시 FT NTFS 디스크 * |
0x8B |
레거시 FT 볼륨으로 포맷된 FAT32 * |
0x8C |
BIOS INT 13h 확장을 사용하고 FAT 32로 포멧된 볼륨 * |
* 표시가 있는 항목은 FT(내결함성-Fault Tolerance) 이 아닌 스트라이프나 스팬 볼륨을 나타낸다.
0x1C3 |
8 Bits |
0xFE |
끝헤드(0xFE=254 10진수) |
000001B0: 80 01
000001C0: 01 00 07 FE BF 09 3F 00 - 00 00 4B F5 7F 00
|
|
|
|
|
|
000001B0: 80 01
000001C0: 01 00 07 FE BF 09 3F 00 - 00 00 4B F5 7F 00
0x1C6 |
32 Bits |
0x3F000000 |
상대섹터 디스크의 시작부터 볼륨의 시작까지의 섹터 수 0x0000003F = 63 |
000001B0: 80 01
000001C0: 01 00 07 FE BF 09 3F 00 - 00 00 4B F5 7F 00
0x1CA |
32 Bits |
0X4BF57F00 |
전체섹터 볼륨 내의 전체 섹터 수 0x007FF54B = 8,385,867 Sectors = 4GB |
000001B0: 80 01
000001C0: 01 00 07 FE BF 09 3F 00 - 00 00 4B F5 7F 00
잘 이해하고 계신가요? 다행입니다. 이제 실린더/섹터가 어떻게 구성되어 있는지 보도록 하겠습니다.
| |||||||||||||||
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
보시는 것과 같이 섹터 값은 워드의 6비트를 사용하고 실린더는 상위 10비트를 사용 합니다. 예제에서 보면 실린더와 섹터의 시작 값은 01 00입니다. MBR안의 바이트는 숫자가 반대로 기록되는 리틀 엔디안으로 시작값은 실린더 0 섹터 1 임을 알 수 있습니다.
우리가 보고 있는 값이 흥미롭습니다. BF 09. 먼저 16진수를 2진수로 변환해 보면 100110111111 이고 아래 테이블과 같이 나타낼 수 있습니다.
| |||||||||||||||
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
하위 6비트가 모두 1로 설정되어 있고 값은 111111또는 63 입니다. 그리고 2개의 비트가 실린더를 위해 할당되어 1000001001 (521) 입니다. 실린더와 헤드 값은 0에서 시작하여 총 522개의 실린더와 255개의 헤드가 있는 것 입니다. CHS 값으로 변환해 보면 522 x 255 x 63 = 8,385,930 섹터 입니다.
CHS 의 시작 주소(실린더0, 헤드1, 섹터1)(63)을 제외하면 이 파티션에 총 8,385,867 섹터 즉 4GB 가 있는 것 입니다. 이 값은 파티션 테이블에 있는 4B F5 7F 00 으로 검증할 수 있습니다. 숫자를 뒤집어 보면 00 7F F5 4B 로 8,385,867 임을 알 수 있습니다.
이제 Disk이 있는 데이터 구조를 이해하게 되었고 이제는 진행 순서를 알아보고자 합니다. 기억할 것은 POST 가 성공적으로 완료된 이후 과정이라는 것 입니다.
1. 마더보드의 롬 바이오스가 바이오스에 설정되어 있는 첫 부트 디바이스에 접근을 시도 합니다. (일반적으로 사용자가 BIOS 설정 유틸리티를 사용해서 설정 가능합니다.)
2. 롬 바이오스는 첫 번째 부트 디바이스에서 실린더0, 헤드0, 섹터 1를 읽습니다.
3. 롬 바이오스가 한 섹터를 메모리로 읽어 들이고 테스트 합니다.
a. 플로피 드라이브일 경우 첫 번째 섹터는 FAT 부트 섹터 입니다.
b. 하드 드라이브일 경우 첫 번째 섹터는 Master Boot Record(MBR)입니다.
4. 하드 드라이브로 부팅할 경우 롬 바이오스는 섹터 1의 마지막 두 바이트를 확인하여 55AA 인지 확인 합니다.
a. 마지막 두 바이트가 55AA가 아니라면 시스템은 MBR이 손상되었거나 파티션이 만들어지지 않은 것으로 보고 바이오스 인터럽트 18번을 호출하여 바이오스 제작사가 정의한 “Operating System not found” 와 같은 메시지를 출력 합니다.
b. 마지막 두 바이트가 55AA 라면 MBR 프로그램을 실행 합니다.
5. MBR은 파티션 테이블을 검색하여 0x80 즉 부트 파티션인 활성 파티션을 찾습니다.
a. 활성 파티션을 찾을 수 없다면 바이오스 인터럽트 18번을 호출하여 “Operating System not found” 를 출력 합니다.
b. 부트 표지가 0x80이나 0x00이 아니거나 하나 이상의 파티션이 0x80으로 설저오디어 있는 경우 시스템은 멈추고 “Invalid partition table”를 출력 합니다.
c. 활성 파티션을 찾았다면 찾은 파티션의 부트 섹터를 로드하고 테스트 합니다.
6. MBR은 활성 파티션의 부트섹터를 읽어 들인 후 55AA인지 확인 합니다.
a. 부트 섹터를 읽는 것을 5번 실패할 경우 시스템은 실패하고 “Error loading operating system”를 출력합니다.
b. 부트 섹터를 읽었으나 55AA 값이 일치 하지 않는다면 “Missing operating system”를 출력하고 실패 합니다.
c. 부트스트랩 영역은 16섹터로 이루어 집니다.(0-15) 0번째 부트 코드가 올바르나 1-15사이에 손상된 것이 있다면 아무 에러화면 없이 검정 화면을 보게 될 것 입니다. 이 경우 다른 디스크의 1-15섹터(0번 섹터 제외)의 값을 DskProbe로 가져 오면 됩니다.
d. 부트 섹터가 로드 되고 55AA 값이 일치 한다면 MBR은 활성 파티션의 부트 섹터로 제어를 넘깁니다.
7. 활성 파티션의 부트 섹터가 실행되고 NTLDR을 찾습니다. 부트 섹터에 들어 있는 내용은 무엇으로 포멧되었느냐에 따라 달라 집니다. 예를 들어 부프 파티션이 FAT 파티션 이라면 Windows는 부트 섹터를 FAT 파일 시스템을 읽을 수 있도록 작성 합니다. 부트 섹터의 역할은 루트 디렉토리에서 NTLDR을 읽을 수 있도록 논리 드라이브의 포멧과 정보를 제공해 주는 것 입니다. 이 지점에서의 오류는 파일 시스템에 따라 달라 집니다. 아래 FAT 일 경우와 NTFS 일 경우의 에러가 있습니다.
a. FAT : 아래 에러가 발생한 이후 “press any key to restart”가 표시 됩니다.
(1) NTLDR을 찾을 수 없을 경우 “NTLDR is missing” 이 표시 됩니다.
(2) NTLDR 이 베드 섹터에 있을 경우 “Disk Error” 가 표시 됩니다.
b. NTFS : 아래 에러가 발생한 이후 “Press CTRL+ALT+DEL to restart”가 표시 됩니다.
(1) NTLDR이 베드 섹터에 있을 경우 “A disk read error occurred” 가 표시 됩니다. 이 메시지는 Windows 2000또는 이상의 시스템이고 확장 인터럽트 13의 호출이 필요할 경우라면 표시 됩니다. 하지만 CMOS나 SCSI 바이오스에서 표시 됩니다. 이 동작은 FRS(File Record Segment)가 로드 될 수 없거나 NTFS 메타데이타 정보가 손상 되었을 때도 보여 집니다.
(2) NTLDR을 못 찾으면 “NTLDR is missing” 이 표시 됩니다.
(3) NTLDR이 압축 되어 있으면 “NTLDR is compressed” 이 표시 됩니다.
8. NTLDR을 찾으면 메모리로 로드 하고 실행 시킵니다. 이 시점에 부트 로더 단계가 시작 됩니다.
초기화단계에서문제해결 ( 초기디스크접근시점 )
Windows를 부팅 시킬 수 없고 부트 프로세스의 초기에서 실패 한다면 Windows 부트 플로피를 만들어야 한다. (역자 주 : 아래 링크는 동작하지 않습니다. 문서가 이동하거나 삭제된 것 같습니다.)
Q119467 How to Create a Bootable Disk for an NTFS or FAT Partition
https://support.microsoft.com/default.aspx?scid=kb;EN-US;Q119467
플로피로 부팅할 수 없다면 “플로피로 부팅할 수 없다”를 건너 뜁니다.
부트 디스크로 시작이 성공할 경우 문제는 마스터 부트 레코드와 부트 섹터 또는 NTLDR, NTDetect.com 또는 boot.ini 파일에 한정 됩니다. Windows 가 실행된 후 즉시 부트 섹터 또는 마스터 부트 섹터를 수정하기 전에 백업을 반드시 실행 합니다.
1. 바이러스가존재하는지검사를진행합니다 .
2. 에러에따라문제해결방법을선택합니다 . ( 에러메시지는번역안하도록하겠습니다 .)
· Operating System not found
MBR에 55AA 표지가 없는 경우 발생 합니다. DskProbe 등을 사용해서 수정해야 합니다.
주의 : 이문제에서 FixMBR 또는 FDISK /MBR 를사용할경우파티션테이블이초기화됩니다 .
· Invalid Partition Table
DskProbe 를 사용하여 0x80 부트 표지를 확인하고 수정할 수 있습니다.
· Error Loading Operating System
올바르지 않은 부트 섹터라는 의미 입니다. 아래의 “부트 섹터 복구”를 확인 합니다.
· Missing Operating System
55AA가 부트 섹터에 없을 경우 발생 합니다. DskProbe 또는 아래의 “부트 섹터 복구”를 확인 합니다.
· NTLDR is missing
아래 “NTDLR 파일 복구”를 확인 합니다.
· Disk error (FAT only)
NTLDR이 위치한 곳이 베드 섹터라는 의미 입니다.
· A disk read error occurred (NTFS only)
NTLDR이 위치한 곳이 베드 섹터라는 것 입니다. 아래 “NTLDR 파일 복구”를 확인 합니다
· NTLDR is compressed
NTLDR이 압축 되었다는 의미 입니다. 압축을 해제 하거나 NTLDR을 교체 합니다. 참고:이 에러는 거의 발생하지 않습니다.
· Computer boots to a black screen with blinking cursor
Use the appropriate section below. MBR 또는 활성 파티션의 부트 코드(Q228734)문제 입니다. 아래의 적절한 항목을 확인 합니다.
MBR 복구
Windows Recovery Console 에서 FIXMBR 명령을 사용하여 MBR의 첫 부분부터 446Byte 인부터 코드를 다시 기록 합니다. 파티션 테이블이 손상되지 않아야 합니다.
326215시작하지 않는 Windows Server 2003 기반 컴퓨터에서 복구 콘솔을 사용하는 방법
https://support.microsoft.com/kb/326215/ko
주의 : “Operating System not found” 에러메시지가발생한상태라면사용하지않아야합니다 . FIXMBR 은 MBR에서 55AA를찾지못할경우파티션테이블을초기화시킵니다 . 이경우데이터는복구할수없습니다 .
부트섹터복구
복구 콘솔에서 FIXBOOT 명령을 사용하여 시스템 파티션에 새로운 부터 섹터를 저장 합니다.
326215 시작하지 않는 Windows Server 2003 기반 컴퓨터에서 복구 콘솔을 사용하는 방법
https://support.microsoft.com/kb/326215/ko
이 방법으로 문제가 해결되지 않을 경우 아래 문서를 참고해서 수동으로 수정해야 합니다.
Q153973 NTFS 파티션에서 NTFS 부팅 섹터 복원
https://support.microsoft.com/kb/153973/ko
NTLDR 파일 복구
복구 콘솔에서 Windows CD-ROM의 \i386폴더에서 하드 드라이브의 루트로 NTLDR을 복사 합니다.
플로피를사용해서부트
플로피로 부팅을 할 수 없고 아무런 에러 메시지를 보지 못한 경우 파티션 테이블에 문제가 있는 것 입니다. 파티션 테이블이 손상되었고 부트 디스크로 부팅할 수 없다면 디스크를 포맷하고 Windows를 재 설치하고 백업본을 다시 리스토어 하는 것이 유일한 방법 입니다. 백업 파티션 테이블이 존재 한다면 DskProbe를 사용해서 파티션 테이블을 재 생성할 수 있지만 이 문서의 주제를 벗어나게 되고 나중에 이 방법을 알려 드리도록 하겠습니다.
도움이될만한문서들 ( 기계번역으로매끄럽지못합니다 .)
Q272395 오류 메시지: 부트 레코드 서명 AA55 없습니다.
https://support.microsoft.com/kb/272395/ko
Q155892 Windows NT 부팅 문제가: 커널 파일이 디스크에서 없습니다.
https://support.microsoft.com/kb/155892/ko
Q228004 활성 파티션을 변경하면 수 만들기 시스템 부팅하지
https://support.microsoft.com/kb/228004/ko
Q155053 부팅할 때 공백 화면(Black Screen) 발생
https://support.microsoft.com/kb/155053/ko
Q314503 Windows XP를 시작하면 검은 화면이 나타나면서 컴퓨터가 응답하지 않는다
https://support.microsoft.com/kb/314503/ko
Q153973 NTFS 파티션에서 NTFS 부팅 섹터 복원
https://support.microsoft.com/kb/153973/ko
자 이제 마치도록 하겠습니다. 다음 번에 부팅 순서 및 부트 로드 과정을 말씀 드리도록 할 것이고 아주 흥미로울 것 입니다.