使用带有 nfsroot 内核参数的 fsc 挂载选项来允许 FS-cache

使用带有 nfsroot 内核参数的 fsc 挂载选项来允许 FS-cache

我正在通过 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

我终于解决了这个问题。步骤如下:

  1. 将 Ubuntu 10.04 中的 mount.nfs 添加到 initramfs 映像中(将其复制到/usr/lib/klibc/bin folder. 中)
  2. 将 nfsmount 行更改/usr/share/initramfs-tools/scripts/nfs为:

    mount.nfs ${NFSROOT} ${rootmnt} -o nolock ${roflag} ${NFSOPTS}
    
  3. mkinitramfs使用或更新 initramfs 映像update-initramfs

这将在我的 Ubuntu 10.10 系统上启用 nfsroot 上的 fsc 选项。但我不知道为什么我不能使用 10.10 中的 mount.nfs ——也许是回归?

答案2

最近,我正在基于 16.04 构建一个新的 nfsroot,并决定再次研究使用 cachefilesd 作为 nfsroot 文件系统。我又一次偶然发现了这篇文章。它帮助我指明了正确的方向,我最终让它工作了,但我相信我有一个比这里发布的更好的答案。

虽然 meanderix 的步骤可能有效,但我认为这不是最好的方法。因此,以下是我的步骤:

  1. 创建/usr/share/initramfs-tools/hooks一个新文件。我将其命名fsc为文件系统缓存。
  2. 将以下内容添加到您的文件中:

    #!/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
    
  3. 使 fsc 文件可执行:

    chmod 755 /usr/share/initramfs-tools/hooks/fsc
    
  4. 按照 meanderix 的建议进行修改/usr/share/initramfs-tools/scripts/nfs

  5. 生成你的 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 内核/编译

相关内容