NFS网络启动时服务器/boot目录为空,为何客户端却存在对应文件?
问题解析与解决方案
嘿,这事儿我之前排查过好几次,其实核心逻辑很好理解:你看到客户端上的/boot目录和文件,跟NFS服务器上的/boot根本不是一回事儿——PXE启动的内核和initrd是直接加载到内存里的,从来不会自动写到NFS根文件系统里,而客户端的/boot是启动过程中临时生成的。
下面我拆解一下整个逻辑,再给你排查和解决的步骤:
先理清楚PXE启动的核心流程
你这套环境的启动顺序是这样的:
- 客户端通过DHCP拿到IP、TFTP地址,下载
pxelinux.0启动引导程序 - 从TFTP下载pxelinux配置文件,接着下载
vmlinux(内核)和initrd.img(初始化镜像) - 内核加载到内存,解压initrd并运行里面的初始化脚本,最后挂载NFS服务器的目录作为客户端的根文件系统
注意:这里的vmlinux和initrd.img是直接从TFTP读到内存里运行的,全程不会碰NFS的/boot目录,所以NFS上的/boot是空的完全正常!
那客户端的/boot是哪儿来的?
无非两种可能:
- initrd镜像自带/boot目录:很多发行版的initrd里会预先打包/boot相关文件,当initrd被解压到内存临时根时,这个/boot就存在了。哪怕后来挂载了NFS根,如果NFS根没有/boot,内存里的/boot会被保留下来(或者通过绑定挂载的方式留在新根里)。
- 启动过程临时生成:有些初始化脚本会把内存里的内核文件临时写到/tmp或者专门的tmpfs分区里,然后挂载为/boot,方便后续管理。
怎么验证?
你可以在客户端上跑几个命令确认:
- 查看/boot的挂载来源:
mount | grep /boot,看看它是挂载的tmpfs、loop设备还是本地磁盘(如果客户端有本地盘的话) - 检查initrd的内容:在TFTP服务器上解压initrd看看,命令如下:
解压完看看里面有没有/boot目录和对应的文件,一查就明白。mkdir /tmp/initrd_temp && cd /tmp/initrd_temp zcat /path/to/tftp/server/initrd.img | cpio -idmv
怎么让NFS根的/boot有文件?
如果只是想让NFS服务器的/path/to/nfsroot/boot/目录和客户端的/boot内容一致,直接把TFTP上的内核和initrd复制过去就行:
cp /path/to/tftp/vmlinux /path/to/nfsroot/boot/ cp /path/to/tftp/initrd.img /path/to/nfsroot/boot/
这样客户端挂载NFS根后,/boot就会显示这些文件了。
内容的提问来源于stack exchange,提问作者ThorSummoner
相关产品推荐
相关产品推荐

