애벌레

애벌레

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

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

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

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


참고: 발견됨이 게시물2014년부터 이것은 kexec에서 아직 구현되지 않았다고 말했습니다.

답변1

Windows 에서는 가능할 것으로 보이지만 kexec기껏해야 실험적인 것 같습니다(그리고 잘 테스트되지 않은 것 같습니다).

애벌레

(호환되는 바이너리 형식이 없는 것 같기 때문에) kexec그럽 자체 로는 불가능합니다 .core.img런치패드에 대한 이 버그 보고서. 언급된 오류는 여전히 재현 가능합니다.

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

lnxboot.img. Linux 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 셸로 돌아갑니다. 을 사용하려면 필요에 맞게 gru4dos조정하기만 하면 됩니다 .cmdline이 스레드여전히 적용되어야 합니다.

윈도우

KexecWindows는 한 줄로 된 것 같지는 않지만이전에 수행되었습니다.

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

나는 이것들을 찾았다슬라이드뿐만 아니라 이것github 레포. 이것이 기사에서 언급된 프로젝트인 것 같습니다.

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

답변2

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

다른 OS로 kexec하는 보다 보편적이고 호환 가능한 방법은 (내가 제안한 대로) 다음과 같습니다.리얼 모드 부팅 섹터 부팅 코드를 로드하고 보호 모드를 종료한 다음 리얼 모드 부팅 코드 진입점으로 직접 이동합니다.. 이는 모든 운영 체제의 리얼 모드 부팅 섹터 부팅 코드가 항상 모든 메모리 주소에서 시작하여 로드될 수 있기 때문에 가장 보편적인 방법입니다. 이는 BIOS(다른 컴퓨터 제조업체에서 다른 BIOS를 만듭니다)가 운영 체제로 부팅하는 방법입니다(OS가 그렇지 않은 경우). 다른 BIOS를 설치하거나 부팅하는 것을 원하지 않는 경우(예: Apple) 부팅 섹터 부팅 코드를 로드하는 방법에 독점 제한을 적용할 수 있습니다. 이러한 방식으로 자체 부팅 섹터 부팅 코드를 직접 실행하기 때문에 부팅 코드가 OS 커널 이미지를 로드하는 방법에 관계없이 항상 모든 운영 체제로 부팅할 수 있습니다. 또한 이 모드에서는 부팅 섹터 부팅 코드가 작아서 로드 속도가 빠르며 실제 모드와 보호 모드에서 대규모 커널 이미지 파일을 로드하는 데 따른 차이가 그리 크지 않기 때문에 속도가 느려지지 않습니다.

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

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

  2. 모든 프로세서가 보호 모드에서 리얼 모드로 돌아가는 것을 제대로 지원하는 것은 아닙니다. 최신 프로세서는 생산 비용 및 효율성상의 이유로 OS에서 부팅을 해제(보호 모드에서 리얼 모드로 돌아가기)하는 대신 OS로 부팅(리얼 모드에서 보호 모드로 들어가기)하도록 설계되었습니다. 따라서 보호 모드에서 리얼 모드로 돌아가는 동작은 잘 테스트되지 않았으므로 거의 정의되지 않았습니다. 이 동작은 모델마다 다르기 때문에 제어할 수 없으므로 어떤 브랜드/모델 프로세서가 올바르게 작동하는지 보장할 수 없습니다.

  3. Intel X86 프로세서에만 리얼 모드와 보호 모드가 있습니다(아주 초기 단계의 레거시 기술을 거쳤기 때문입니다). 따라서 부팅 섹터에서 재부팅하는 메커니즘은 프로세서 아키텍처에 따라 다르며 반드시 보호 모드에서 실제 모드로 돌아가는 것은 아니지만 프로세서 작동 상태의 일부 다른 스위치가 포함될 수 있습니다.

그럼에도 불구하고 모든 것이 올바르게 처리된다면 원칙적으로 작동해야 합니다. 앞으로 Linux는 마운트된 부팅 가능 파티션에 kexec할 수 있는 기능을 갖게 될 것입니다(그러나 각 하드 디스크에는 부팅 가능으로 표시된 파티션이 하나만 있을 수 있으므로 반드시 부팅 가능으로 표시될 필요는 없습니다. 그렇지 않으면 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용 grub 메뉴 항목이 "Windows"인 경우 Windows로 재부팅해야 합니다.

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

답변4

kexeclnxboot.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형식을 시도해보십시오.

관련 정보