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-cacheにcopy_exec
を利用して/sbin/mount.nfs
をinitrdに含める手法が(追加)紹介されている.