Samba 再舞

原本以為 Samba 的設定對我已經不是問題了, 不過這天拿到一台全新的 server 測試時, 真讓我傷了不少腦筋.

首先不就是去安裝一套 samba 嗎?然後改改 smb.conf, /etc/init.d/smb restart, 從 PC 連過去不就結了?我原本就是這樣想的, 不過 PC 始終連不上這台新 server. 由於別台 server 的 samba 我都能連得上, 所以 PC 的防火牆顯然沒有問題. 還是來關心 smb.conf 吧!

把 passdb backend =tdbsam ? 改到 tdbsam 時,也看到註解上直接說 smbpasswd 那套都過時了, 現在不是 tdbsam 就是 ldapsam. SAM 大概就是指 Samba 了? LDAP 是 Light Directory Access Protocol,設定 ldapsam 帳號密碼會去問 LDAP server,適用於大量的使用者.而 tdbsam (Trivial DataBase)可以直接支援這台 server 上的用戶, 適用於 250 個以下的使用者 [ref 1]. 不過連 security=share 都不靈, 顯然和帳號密碼都無關.

接著很自然就會想到, Google 一下 “Samba 連不上" 這個關鍵字. 呵呵, Google 果然給我們很多建議, 首先就是目錄的權限要設對. 這個容易, 把它們的 mode 都設成 777 就結了, 但這個也不是原因. 其他人遇到和我類似的狀況時, 往往都是孤兒文 – 有人問沒人答.

沒辦法, 我只好去看 log 了 – Windows 的 “診斷". 其實 Windows 的 “疑難排解" 很難用, 這次真的是不得已才去研究它.

原來是 port 445 沒回應. 那麼怎麼把 server 的 port 445 打開呢?首先要去改 iptables [ref 2].

vi ./etc/sysconfig/iptables

加入兩行規則, 把 port 445 的 TCP 和 UDP 都改為接受.

-A INPUT -m state — state NEW -m tcp -p tcp -s 172.26.0.0/16 –dport 445 -J ACCEPT

-A INPUT -m state — state NEW -m udp -p udp -s 172.26.0.0/16 –dport 445 -J ACCEPT

其中, 192.168.0.0/16 的 代表 mask  255:255:0:0, 所以公司裡面不同網段的 IP 都可以連得上. 關於 32~0 各自代表 mask 值多少, 請參照 [ref 3].數字愈小代表接受 IP 的範圍愈大. 
然後重啟防火牆, 
service iptables restart

果然, 現在新增一個網路連線磁碟機的時候, 所有 smb.conf 裡面設定的目錄都自動跑出來讓我選了.

[ref]

1. Howto setup Samba Server (File Server) With tdbsam Backend 

2. 邁向 RHCE 之路 (Day29) – Samba 檔案分享伺服器

3. Classless Inter-Domain Routing

SAMBA vs. CIFS

SAMBA (SMB – Server Message Block) 是一個讓 Windows 系統存取 Linux 檔案系統的 protocol, 鳥哥對此有很好的介紹. 他也提到, CIFS (Common Internet File System) 和 NFS (Network File System) 只在 Windows 或 Unix 裡面互通. 原文說:

不過,NFS 僅能讓 Unix 機器溝通, CIFS 只能讓 Windows 機器溝通。傷腦筋,那麼有沒有讓 Windows 與 Unix-Like 這兩個不同的平台相互分享檔案資料的檔案系統呢?

果真這樣的話, 那麼來推銷 CIFS IP 的廠商不就是來亂的嗎?也不是, 中間有個演變的過程.

根據歷史, 1991 年先有 SMB 之後, Microsoft 到 1996 年才仿效 SMB 發展出 CIFS 與之匹敵, 放在 Windows NT 裡面. 到了 2006 年推出 Vista 的時候, Microsoft 乾脆就把新的 CIFS 命名為 SMB 2, 頗有雀巢鳩佔的味道. 到了 Windows 7 的時代, 微軟繼續地推出了 SMB 2.1 版, 老實不客氣地搶坐了正統的大位. (Java、Java script 的故事也差不多).

所以今天的 SAMBA 已經是 SMB + CIFS 的綜合體, 這裡有一篇說明. CIFS 代表比較新, 相容性比較好, 解決了 unicode, access control lists, aggressive cacheing, 2/4GB transfer bug 等問題 . 不過若是舊電腦連不上去的話, 請回到老 SAMBA 吧! 

此外, 原始的 SMB 要從 GPL 2.0 升級到 3.0 了. 如果要避免 open source, 可以考慮搬家到 CIFS.CIFS 由 SNIA (Storage Networking Industry Association) 所維護, 理論上可以看著 CIFS 的 technology Reference 自己 implement. 但是其中用到的技術, 要向原始的 owner, reasonable and non-discriminatory (合理而無差別) 地取得授權. 此外, 真正握有技術的 Microsoft 把 CIFS 的規格弄得含糊不清, 因此產生了賣 CIFS IP 的軟體生意出來.

看來看去, 網路上這篇介紹得最好: SMB: The Server Message Block Protocol

其中的這句話寫得更是傳神: Like NetBIOS, the Server Message Block protocol originated a long time ago at IBM. Microsoft embraced it, extended it, and in 1996 gave it a marketing upgrade by renaming it "CIFS".希望有一天我的文章也可以寫得這麼精煉.

Samba server 設定的小 memo

我們公司的 server 前幾天快爆了, 於是我就加了一顆硬碟上去. 由於排線有點小問題, 拆裝硬碟之後, 大家密集使用的 server, 突然就變得不能開機了. 雖然 server 上沒有甚麼重要的資料, 但是我們工讀生的 script 都在上面, 萬一她那邊不能 release code 了, 誰都幫不上忙. 我們緊張了一陣子, 還好把排線換掉之後, 每一顆硬碟的內容都在.

電腦不會動, 當然就是重灌囉! 不幸的是, 我們的 Fedora 版本太舊了, 安裝上去之後, telnet, samba, nfs 統統不會動了, 在本機上選 upgrade, service 也統統都沒反應. 因此我把手動安裝的 samba 的步驟稍微整理一下, 以備不時之需. 其實我覺得更應該記下來的是, 我們同事 hack 的方法, 竟然都不用啟動 smb 耶, 而是依序執行某 3 隻程式也行. 我們先講正統的做法吧!

1. 檢查 samba 的 package 在不在?

rpm -qa samba

沒看到印東西, 那麼 /etc/init.d 下面應該沒有smb 這隻程式.

2. 安裝 yam -y install samba

接者 samba 就被安裝好了, 但是還沒有啟動.

3. 加 user, vi /etc/samba/smb.conf

檔案的上半部有一些 global rule, 開得鬆一點, 底下的目錄就隨便都可以進得去.

4. 測試 testparm

如果有問題會 complain.

5. 加 user, smbpasswd -a username

這個程式會要求輸入 password, 並且再 confirm 一次

值得留意的地方是, smbpasswd 是一個執行檔, 但是 /etc/samba/smbpasswd 底下真的有一個同名的檔案是放 password 的實體位置.

6. 可以省略的部分

6.0 其實連 5 都可以省略, 假如大家開公用目錄來用, 就不要分那麼細了.

6.1 防火牆設置,  vi /etc/sysconfig/iptables

6.2 重新啟動 iptable, /etc/rc.d/init.d/iptables restart

6.3 將 samba 設為自動啟動, chkconfig smb on

6.4 確認自動啟動的狀態, chkconfig –list smb

7. 啟動 samba server,  /etc/init.d/smb start

系統會印出

starting smb service: [OK]

starting nmb service: [OK]

8. 若不按照上面 7 的步驟, 硬是執行 smbd, nmbd, winbinbd 也是有同樣的效果. 而且不用 smb restart  也可以對 smb.conf 立刻生效喔! 這就是我們同事的最精簡 hack 版.

若慎重一點的話, 要按照下面的步驟.

以下抄襲自:由 jengyic 發表於 週六 6月 03, 2006 5:22 pm,

網址為: http://www.daemon-land.idv.tw/phpBB3/viewtopic.php?f=18&t=143

安裝 samba

1.cd /usr/ports/net/samba3

make install clean

options for samba

不修改預設值,僅多勾選 AD Support 選項。

2.cp /usr/local/etc/smb.conf.default /usr/local/etc/smb.conf

3.開機時啟動

(1)察看 samba.sh 內容,寫入 samba_enable="YES"

(2)寫入
smbd、nmbd、winbindd

smbd_enable="YES"

smbd_flags="-D"

nmbd_enable="YES"

nmbd_flags="-D"

winbindd_Enable="YES"

winbindd_flags=""

inetd_enable="YES"

4.使用 swat 管理

vi /etc/inetd.conf

將 swat 敘述前的 # 符號刪除,重新啟動 inetd

/etc/rc.d/inetd restart

開啟瀏覽器,輸入 http://FQDN:901

註1:

inetd.conf

# Enable the following two entries to enable samba startup from inetd
# (from the Samba documentation). Enable the third entry to enable the swat
# samba configuration tool.
#
#netbios-ssn stream tcp nowait root /usr/local/sbin/smbd smbd
#netbios-ns dgram udp wait root /usr/local/sbin/nmbd nmbd
#swat stream tcp nowait/400 root /usr/local/sbin/swat swat

前兩行表示如果要在開機的時候,自 inetd 啟動 samba ,需要將 netbios* 前的 # 符號刪除;如果要使用第三方 samba 設定工具(指的是 swat ),就需要將 swat 前的 # 符號刪除。

但是,發現系統主機前會不斷出現訊息r

….inetd[1228]: netbios-ssn/tcp: bind: Address already in use
….inetd[1228]: netbios-ns/udp: bind: Address already in use

最後,將 /etc/inetd.conf 中的 netbios* 前的 # 符號填上,就不再出現;猜測可能是因為先前寫入 /etc/rc.conf 檔案中的 smbd、nmbd 兩者已經在開機的過程中啟動,而後 inetd 要再啟動 smbd、nmbd 時,便出現已使用的訊息。

註2:

會了能夠在網路上看見中文檔案名稱的分享資料夾,需要在 smb.cond 檔案中加入 unix charset = big5 (發現僅在 xp 中見到中文僅需修改 big5 即可,但在 98 會呈現空白,需再添加 dos charset = 0xb9 ,由 CP850 修改為 0xb9 ,方可辨識中文)(亦可在 swat 中修改);而安全性設定則設為 user 即可。

註3:samba 的使用者帳號必須是存在系統上的帳號。