저는 컴팩트 플래시를 분석하고 이를 CF 마스터 부트 레코드의 파티션 테이블 내용과 비교하기 위해 fdisk를 사용하고 있습니다. "시작" 및 "종료" 열의 의미를 이해할 수 없습니다. 내가 읽은 일부 문서에서는 이것이 파티션의 시작 및 끝 섹터를 의미한다고 나와 있지만 fdisk 출력을 MBR 파티션 테이블의 파티션 주소와 비교하면 결과가 일치하지 않는 것 같습니다.
Fdisk -l은 첫 번째 파티션이 3에서 시작하지만 2241에서 끝나는 것을 보고합니다.
그러나 MBR에 있는 파티션 테이블의 16진수 덤프를 보면 파티션이 LBA 주소를 기준으로 0x800 섹터에서 시작하는 것으로 나타납니다. CHS 주소는 실린더 1, 헤드 1, 섹터 3으로 표시됩니다.
그렇다면 fdisk에서 Start 3과 End 2241은 무엇을 의미합니까?
답변1
CentOS 6에서는 fdisk
파티션 테이블을 표시할 때 여전히 실린더를 기본 단위로 사용합니다. zevzek이 언급했듯이 이는 더 이상 사용되지 않으며 fdisk -u=sectors -l
최신 저장 장치의 현실과 이후 버전이 fdisk
기본적으로 표시하는 방식에 더 잘 일치하도록 사용해야 합니다 .
실제 분할된 테이블의 CHS 값은 상당히 엄격한 최대값을 갖습니다.
- 이것실린더필드 폭은 10비트에 불과합니다(= 값 0-1023).
- 이것머리필드 폭은 8비트입니다(= 값 0-255).
- 이것부서필드 폭은 6비트입니다(= 값 0-63).
따라서 파티션 테이블에서 시작 CHS(3바이트)는 H = 1, S = 3, C = 1로 시작하여 0x1bf 위치에서 시작됩니다. 이건 잘못된 것 같습니다.
위치 0x1c2는 파티션 유형(0x83)이고, 위치 0x1c3 뒤에는 종료 CHS 값(3바이트)이 옵니다.
16진수 덤프의 두 번째 빨간색 상자는 올바른 위치를 가리키지 않습니다. 0x1c3의 값은 끝 H 값(0x14 = 20)입니다.
0x1c4의 값은 하위 6비트에 종료 섹터 값을 지정하고 상위 2비트에 종료 실린더 값의 최상위 2비트를 지정합니다. 따라서 이진수 0xe8 = 11 101000이므로 끝 S는 40입니다. 끝 C 값의 처음 두 자리는 16진수 3을 나타냅니다.
0x1c5의 값은 끝 C 값의 하위 바이트를 지정합니다. 이전 바이트의 상위 2비트와 함께 끝 실린더 값은 0x3b4 = 948입니다.
(이 값은 약 378MB의 파티션만 나타내므로 파티션 테이블의 최종 CHS 값은 파티션 테이블 뒤의 4바이트 파티션 크기 값과 비교하면 완전히 말도 안되는 것입니다.)
하지만 어떻게 분할하더라도 결과적으로 7.87GiB / 8.45GB의 제한이 발생하며, 이 시점에서 분할된 테이블의 CHS 필드의 비트 값은 모두 1이 되며 이러한 필드는 다음보다 큰 값을 나타낼 수 없습니다. 저것.
IDE 디스크 컨트롤러 사양으로 인해 상황이 더욱 복잡해졌습니다.다른CHS 제한 설정: IDE 컨트롤러는 최대 65536개 실린더(0-65535) 및 255개(1-255) 섹터까지 CHS 값을 수용할 수 있지만, 헤드는 최대 16개(0-15)까지만 허용됩니다. CHS 값을 있는 그대로 사용하면 MBR 제한과 함께 504MiB/528.4MB의 제한이 발생합니다.
따라서 1994년 7월부터 CHS 값을 현재 사용 사례에 맞게 조정하기 위한 기하학 변환 규칙이 등장했습니다. 그래서 2242개의 실린더, 21개의 헤드, 40개의 섹터를 하드웨어가 실제 기하학이라고 부르는 것이며, 파티션 테이블에 사용되는 값은 변환된 것을 기준으로 하며,서서히 나아가는가장 오래된 BIOS 시스템 호출의 파티션 테이블과 필드에 값을 맞추는 형상입니다. 이 변환에는 일반적으로 숫자 N을 선택하고 물리적 C 값을 N으로 나누고 물리적 H 값에 N을 곱하는 작업이 포함됩니다. N의 값은 일반적으로 2, 4, 8 또는 15입니다. (예, 16 대신 15는 MS-DOS, 이전 버전의 Windows 및 일부 이전 BIOS의 버그를 수정합니다.)
8.45GB를 초과하면 CHS 값은 어차피 쓸모가 없으므로 최신 운영 체제는 일반적으로 바로 위로 올라갑니다.CHS 값 무시대신 파티션의 첫 번째 블록의 LBA 번호와 파티션에 있는 총 블록 수의 4바이트 값을 사용하여 실제로 파티션의 위치와 크기를 정의합니다. 이러한 4바이트 값은 항상 정확하고 명확해야 합니다.
기존 512바이트 섹터 크기를 사용하는 경우 이러한 4바이트 값은 최대 (2^32 - 1) 블록, 즉 2TiB 또는 2.19TB 미만의 디스크 크기에 충분합니다.
파티션의 경우 16진수 덤프의 두 번째 빨간색 상자는 실제로 파티션의 첫 번째 블록의 LBA#인 0x1c6 이상의 위치를 가리킵니다. 리틀 엔디안 형식으로 표시되므로 값은 16진수로 10 0x800입니다. 또는 10진수로 2048입니다. 이는 디스크 시작 부분에서 정확히 1MiB 떨어진 곳에서 첫 번째 파티션을 시작하는 최신 표준 규칙을 따릅니다.
파티션의 길이는 오프셋 0x1ca부터 시작하여 지정됩니다. 즉, 0x1cb000 = 1 880 064 블록 또는 918MiB / 940MB입니다.
하드웨어에 의해 보고된 CHS 구조도 21 heads, 40 sectors/track, 2242 cylinders
2242 * 40 * 21 = 1 883 280 섹터 또는 1883280 * 512 = 964 249 360바이트에 불과한 반면 실제 디스크 용량은 964로 보고되는 것을 볼 수 있습니다.583 424바이트.
이는 CHS "기하학"이 이전 장치 및 운영 체제에 대한 근사치일 뿐이며 정확한 용량이 다양함을 다시 나타냅니다.
그냥 LBA 표현을 사용해서 다 해보고 싶고 fdisk
, 파티션 시작과 끝 값을 실린더로 표시하라고 하면 그냥 LBA 위치와 크기 값을 기준으로 계산하고 시작/끝 CHS 값은 완전히 무시하고 싶어요. 파티션 테이블에서. 다시 말하지만, 이 Blocks
열은 실제로 파티션 크기를 2KB 단위로 표시하는 것으로 보입니다.