정의된 서버에 무엇을 시작할지 물어보는 방법

정의된 서버에 무엇을 시작할지 물어보는 방법

다음 부팅 시나리오를 완료하는 데 사용할 수 있는 옵션은 무엇입니까?

부팅 시(부팅 전) 정의된 네트워크 서버에 접속하여 무엇을 부팅할지 묻습니다. (일반 답변: 로컬 하드 드라이브에서 부팅, 대체 답변: 부팅 이미지 XYZ)

목표는 클라이언트 측에서 사용자 상호 작용 없이 클라이언트를 다시 설치할 수 있는 것입니다. 이를 수행하는 논리적인 방법은 PXE 부팅이지만, 기본적으로 일반 부팅으로 설정되는 환경을 제어할 수 없기 때문에 PXE는 공격 벡터를 열므로 안전하지 않습니다.

지금까지 나는 다음을 찾아 시도했습니다. 로컬 하드 드라이브에서 Grub2를 부팅하고 iPXE를 체인로드합니다. 그런 다음 iPXE는 http를 통해 정의된 웹 서버에 접속하고 iPXE 스크립트를 얻습니다. 그러나 거기에서 나는 로컬 드라이브에서 부팅하는 방법을 찾지 못했습니다(Grub을 다시 시작하고 무한 루프로 끝나는 것 외에는). 부팅하려는 운영 체제는 Grub/iPXE가 부팅된 동일한 하드 드라이브의 파티션 2에 있습니다.

  1. 우리가 달성하고 싶은 것을 달성할 수 있는 다른 방법이 있나요?
  2. 두 번째 부팅(iPXE에서 다시 부팅)에서 Grub에게 다른 옵션을 선택하도록 지시하거나 iPXE에 파티션 2에서 부팅하도록 지시하는 방법이 있습니까?

참고 사항: 파티션 2에는 Grub 메뉴에서 시작할 수 있는 Windows Boatloader가 포함되어 있습니다.

답변1

나는 원격 시스템을 업그레이드하기 위해 다음 기술을 사용했는데, 이는 여러분에게도 도움이 될 것입니다. 이 시스템에서는 재설정을 시작할 수만 있고 (부팅) 화면은 볼 수 없습니다. 시스템은 grub(Ubuntu 12.04)으로 부팅되며 추가 파티션과 데이터 파티션이 있습니다. 비결은 다음을 삽입하는 것입니다 /etc/default/grub.

GRUB_DEFAULT=saved
GRUB_SAVEDEFAULT=false

다음의 경우를 제외하고는 항상 항목 0(Ubuntu 12.04)으로 부팅합니다.

  • 콘솔의 누군가가 다른 것을 선택했습니다.
  • grub-reboot XUbuntu에 로그인하여 실행한 후 다시 시작하세요.

Ubuntu에서 tar 파일을 다운로드하여 추가 파티션에 추출한 다음(또는 수동으로 약간의 변경 작업 수행) 실행하여 update-grubgrub 메뉴를 업데이트합니다(새로 채워진 추가 파티션을 스캔하고 해당 OS에 대한 메뉴 항목을 생성합니다). grub-reboot 및 을 사용합니다 reboot.

머신을 복구할 수 없는 경우(즉, ssh유예 기간 이후에 복구할 수 없는 경우) 머신을 재설정하면 Ubuntu에서 재부팅되어 무엇이 잘못되었는지 분석하고 다음 주기를 위해 준비됩니다.

부팅 시 적절한 프로그램을 실행하면 다운로드해야 할 다음 "이미지"가 무엇인지 확인할 수 있고 해당 이미지가 이미 있는지(다운로드하지 않은 경우) 확인하고 설치할 수 있습니다. 그런 다음 위와 같이 다시 시작하십시오.

린 기반 systemd배포판의 경우 재부팅 프로세스가 상대적으로 빨라야 하며 대체 OS/배포판을 다운로드/설치하는 데 대부분의 시간이 걸립니다.

답변2

나는 우리가 찾고 있는 것을 달성할 수 있는 방법을 찾았습니다. grubenv 및 @Anthon에 대한 팁을 제공한 @jc__에게 감사드립니다.

그래서 내 해결책은 다음과 같습니다. iPXE 커널 바이너리(.lkrn)를 사용자 정의 스크립트와 함께 넣어 부팅 제어 서버에 연결하려면 /boot

그런 다음 Grub을 설정하십시오.

1-grubenv에서 변수 사용

GRUB_DEFAULT=saved

2- /boot의 Grub에서 iPXE를 체인로드하고 iPXE를 시작하기 전에 다음 명령을 포함합니다.

set saved_entry='<menuentry to boot from local drive>'
save_env saved_entry

3- Grub 메뉴 항목 앞에 로컬 드라이브에서 운영 체제를 로드하는 명령을 추가합니다.

set saved_entry='<menuentry iPXE>'
save_env saved_entry

4- 조치가 필요하지 않은 경우 부팅 제어 서버는 iPXE에 로컬 드라이브에서 부팅하도록 지시합니다.

sanboot --no-describe --drive 0x80

5- Grub을 다시 로드하고 로컬 드라이브로 부팅한 후 다음 부팅을 다시 iPXE로 설정합니다.

Windows 10으로의 부팅 시간(부팅 제어 서버 요청 포함)은 약 25초입니다. 그래서 실제로는 꽤 빠릅니다. :)

답변3

이를 달성하는 방법에는 최소한 두 가지가 있습니다.

  1. 보세요http://ipxe.org/appnote/work_around_bios_halting_on_ipxe_exit#examples, 다음 명령 중 하나가 적합할 수 있습니다.

    chain ${server}/grub4dos.exe --config-file="find --set-root /BOOTMGR;chainloader /BOOTMGR"
    chain ${server}/grub4dos.exe --config-file="root (hd0,1);chainloader +1"
    
  2. iPXE 사이트의 GRUB4DOS에서 이 페이지를 찾기 전에 이것을 구축했기 때문에 현재 다음을 사용하고 있습니다. ISOLINUX 및 다음 구성을 포함하는 ISO 이미지를 생성합니다.

    NOESCAPE 1
    PROMPT 0
    ALLOWOPTIONS 0
    
    DEFAULT chain-hd0-2
    LABEL chain-hd0-2
    SAY Chaining hd0 2...
    COM32 chain.c32
    APPEND hd0 2
    

    다음 명령으로 시작합니다(기본값은 0x80으로 설정되어 로컬 디스크를 덮어쓰므로 여기서는 0x81을 사용해야 합니다).

    sanboot --drive 0x81 ${server}/chain-hd0-2.iso
    

관련 정보