Dhcp

網路啟動時如何通過 DHCP 提供 nfsroot 路徑

  • July 16, 2021

我正在嘗試通過網路引導一些 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: Completerootserver=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 獲取伺服器和路徑。

如果有人知道執行此操作的正確方法,請發布答案,但這種解決方法似乎至少暫時有效。

引用自:https://unix.stackexchange.com/questions/658674