有哪些選項可用於完成以下引導場景?
啟動時(啟動前)聯絡定義的網路伺服器並詢問啟動什麼(正常答案:從本機硬碟啟動;替代答案:啟動映像 XYZ)
目標是能夠重新安裝客戶端,而無需在客戶端進行使用者互動。執行此操作的邏輯方法是 PXE 啟動,但由於我們無法控制預設為常規啟動的環境,因此 PXE 是不安全的,因為它會開啟攻擊向量。
到目前為止,我發現並嘗試過以下內容:從本機硬碟啟動 Grub2 並鍊式載入 iPXE。然後 iPXE 透過 http 聯繫定義的 Web 伺服器並取得 iPXE 腳本。但從那裡我還沒有找到從本機磁碟機啟動的方法(除了再次啟動 Grub 並以無限循環結束)。我想要啟動的作業系統位於啟動 Grub/iPXE 的相同硬碟的分割區 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-reboot
和reboot
。
如果機器無法恢復(即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
至少有兩種方法可以實現這一點:
看一眼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
並使用以下命令啟動它(這裡必須使用 0x81,因為它預設使用 0x80,這會覆蓋本機磁碟):
sanboot --drive 0x81 ${server}/chain-hd0-2.iso