다음 부팅 시나리오를 수행하는 데 사용할 수 있는 옵션은 무엇입니까?
부팅 시(부팅 전) 정의된 웹 서버에 접속하여 무엇을 부팅할지 묻습니다(일반 답변: 로컬 하드 드라이브에서 부팅, 대체 답변: 부팅 이미지 XYZ)
목표는 클라이언트에서 사용자 상호 작용 없이 클라이언트를 다시 설치할 수 있는 것입니다. 이를 수행하는 논리적인 방법은 PXE 부팅이지만 일반 부팅을 기본으로 하는 환경을 제어하지 않기 때문에 PXE는 공격 벡터를 열 수 있으므로 안전하지 않습니다.
지금까지 내가 찾아 시도한 것은 다음과 같습니다. 로컬 하드 드라이브에서 Grub2를 시작하고 iPXE를 체인로드합니다. 그런 다음 iPXE는 http를 통해 정의된 웹 서버에 접속하고 iPXE 스크립트를 다시 가져옵니다. 그러나 거기에서는 아직 로컬 드라이브에서 부팅하는 방법을 찾지 못했습니다(Grub을 다시 시작하고 무한 루프로 끝나는 것을 제외하고). 부팅하려는 OS는 Grub/iPXE가 시작된 것과 동일한 하드 드라이브의 파티션 2에 있습니다.
- 우리가 달성하려는 목표를 달성할 수 있는 다른 방법이 있습니까?
- 두 번째 시작(iPXE에서 돌아올 때)에서 Grub에게 다른 옵션을 선택하도록 지시하거나 iPXE에 파티션 2에서 부팅하도록 지시하는 방법이 있습니까?
참고 사항: 파티션 2에는 Windows Boatloader가 포함되어 있으며 Grub 메뉴에서 부팅할 수 있습니다.
답변1
나는 원격 시스템을 업그레이드하는 다음 기술을 사용했는데, 이는 여러분에게도 도움이 될 것입니다. 해당 시스템에서는 (부팅) 화면을 볼 수 없고 재설정만 시작할 수 있었습니다. 시스템은 grub(Ubuntu 12.04)으로 부팅되었으며 추가 파티션과 데이터 파티션이 모두 있었습니다. 트릭은 다음에 삽입하는 것입니다
/etc/default/grub
.
GRUB_DEFAULT=saved
GRUB_SAVEDEFAULT=false
다음과 같은 경우를 제외하고 항상 0 항목(Ubuntu 12.04)으로 부팅합니다.
- 콘솔에 있는 누군가가 다른 것을 선택합니다
grub-reboot X
Ubuntu에 로그인한 상태에서 실행하고 재부팅합니다.
Ubuntu에서 tar 파일을 다운로드하여 추가 파티션으로 추출한 다음(또는 직접 약간 변경) 실행하여 update-grub
grub 메뉴를 업데이트하고(새로 채워진 추가 파티션을 스캔하고 해당 OS에 대한 메뉴 항목을 생성함) 다음을 사용합니다 grub-reboot
. reboot
.
머신이 다시 돌아오지 않으면(예: ssh
유예 기간 후에도 돌아오지 못하는 경우) 머신을 재설정하면 무엇이 잘못되었는지 분석하고 다음 주기를 위해 Ubuntu에서 재부팅할 수 있습니다.
부팅 시 적절한 프로그램을 실행하면 다운로드해야 할 다음 "이미지"가 무엇인지 확인할 수 있고, 해당 이미지가 이미 있는지 확인하고(다운로드하지 않은 경우) 설치할 수 있습니다. 그런 다음 위와 같이 재부팅하십시오.
린 systemd
기반 배포판을 사용하면 재부팅 프로세스가 비교적 빨라야 하며 대체 OS/배포판을 다운로드/설치하는 데 시간의 대부분이 소요됩니다.
답변2
나는 우리가 찾고 있던 것을 성취할 수 있는 방법을 찾았습니다. grubenv와 @Anthon에 대한 힌트를 주신 @jc__에게 감사드립니다.
내 해결책은 다음과 같습니다. 사용자 정의 스크립트와 함께 iPXE 커널 바이너리(.lkrn)를 넣어 부팅 제어 서버에 연결하려면 /boot를 사용하세요.
그런 다음 Grub을 설정하십시오.
1- grubenv의 변수를 사용하려면
GRUB_DEFAULT=saved
2- Grub에서 /boot에 iPXE를 체인 로드하고 iPXE를 부팅하기 전에 다음 명령을 포함합니다.
set saved_entry='<menuentry to boot from local drive>'
save_env saved_entry
3- 로컬 드라이브에서 OS를 로드하는 Grub 메뉴 항목을 앞에 추가합니다.
set saved_entry='<menuentry iPXE>'
save_env saved_entry
4- 아무것도 수행할 필요가 없는 경우 부팅 제어 서버는 iPXE에 다음을 사용하여 로컬 드라이브에서 부팅하도록 지시합니다.
sanboot --no-describe --drive 0x80
5- Grub이 다시 로드되고 로컬 드라이브로 부팅되며 다음 부팅이 다시 iPXE로 설정됩니다.
부팅 제어 서버 요청을 포함하여 Windows 10으로 부팅하는 데 걸리는 시간은 약 25초입니다. 그래서 실제로는 꽤 빠릅니다. :)
답변3
이를 수행하는 방법에는 최소한 두 가지가 있습니다.
보세요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"
나는 현재 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