Raspberry Pi 的實作 - 讓 Linux、Windows、OSX 分享檔案的 File Server

by 5/21/2014 0 意見

在 Windows 的環境下,透過 CIFS 協定,用網路上的芳鄰或是網路磁碟機來分享檔案是一種很簡便的方式,而 Linux 要分享檔案給 Windows 其實也可以很簡單,我們可以利用 Samba 這個套件來進行。

Samba 的官網是 http://www.samba.org/,它生來就是為了讓 DOS、Windows、Linux、OS/2 等系統直接進行傳案傳輸,也可以無縫整合原有的 Active Directory 帳號直接登入。

在 4.0 版開始,不再需要透過一堆複雜的操作及其他服務的協同運作,就可以直接模擬成 Active Directory Server,讓 Windows 把 Samba Server 當成 AD Server 統一管理網域的帳號密碼。

最新更新日期 - 2015/01/21


事前準備

  • Raspberry Pi Type B / B+,Type A / A+ 無法實作,除非自行安裝一張網路卡。
  • Raspbian 作業系統。
  • USB 外接硬碟,請特別注意,由於 Raspberry Pi 的供電不足以推動外接硬碟,所以一定要有獨立電源

開始安裝

  • 我們可以用內建的套件庫進行安裝。
    sudo apt-get -y install samba

     
  • 如果要想用最新的版本可以到 官網下載原始碼 自行編譯,目前最新的版本是 4.1.16 。
    wget https://download.samba.org/pub/samba/samba-4.1.16.tar.gz

    將主程式解壓縮。
    tar zxvf samba-4.1.16.tar.gz

    開始編譯及安裝。
    cd samba-4.1.16

    ./configure


    make clean && make && sudo make install

建立設定檔


主設定檔在 /etc/samba/smb.conf,官方的詳細說明與範例在 The Official Samba 3.5.x HOWTO and Reference Guide

這邊以隨身碟做為外接設備來示範,我們的目標是讓 Windows、OS X、Linux 的用戶全部不用輸入帳號密碼,只要連上 Raspberry Pi 就可以自由的讀寫檔案 。

先確認一下隨身碟的確已經被偵測到了,而且已經建立好分割區及檔案系統。

這邊可以看到我用的是 A-DATA 8GB 的隨身碟,切了一個分割區 /dev/sda1,檔案系統是 FAT32。

我們把 sda1 掛載到 /mnt/usb 來分享,存取權限全開。
sudo mkdir /mnt/usb
sudo chmod 777 /mnt/usb
sudo mount /dev/sda1 /mnt/usb

因為主設定檔裡的內容太多了,所以先把檔名改掉備查。
sudo mv /etc/samba/smb.conf /etc/samba/smb.conf.bak

建立一個新的設定檔。
sudo vi /etc/samba/smb.conf

這個範例檔是將主機名稱 RPi-File-Server 的 /mnt/usb 目錄分享出來,分享的目錄名稱是 share,開放訪客自由存取,不必輸入帳號密碼。

相關參數請依實際環境修改,此外,一定要把包含「#」註解符號之後的文字全部刪除,再貼到設定檔裡面去,否則設定檔一定無法被正常讀取,導致 Samba 無法啟動

########## 我是分隔線 ##########
[global]
  netbios name  = RPi-File-Server # 區域網路顯示的主機名稱
  workgroup     = WORKGROUP       # 工作群組或網域的名稱
  security      = user            # 由本機管理帳號密碼
  map to guest  = bad user        # 讓無帳號的使用者以 guest 身份連入

[share]                 # 分享目錄的自訂顯示名稱
  path       = /mnt/usb # 分享目錄的絕對路徑
  read only  = no       # 開放寫入
  browseable = yes      # 開放瀏覽
  guest ok   = yes      # 開放 guest 存取
########## 我是分隔線 ##########

安裝 Samba 的基礎指令。
sudo apt-get -y install samba-common-bin

測試一下設定檔的內容是否正確,請注意這個指令只能檢查出語法錯誤,無法檢查邏輯錯誤。
testparm

設定檔編輯完成之後,就可以正式啟動服務了。
sudo service samba restart

啟動服務之後,並不會馬上在區域網路裡看到,要稍等一下下才會出現。


從 Windows 連線


以 Windows 7 為例,執行「檔案總管」,點選「網路」,就可以看到 Raspberry Pi 分享出來的主機名稱 RPI-FILE-SERVER。

由於我們開放訪客存取,所以直接可以看到 SHARE 目錄分享出來的檔案了。


從 Linux 連線


我們可以先查詢 SAMBA 分享的目錄清單。
smbclient -L //rpi-file-server

接著就可以用 Samba 的用戶端連線指令,連到分享的目錄去。
smbclient //rpi-file-server/share

看到 smb: \> 就代表連線成功了,可以輸入 help 列出所有可用的指令。

但是,這個方法有個小問題,只能使用被 help 顯示出來的這些指令,無法與 Linux 的檔案系統直接互動,也無法使用在 Bash shell 下可以執行的指令。

所以,我們通常會用掛載的方式,把 Samba 分享的目錄掛載到任一指定目錄,就可以被視同一個普通目錄來被操作了。
sudo mkdir /mnt/share
sudo mount -t cifs -o guest //w.x.y.z/share /mnt/share

這邊有個地方要注意,
出現「mount error: could not resolve address for XXX: Unknown error」錯誤訊息的原因是,
mount 指令在連線時是靠 DNS Server 來解析電腦名稱,所以當區域網路裡沒有 DNS Server 的話,就必須直接輸入 IP 位址進行連線才行。


從 OS X 連線


打開 Finder,點選上面功能列的「前往」-「連接伺服器」,或是直接按 Command + K (⌘ + K)。

在伺服器位址輸入「smb://rpi-file-server/share」。

連接身份選擇「訪客」。

這樣子就可以自由存取了。


注意事項


目錄的存取權限有問題的時候,請檢查下列項目的設定值。
  • Samba 設定檔的目錄分享權限。
  • Samba 設定檔的使用者存取權限。
  • Linux 實際目錄的存取權限。
  • SELinux 模組的存取權限。

更新紀錄

  • 2014/05/21 撰文
  • 2015/01/20 修正部份內文。
  • 2015/01/21 加入執行畫面,新增 Windows、OS X 及 Linux 等 Client 端的連線畫面。

Heracles Jam,江湖人稱「海公公」

IT 技術家 - 創站部落客

一個常用 Windows、慣用 macOS、愛用 Linux 的 3C 阿宅
現職 MIS / 業界講師 / 資訊顧問 / 部落客

0 意見 :

張貼留言