애벌레

애벌레

Linux로 부팅하고 자동화 스크립트를 실행한 다음 자동으로 Windows로 부팅해야 하는 애플리케이션이 있습니다. Kexec를 사용하여 grub을 실행할 수 있나요?

또 다른 사용 사례는 Linux 커널을 부팅하여 프로세서 마이크로코드를 업데이트한 다음 kexecGRUB 또는 Syslinux를 부팅하여 Windows를 부팅하는 것입니다. 왜냐하면 마이크로코드는 전체 재부팅 후에도 유지되지 않기 때문입니다.

나는 들었다 grub4dos(링크(사용할 수 없음),보관된 버전), 그런데 단종된 것 같은데 GRUB2를 사용하여 할 수 있는 방법이 있나요?

기본적으로 로드 가능한 GRUB 이미지가 필요합니다 kexec. 여기에서 찾은 이미지를 로드하려고 합니다.설명하다, 하지만 작동하지 않는 것 같습니다. 어떤 팁이라도 주셔서 감사합니다.


참고: 발견됨이 게시물2014년 현재 kexec에서는 이 기능이 구현되지 않습니다.

답변1

이는 Windows에서는 가능해 보이지만 kexec기껏해야 실험적인 것 같습니다(완전히 테스트되지는 않음).

애벌레

kexecgrub 자체로는 불가능합니다 core.img(호환되는 바이너리 형식이 없는 것 같습니다).Launchpad에 대한 버그 보고서. 언급된 오류는 여전히 재현될 수 있습니다.

kexec -l /boot/grub2/i386-pc/core.img

에 따르면 kexec --help현재 다음 유형이 지원됩니다.

elf-x86_64
multiboot-x86
multiboot2-x86
elf-x86
bzImage64
bzImage
beoboot-x86
nbi-x86

다른 로더를 로드하려면 이러한 형식 중 하나를 사용해야 하며, 그렇지 않으면 호환성을 추가해야 합니다. GRUB이 어떤 형식을 사용하는지 잘 모르겠습니다. 간단한 file명령으로 다음을 생성합니다.

/boot/grub2/i386-pc/core.img: data

부팅 가능한 GRUB 이미지 생성

현재 다음과 같은 가능성이 있는 것으로 보입니다.

부트로더

lnxboot.imgLinux kernel x86 boot executeable bzImage커널로 로드되도록 의도된 것 같습니다 .

그런 다음 syslinux/isolinux/pxelinux/lilo 또는 Linux 커널을 지원하는 다른 부트 로더에서 grub2.bin을 로드할 수 있습니다.

Kexec는 이를 로드하지만 실행 시 충돌이 발생합니다.

kexec -l /usr/lib/grub/i386-pc/lnxboot.img --initrd=/boot/grub2/i386-pc/core.img --debug

또한 로드할 때 문제가 있는 것 같습니다(디버그 출력의 처음 몇 줄).

Try gzip decompression.
Try LZMA decompression.
lzma_decompress_file: read on /usr/lib/grub/i386-pc/lnxboot.img of 65536 bytes failed
[...]

Grub4Dos

Grub4Dos를 간단히 살펴보세요:

# file grub.exe
grub.exe: Linux kernel x86 boot executable bzImage, version \353kHdrS\003\002, RO-rootFS, Normal VGA

이는 호환 가능함을 의미합니다. 이것은 레거시 소프트웨어이므로 나에게는 옵션이 아닙니다.

grub4dos하지만 다운로드를 통해 0.4.4로드할 수 있었습니다.소스 포지그런 다음 다음을 실행하십시오.

kexec -l grub.exe
kexec -e

구성되지 않으면 잠시 후 Grub Shell로 돌아갑니다. 사용하고 싶다면 필요에 맞게 gru4dos조정하면 됩니다 .cmdline이 스레드여전히 적용되어야 합니다.

윈도우

KexecWindows는 단순한 문장처럼 보이지 않을 수도 있지만,이전에 이미 완료됨.

이 방향의 작업 중 대부분은 다음과 관련이 있는 것 같습니다.리눅스 부팅프로젝트.지텁

나는 이것들을 찾았다슬라이드쇼github 저장소. 이 항목이 작동하도록 하기 위해 기사에 언급된 항목인 것 같습니다.

가능해 보이지만 작업이 많이 필요합니다(그리고 "생산 준비"가 가능한 솔루션이 없습니다. 적어도 아직 찾지 못했습니다). 불행하게도 LinuxBoot에 대한 문서가 많지 않은 것 같으므로 개발자에게 문의해야 할 수도 있습니다. 이를 수행하는 더 직접적인 방법이 이미 있을 수 있습니다.

답변2

kexec이 Windows에 들어가기가 너무 어렵고 복잡한 이유는 모든 운영 체제 부트 로더가 비슷한 방식으로 운영 체제 커널 이미지를 로드한다고 가정하는 kexec의 내부 설계 메커니즘에 결함이 있기 때문입니다. 이는 분명히 사실이 아닙니다. 예를 들어 일부 운영 체제 커널 이미지는 일부 특수 메모리 주소 오프셋부터 로드해야 하며, 일부 운영 체제에서는 운영 체제 커널 이미지와 함께 로드하기 위해 추가 파일(드라이버 정보 포함)이 필요할 수 있습니다. OS가 커널 이미지를 로드하는 방법이나 향후 릴리스에서 커널 이미지를 로드하는 방법을 제어할 수 없기 때문에 현재 다른 OS/커널로 kexec하는 방법은 장기적으로 잘 작동하지 않습니다.

(내가 제안한 대로) 다른 OS로 kexec하는 보다 일반적이고 호환 가능한 방법은 다음과 같습니다.리얼 모드 부트 섹터 부트 코드를 로드하고, 보호 모드를 종료하고, 리얼 모드 부트 코드 진입점으로 직접 점프합니다.. 이는 모든 운영 체제에 대한 리얼 모드 부팅 섹터 부팅 코드가 항상 모든 메모리 주소에서 시작하여 로드될 수 있기 때문에 가장 일반적인 방법이며 BIOS(다른 컴퓨터 제조업체는 다른 BIOS를 만듭니다)가 운영 체제로 부팅하는 방법입니다(운영 체제가 시스템은 부팅 섹터 부팅 코드가 로드되는 방식에 독점 제한을 가할 수 있는 Apple과 같은 다른 BIOS가 시스템을 설치하거나 부팅하는 것을 원하지 않습니다. 이렇게 하면 자체 부팅 섹터 부팅 코드를 직접 실행하므로 부팅 코드가 운영 체제 커널 이미지를 로드하는 방법에 관계없이 항상 모든 운영 체제로 부팅할 수 있습니다. 또한 이 모드는 부팅 섹터의 부팅 코드가 작아서 로딩이 빠르기 때문에 속도 저하가 발생하지 않으며, 리얼 모드와 보호 모드에서 큰 커널 이미지 파일을 로딩하는 것의 차이가 크지 않습니다.

그러나 이 목표를 달성하는 것은 다음과 같은 이유로 매우 어렵습니다.

  1. 모든 최신 운영 체제와 마찬가지로 리얼 모드에서 보호 모드로 들어가면 일부 설명자 테이블이나 페이지 테이블 항목이 리얼 모드 메모리를 덮어씁니다. 따라서 백업이 없습니다. 그러나 리얼 모드 부팅 코드는 BIOS 인터럽트를 사용하여 하드웨어 IO에 액세스하므로 원래 리얼 모드 메모리 맵을 복원하지 않으면 하드 디스크에서 커널 이미지 파일을 로드할 수 없습니다. 이 문제는 까다롭지만 해결 가능합니다. 보호 모드로 들어가기 전에 메모리 스냅샷을 찍고 머신에서 한 번만 수행하면 되는 특별한 Linux 부트로더를 설치할 수 있습니다.

  2. 모든 프로세서가 보호 모드에서 리얼 모드로의 복귀를 잘 지원하는 것은 아닙니다. 생산 비용 및 효율성상의 이유로 최신 프로세서는 운영 체제에서 부팅을 해제(보호 모드에서 다시 리얼 모드로)하는 대신 운영 체제로 부팅(리얼 모드에서 보호 모드로)하도록 설계되었습니다. 따라서 보호 모드에서 실제 모드로 돌아가는 동작은 완전히 테스트되지 않았으므로 매우 불확실합니다. 이 동작은 모델마다 다르기 때문에 제어할 수 있는 방법이 없으므로 어떤 프로세서 제조업체/모델이 작동할지 보장할 수 없습니다.

  3. Intel Real 모드만 해당되지만 프로세서 작동 상태의 다른 전환이 포함될 수 있습니다.

그래도 모든 것이 올바르게 수행된다면 원칙적으로는 작동할 것입니다. 앞으로 Linux는 마운트된 부팅 가능한 파티션에 대해 kexec-ing할 수 있는 기능을 갖게 될 것입니다(단, 하드 드라이브당 부팅 가능한 것으로 표시된 파티션은 하나만 있을 수 있으므로 반드시 부팅 가능한 것으로 표시할 필요는 없습니다. 그렇지 않으면 BIOS가 모든 하드 드라이브에서 직접 보고합니다). 오류가 발생하고 부팅이 거부됨) 전체 하드웨어 재부팅이 필요하지 않으며 이는 훨씬 느립니다. 이는 Linux에 더 많은 빛과 희망을 가져다줍니다^_^

답변3

grub을 설치하고 Linux 시스템을 기본값으로 부팅해야 합니다.

다음과 같이 Linux 시스템에서 crontab 항목을 만듭니다.

@reboot /do/some/stuff

여기서 /do/some/stuff는 수행해야 하는 모든 작업을 수행하는 스크립트입니다. 스크립트 끝에 다음을 추가합니다.

#!/bin/bash
#
# Do something here

sudo grub2-once "Windows"
sudo reboot

Windows 그럽 메뉴 항목이 "Windows"인 경우 Windows로 재부팅해야 합니다.

다음에 재부팅하면 Linux로 돌아가서 동일한 작업을 수행합니다.

답변4

kexec예를 들어 lnxboot.img과 두 개의 그럽 이미지를 결합하면 작동할 수 있습니다.core.img

cat lnxboot.img core.img > your-kexec-able.img

시도해 볼 가치가 있습니다.

편집하다:

이제 이미지 내부를 살펴보니 lnxboot.image그것보다 "ELF"에 더 가까운 것 같으니 lnxboot.img그것도 시도해 보세요.

편집하다:

분명히 /boot/grub2/i386-pc/xxx.img 이미지는 이를 준수하지 않습니다 kexec. 그렇다면 몇 가지 다른 형식을 생성해 보고 어떤 것이 작동하는지 확인해 보는 것은 어떨까요 grub-mkimage? 매뉴얼 페이지에 따르면 -O, --format=FORMAT다양한 다른 형식이 지원됩니다. 어쩌면 x86_64-xen형식을 시도해보십시오.

관련 정보