章節概述#

本章探討在網路上的機器之間分發與共享檔案的各種方式。首先介紹除了 scpsftp 之外的檔案複製方法,接著討論真正的檔案共享(將一台機器上的目錄掛載到另一台機器)。

書中根據不同場景列出對應的解決方案:

場景解決方案
臨時讓檔案可被其他機器存取Python SimpleHTTPServer (12.1)
定期在機器間分發/複製檔案rsync (12.2)
將 Linux 檔案分享給 Windows 機器Samba (12.4)
在 Linux 上掛載 Windows 共享CIFS (12.4)
Linux 之間小規模檔案共享SSHFS (12.5)
從 NAS 或伺服器掛載較大的檔案系統NFS (12.6)
掛載雲端儲存FUSE-based filesystems (12.7)

12.1 Quick Copy#

最簡單的檔案分享方式是使用 Python 內建的 HTTP 伺服器。進入包含檔案的目錄後執行:

python -m SimpleHTTPServer

這會在 port 8000 上啟動一個基本的 web 伺服器,讓同一網路上的任何瀏覽器都能存取當前目錄的檔案。

此方法假設你的區域網路是安全的。不要在公共網路或不信任的網路環境中使用。

12.2 rsync#

rsync 是 Linux 上標準的檔案同步工具,提供良好的效能和許多實用的傳輸方式。與 scp 相比,rsync 能進行分析和驗證,確保遠端擁有來源目錄的精確副本。

Figure 12-1: Normal rsync copy

12.2.1 開始使用 rsync#

rsync 需要在來源和目標兩台主機上都安裝。預設使用 SSH 連線到遠端主機。基本用法:

rsync file1 file2 ... host:
rsync file1 file2 ... user@host:
  • 預設情況下 rsync 只複製檔案,不複製目錄
  • 要傳輸整個目錄階層(包含 symbolic links、權限、裝置),使用 -a 選項
  • 要複製到遠端主機上的特定目錄,在主機名後指定路徑:
rsync -a dir host:dest_dir

使用 -nv 選項組合進行「dry run」預演,可以在不實際複製任何檔案的情況下查看傳輸詳情。

rsync -nva dir host:dest_dir

12.2.2 建立目錄結構的精確副本#

預設情況下,rsync 複製檔案時不會考慮目標目錄先前的內容。要刪除目標目錄中來源不存在的檔案,使用 --delete 選項:

rsync -a --delete dir host:dest_dir

--delete 操作可能很危險。在不確定時,先使用 -nv 選項進行 dry run,確認哪些檔案會被刪除。

12.2.3 Trailing Slash 的影響#

在 rsync 中,來源目錄名稱是否帶有 trailing slash (/) 會顯著改變行為:

Figure 12-2: Effect of trailing slash in rsync

  • 不帶 slashrsync -a dir host:dest_dir — 會在 dest_dir 裡面建立 dir 目錄
  • 帶 slashrsync -a dir/ host:dest_dir — 會將 dir 裡面的內容直接複製到 dest_dir,不會建立 dir 目錄本身

結合 trailing slash 和 --delete 選項時要格外小心,因為可能會意外刪除不相關的檔案。許多 shell 的自動補全功能會在目錄名後自動加上 /

12.2.4 排除檔案和目錄#

使用 --exclude 排除特定檔案或目錄:

rsync -a --exclude=.git src host:
rsync -a --exclude=/src/.git src host:

排除模式的重點:

  • 可以使用多個 --exclude 參數
  • 重複使用的模式可放在文字檔中,搭配 --exclude-from=file 使用
  • 只排除目錄不排除同名檔案,使用 trailing slash:--exclude=item/
  • 排除模式支援簡單的 glob wildcards
  • 如果排除範圍太大,可用 --include 重新納入特定項目

--exclude 中的路徑以 / 開頭時,指的是傳輸的基礎目錄,而非系統根目錄。

12.2.5 檢查傳輸、安全措施與 Verbose 模式#

rsync 使用檔案大小和最後修改日期的組合來快速判斷檔案是否已存在於目標端。

額外的安全選項:

  • --checksum (-c):計算 checksum 來比較檔案,適用於敏感資料或檔案大小常相同的情況
  • --ignore-existing:不覆蓋目標端已存在的檔案
  • --backup (-b):在覆蓋前將目標檔案加上 ~ 後綴備份
  • --suffix=s:更改 --backup 的後綴
  • --update (-u):不覆蓋目標端較新的檔案

使用 rsync -vrsync -vv 取得更多細節,使用 rsync --stats 取得完整的傳輸統計摘要。

12.2.6 壓縮資料#

使用 -z 選項在傳輸前壓縮資料:

rsync -az dir host:dest_dir

壓縮在慢速連線或高延遲環境下能提升效能。但在快速區域網路中,壓縮/解壓縮的 CPU 開銷可能反而使傳輸變慢。

12.2.7 限制頻寬#

使用 --bwlimit 避免 rsync 佔滿上行頻寬:

rsync --bwlimit=100000 -a dir host:dest_dir

12.2.8 將檔案傳輸到本機#

rsync 也可以從遠端主機傳輸檔案到本機,只需將遠端路徑放在第一個參數:

rsync -a host:src_dir dest_dir

rsync 也可以用於在本機上複製目錄,只要兩個參數都省略 host: 即可。

12.2.9 進階 rsync 主題#

  • rsync 的 batch mode 特別適合複製相同檔案集到多台主機,能加速長傳輸並支援中斷後續傳
  • 可配合 Amazon S3 等網路儲存使用 rsync --delete 實現有效的備份系統
  • 更多選項可執行 rsync --help 或查閱 rsync(1) man page

12.3 檔案共享簡介#

12.3.1 檔案共享的用途與效能#

使用網路檔案共享前,應先思考為什麼需要它。傳統 Unix 網路中,檔案共享的主要原因是便利性和本地儲存的缺乏。

網路儲存效能的主要問題是 latency(延遲)。對於大量資料的循序存取(如串流影音),效能通常沒問題。但如果需要頻繁的隨機存取(如軟體開發或影片編輯),應將檔案保存在本地儲存。

12.3.2 檔案共享的安全性#

傳統檔案共享協定未將安全性視為優先考量。實作檔案共享時應考慮:

  • 授權/認證 (Authorization/Authentication):確保只有擁有正確憑證的人能存取檔案
  • 加密 (Encryption):確保資料在傳輸過程中不被竊取

最容易設定的檔案共享選項通常也是最不安全的。如果需要更高安全性,可使用 stunnelIPSecVPN 等工具來保護底層連線。

12.4 使用 Samba 共享檔案#

Samba 是 Unix 上的標準檔案共享軟體套件,使用 Windows 的 Server Message Block (SMB) 網路協定。它不僅讓 Windows 電腦能存取 Linux 系統的檔案和印表機,也能反向操作——從 Linux 存取 Windows 伺服器上的檔案。macOS 也支援 SMB 檔案共享。

12.4.1 伺服器設定#

Samba 的核心設定檔是 smb.conf,通常位於 /etc/samba。設定檔使用類似 XDG/systemd 的格式,以方括號分段(如 [global][printers])。

[global] 段落的主要參數:

  • netbios name:伺服器名稱(省略則使用 Unix hostname)
  • server string:伺服器描述
  • workgroup:Windows 工作群組名稱

12.4.2 伺服器存取控制#

smb.conf[global] 段落中可設定存取控制:

  • interfaces:指定 Samba 監聽的網路介面
  • bind interfaces only:限制只接受指定介面的連線
  • valid users:指定允許存取的使用者
  • guest ok:允許匿名存取(僅限信任的網路)
  • browseable:設定共享是否可被網路瀏覽器發現

12.4.3 密碼#

建議使用密碼認證來保護 Samba 伺服器。Samba 使用自己的 Trivial Database (TDB) 密碼後端,在 [global] 中設定:

security = user
passdb backend = tdbsam

管理使用者的指令:

  • 新增使用者smbpasswd -a username
  • 刪除使用者smbpasswd -x username
  • 停用/啟用使用者smbpasswd -d username / smbpasswd -e username
  • 變更密碼smbpasswd username

注意 smb.conf 中的 unix password sync = yes 設定。這會在變更 Samba 密碼時同時變更 Linux 系統密碼,可能導致使用者無法登入 Linux 系統。

12.4.4 手動啟動伺服器#

如果從原始碼安裝 Samba,需要手動啟動 nmbd(NetBIOS name server)和 smbd(處理共享請求的 daemon):

nmbd -D -s smb_config_file
smbd -D -s smb_config_file

12.4.5 診斷與日誌#

Samba 的執行期間診斷訊息會寫入 log.nmbdlog.smbd 日誌檔,通常位於 /var/log 目錄下(如 /var/log/samba)。

12.4.6 檔案共享設定#

smb.conf 中新增段落來匯出目錄:

[label]
path = path
comment = share description
guest ok = no
writable = yes
printable = no

重要參數:

  • guest ok:是否允許訪客存取
  • writable:是否可讀寫(不要對訪客開放讀寫)
  • printable:目錄共享必須設為 no
  • veto files:阻止匯出符合特定模式的檔案

12.4.7 Home Directories#

smb.conf 中新增 [homes] 段落可匯出使用者的 home 目錄。可使用 %S 替換當前使用者名稱來自訂路徑。

12.4.8 印表機共享#

新增 [printers] 段落可將印表機匯出給 Windows 用戶端。搭配 CUPS 列印系統使用。

12.4.9 Samba Client#

smbclient 程式可以存取遠端 Windows 共享。

  • 列出伺服器上的共享:smbclient -L -U username SERVER
  • 存取特定共享:smbclient -U username '\\SERVER\sharename'

在檔案傳輸模式中,smbclient 類似 Unix ftp,支援 getputcdlcdpwd 等指令。

使用 CIFS 檔案系統:如果需要更方便的存取,可以用 mount 直接掛載 Windows 共享:

mount -t cifs SERVER:sharename mountpoint -o user=username,pass=password

12.5 SSHFS#

SSHFS 是一個 user-space 檔案系統,透過 SSH 連線將遠端檔案呈現在本機的掛載點上。適合 Linux 之間不太複雜的檔案共享場景。

sshfs username@host:dir mountpoint

卸載時使用 fusermount(一般使用者)或 umount(superuser):

fusermount -u mountpoint

SSHFS 的優點

  • 設定極為簡單,遠端只需啟用 SFTP(大多數 SSH 伺服器預設啟用)
  • 不依賴特定網路設定,只要能建立 SSH 連線即可運作
  • 透過 SSH 加密,在不安全的網路上也安全

SSHFS 的缺點

  • 效能較差(加密、轉譯、傳輸的開銷)
  • 多使用者場景支援有限

12.6 NFS#

NFS (Network File System) 是 Unix 系統之間最常用的傳統檔案共享系統。支援 TCP 和 UDP,有多種版本和多種認證/加密選項(但預設啟用的很少)。

掛載遠端 NFS 目錄:

mount -t nfs server:directory mountpoint

重要考量:

  • 安全性方面,可透過 nfs(5) man page 中的 sec 選項進行設定
  • 許多管理員在小型封閉網路上使用 host-based access control
  • 更進階的方法如 Kerberos 認證需要額外的系統設定
  • 大量使用網路檔案系統時,建議設定 automounter,讓系統在實際使用時才掛載檔案系統(systemd 的 automount unit type 已取代傳統的 automount/amd 工具)

設定 NFS 伺服器比設定用戶端複雜得多,需要執行 mountdnfsd daemon 並設定 /etc/exports 檔案。但許多人選擇直接購買 NAS 裝置來處理,因為這些裝置通常是 Linux-based 且內建 NFS 支援。

12.7 Cloud Storage#

雲端儲存(如 AWS S3、Google Cloud Storage)雖然沒有區域網路的效能,但有兩大優勢:

  • 不需自行維護
  • 不需擔心備份

在 Linux 上掛載雲端儲存幾乎都是透過 FUSE (File System in User Space) 介面實現。FUSE handler 本質上是一個 user-space daemon,作為資料來源與 kernel 之間的中介。對於 S3 等熱門雲端服務,甚至有多種 FUSE 選項可選。

12.8 網路檔案共享的現狀#

本章最後討論了網路檔案共享領域的整體狀況與挑戰:

  • NFS 的基礎安全等級相當低,需要大量額外工作才能提升
  • CIFS 系統在加密層面較好(內建於現代軟體中),但效能限制仍然存在
  • Andrew File System (AFS) 在 1980 年代就為這些問題設計了解決方案,但它要求 Kerberos 認證系統,設定和維護成本高,主要在大型機構(大學、金融機構)中使用
  • 傳統網路檔案系統客戶端多為 kernel code,這帶來了複雜度和開發限制
  • 雲端儲存的出現改變了格局——透過 TLS 等機制提供安全性,透過 FUSE 在 user space 處理認證和加密,不再依賴 kernel

目前 Linux/Unix 世界中尚無真正標準化的網路檔案共享方案。未來隨著 FUSE 和雲端技術的發展,可能會出現在安全性和靈活性方面更好的檔案共享設計。