grub1을 GPT와 함께 작동시키려고 합니다. 현재 실제 머신으로 마이그레이션하기 전 테스트 단계로 가상 머신에 있습니다.
/boot
grub stage1.5를 포함하려는 다른 파티션과 파티션을 만들었습니다 . 이것은 gdisk가 표시하는 GPT 파티션 테이블입니다:
Number Start (sector) End (sector) Size Code Name
1 2048 104447 50.0 MiB 8300 boot
2 104448 206847 50.0 MiB EF00 EFI
3 206848 16984063 8.0 GiB 8E00
4 1024 2047 512.0 KiB EF02 GRUB1
EFI 파티션은 그대로 두십시오. 이 경우에는 사용되지 않습니다. 단지 나중에 시스템을 UEFI로 업그레이드할 계획이고(grub1에 작별 인사를 하고) 파티션을 일찍 생성하고 싶었을 뿐입니다.
이제 grub1은 GPT를 이해하지 못하므로 첫 번째 파티션과 네 번째 파티션으로 구성된 하이브리드 MBR을 만들었습니다. 하이브리드 MBR에 대해 gdisk가 말하는 내용은 다음과 같습니다.
Number Boot Start Sector End Sector Status Code
1 1 1023 primary 0xEE
2 * 2048 104447 primary 0x83
3 1024 2047 primary 0xEF
4 104448 20971519 primary 0xEE
내 의도는 stage1.5를 1MB 미만의 작은 파티션에 놓고 boot
해당 파티션(GPT 1/MBR 2)에 실제 부팅 파티션(stage2, grub 구성 및 커널 이미지 포함)을 두는 것입니다. 하지만 설치 단계에서 grub을 얻을 수는 없습니다.
grub
명령을 실행할 때 이 find /grub/menu.lst
표시되므로 (hd0,0)
임베디드 파티션이 있는 실행 중인 커널 파티션 레이아웃을 사용하는 것처럼 보입니다 (hd0,3)
. 그러나 주는 것이 root (hd0,3)
나에게 주었다
파일 시스템 유형을 알 수 없음, 파티션 유형 0x83
파티션이 비어 있기 때문에 파일 시스템 유형은 놀라운 일이 아니지만 파티션 유형을 설정했는데 표시되지 않습니다.
stage1.5를 파티션에 포함하려고 하면(사용) embed (hd0,0)/grub/e2fs_stage1_5 (hd0,3)
오류가 발생합니다.
오류 17: 선택한 파티션을 마운트할 수 없습니다.
해당 파티션에 reiserfs3을 생성하려고 시도했지만(reiserfs3에는 부트로더를 포함할 공간이 16KB이므로) 오류는 동일합니다. 그런데 제가 만든 FS는 비표준이고, 일반 FS를 만들기에는 512KB가 부족해서 로그가 별도의 장치에 있습니다.
cat (hd0,3)+1
파티션의 첫 번째 섹터에 무언가를 쓰고 grub 쉘에서 실행하면 예상되는 출력이 제공되므로 (hd0,3)이 올바른 드라이브인지 확인했습니다 .
실행 방법에 대한 다른 옵션이 있습니까? stage1.5를 선택한 파티션( cat /boot/grub/e2fs_stage1_5 > /dev/sda4
)에 수동으로 삽입하고 적절하게 수정하려고 합니다(I추측하다첫 번째 섹터의 차단 목록과 두 번째 섹터의 stage2 위치)에서 시작되지만 제대로 작동하기를 원합니다.
제가 사용하고 있는 버전은 Gentoo의 sys-boot/grub-0.97-r18입니다.
답변1
예상했던 것보다 쉬우면서도 어려웠습니다.
첫째, Gentoo(및 내가 아는 한 다른 많은 배포판)는 GPT를 읽을 수 있도록 Grub을 패치했으므로 혼합 MBR의 번거로움이 필요 없으며 순수 GPT와 함께 사용할 수 있습니다.
setup (hd0,0)
"부팅 가능한 시스템 만들기"처럼 표준이 작동하기 때문에 더 쉽습니다 . 그러나 시스템은 내 표준에 비해 충분히 강력하지 않습니다. setup
stage1.5는 어디에도 내장할 수 없기 때문에 stage2를 패치하고 MBR에 디스크 위치를 포함시키는 방법을 사용합니다. 따라서 stage2를 이동하여 이전에 있던 블록을 변경하면 부팅할 수 없는 시스템이 발생합니다. 더 나쁜 점은 아마도 먼저 눈치채지 못할 것이라는 점입니다. 업그레이드로 인해 stage2가 다른 위치로 이동하지만 이전 위치는 동일하게 유지됩니다. 시스템이 계속 부팅 중인데 아무 것도 표시되지 않습니다. 그러나 시작 중에 사용된 코드는 이제 파일 시스템 POV의 여유 공간이므로 나중에 무작위로 덮어쓰여 붐을 일으킬 것입니다.
그래서 질문 끝에 설명된 단계를 수행하고 stage1.5를 수동으로 삽입했습니다.
먼저 해당 stage1.5 파일의 복사본을 만든 다음 복사본에서 16진수 편집기를 실행합니다. 편리한 도구가 없으면 vim 및 xxd를 사용하여 성공했습니다. 파일을 편집하고 :!xxd<enter>
파일을 16진수로 편집하도록 입력한 다음 입력 :!xxd -r<enter>
하고 저장합니다. 파일 끝에 추가 줄바꿈이 있지만 무해합니다. 이 경우 오른쪽의 ASCII 부분은 완전히 무시되고 16진수만 사용된다는 점에 유의하세요. 이 파일에서 3가지를 편집해야 합니다.
- 블록번호를 입력하세요두번째stage1.5의 블록은 offset 에 삽입됩니다
0xf8
. 이는 리틀 엔디안이며 디스크 시작 부분에 상대적입니다. BIOS 부팅 파티션은 섹터 1024에서 시작하므로 1025 또는0x0401
(리틀 엔디안) 바이트 입니다0104
. - stage1.5의 512바이트 섹터 번호를 오프셋에서 1을 뺀 위치에 배치합니다
0x1fc
. 내 stage1.5는 9908바이트(9909에 추가 줄 바꿈)이므로 20개의 섹터(19개 섹터는19*512=9728
10240바이트, 20개 섹터는 10240바이트) 가 있으므로13
Put in 19 또는 16진수가 필요합니다. ff
오프셋 219를 근처를00
만지지 마십시오 .ff
원본 파일과 수정된 파일의 16진수 덤프 차이점은 다음과 같습니다.
-000001f0 00 00 00 00 00 00 00 00 02 00 00 00 00 00 20 02 |.............. .|
+000001f0 00 00 00 00 00 00 00 00 01 04 00 00 13 00 20 02 |.............. .|
00000200 ea 70 22 00 00 00 03 02 ff ff ff 00 00 00 00 00 |.p".............|
-00000210 02 00 30 2e 39 37 00 ff ff ff ff 2f 62 6f 6f 74 |..0.97...../boot|
+00000210 02 00 30 2e 39 37 00 ff ff 00 ff 2f 62 6f 6f 74 |..0.97...../boot|
작동 방식은 stage1.5의 첫 번째 섹터가 끝 부분부터 숫자를 읽고 디스크 시작 부분의 지정된 섹터부터 시작하여 그만큼 많은 섹터를 읽는 것입니다. 이는 stage1.5의 나머지 섹터를 메모리에 로드한 다음 실행합니다. 세 번째 부분은 실제로 grub이 올바른 파티션을 찾아야 하는 디스크의 위치입니다. 누구든지 관심이 있다면 관련 코드는 grub의 소스 코드에 있습니다. stage2/disk_io.c
사용하는 부분은 에 있고 #ifdef STAGE1_5
나머지를 로드하는 첫 번째 섹터는 에 있다는 것을 기억하세요 stage2/start.S
. 여러 개별 섹션에 stage1.5를 포함하는 것이 가능할 수도 있지만 아직 시도하지 않았습니다.
cat
수정된 stage1.5를 작성한 후 또는 원하는 대로 를 사용하여 대상 파티션(예에서는 네 번째 파티션)에 복사하기만 하면 됩니다 dd
.
마지막으로 grub 쉘에서 실행하십시오.
install /boot/grub/stage1 (hd0) (hd0)1024+20
(hd0)은 사용 중인 장치의 그럽 이름이고, 1024
임베디드 stage1.5의 시작(그런데 BIOS 부팅 파티션의 시작)이며, 20
블록 단위의 stage1.5 크기입니다. 이것으로 전체 프로세스가 완료됩니다.