章節簡述:
本章節為讀者講述文件共享系統的作用,了解Samba與NFS服務程序的開發背景以及用法。
詳細逐條講解Samba服務配置參數,演示安全共享文件的配置策方法,并使用autofs服務程序自動掛載設備,
學會后即可實現Linux系統之間或與Windows系統之間的文件共享,以及在共享文件時如何配置防火墻與SELinux策略規則。
?
本章目錄結構
- 12.1 了解文件共享服務
- 12.2 Samba服務
- 12.2.1 安裝服務程序
- 12.2.2 安全共享文件
- 12.3 NFS網絡文件系統
- 12.4 AutoFs自動掛載服務
12.1 了解文件共享服務
早期網絡想要在不同主機之間共享文件大多要用FTP協議來傳輸,但FTP協議僅能做到傳輸文件卻不能直接修改對方主機的資料數據,這樣確實不太方便,于是便出現了NFS開源文件共享程序:NFS(NetworkFile System)是一個能夠將多臺Linux的遠程主機數據掛載到本地目錄的服務,屬于輕量級的文件共享服務,不支持Linux與 Windows系統間的文件共享。
隨后在1991年時大學生Tridgwell為了解決Linux與Windows系統之間共享文件的問題,便開發出了SMB協議與Samba服務程序。
SMB(Server Messages Block)協議:實現局域網內文件或打印機等資源共享服務的協議。
當時Tridgwell想要注冊SMBServer這個商標,但卻被因為SMB是沒有意義的字符被拒絕了,經過Tridgwell不斷翻看詞典,終于找到了一個拉丁舞蹈的名字——SAMBA,而這個熱情舞蹈的名字中又恰好包含了SMB(SAMBA),于是這便是Samba程序名字的由來。
Samba服務程序是一款基于SMB協議并由服務端和客戶端組成的開源文件共享軟件,實現了Linux與Windows系統間的文件共享。
12.2 Samba服務
12.2.1 安裝服務程序
通過安裝Samba服務程序后細致的分析其配置文件參數,更能夠幫助讀者們理解Samba服務的安全驗證方式。
安裝Samba服務軟件包:
[root@linuxprobe Desktop]# yum install samba Loaded plugins: langpacks, product-id, subscription-manager ………………省略部分安裝過程……………… Installing:samba x86_64 4.1.1-31.el7 rhel7 527 k ………………省略部分安裝過程……………… Complete!
[root@linuxprobe ~]# cat/etc/samba/smb.conf
備份原始的配置文件:
[root@linuxprobe ~]# mv /etc/samba/smb.conf /etc/samba/smb.conf.bak
過濾掉無用的內容:
先使用cat命令讀入Smb配置文件后通過grep命令-v參數(反向選擇)去掉所有注釋信息,然后分別刪選掉包含#號的行("#"),包含;號的行(";")以及所有的空白行("^$"),最后最后將過濾后的信息覆蓋寫入到/etc/samba/smb.conf文件中。
cat /etc/samba/smb.conf.bak | grep -v "#" | grep -v ";" | grep -v "^$" > /etc/samba/smb.conf
[global] | ? | #全局參數。 |
? | workgroup = MYGROUP | #工作組名稱。 |
? | server string = Samba Server Version %v | #服務器介紹信息,參數%v為顯示SMB版本號。 |
? | log file = /var/log/samba/log.%m | #定義日志文件存放位置與名稱,參數%m為來訪的主機名。 |
? | max log size = 50 | #定義日志文件最大容量為50Kb。 |
? | security = user | #安全驗證的方式,總共有4種。 |
? | #share:來訪主機無需驗證口令,更加方便,但安全性很差。 | |
? | #user:需由SMB服務驗證來訪主機提供的口令后才可建立訪問,更加的安全。 | |
? | #server:使用獨立的遠程主機驗證來訪主機提供的口令(集中管理帳號)。 | |
? | #domain:使用PDC來完成驗證 | |
? | passdb backend = tdbsam | #定義用戶后臺的類型,共有3種。 |
? | #smbpasswd:使用SMB服務的smbpasswd命令給系統用戶設置SMB密碼。 | |
? | #tdbsam:創建數據庫文件并使用pdbedit建立SMB獨立的用戶。 | |
? | #ldapsam:基于LDAP服務進行帳戶驗證。 | |
? | load printers = yes | #設置是否當Samba服務啟動時共享打印機設備。 |
? | cups options = raw | #打印機的選項 |
[homes] | ? | #共享參數 |
? | comment = Home Directories | #描述信息 |
? | browseable = no | #指定共享是否在“網上鄰居”中可見。 |
? | writable = yes | #定義是否可寫入操作,與"read only"相反。 |
[printers] | ? | #打印機共享參數 |
? | comment = All Printers | ? |
? | path = /var/spool/samba | #共享文件的實際路徑(重要)。 |
? | browseable = no | ? |
? | guest ok = no | #是否所有人可見,等同于"public"參數。 |
? | writable = no | ? |
? | printable = yes | ? |
參數 | 作用 |
[linuxprobe] | 共享名稱為linuxprobe |
comment = Do not arbitrarily modify the database file | 警告用戶不要隨意修改數據庫 |
path = /home/database | 共享文件夾在/home/database |
public = no | 關閉所有人可見 |
writable = yes | 允許寫入操作 |
12.2.2 安全共享文件
使用Samba服務口令驗證方式可以讓共享文件更加的安全,做到僅讓信任的用戶訪問,而且驗證過程也很簡單,要想使用口令驗證模式,我們需要先需要創建Samba服務獨立的數據庫。
第1步:檢查當前是否為user驗證模式。
[root@linuxprobe ~]# cat /etc/samba/smb.conf

?
第2步:創建共享文件夾:
[root@linuxprobe ~]# mkdir /database
第3步:描述共享文件夾信息。
在SMB服務主配置文件的最下面追加共享文件夾的配置參數:
[database]
comment = Do not arbitrarily modify the database file
path = /database
public = no
writable = yes
保存smb.conf文件后重啟啟動SMB服務:
[root@linuxprobe ~]# systemctl restart smb
添加到開機啟動項:
ln -s '/usr/lib/systemd/system/smb.service' '/etc/systemd/system/multi-user.target.wants/smb.service'
第4步:使用Windows主機嘗試訪問
讀者按照下表的IP地址規劃動手配置下Windows的網卡參數,應該都會吧~
主機名稱 | 操作系統 | IP地址 |
Samba共享服務器 | 紅帽RHEL7操作系統 | 192.168.10.10 |
客戶端 | 紅帽RHEL7操作系統 | 192.168.10.20 |
客戶端 | 微軟Windows7操作系統 | 192.168.10.30 |
在Windows主機的運行框中輸入遠程主機的信息
此時訪問Samba服務報錯
此時訪問Samba服務是報錯的,如果讀者已經看完Apache(httpd)服務程序的章節,應該還記得防火墻和SELinux規則吧。
第5步:清空防火墻規則鏈:
Windows訪問Samba主機提示報錯,我們懷疑是Iptables阻止了訪問操作,于是執行:
[root@linuxprobe ~]# Iptables -F [root@linuxprobe ~]# service iptables save
因為Windows系統的緩存關系,可能需要先重啟下Windows主機再嘗試訪問Samba共享。
Windows系統被要求驗證帳戶口令
那么這個問題就是出在Iptables防火墻的默認規則中了,所以請對SELinux多一點耐心,不要直接關閉SELinux。
第6步:創建SMB服務獨立的帳號。
現在Windows系統要求先驗證后才能訪問共享,而SMB服務配置文件中密碼數據庫后臺類型為"tdbsam",所以這個帳戶和口令是Samba服務的獨立帳號信息,我們需要使用pdbedit命令來創建SMB服務的用戶數據庫。
pdbedit命令用于管理SMB服務的帳戶信息數據庫,格式為:“pdbedit [選項] 帳戶”。
參數 | 作用 |
-a 用戶名 | 建立Samba用戶 |
-x 用戶名 | 刪除Samba用戶 |
-L | 列出用戶列表 |
-Lv | 列出用戶詳細信息的列表 |
創建系統用戶:
[root@linuxprobe ~]# useradd smbuser
將此系統用戶提升為SMB用戶:
[root@linuxprobe ~]# pdbedit -a -u smbuser new password:設置SMB服務獨立的密碼 retype new password: Unix username: smbuser NT username: Account Flags: [U ] User SID: S-1-5-21-4146456071-3435711857-2069708454-1000 Primary Group SID: S-1-5-21-4146456071-3435711857-2069708454-513 Full Name: Home Directory: \\linuxprobe\smbuser HomeDir Drive: Logon Script: Profile Path: \\linuxprobe\smbuser\profile Domain: LINUXPROBE Account desc: Workstations: Munged dial: Logon time: 0 Logoff time: Wed, 06 Feb 2036 23:06:39 CST Kickoff time: Wed, 06 Feb 2036 23:06:39 CST Password last set: Sat, 11 Jul 2015 18:27:04 CST Password can change: Sat, 11 Jul 2015 18:27:04 CST Password must change: never Last bad password : 0 Bad password count : 0 Logon hours : FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF
使用Windows主機訪問Samba共享果然可以使用smbuser用戶登入,但對于共享文件這么重要的事情,SELinux一定會強制管理,剛剛沒有妥當的配置好SELinux,現在果然又報錯了。
將共享目錄的所有者和所有組設置為smbuser用戶:
[root@linuxprobe ~]# chown -Rf smbuser:smbuser /database
允許SELinux對于SMB用戶共享家目錄的布爾值:
[root@linuxprobe ~]# setsebool -P samba_enable_home_dirs on
將共享目錄的SELinux安全上下文設置妥當:
[root@linuxprobe ~]# semanage fcontext -a -t samba_share_t /database
使新的安全上下文立即生效:
[root@linuxprobe ~]# restorecon -Rv /database/

主機名稱 | 操作系統 | IP地址 |
Samba共享服務器 | 紅帽RHEL7操作系統 | 192.168.10.10 |
客戶端 | 紅帽RHEL7操作系統 | 192.168.10.20 |
客戶端 | 微軟Windows7操作系統 | 192.168.10.30 |
在客戶端安裝cifs-utils軟件包:
[root@linuxprobe ~]# yum install -y cifs-utils Loaded plugins: langpacks, product-id, subscription-manager ………………省略部分安裝過程……………… Installing:cifs-utils x86_64 6.2-6.el7 rhel7 83 k ………………省略部分安裝過程……………… Complete!
創建掛載目錄:
[root@linuxprobe ~]# mkdir /database
在root家目錄創建認證文件(依次為SMB用戶名、SMB用戶密碼、SMB共享域):
[root@linuxprobe ~]# vim auth.smb username=smbuser password=redhat domain=MYGROUP
此文件太重要了,權限應該給小一些:
[root@linuxprobe ~]# chmod -Rf 600 auth.smb
配置其掛載信息(內容依次為遠程共享信息、本地掛載目錄、文件系統類型、認證文件以及開機自檢選項):
[root@linuxprobe ~]# vim /etc/fstab //192.168.10.10/database /database cifs credentials=/root/auth.smb 0 0
使用mount命令的-a參數掛載所有在fstab文件中定義的文件信息:
[root@linuxprobe ~]# mount -a
成功掛載Samba的共享目錄(能夠看到共享文件了):
[root@linuxprobe ~]# cat /database/Memo.txt i can edit it .
出現問題?大膽提問!
因讀者們硬件不同或操作錯誤都可能導致實驗配置出錯,請耐心再仔細看看操作步驟吧,不要氣餒~
Linux技術交流請加A群:560843(滿),B群:340829(推薦),C群:463590(推薦),點此查看全國群。
*本群特色:通過口令驗證確保每一個群員都是《Linux就該這么學》的讀者,答疑更有針對性,不定期免費領取定制禮品。
12.3 NFS網絡文件系統
NFS(Network Files System)即網絡文件系統,NFS文件系統協議允許網絡中的主機通過TCP/IP協議進行資源共享,NFS客戶端可以像使用本地資源一樣讀寫遠端NFS服務端的資料,需要注意NFS服務依賴于RPC服務與外部通信,所以必需保證RPC服務能夠正常注冊服務的端口信息才能正常使用NFS服務。
有個學員問過NFS是不是need for speed的縮寫啊?哈哈,NFS配置和使用都是非常快捷,所以這么說也是有道理的。
紅帽RHEL7系統已經默認安裝NFS服務:
[root@linuxprobe ~]# yum install nfs-utils Loaded plugins: langpacks, product-id, subscription-manager (1/2): rhel7/group_gz | 134 kB 00:00 (2/2): rhel7/primary_db | 3.4 MB 00:00 Package 1:nfs-utils-1.3.0-0.el7.x86_64 already installed and latest version Nothing to do
本次的實驗需要兩臺Linux主機,網絡配置情況:
主機名稱 | 操作系統 | IP地址 |
NFS服務端 | 紅帽RHEL7操作系統 | 192.168.10.10 |
NFS客戶端 | 紅帽RHEL7操作系統 | 192.168.10.20 |
第1步:創建NFS服務端的共享目錄。
清空iptables默認的規則鏈:
[root@linuxprobe ~]# iptables -F
保存清空后的iptables規則:
[root@linuxprobe ~]# service iptables save
創建nfsfile共享目錄:
[root@linuxprobe ~]# mkdir /nfsfile
為共享目錄設置權限(讓其他人可以有寫入權限):
[root@linuxprobe ~]# chmod -Rf 777 /nfsfile
寫入一個文件,用于NFS客戶端讀取:
[root@linuxprobe ~]# echo "welcome to linuxprobe.com" > /nfsfile/readme
NFS服務端配置文件是"/etc/exports",用于定義要共享的目錄以及相應權限。
[root@linuxprobe ~]# vim /etc/exports //格式為:共享目錄的絕對路徑 允許訪問NFS資源的客戶端(權限參數) /nfsfile 192.168.10.* (rw,sync,root_squash)
NFS配置共享的參數有:
參數 | 作用 |
ro | 只讀默認 |
rw | 讀寫模式 |
root_squash | 當NFS客戶端使用root用戶訪問時,映射為NFS服務端的匿名用戶。 |
no_root_squash | 當NFS客戶端使用root用戶訪問時,映射為NFS服務端的root用戶。 |
all_squash | 不論NFS客戶端使用任何帳戶,均映射為NFS服務端的匿名用戶。 |
sync | 同時將數據寫入到內存與硬盤中,保證不丟失數據。 |
async | 優先將數據保存到內存,然后再寫入硬盤,效率更高,但可能造成數據丟失。 |
看完后來分析下/etc/exports文件中參數作用吧“/nfsfile 192.168.10.* (rw,sync,no_root_squash)”(答案模式)。
答案:將/nfsfile目錄共享給192.168.10.0/24網段,運行NFS客戶端讀寫數據、同步數據并映射為NFS服務器的root用戶。
第2步:啟動NFS服務端
剛剛講到NFS服務是依賴于RPC服務的,但在紅帽RHEL7系統中RPC服務已經默認運行(active)了,所以無需再配置RPC服務啦。
[root@linuxprobe ~]# systemctl status rpcbind
啟動nfs-server程序:
[root@linuxprobe ~]# systemctl start nfs-server
設置NFS服務端為開機啟動:
[root@linuxprobe ~]# systemctl enable nfs-server
第3步:配置NFS客戶端
如果NFS客戶端也是紅帽RHEL7系統,那么軟件包nfs-utils一定也是已經默認安裝,直接掛載共享就可以了。
showmount命令用于查詢NFS服務端共享信息,格式為:“showmount [參數] [遠程主機]”。
參數 | 作用 |
-e | 顯示NFS服務端的共享列表 |
-a | 顯示本機掛載NFS資源的情況 |
-v | 顯示版本號 |
查詢遠程NFS服務端中可用的共享資源:
[root@linuxprobe ~]# showmount -e 192.168.10.10 Export list for 192.168.10.10: /nfsfile (everyone)
創建本地掛載目錄:
[root@linuxprobe ~]# mkdir /nfsfile [root@linuxprobe ~]# mount -t nfs 192.168.10.10:/nfsfile /nfsfile
順利查看到剛剛寫入文件內容:
[root@linuxprobe ~]# cat /nfsfile/readme welcome to linuxprobe.com
如果希望開機后自動將NFS資源掛載到本地,那么就可以通過修改fstab文件來實現:
[root@linuxprobe ~]# vim /etc/fstab 192.168.10.10:/nfsfile /nfsfile nfs defaults 0 0
12.4 AutoFs自動掛載服務
AutoFs服務與Mount/Umount命令不同之處在于它是一種守護進程,只有檢測到用戶試圖訪問一個尚未掛載的文件系統時才自動的檢測并掛載該文件系統,換句話說,將掛載信息填入/etc/fstab文件后系統將在每次開機時都自動將其掛載,而運行AutoFs后則是當用戶需要使用該文件系統了才會動態的掛載,節約網絡與系統資源。
模擬訓練:每次進入/media/iso目錄時都會自動掛載鏡像。
主機名稱 | 操作系統 | IP地址 |
NFS服務端 | 紅帽RHEL7操作系統 | 192.168.10.10 |
NFS客戶端 | 紅帽RHEL7操作系統 | 192.168.10.20 |
安裝autofs服務:
[root@linuxprobe ~]# yum install autofs ………………省略部分安裝過程……………… Installing: autofs x86_64 1:5.0.7-40.el7 rhel 550 k Installing for dependencies: hesiod x86_64 3.2.1-3.el7 rhel 30 k ………………省略部分安裝過程……………… Complete!
啟動autofs服務并加入到開機啟動項中:
[root@linuxprobe ~]# systemctl enable autofs
ln -s '/usr/lib/systemd/system/autofs.service' '/etc/systemd/system/multi-user.target.wants/autofs.service'
修改autofs主配置文件(格式為:掛載目錄 映射配置文件):
[root@linuxprobe ~]# vim /etc/auto.master /media /etc/iso.misc
編輯掛載配置參數文件(映射文件):
[root@linuxprobe ~]# vim /etc/iso.misc iso -fstype=iso9660,ro,nosuid,nodev :/dev/cdrom
重新加載啟動autofs服務:
[root@linuxprobe ~]# systemctl restart autofs
進入自動掛載目錄中:
[root@linuxprobe ~]# cd /media/iso
查看當前目錄下的文件:
[root@linuxprobe iso]# ls addons images Packages RPM-GPG-KEY-redhat-release EFI isolinux release-notes TRANS.TBL EULA LiveOS repodata GPL media.repo RPM-GPG-KEY-redhat-beta