我正在通过 PXE 启动 Ubuntu 10.10 系统,其中我指定了内核参数如下:
append root=/dev/nfs initrd=ubuntu-boot/initrd.img-2.6.35-24-generic
nfsroot=11.22.33.44:/data/nfsroot,fsc ip=dhcp rw
我需要使用挂载选项“fsc”才能使用 FS-cache 功能(cachefilesd 包)。但是,当我尝试此操作时,启动时出现以下错误:
nfsmount: bad option 'fsc'
为什么 nfsmount 不允许此选项?(mount -o fsc
启动后手动挂载时,它可以正常工作。)
mount -t nfs
我在文件中将nfsmount 更改为/usr/share/initramfs-tools/scripts/nfs
,然后运行update-initramfs -u
更新 initramfs 映像,但似乎仍然出现错误:
mount: unknown nfs mount option 'fsc'
我的猜测是,这是安装功能的限制库。解决这个问题的最佳方法是什么?nfsmount 程序是否需要修补?
由于这似乎是 klibc 中 nfsmount 工具的限制,所以我在想是否可以添加/sbin/mount.nfs
到 initramfs 映像中并使用此工具挂载 nfsroot。我将其复制到文件夹中/usr/lib/klibc/bin
,并更新了脚本/usr/share/initramfs-tools/scripts/nfs
,如下所示:
mount.nfs ${NFSROOT} ${rootmnt} -o nolock ${roflag} ${NFSOPTS}
启动更新的 initramfs 映像后,执行 mount.nfs 时会有较长的延迟,然后显示以下消息:
mount.nfs: an incorrect mount option was specified
Begin: Retrying nfs mount ... Begin: Running /scripts/nfs-premount ... done.
但是,无论我使用什么挂载选项,都会显示此消息,因此它似乎是一个完全不同的问题......
答案1
我终于解决了这个问题。步骤如下:
- 将 Ubuntu 10.04 中的 mount.nfs 添加到 initramfs 映像中(将其复制到
/usr/lib/klibc/bin folder
. 中) 将 nfsmount 行更改
/usr/share/initramfs-tools/scripts/nfs
为:mount.nfs ${NFSROOT} ${rootmnt} -o nolock ${roflag} ${NFSOPTS}
mkinitramfs
使用或更新 initramfs 映像update-initramfs
。
这将在我的 Ubuntu 10.10 系统上启用 nfsroot 上的 fsc 选项。但我不知道为什么我不能使用 10.10 中的 mount.nfs ——也许是回归?
答案2
最近,我正在基于 16.04 构建一个新的 nfsroot,并决定再次研究使用 cachefilesd 作为 nfsroot 文件系统。我又一次偶然发现了这篇文章。它帮助我指明了正确的方向,我最终让它工作了,但我相信我有一个比这里发布的更好的答案。
虽然 meanderix 的步骤可能有效,但我认为这不是最好的方法。因此,以下是我的步骤:
- 创建
/usr/share/initramfs-tools/hooks
一个新文件。我将其命名fsc
为文件系统缓存。 将以下内容添加到您的文件中:
#!/bin/sh set -e PREREQ="" prereqs () { echo "${PREREQ}" } case "${1}" in prereqs) prereqs exit 0 ;; esac . /usr/share/initramfs-tools/hook-functions copy_exec /sbin/mount.nfs /sbin exit 0
使 fsc 文件可执行:
chmod 755 /usr/share/initramfs-tools/hooks/fsc
按照 meanderix 的建议进行修改
/usr/share/initramfs-tools/scripts/nfs
。生成你的 initramfs。例如:
mkinitramfs -o /fscinitrd
这里的不同之处和真正的魔力在于/usr/share/initramfs-tools/hooks/fsc
文件。特别是那copy_exec
行。创建初始 RAM 磁盘时,它将自动添加mount.nfs
到 initramfs。但等等,还有更多!它还将确定所需的库并为您添加它们。这真的很酷,因为在 Ubuntu 16.04 上我需要它,libtirpc.so
因为mount.nfs
它依赖于它,而它为我添加了这些依赖项。
完成此操作并配置 cachefilesd 后,我现在拥有 NFSROOT 的文件系统缓存,这真是太棒了。
答案3
内核尚未使用该模块进行编译(内核配置中的 CONFIG_NFS_FSCACHE)。以下是指南链接:Ubuntu 内核/编译