我试图在网络上引导一些Linux机器,因此它们通过NFS挂载它们的根文件系统。我想通过DHCP提供NFS挂载的路径,这样所有机器都可以共享相同的TFTP配置,但是根据DHCP响应中的值挂载不同的NFS文件夹。
如果我提供nfsroot内核参数(例如nfsroot=1.2.3.4:/srv/client),它们将很高兴地从该NFS服务器和path挂载根文件系统并正常启动,所以只要我在内核参数中提供路径,设置就可以工作。
但是,我不想在内核命令行上硬编码这个参数,我希望它从DHCP响应中加载,但是我无法让它工作。
如果我在DHCP服务器配置中设置了带有option root-path "1.2.3.4:/srv/client"的DHCP选项17,那么内核引导日志将显示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响应的值吗?
发布于 2021-07-16 12:06:32
我不确定这是否是解决办法,但像往常一样,在问完问题后,答案就出现了。
如果您提供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
复制相似问题