나는 최근 GRUB ntldr
모듈을 우연히 발견했습니다.
분명히 그 용도 중 하나는 chainloader
아래 예에 표시된 것처럼 NT >= 6.0 버전의 Windows를 부팅하는 대신에 사용되는 것입니다. (Windows 파티션의 볼륨 부트 레코드가 손상된 경우 매우 편리합니다.)
menuentry "Windows 7 (bootmgr on /dev/sda1)" --class windows --class os {
insmod part_msdos
insmod ntfs
insmod ntldr
set root='(hd0,msdos1)'
search --no-floppy --fs-uuid --set=root 1EA0019AA0017A13
ntldr ($root)/bootmgr
}
이 부팅 지시문을 사용하는 방법에 대한 자세한 내용은 어디서 배울 수 있습니까? 확인해보니 목록에 없던데HTML 버전~의GNU GRUB 매뉴얼.
ckhan의 답변에 답장하기
매우 감사합니다! 나는 ntldr
GRUB 명령/모듈에 대해 더 자세히 알아보기 위해 소스 코드를 파헤쳐 봐야겠다고 거의 결정했습니다 . 하지만 당신은 나보다 훨씬 더 잘 해냈어요.
코드를 작성한 사람들이 어떤 디자인 토론을 했는지 확인하기 위해 이메일 아카이브를 살펴보는 일은 결코 일어나지 않았습니다. 이 방법은 앞으로 매우 도움이 될 것 같습니다. 언급해 주셔서 감사합니다.
ntldr
GRUB 지원에 대한 나의 생각
- 얼마나 큰 차이가 있는지는 잘 모르겠지만
ntldr
명령이 아니라 모듈입니다. 또는 원하는 경우 동적으로 로드된 명령을 사용할 수도 있습니다.
당신의소스코드 링크GRUB_MOD_INIT
152행( )과 159행( ) 을 보면GRUB_MOD_FINI
모듈을 로드하고 언로드하는 코드를 볼 수 있습니다.
GRUB은 여러분이 "라고 생각할 수 있는 많은 기능을 구현한 것으로 보입니다.주문하다"모듈입니다. 제가 아는 한 사용법의 유일한 차이점은 모듈을 사용하기 전에 명령을 사용하여 로드되었는지 확인해야 한다는 것입니다insmod ntldr
.
옆에:나는 GRUB이 왜 그것을 지원하지 않는지 항상 궁금했습니다reboot
. 명령이 존재하지만 모듈이라는 것이 밝혀졌습니다.reboot
반환 되면 GRUBunknown command
는 명령insmod reboot
을 "기억"할 수 있습니다reboot
.
옆에:GRUB은 언제, 왜 "제거하다"모듈, 아직은 모르겠어요. 아마 비슷한 결과일지도 모르겠네요."쓰레기 수거"?모듈이 로드되면 시스템 전원을 끄고 다시 시작한 후에도 모듈이 지속되는 것 같습니다. 물론의지하다그러나 그것은 실제로 종종 작동하는 방식인 것 같습니다. - 흥미로운 점은 그들이
ntldr
기반을 두고 있다는 것입니다. 코드를chainloader
본 적이 없습니다 .chainloader.c
Intel 16비트에서 로드를 재배치할 수도 있을 것 같습니다.진짜모델?
나예ntldr
그렇게 되지 않아서 다행이에요chainloader
. 저도 Vladimir의 의견에 동의합니다. 표면적인 유사성이 무엇이든 사용법 구문은 매우 다릅니다. 현재 접근 방식은 덜 어색합니다. - 흥미롭게도 이 명령을 GRUB에 추가하려는 열정이 명백히 부족했습니다. 분명히 GRUB 개발자는 이것이 Windows에 해를 끼칠 것이라고 생각했습니다.파티션 부트 레코드(PBR)가능성은 거의 없습니다. 그러나 간단한 설치 중에 이 작업을 수행하는 방법을 개략적으로 설명할 수 있습니다.
먼저 사용자 시스템에 Windows가 설치되어 있다고 가정합니다. 이제 Ubuntu(12.04 LTS)가 설치됩니다."옆에"Windows. Ubuntu 설치 중 어느 시점에서 그들은 분명히 GRUB를 설치할 위치를 결정하게 됩니다. 추측할 수 없는 이유로 그들 중 일부는 Windows가 설치된 파티션에 GRUB를 설치하기로 결정합니다.
설치가 끝난 후 완료하면 Ubuntu를 성공적으로 부팅할 수 있지만 GRUB 메뉴에서 항목을 선택하여 Windows를 부팅하려고 하면 Windows가 성공적으로 부팅되지 않습니다.아니요시작. 대신 GRUB를 사용하여 Windows를 부팅하려고 하면 GRUB 메뉴가 다시 표시됩니다.
왜? 분명히 그들이 GRUB을 Windows 파티션에 설치하기로 선택했을 때 실제로 발생한 일은 GRUB의 PBR이 Windows 파티션의 PBR을 덮어쓴 것입니다. 따라서chainloader +1
Windows 부트 로더는 체인 로드되지 않지만 GRUB는 다시 로드됩니다.
IMO, 가장 안전한빠른이 경우 사용자가 Windows를 부팅할 수 있도록 하는 한 가지 방법은 GRUB의 새로운 기능을 사용하는 것입니다ntldr
. 개발자들이 이에 관심이 있는지는 모르겠습니다. 나는 그들이 이것을 기대하지 않았다고 생각합니다.
Windows 외에 GRUB 명령으로 ntldr
로드할 수 있는 다른 부트 로더가 무엇인지 알고 싶습니다.bootmgr
ntldr
답변1
문서화되지 않은 기능 연구
ntldr
명령(모듈이 아닌 명령)이 문서화되어 있지 않다는 것이 맞습니다 . 그래서 모험을 떠나는 것은 좋은 핑계가 됩니다.
코드 고고학.
문서화되지 않은 기능을 발견할 때마다 가장 먼저 하는 일은 소스를 확인하는 것입니다.
출처는 다음 위치에 있습니다.사바나 Git 저장소 2010년 8월에 본선에 합병된 것으로 나타난다.
소스 브랜치는 더 이상 존재하지 않는 것 같지만 여전히 볼 수 있습니다.그 해 초에 설립된, 2010년 4월. "Vladimir 'phcoder' Serbinenko"의 체크인 코멘트는 다음과 같습니다.
ntldr support. (based on information from nyu but no code from him)
chainloader
헤더 주석의 파일 이름이 아직 업데이트되지 않았기 때문에 명령 에 매우 밀접하게 기반을 두고 있습니다 .
이제 정확한 체크인과 이름을 얻었으므로 메일 보관함을 확인할 수 있습니다. 개발자가 1년 전에 이 기능 추가에 대해 논의한 곳을 볼 수 있습니다. grub-devel 메일링 리스트:
이 스레드에서 일부 관련 발췌문:
로버트 밀란이 패치는 NTLDR 부팅 의미 체계를 사용하여 로더를 구현합니다(BootMGR에서도 동일하므로 둘 다 지원됨).
로버트 밀란이 기능을 원한다면 독립 실행형 명령이 아닌 체인로더의 옵션이어야 한다고 생각합니다. 실제로 체인로더와 거의 동일합니다. 유일한 차이점은 ntldr이 PBR 자체가 아닌 PBR 이후 GRUB에 의해 로드된다는 것입니다.
블라디미르 세르비넨코ntldr은 이 PBR을 파티션을 식별하기 위한 슈퍼블록으로만 사용하기 때문에 이에 대해 어떤 문제도 발견되지 않습니다. 그래서 나는 이 로드를 $root를 전달하는 특별한 경우로 처리하고 싶습니다. 단지 그 형식이 약간 이상하다는 것뿐입니다.
이브 브루소명령과 관련하여, 부트로더 유형을 감지하려고 시도하는 체인로더(grub4dos와 같은) 명령 하나만 있으면 사용자에게 더 간단할 것이라고 생각합니다. 이것은 단지 내 개인적인 의견입니다.
블라디미르 세르비넨코나는 이것에 동의하지 않습니다. chainloader와 ntldr은 동일한 구문을 공유하지 않습니다. chainloader에는 부팅 섹터가 필요하고 ntldr에는 ntldr 또는 bootmgr 파일이 필요합니다. GRUB2의 목적은 GRUB1의 잘못된 설계 결정을 깨는 것이었고 그 중 하나는 "커널" 명령이었습니다. GRUB4DOS는 이 문제에 대해 GRUB1을 따릅니다.
로버트 밀란괜찮은. 이것을 별도의 명령으로 만들어 보겠습니다. 나는 여전히 chainloader.c와 코드(일부 ifdef 포함)를 공유해야 한다고 생각합니다.
당신의 질문에 대답
이 모든 내용을 살펴본 후 사용 방법에 대해 무엇을 알 수 있습니까?
체인 로더를 기반으로 합니다.
하나의 매개변수, 즉 열려는 파일을 사용합니다.
파티션 부트 레코드를 방지하므로 파티션 손상을 우회할 수 있습니다. 바라보다이 게시물이를 테스트하는 방법에 대한 세부정보입니다.
그것은약 160줄의 코드만 있으면 됩니다., 거기에는 그다지 많은 것이 없다는 것을 알 수 있습니다.
도움이 되었기를 바랍니다!