網路啟動時如何通過 DHCP 提供 nfsroot 路徑
我正在嘗試通過網路引導一些 Linux 機器,因此它們通過 NFS 掛載它們的根文件系統。我想通過 DHCP 提供 NFS 掛載的路徑,以便所有機器可以共享相同的 TFTP 配置,但根據 DHCP 響應中的值掛載不同的 NFS 文件夾。
如果我提供
nfsroot
核心參數(例如nfsroot=1.2.3.4:/srv/client
),那麼他們會很樂意從該 NFS 伺服器和路徑掛載根文件系統並正常啟動,因此只要我在核心參數中提供路徑,設置就可以正常工作。但是我不想在核心命令行上硬編碼這個參數,我希望它從 DHCP 響應中載入,但我不能讓它工作。
如果我在我的 DHCP 伺服器配置中設置 DHCP 選項 17,
option root-path "1.2.3.4:/srv/client"
則會顯示核心引導日誌IP-Config: Complete
,rootserver=1.2.3.4, rootpath=/srv/client
因此核心自動配置會正確選擇此 DHCP 選項。但是,一旦我
nfsroot
從核心命令行中刪除了參數,它似乎會跳過一些 NFS 步驟::: mounting '' on real root nfs: Bad value for 'source'
因此,如果我添加
nfsroot=
回來(但將其留空),則失去的 NFS 消息會返回但由於沒有路徑而失敗 - 它沒有選擇 DHCP 提供的路徑:NFS-Mount: y:y Waiting 10 seconds for device /dev/nfs ... nfsmount: need a path ERROR: Failed to mount the real root device.
查看核心程式碼,如果路徑以或數字開頭
/
,,
那麼它將對其進行解析,否則它將使用預設/tftproot/%s
字元串填充路徑。所以我嘗試提供路徑,
(即空伺服器、空路徑、選項分隔符,然後沒有選項),這取得了一點進展——現在出現了 DHCP 提供的路徑:NFS-Mount: ,:/srv/client Waiting 10 seconds for device /dev/nfs ... nfsmount: can't parse IP address ',' ERROR: Failed to mount the real root device.
但是現在它將逗號視為伺服器 IP。測試我的理論,看看如果我確實提供了一個實際路徑會發生什麼
nfsroot=/dummy
,果然它會覆蓋 DHCP 響應:NFS-Mount: /dummy:/dummy Waiting 10 seconds for device /dev/nfs ... nfsmount: can't parse IP address '/dummy' ERROR: Failed to mount the real root device.
我有點卡在這一點上。似乎如果您省略該
nfsroot
參數,則它不會嘗試進行 NFS 掛載,但如果您提供它,它將覆蓋從 DHCP 伺服器返回的值。有什麼想法可以告訴核心進行 nfsroot 掛載但使用 DHCP 響應中的值嗎?
好吧,我不確定這是否是解決方案,但像往常一樣,在提出問題後,答案就會出現。
如果您提供
nfsroot=:
那麼似乎足以讓它從 DHCP 選項中提取伺服器 IP 和 NFS 路徑。這並不完美,因為在 DHCP 值中提供的任何 NFS 選項(例如
1.2.3.4:/srv/client,v3,hard
,將被解釋為路徑的一部分,但是您可以從 DHCP 值中刪除選項並nfsroot=:,v3,hard
在命令行上為所有客戶端提供 NFS 選項,但是仍然從 DHCP 獲取伺服器和路徑。如果有人知道執行此操作的正確方法,請發布答案,但這種解決方法似乎至少暫時有效。