2007-07-05

Samba Server 網路芳鄰共享的設定

Samba 是用來提供網路芳鄰服務、讓附近的電腦可以直接存取 LinkStation 裡面的檔案,甚至如果把 USB 印表機接上 LinkStation 的 USB Port,還可以透過它來分享印表機哩!這種存取檔案的方法雖然沒有直接用 FTP 來得快,但是如果用來變成網路硬碟,別的電腦不用複製就可以播放和分享這個網路硬碟的音樂或影片、燒錄或安裝放在 LinkStation 裡面的映象檔或程式,實用性更是大大地增加了,LinkStation 儼然成為家裡區域網路上的多媒體中心和檔案伺服器,讓內部分享和使用更加便利。再進階一點就變成 NAS (Network Attached Storage),可以作為中小企業的檔案伺服器,內建的目錄和權限管理,能因應一般公司大部分的檔案分享需求。

首先先安裝 Samba 的套件:

apt-get install samba

這樣會幫你安裝 Samba 所需的相關套件。接下來調整設定檔:

nano /etc/samba/smb.conf

Samba 設定檔主要是設定像是存取權限、連線效率、語系編碼(中文目錄和檔名)以及分享目錄等等,部分參數已經存在,要修改內容,部分參數是要整段新增的,以下是我的範例(可以用 Ctrl+W 尋找字串來修改):

#======================= 站台設定 =======================
[global]

# 更正編碼語系,除 DOS 外都改成 UTF8,不然就用 Big5
  display charset = UTF8
  dos charset = CP950
  unix charset = UTF8

# 伺服器描述
  server string = "Server"

# 預設工作群組
  workgroup = WORKGROUP

# WINS 支援
#  wins support = no
;  wins server = w.x.y.z
  dns proxy = no
;  name resolve order = lmhosts host wins bcast

# 封包傳遞項目設定,以提昇效能
  socket options = TCP_NODELAY SO_RCVBUF=8192 SO_SNDBUF=8192

# Log 檔相關設定、Log 檔最大值 (KB)、要不要透過 syslog 來紀錄
  log file = /var/log/samba/log.%m
  max log size = 1000
  syslog = 0

# Samba 掛掉的處理
  panic action = /usr/share/samba/panic-action %d

#======================= 認證設定 =======================
# 登入認證設定
#  security = share
  security = user
 
# 密碼加密、與系統密碼同步
  encrypt passwords = true
  unix password sync = yes

# 密碼處理程式及相關限制
  passwd program = /usr/bin/passwd %u
  passwd chat = *Enter\snew\s*\spassword:* %n\n *Retype\snew\s*\spassword:* %n\n *password\supdated\ssucces$
  passdb backend = tdbsam
  obey pam restrictions = yes
  pam password change = yes

# 匿名登入(帳號、處理)
  guest account = samba
  map to guest = Bad User

解釋一下上面參數的意思。一開始是處理目錄檔名編碼語系的問題,現在安裝好的應該都是 Samba Server 3.x,在一開始我們裝 Debian 時有設定過系統預設語系是 zh_TW.UTF-8,所以預設顯示和操作都要設成 UTF-8,而外部 Dos 存取則設成 CP950(給 DOS 存取用的,反正 DOS 不支援 UTF、只支援 ANSI),這樣就能解決大部分中文目錄檔名在分享和存取上變成亂碼的問題。

重頭戲來了,要接著設定 Samba 分享的權限和存取控制。初步的概念是,希望能夠同時開放匿名存取、方便朋友或其他網路裝置來做不需認證的存取 (Read-only),另一方面又希望像檔案伺服器一樣,讓有帳號的人能在伺服器上有自己的目錄放些私人檔案,最後,還要有個分享目錄是專門給有帳號的人共用的,這些「會員專屬」的分享目錄當然不希望匿名存取的人看到,以上,聽起來相當複雜是吧~看看設定檔中關於認證設定的部份,要兼容匿名和帳號登入,首先要將安全層級設定為使用者 (security = user,如上述設定檔所設)、並設定密碼加密及與系統同步共用,這樣在 Debian 裡新增的帳號和密碼,就可以與 Samba 共用了(不需要另外設定 smbpasswd)!接下來我們需要一個匿名帳號,給沒帳號的訪客登入使用,設定檔裡我指定了一個匿名帳號叫 samba (guest account = samba),這個帳號預設不存在,所以要手動新增,我們直接修改 /etc/passwd:

nano /etc/passwd

加一筆資料像是這樣:

samba:x:103:100:samba:/etc/samba:/bin/false

其中 103 是 User ID,不能和 passwd 裡面存在的重複(所以要自己找一個沒人用的,103 是我系統還沒人用到的 ID),而 100 是 Group ID,預設應該是 users 這個群組才是(如果不是請自行調整)。到此,基本設定的部份算是完成了,緊接著要補上分享目錄的資訊和設定。根據以上需求,我需要三種目錄:第一種是有系統帳號的人,能夠在伺服器裡有自己專用的目錄放私人檔案,第二種是給有系統帳號的人,能夠做會員間分享存取使用,最後一種,不管你有沒有帳號,都可以具名或匿名存取的公用目錄。這三類目錄的分享設定如下(請把以下範例直接補到 /etc/samba/smb.conf 後面):

#======================= 分享設定 =======================
[Homes]
  comment = Home Directories
  valid users = %S
  browseable = no
  writeable = yes
  create mask = 0644
  directory mask = 0755

[Share]
  comment = Private Shared Folder
  path = /home/samba
  browsable = yes
  writable = yes
  valid users = @users
  create mask = 0664
  directory mask = 0775
 
[Files]
  comment = Public Shared Folder
  path = /home/ftp
  browsable = yes
  writable = no
  write list = abin
  public = yes
  create mask = 0664
  directory mask = 0775

第一段 [Homes],顧名思義就是每個帳號的「家目錄」,當使用者用自己的帳號密碼登入後,該目錄名稱就會變成自己的帳號名稱,假設系統裡有個帳號叫 abin、它在系統裡的家目錄是 /home/abin,那麼登入後 Samba 會連結目錄到 /home/abin、給這位使用者 abin 直接使用(很直覺吧)。第二段 [Share],分享目錄指定到 /home/samba(沒這個目錄自己建立,記得 chown -R samba:users /home/samba/),其中指定了 valid users = @users,意思是「只有合法登入的一般帳號」才能夠存取使用,這個目錄就是「會員專屬」的分享目錄。最後一段 [Files] 就是開放給所有人(包含匿名)的公用分享目錄(範例中指定到 FTP 的共用分享目錄),注意其中我關閉了公用目錄「寫入」的權限(也就是任何人透過 Samba 進來都只能讀取),而指定只有 abin 這個帳號的人可以寫入 (write list = abin),表示該目錄有限定管理者,這樣自己透過 Samba 進來進行存取,也方便做目錄檔案的管理。

特別注意的是,我這邊用同屬一般使用者群組 (user) 的帳號來做 Samba 分享目錄的管理者,用的是和 FTP 服務共用的分享目錄,以我設定的檔案目錄創建屬性(create 0664, directory 0775),一樣是「屬於同群組的帳號擁有完全的讀寫權限」、和 FTP 設定的管理權限一模一樣,所以從檔案屬性來看,可以知道分享目錄裡的檔案來源是從 FTP 還是 Samba 來的,而且不管從哪來,FTP 或 Samba 管理者都可以做目錄檔案的管理,不會被不同來源的權限給擋住,在跨服務、同目錄的管理才能有最大的彈性,同樣也兼顧了安全性。設定好設定檔和帳號存取問題,就可以啟動 Samba 服務囉!設定檔的部分,Samba 有提供一個驗證工具,啟動服務前可以執行 testparm,它會幫你檢驗設定的參數正不正確。沒問題的話就直接重新啟動 Samba:

/etc/init.d/samba restart

這時,其他的電腦就可以透過網路芳鄰存取 LinkStation 了。當有電腦來存取的時候,還可以用 smbstatus 這個命令查看連線的狀態,看那個機器正在使用 LinkStation 的資源。用以上分享的範例,到 Windows 網路芳鄰、開啟工作群組電腦,會看到多一台電腦,點進去裡面有兩個分享的資料夾:Share、Files,如果點進 Files,算是直接匿名登入,Log 會顯示有個 Guest 叫 samba 的連進來,如果改點 Share 目錄,這時候會要求你敲帳號密碼登入,不敲就看不到,而用帳號登入後除了可以看到 Share 的內容、可以存取檔案之外,回到上層目錄會看到多一個和自己帳號一樣的目錄出現,那個就是自己私人在伺服器上的目錄啦!這裡有一個 Windows 用網路芳鄰連線的小技巧,一般開完機用網芳連過,基本上就沒有「登出」「重新登入」的機會了,如果在測試時修改 Samba 設定然後用 Windows 測試時,不能反覆登入是很麻煩的事,這裡可以 DOS 開視窗、用下面的這個命令,強迫 Windows 的網路芳鄰斷線登出,這樣要測試匿名登入或帳號登入時,就不會受到 Windows 不給登入的限制:

net use * /delete

到此為止呢,在 LinkStation 上面已經完成 Samba 服務的設定,也可以透過網路芳鄰與區域網路內同個網段的電腦做檔案共享,但,人家可以透過網路芳鄰連進 LinkStation,那能不能登入 LinkStation 後透過機器去存取其他也有提供 Samba 服務的電腦、利用 LinkStation 使用網路芳鄰的資源呢?上面我們提到的安裝 Samba 服務,接下來我們來安裝透過 Samba 來存取其他電腦的 Client 程式:

apt-get install smbclient

裝完系統內會多了幾個公用程式,像是想要瀏覽網路芳鄰,可以用命令:

findsmb

它會幫你找整個區網、列出同一個 Workgroup 的電腦,找到電腦以後根據主機名稱 (hostname) 可以用:

smbclient -L '主機名稱'

這個命令會列出該電腦有分享出來的資源(直接用 smbtree 也行),假設分享的目錄名稱是 Files 目錄,要連進去該目錄用下述命令:

smbclient '\\主機名稱\Files' -U '登入帳號'

輸入密碼(匿名登入的話直接按 Enter)就登入了(確定匿名沒密碼可以直接用 smbclient -N '\\主機名稱\Files' 進去)。接著會出現操作的提示符號:smb: \>,你可以下和 ftp 接近的檔案操作命令 (get, mget, put, mput, mkdir, rmdir ....),進行檔案的相關操作。

最後一個和 Samba 有關係的就是「網路磁碟機」,在 Windows 下面我們可以把某個網路芳鄰分享的目錄掛載成一台網路磁碟機,並給它一個磁碟機代號,透過 smbclient,我們能存取別人電腦的分享目錄,那能不能也把那個目錄,掛載成 LinkStation 的某個路徑,像用網路磁碟機一樣?這時候我們要另外裝一個套件,裡面包含一些 Samba 檔案系統 (smbfs) 的公用程式:

apt-get install smbfs

裝完會多一個 smbmount 公用程式,或是預設的 mount 也會多支援 Samba 專用的檔案系統 (smbfs)。如果要掛載某個分享目錄到本地的路徑,命令是:

smbmount '//主機名稱/Files' /mnt/samba -o codepage=UTF8,iocharset=UTF8

這樣就是把網路某分享目錄掛載到自己的某個目錄啦 (/mnt/samba),這裡也可以用 mount -t smbfs 替代 smbmount 來操作。嗯,所有 Samba 的服務和工具差不多就這樣了,如果想玩網路印表機分享(驅動程式要支援)、更複雜像是 LDAP、AD 之類的管理機制,可以更深入去研究 Samba 的用法~

後記:現在主要的網芳 client 越來越多是 Windows 7 的了,偏偏 Windows 7 在傳統網路芳鄰的資源上很差,試了很多次改什麼 Windows 的 registry 通通不管用,敲什麼帳號密碼都沒辦法登入(Windows XP 就沒這些問題),最後直接在 samba 裡面新增專用帳號和密碼,這樣才能通過身分認證並連結系統的原生帳號。假設我們要允許帳號 admin 能存取有權限設置的目錄(必須登入),先在 samba 裡新增帳號:

smbpasswd -a admin

過程會要求設置密碼,這是用來登入 samba 用的帳號密碼,必須要是系統存在的帳號,但密碼可以和系統內的不一樣。如果要知道系統裡的 samba 已經被加了幾個這樣的帳號,可以用命令:pdbedit -L 列出來,如果要刪除則用 pdbedit -x。

參考文章:
鳥哥 - SAMBA 伺服器
使用 Samba 架設中小企業 File Server

回應: 13

匿名 提到...

您好! 能請教一下你在打cmd 的地方那個框框要怎麼弄出來嗎 還有文章收合地方要怎麼新增語法才會有謝謝

Abin 提到...

你可以在我的 Blog 用分類或搜尋先找找看。請參考:程式碼的標記區塊,還有首頁長篇文章的收合

jslin 提到...

您好,我設定好網路芳鄰,也能從 windows 看到linkstation了,但是我插上 USB 硬碟後似乎找不到,請問我還需要再設定什麼嗎?謝謝您

Abin 提到...

To jslin:
你是把 USB 插上 LinkStation?那當然看不到。
1. 首先,你要確定你的 USB 硬碟的檔案系統是 FAT/FAT32/EXT2/EXT3,NTFS 不支援。
2. 插上之後,到 LinkStation 裡面有沒有偵測到(dmesg | grep hd)
3. 有偵測到,也要手動 mount 起來才能用(mount -t 檔案系統 偵測到的裝置 要mount的路徑,例如:mount -t ext3 /dev/sda3 /mnt/usbdisk/)
4. 最後,把剛剛 mount 的路徑加入 samba 分享的設定(詳見上文)。
要以上四個步驟,才能將 USB 插上 LinkStation,並且分享給其他電腦使用。

jslin 提到...

Abin
我還是沒辦法成功
基本上應該是我完全不懂 linux 的關係 Orz
但想請您幫忙看一下錯誤訊息
只是留言好像不能打太長的文章
所以不曉得可不可以麻煩您給我您的 e-mail 嗎?
我的 e-mail 是 jslin43@yahoo.com.tw
謝謝您,感激不盡

Abin 提到...

To jslin:
我的 email 在頁面上就有。
另外,聽到你說「完全不懂 linux」我是覺得有點害怕,因為改機這件事情是需要基本的 linux 基礎,不然很多突發狀況或我認為是基本的訊息您可能都不能瞭解,要解釋起來很辛苦,畢竟這個 Blog 對我來說是當「筆記」用的,並不是用來做「教學」的,我還是希望很多事情需要做些功課有點基礎。我這方面也沒有很強,只能就我用過的經驗來討論。

新手爸爸 提到...

冒昧請教個問題..就是小弟在安裝完成vsftp和samba後
vsftp上傳的檔案名稱 若是中文,samba讀取是亂碼
samba拷進去的檔案 若有中文,ftp上所看到的檔案亦為亂碼

Abin 提到...

To 新手爸爸:
中文的問題的確讓人很頭大,首先,vsftp 我並沒有涉獵過「如何去設定語系」的部份,所以就算能跑,其實也不知道預設是用什麼中文編碼(當然,這和你上傳檔用的 FTP client 程式也是有一些關係的),目前我用的是 ProFTP + FileZilla,並沒有遇到您的困擾。
Samba 的編碼,本文用的是與中文版 Windows 相同的 CP950 (Big5),並不是 UFT8,因此透過網路芳鄰存取比較不會有問題,如果 samba 使用正常,建議您從調整 vsftp 的設定檔、關於中文編碼部份(我沒用過),看看能不能解決這個問題。

Rain@DNA 提到...

我刚做了一个4TB的filesystem for samba,但是在Windows里却只显示140GB,有办法解决吗?

Abin 提到...

To Rain@DNA:
我沒那麼大的硬碟(4TB),所以當然沒經驗解決。據我所知 Linux ext3 不是本來就有 4TB 的限制,不知道你怎麼做出一個 4TB 的 FS?回到你的問題,目前 Windows 本身也有 2TB 的上限限制,除非換作業系統,不然 Windows 是沒法正常看到更大的空間(定址問題,這是作業統的限制)。

Rain@DNA 提到...

谢谢!
我昨晚用虚拟机又模拟了一个4TB的SAMBA,问题已经解决了。
问题在于是否单独把FileSystem配置为一个共享目录。

RHEL ext3目前的限制为16TB,
Windows的2TB限制为dos lable的2TB分区限制,是否有2TB文件大小的限制,没有去确定。

还是很感谢你的及时回复!

匿名 提到...

linux系統帳號要和samba同步,要加libpam-smbpass

nknudragon 提到...

想請教一下,小弟我沒改過BUFFALO Linkstation 只改過 PCI NAS-01G
Linkstation 買來的時候預設不就有Samba了麼?
照這樣子改的話 Linkstation 改機過後原本的韌體就完全不會啟用了是麼 ?

因為NAS-01G的改機是再/mnt底下再額外放一個debian 然後其他額外的服務是跑在底下的debian (利用chroot 切換過去的)
nas-01g上層的root系統是還在的 (web管理介面,samba,FTP服務)

張貼留言

歡迎留言或發表意見,不過要理性不做人身攻擊。匿名的朋友得到回應的速度會比較慢喔~
發問相關的禮貌和規矩請先參考這篇文章,不當留言、和本文無關的回應可能會被直接刪除無視喔!