我如何詢問定義的伺服器要啟動什麼

我如何詢問定義的伺服器要啟動什麼

有哪些選項可用於完成以下引導場景?

啟動時(啟動前)聯絡定義的網路伺服器並詢問啟動什麼(正常答案:從本機硬碟啟動;替代答案:啟動映像 XYZ)

目標是能夠重新安裝客戶端,而無需在客戶端進行使用者互動。執行此操作的邏輯方法是 PXE 啟動,但由於我們無法控制預設為常規啟動的環境,因此 PXE 是不安全的,因為它會開啟攻擊向量。

到目前為止,我發現並嘗試過以下內容:從本機硬碟啟動 Grub2 並鍊式載入 iPXE。然後 iPXE 透過 http 聯繫定義的 Web 伺服器並取得 iPXE 腳本。但從那裡我還沒有找到從本機磁碟機啟動的方法(除了再次啟動 Grub 並以無限循環結束)。我想要啟動的作業系統位於啟動 Grub/iPXE 的相同硬碟的分割區 2 上。

  1. 有沒有其他方法可以實現我們想要實現的目標?
  2. 有沒有辦法告訴 Grub 在第二次啟動時選擇不同的選項(從 iPXE 返回)或告訴 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 選單(它掃描新填充的額外分割區並為其作業系統建立選單項目),然後使用grub-rebootreboot

如果機器無法恢復(即ssh在寬限期後無法恢復),我可以重置機器,然後它將在 Ubuntu 中重新啟動,準備分析出了什麼問題以及下一個週期。

透過在啟動時執行適當的程序,您可以檢查需要下載的下一個「映像」是什麼,看看您是否已經擁有該映像(如果沒有下載)並安裝。然後按照上面的方法重新啟動。

對於基於精益的systemd發行版,重新啟動過程應該相對較快,下載/安裝替代作業系統/發行版將花費大部分時間。

答案2

我找到了一種方法來實現我們正在尋找的目標。感謝@jc__ 對 grubenv 的提示以及@Anthon。

所以這是我的解決方案:將 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- 在 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
    

    並使用以下命令啟動它(這裡必須使用 0x81,因為它預設使用 0x80,這會覆蓋本機磁碟):

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

相關內容