在smb.conf設定檔中,可以分成多個service。每個service可以擁有各自的設定。其中有一個設定稱為vfs objects,此設定是用來套用stackable VFS功能到該service上。
所謂的stackable VFS功能指的是在進行檔案存取時,samba額外對該service進行的處理動作,這是在samba的第3版之後才加入的新功能。你可以在一個service上套用多個vfs modules,samba混根據smb.conf設定檔案所列出的先後順序,依序套用所列的vfs module。在samba套件中也有幾個vfs objects可以使用,這些module放在samba安裝目錄下的lib目錄中(/usr/lib/samba/vfs或是/usr/local/samba/lib/vfs):
audit
這個vfs module可以將存取檔案的紀錄寫到syslog中,
default_quota
default_quota可以設定user或是group的quota。
extd_audit
這個module原則上與audit一樣,除了將檔案存取紀錄寫到syslog中,還會寫一份到samba本身的log檔。
recycle
這個module是模擬Windows上的資源回收筒的功能,也就是刪除sambaer server上的檔案時,samba會將你刪除的檔案搬移到一個隱藏目錄中,預設是.recycle目錄,不過也可以透過repository選項設定要當作資源回收筒的路徑。
有些vfs module可能很簡單,有些則有選項可供設定。其設定的語法是以
module: option = value的格式來指定所要設定的選項,例如指定資源回收筒的路徑為/tmp:
[myshare]
vfs objects = recycle
recycle: repository = /tmp
如果選項的設定值不只一個,而是有多個所形成的list,則每個設定值之間用應逗號隔開。例如:
[myshare]
vfs objects = access_control
access_control: allow_host = pc1
access_control: deny_host = pc2, pc3
當你自行開發vfs module時,samba已經有提供處理上述vfs module選項的相關function。在 loadparm.c檔案中,有許多有關選項處理的function。其中
const char *lp_parm_const_string(int snum, const char *type, const char *option, const char *def)
以及
const char **lp_parm_string_list(int snum, const char *type, const char *option, const char **def)
是兩個可以用來得到service的選項設定值或設定列表的function。其中,
snum是連線id,可以透過SNUM(conn)取得。
type就是vfs module的名稱,例如:recycle, access_control。
option是指定要讀取的選項名稱,例如:repository, allow_host, deny_host。
def是預設值,也就是在smb.conf中沒有針對該選項進行設定時,vfs module預設要採用的設定值。
而lp_parm_const_string()與lp_parm_string_list()兩個差別在於,不管設定值的個數有幾個,t_string()會將所有選項(包含分隔選項的逗號)當作一個字串傳回,而lp_parm_string_list()則會將每個選項以一個字串儲存,所以會傳回一個字串陣列。例如:
lp_parm_const_string(SNUM(conn), "access_control", "allow_host", NULL) => "pc1"
lp_parm_const_string(SNUM(conn), "access_control", "deny_host", NULL) => "pc2, pc3"
lp_parm_string_list(SNUM(conn), "access_control", "allow_host", NULL) => {"pc1"}
lp_parm_tring_list(SNUM(conn), "access_control", "deny_host", NULL) => {"pc2", "pc3"}