2013-02-17 281 views
5

已经开发了一个应用程序,用于在2.6.10内核的目标上运行。在Windows机器上的共享文件夹通过命令安装:如何禁用客户端在Linux的CIFS(samba)中的缓存

mount -t cifs -o username=xxx,password=xxx,forcedirectio //192.168.170.67/57 /fsRecord 

正如你可以在命令选项forcedirectio理解,我想在客户端上禁用缓存。但我不能。

目标上可用RAM的数量为40 MB。当我复制大小约为10MB的文件时,可用RAM容量减小到30 MB。

内核2.6.10使用cifs.1.28。我还将oplockEnabled设置为0(在源代码和/ proc/fs/cifs/OplockEnabled中)。但它并没有停止缓存。我怎样才能禁用CIFS客户端上的缓存真实?

回答

4

也许为时已晚,但在拱我做到这一点有以下几点:

/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 

这里有一个方便的功能来确定有效的模块选择。

# 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 
} 

有关modprobe.d语法的更多信息,请参阅man 5 modprobe.d

此外,CIFS装载尊重cache选项。根据the mount.cifs manual,设置cache=none应禁用缓存,而默认值为cache=strict