msdos 파티션 테이블 MBR이 55 AA(16진수)로 끝나기 때문에 이 문제가 간단하다고 생각할 수도 있습니다. 하지만 파티션 테이블 없이 FAT32로 포맷된 디스크도 55 AA로 끝나기 때문은 아닙니다.
다음과 같이 디스크를 포맷합니다.
mkfs.vfat -F32 /dev/sdX
이러한 디스크에는 파티션 테이블이 없으며 Linux와 Windows 모두에서 인식됩니다. 처음 512바이트는 55AA로 끝납니다.
Linux는 55 AA로 끝나더라도 그러한 디스크에 유효한 파티션 테이블이 없다는 것을 어떻게 알 수 있습니까?
답변1
이것이 블록 장치의 첫 번째 섹터이고 0x55 0xAA로 끝나더라도 Linux 커널은 이것이 MBR이 아니라는 것을 어떻게 알 수 있습니까?
답은 코드에 있습니다:https://elixir.bootlin.com/linux/latest/source/block/partitions/msdos.c#L616
먼저 해당 섹터의 데이터를 파티션 테이블로 해석한 다음 FAT 메타데이터로 해석하려고 시도합니다. 두 번째 경우에는 블록 장치에 대한 파티션을 생성하지 않습니다. 이는 경험적 방법이므로 PBR에 존재하지 않는 파티션 테이블이 잘못 감지되는 일부 극단적인 경우가 있을 수 있습니다.
원래 DOS 부팅 프로세스는 다음과 같이 작동합니다.
첫 번째 섹터에는 마스터 부트 레코드, 파티션 테이블 및 작은 코드 조각이 포함되어 있습니다. 최신 시스템의 이 코드는 더 복잡한 부트로더를 호출합니다. 이때 파티션 테이블 항목을 살펴보고 첫 번째 활성(부팅 가능한) 파티션의 첫 번째 섹터 실행을 시작합니다.
첫 번째 섹터는 FAT 파티션의 부트 레코드입니다(https://wiki.osdev.org/FAT#Boot_Record)에는 작은 코드 조각도 포함되어 있습니다. 이는 DOS에 필요한 전체 부트 로더입니다(해당 작업은 IO.SYS 및 MSDOS.SYS 파일을 로드하는 것입니다).
파티션 부트 레코드와 마스터 부트 레코드의 서명은 모두 0x55 0xAA입니다. 이제 플로피 디스크와 같은 이동식 드라이브에서는 단지 공간을 낭비하기 위해 파티션 테이블을 갖는 것이 의미가 없으므로 디스크는 FAT 파티션과 해당 부트 레코드로 시작됩니다. 로더 코드는 MBR처럼 오프셋 0에서 시작하므로 BIOS에 아무런 영향을 미치지 않으므로 거기에 있는 모든 것을 실행하기만 하면 됩니다.
물론 PBR은 MBR과 구조가 다르며 FAT 파일 시스템의 특성을 설명합니다.
답변2
리눅스는 어떻게 아는가
여기서 용어에 대해 명확히 해야 합니다.리눅스이 경우에는?
- Linux(또는 기타 운영 체제 부팅 프로세스):
mkfs.vfat
포맷된 디스크하다MBR 부팅 섹터와 항목이 하나만 있는 파티션 테이블로 시작합니다.~ 할 것이다시작 시 실행됩니다. 확인해볼man mkfs.vfat
부분--mbr=no
:
섹터 0(MBR 자체 포함)에서 시작하고 전체 디스크 장치에 걸쳐 있는 파티션에 대한 디스크 서명으로 (가짜) MBR 테이블을 채웁니다. Microsoft Windows 시스템에서 이동식이 아닌 디스크를 사용하는 경우와 파티션되지 않은 전체 디스크를 포맷하는 경우에만 필요합니다. 디스크 서명과 파티션 테이블의 위치는 첫 번째 FAT 섹터의 끝 부분(부팅 코드 위치)과 겹치므로 추가 공간이 사용되지 않습니다.
- Linux 파티셔닝 도구도 이 테이블을 감지합니다.
fallocate -l 100M fatimg; mkfs.vfat -F32 fatimg; echo print all | parted fatimg
- Linux 파티셔닝 도구도 이 테이블을 감지합니다.
- 그러나 현대에는 버그가 있는 것 같아서
mkfs.vfat
적어도--mbr=no
파일 형식을 지정할 때는 일반적으로 무시됩니다. - Linux 커널 파티션 스캔은 예상되는 MBR 테이블, 즉 디스크의 시작 부분에만 관심을 갖습니다.
- Linux에서 파티션을 발견하면 마운트 도구가 파일 시스템을 조사하여 VFAT를 확인하는 것은 쉽습니다. VFAT 파일 시스템인지 여부반품MBR 레코드 포함: 관련 없음. 파일 시스템 드라이버는 상관하지 않습니다.
답변3
꼭 알아야 할 것은 리눅스가 아니라 BIOS이다.
BIOS는 부트 섹터(디스크의 첫 번째 섹터)를 로드하고 이를 실행합니다(사용자가 작성한 서명이 있음). 부트 섹터의 마지막 부분에는 4개의 파티션이 있습니다. 부트 코드는 단지 활성 파티션을 찾아 이를 메모리에 로드하고 실행합니다(부트 섹터는 메모리의 정확한 위치에 있을 것으로 예상되므로 실제 섹터의 복사본도 있고 그곳으로 점프합니다). 새 부팅 섹터는 운영 체제를 부팅할 수 있거나 MBR과 매우 유사할 수 있지만 이 경우에는 보조 파티션 테이블이므로 재귀적으로 수행됩니다. GRUB는 더 많은 코드를 저장하기 위해(보조 GRUB 코드를 로드하기 위해) 디스크 섹터가 512바이트(플로피 디스크 섹터 크기)보다 크다는 사실을 활용하여 부트 섹터를 수정합니다.
이것이 코드가 실행되는 방식입니다.
Linux(및 Linux)의 프로그램은 MBR의 테이블 구조(및 보시다시피 다른 파티션 테이블 형식은 단지 관례일 뿐임)를 알고 있으므로 하드 디스크에서는 첫 번째 섹터에 있어야 하며 모든 파티션 테이블 형식은 확장 테이블에는 파티션이 있어야 하며 궁극적으로 확장 테이블에 대한 추가 링크가 있어야 합니다.
프로그램이나 커널에서 인식하지 못하면 편집할 수 없습니다. 그러나 BIOS가 부팅할 수 있을 수도 있습니다(또는 부팅 섹터의 코드가 이를 수행할 수 있는 것이 더 좋습니다). 우리는 오래된 프로그램에 대해 이야기하고 있으며 메모리가 매우 제한되어 있으므로 너무 많은 논리를 기대하지 마십시오. 최악의 시나리오: "다시 시작하려면 아무 키나 누르십시오."