我正在尝试网络引导一些 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 响应中的值吗?
答案1
好吧,我不确定这是否是解决方案,但像往常一样,在提出问题后不久,答案就会出现。
看起来,如果您提供的nfsroot=:
话,就足以让它从 DHCP 选项中提取服务器 IP 和 NFS 路径。
它并不完美,因为 DHCP 值中提供的任何 NFS 选项(例如1.2.3.4:/srv/client,v3,hard
将被解释为路径的一部分,但是您可以从 DHCP 值中删除这些选项,并nfsroot=:,v3,hard
在命令行上为所有客户端提供 NFS 选项,但是仍然从 DHCP 获取服务器和路径。
如果有人知道执行此操作的正确方法,请发布答案,但此解决方法至少暂时似乎有效。