sha*_*ess 6 samba caching cifs embedded-linux
开发了一个应用程序,以2.6.10内核的目标运行.Windows计算机上的共享文件夹通过以下命令安装:
mount -t cifs -o username=xxx,password=xxx,forcedirectio //192.168.170.67/57 /fsRecord
Run Code Online (Sandbox Code Playgroud)
从命令选项中可以理解forcedirectio,我想在客户端禁用缓存.但我不能.
目标上的可用RAM量为40 MB.当我复制大小约10MB的文件时,可用RAM大小减少到30 MB.
内核2.6.10使用cifs.1.28.我还将oplockEnabled设置为0(在源代码和/ proc/fs/cifs/OplockEnabled中).但它并没有停止缓存.如何在cifs客户端上禁用缓存?
也许为时已晚,但在Arch中,我通过以下方式完成此任务:
/etc/modprobe.d/cifs.conf
-------------------------
# Disable caching and the CIFS oplog for stable NTFS network shares
options cifs enable_oplocks=0
install cifs /sbin/modprobe --ignore-install cifs $CMDLINE_OPTS && echo 0 > /proc/fs/cifs/LinuxExtensionsEnabled && echo 0 > /proc/fs/cifs/LookupCacheEnabled
remove cifs /sbin/modprobe -r cifs
Run Code Online (Sandbox Code Playgroud)
这是一个确定有效模块选项的便捷功能.
# Shamelessly ripped the Kernel_Modules ArchWiki entry:
# https://wiki.archlinux.org/index.php?title=Kernel_modules&oldid=286087#Bash_function_to_list_module_parameters
function aa_mod_parameters ()
{
N=/dev/null;
C=`tput op` O=$(echo -en "\n`tput setaf 2`>>> `tput op`");
for mod in $(cat /proc/modules|cut -d" " -f1);
do
md=/sys/module/$mod/parameters;
[[ ! -d $md ]] && continue;
m=$mod;
d=`modinfo -d $m 2>$N | tr "\n" "\t"`;
echo -en "$O$m$C";
[[ ${#d} -gt 0 ]] && echo -n " - $d";
echo;
for mc in $(cd $md; echo *);
do
de=`modinfo -p $mod 2>$N | grep ^$mc 2>$N|sed "s/^$mc=//" 2>$N`;
echo -en "\t$mc=`cat $md/$mc 2>$N`";
[[ ${#de} -gt 1 ]] && echo -en " - $de";
echo;
done;
done
}
Run Code Online (Sandbox Code Playgroud)
有关man 5 modprobe.dmodprobe.d语法的更多信息,请参见参考资料.
此外,CIFS安装尊重cache选项.根据mount.cifs手册,设置cache=none应禁用缓存,而默认值为cache=strict.