web-dev-qa-db-ja.com

nfsrootカーネルパラメーターでfscマウントオプションを使用してFSキャッシュを許可する

Ubuntu 10.10システムをPXEブートしています。ここでは、カーネルパラメーターを次のように指定しています。

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

FSキャッシュ機能(cachefilesdパッケージ)を使用するには、マウントオプション 'fsc'を使用する必要があります。ただし、これを試みると、起動時に次のエラーが発生します。

nfsmount: bad option 'fsc'

Nfsmountがこのオプションを許可しないのはなぜですか? (起動後にmount -o fscを使用して手動でマウントすると正常に機能します。)

Nfsmountをファイルmount -t nfs/usr/share/initramfs-tools/scripts/nfsに変更し、update-initramfs -uを実行してinitramfsイメージを更新しましたが、まだエラーが発生しているようです:

mount: unknown nfs mount option 'fsc'

私の推測では、これはklibcのマウント機能の制限です。これに対処する最良の方法は何でしょうか? 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.

ただし、このメッセージは、使用するマウントオプションに関係なく表示されるため、まったく別の問題のように見えます...

5
meanderix

私はついにそれを解決しました。手順は次のとおりです。

  1. Ubuntu 10.04のinitramfsイメージにmount.nfsを追加します(/usr/lib/klibc/bin folderにコピーします)。
  2. /usr/share/initramfs-tools/scripts/nfsのnfsmount行を次のように変更します。

    mount.nfs ${NFSROOT} ${rootmnt} -o nolock ${roflag} ${NFSOPTS}
    
  3. mkinitramfsまたはupdate-initramfsのいずれかでinitramfsイメージを更新します。

これにより、Ubuntu 10.10システムのnfsrootでfscオプションが有効になります。しかし、10.10からmount.nfsを使用できない理由がわからない-おそらく回帰ですか?

5
meanderix

最近、16.04に基づいて新しいnfsrootを構築していましたが、nfsrootファイルシステムにcachefilesdを使用することをもう一度検討することにしました。それでも、私はこの投稿につまずいた。正しい方向に向けられるようになったので、うまくいきましたが、ここに掲載されたものよりも良い答えがあると思います。

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のファイルシステムキャッシュができました。

2
SimonSays

カーネルはそのモジュールでコンパイルされていません(カーネル構成のCONFIG_NFS_FSCACHE)。そして、そのためのガイドへのリンク: buntu Kernel/Compile

0
user8290