やるきなし

2015/10/29 12:44 / nfsroot で / に対して fscache (fsc) を有効にする

FS-Cache や cachefilesd 等に関しては他のページを参照のこと.ここでは / 自体が NFS な環境でそれを有効にすることを考える.

http://askubuntu.com/questions/23767/using-the-fsc-mount-option-with-nfsroot-kernel-parameter-to-allow-fs-cache に情報があるが,これだとうまく動かない.というのは /sbin/mount.nfs/usr/lib/klibc/bin/ に copy するだけだと /sbin/mount.nfs が依存するライブラリが initrd に含まれない.

私の環境(Debian GNU/Linux)では以下のようにした.

% sudo vi /usr/share/initramfs-tools/scripts/nfs
(nfs_mount_root_impl()の箇所)
-       nfsmount -o nolock ${roflag} ${NFSOPTS} ${NFSROOT} ${rootmnt}
+       mount.nfs ${NFSROOT} ${rootmnt} -o nolock ${roflag} ${NFSOPTS}

nfsmount は klibc に含まれるものだが,これが fsc option を解釈してくれない.ということで mount.nfs を使うように書き換える.引数の順も変更になるので注意.これは askubuntu.comと同じ.

% sudo vi /usr/share/initramfs-tools/hooks/klibc
(以下をファイル末に追加)
. /usr/share/initramfs-tools/hook-functions
copy_exec /sbin/mount.nfs /bin/mount.nfs

実際は /usr/share/initramfs-tools/hooks/klibc ではなく,新しいファイルを用意したほうが良いような気もするが,面倒だったので copy_exec で依存するライブラリも含めて initrd に含まれるようになる.

あとは,update-initramfs -u -k 3.XX.XX-2015XXXX+ で initrd 再生成,tftp に配置,pxelinux.cfg/default 等 PXE での起動 option の nfsroot=10.0.0.XX:/export/diskless,rw みたいな箇所を nfsroot=10.0.0.XX:/export/diskless,rw,fsc として fsc option を追加,という感じ.で,再起動.

% cat /proc/fs/nfsfs/volumes
NV SERVER   PORT DEV     FSID              FSC
v4 0a08000a  801 0:16    0:0               yes
v4 0a08000a  801 0:48    0:0               yes
v4 0a080002  801 0:49    0:0               yes

とかで全ての NFS mount point で cache が有効になっていることが確認できる.

nfsroot なので,kernel の option に注意が必要.多分以下ぐらいが必要.

CONFIG_FSCACHE=y
CONFIG_CACHEFILES=y
CONFIG_NFS_FSCACHE=y

追記(2017/5/18)

http://askubuntu.com/questions/23767/using-the-fsc-mount-option-with-nfsroot-kernel-parameter-to-allow-fs-cachecopy_execを利用して/sbin/mount.nfsをinitrdに含める手法が(追加)紹介されている.

Related articles