Samba 實現 SMB/CIFS 協議,讓 Linux 成為 Windows 網路鄰居中的一員,提供檔案共享、印表機共享、域控制器功能。對比 Windows 自帶共享,Samba 配置檔案化、權限精細、效能穩定,幾分鐘即可完成部署。
Samba 權限 = Linux 檔案系統權限 ∩ Samba 設定權限。兩者同時滿足才能存取。必須掌握:
useradd, groupadd, usermod, /etc/passwd, /etc/groupchmod, chown, chgrp, ls -lsetfacl, getfacl| 服務 | 程序名 | 功能 | 端口 |
|---|---|---|---|
| SMB 服務 | smbd | 檔案/印表機共享、使用者驗證 | 139, 445 |
| NMB 服務 | nmbd | NetBIOS 名稱解析、工作組瀏覽、主瀏覽器選舉 | 137 (UDP) |
關鍵:nmbd 未啟動時,Windows 僅能用 IP 存取,無法透過電腦名稱瀏覽。
# Systemd 系統 (現代主流)
systemctl start|stop|restart|enable|status smb nmb
# SysVinit 系統 (舊版)
/etc/init.d/smb start|stop|restart
/etc/init.d/nmb start|stop|restart
# 通用手動啟動 (編譯安裝時)
/usr/sbin/smbd -D
/usr/sbin/nmbd -D
# 檢查程序
pgrep -lf smbd
pgrep -lf nmbd
# 強制終止
pkill smbd; pkill nmbd
# firewalld (CentOS 7+/RHEL 7+/Fedora)
firewall-cmd --permanent --add-service=samba
firewall-cmd --reload
# iptables 直接開放
iptables -I INPUT -p tcp --dport 139 -j ACCEPT
iptables -I INPUT -p tcp --dport 445 -j ACCEPT
iptables -I INPUT -p udp --dport 137 -j ACCEPT
iptables -I INPUT -p udp --dport 138 -j ACCEPT
service iptables save
[global]
workgroup = WORKGROUP # 工作組名稱,需與 Windows 一致
netbios name = LINUX_SERVER # 網路鄰居顯示名稱
server string = Samba %v
security = user # 使用者級驗證 (推薦)
map to guest = Bad User # 驗證失敗映射為 guest
passdb backend = tdbsam # 密碼資料庫後端
# 日誌與效能
log file = /var/log/samba/log.%m
max log size = 50
socket options = TCP_NODELAY SO_RCVBUF=8192 SO_SNDBUF=8192
[homes]
comment = Home Directories
browseable = no
writable = yes
valid users = %S
[public]
comment = Public Share
path = /srv/samba/public
browseable = yes
writable = yes
guest ok = yes
create mask = 0664
directory mask = 0775
force group = users
[private]
comment = Private Share
path = /srv/samba/private
browseable = yes
writable = yes
valid users = alice, bob
create mask = 0660
directory mask = 0770
Samba 使用獨立密碼資料庫 (tdbsam),系統使用者需另行建立 Samba 密碼。
# 建立系統使用者 (若不存在)
useradd -M -s /sbin/nologin alice
# 設定 Samba 密碼
smbpasswd -a alice # 新增使用者並設定密碼
smbpasswd -e alice # 啟用使用者
smbpasswd -x alice # 刪除使用者
smbpasswd -d alice # 停用使用者
# 列出所有 Samba 使用者
pdbedit -L -v
mkdir -p /srv/samba/public
chown nobody:users /srv/samba/public
chmod 2775 /srv/samba/public # SGID: 新檔案繼承群組
setfacl -m g:users:rwx /srv/samba/public
setfacl -d -m g:users:rwx /srv/samba/public # 預設 ACL
mkdir -p /srv/samba/private
chown alice:alice /srv/samba/private
chmod 2770 /srv/samba/private
setfacl -m u:bob:rwx /srv/samba/private
setfacl -d -m u:bob:rwx /srv/samba/private
[homes] 區段自動分享每位使用者家目錄,valid users = %S 限制僅本人存取。
# 列出伺服器共享
smbclient -L //192.168.1.100 -U alice
# 互動式連線 (類 FTP)
smbclient //192.168.1.100/private -U alice
smb: \> ls
smb: \> get remote.txt local.txt
smb: \> put local.txt remote.txt
smb: \> mkdir newdir
smb: \> quit
# 掛載到本地目錄 (需 cifs-utils)
mount -t cifs //192.168.1.100/public /mnt/samba -o username=alice,password=****,uid=1000,gid=1000,iocharset=utf8
# 寫入 /etc/fstab 永久掛載
//192.168.1.100/public /mnt/samba cifs credentials=/etc/samba/cred,uid=1000,gid=1000,iocharset=utf8 0 0
\\192.168.1.100 或 \\LINUX_SERVER| 工具 | 用途 |
|---|---|
testparm | 語法檢查 smb.conf |
smbstatus | 顯示目前連線、開啟檔案、鎖定狀態 |
smbtree | 文字模式瀏覽網路鄰居樹狀圖 |
smbpasswd | 管理 Samba 密碼 |
pdbedit | 進階使用者資料庫管理 |
net rpc | 遠端管理 (關機、使用者管理等) |
samba-tool domain provision)。[printers] 區段配合 CUPS 實現網路列印。socket options、read raw/write raw、max xmit、啟用 aio 非同步 I/O。testparm 檢查語法錯誤。systemctl status smb nmb 確認服務運行。firewall-cmd --list-all / iptables -L 確認端口開放。smbclient -L //localhost -U% 本機測試匿名列表。tail -f /var/log/samba/log.* 觀察錯誤日誌。setsebool -P samba_enable_home_dirs on、chcon -t samba_share_t /path。Samba 架設核心三步驟:系統權限配置 → smb.conf 共享定義 → smbpasswd 帳號管理。善用 testparm、smbstatus、smbclient 驗證,配合防火牆與 SELinux 設定,即能建立穩定、安全、高效能的跨平台檔案共享服務。