網絡文件系統,NFS (Network File System)
主要在Unix和類Unix環境下使用
有服務器端和客戶端
可以將遠程Linux主機的文件共享掛載在本地主機目錄上
Windows 可以支持
基于UDP/IP協議
# 檢查是否存在 NFS 相關軟件
rpm -qa | grep nfs
# 刪除現存 NFS 相關軟件
sudo yum -y remove nfs*
# CentOS 安裝 NFS 工具包
sudo yum install -y nfs-utils \
rpcbind
# Ubuntu 安裝 NFS 工具包
sudo apt-get install -y nfs-kernel-server
# 啟動 NFS 服務
systemctl start nfs.service
systemctl start rpcbind.service
# 設置 NFS 為開機自啟動
systemctl enable nfs.service
systemctl enable rpcbind.service
# 檢查 NFS 服務運行狀態
sudo systemctl status nfs.service
sudo systemctl rpcbind.service
# 查看 NFS 進程運行信息
ps -ef | grep NFS
# 查看端口運行情況 (未安裝Net-Tools無法使用)
netstat -nlpt | grep NFS
# 停止 NFS 服務
sudo systemctl stop nfs.service
sudo systemctl stop rpcbind.service
# 重啟 NFS 服務
sudo systemctl restart nfs.service
sudo systemctl restart rpcbind.service
# 查看 NFS 需要占用的端口,有可能會出現不一樣的情況,根據情況編寫下面文件
rpcinfo -p
# 編寫 NFS 防火墻網絡服務文件
# 具體端口根據 上面命令輸出結果改一下,端口太多了一個一個開放太麻煩
# 系統自帶網絡服務文件端口釋放的有問題,無法通過
sudo cat <<EOF > /usr/lib/firewalld/services/fl-nfs.xml
<?xml version="1.0" encoding="utf-8"?>
<service>
<short>fl-nfs</short>
<description>FourLeaf Studio 自建 NFS 防火墻 網絡服務文件.</description>
<port protocol="tcp" port="2049"/>
<port protocol="udp" port="2049"/>
<port protocol="tcp" port="111"/>
<port protocol="udp" port="111"/>
<port protocol="tcp" port="32768"/>
<port protocol="udp" port="32768"/>
<port protocol="tcp" port="32769"/>
<port protocol="udp" port="32769"/>
<port protocol="tcp" port="1011"/>
<port protocol="udp" port="1011"/>
<port protocol="tcp" port="57199"/>
<port protocol="udp" port="57199"/>
<port protocol="tcp" port="43554"/>
<port protocol="udp" port="43554"/>
<port protocol="tcp" port="51889"/>
<port protocol="udp" port="51889"/>
<port protocol="tcp" port="38504"/>
<port protocol="udp" port="38504"/>
<port protocol="tcp" port="51889"/>
<port protocol="udp" port="51889"/>
<port protocol="tcp" port="20048"/>
<port protocol="udp" port="20048"/>
<port protocol="tcp" port="42905"/>
<port protocol="udp" port="42905"/>
<port protocol="tcp" port="43931"/>
<port protocol="udp" port="43931"/>
<port protocol="tcp" port="60476"/>
<port protocol="udp" port="60479"/>
<port protocol="tcp" port="40103"/>
<port protocol="udp" port="40103"/>
</service>
EOF
# 刷新 防火墻策略
sudo firewall-cmd --reload
# 放行 NFS 服務
sudo firewall-cmd --permanent --zone=public --add-service=fl-nfs
# 生效 防火墻策略
sudo firewall-cmd --reload
# 創建 NFS 共享文件夾
mkdir -p /data/NFS-Folder
# 賦予 NFS 共享文件夾 完全權限
chmod -Rf 777 /data/NFS-Folder
# 創建測試文件
echo “Welcome to FourLeaf Studio” > /data/NFS-Folder/ReadME.txt
# 方法1 :編輯 NFS 配置文件 (默認是一個空文件)
sudo nano /etc/exports
# {
# 把 /data/NFS-Folder 共享給 172.16.28.* 網段,擁有 讀寫權限、任何用戶登錄時都映射為匿名用戶
/data/NFS-Folder 172.16.28.*(rw,sync,all_squash)
# }
# 方法2 :命令行添加 NFS 共享信息
sudo cat <<EOF >> /etc/exports
# 把 /data/NFS-Folder 共享給 172.16.28.* 網段,擁有 讀寫權限、任何用戶登錄時都映射為匿名用戶
/data/NFS-Folder 172.16.28.*(rw,sync,all_squash)
EOF
cat /etc/exports | tail -n 3
# 重新加載配置文件
exportfs -rv
# 重新啟動 NFS 服務
sudo systemctl restart nfs.service
# NFS配置文件定義 (IP與權限之間沒有空格)
路徑 可用IP范圍 (權限,權限)
# NFS權限列表
ro 只讀
rw 讀寫
root_squash 以root用戶登錄時,映射為匿名用戶
no_root_squash 以root用戶登錄時,映射為root管理員
all_squash 以任何用戶登錄時,映射為匿名用戶
sync 同時寫入內存和硬盤,防止數據丟失
async 先寫入內存,然后寫入硬盤,容易丟失數據
# 安裝 NFS 工具包
sudo yum install -y nfs-utils
# Ubuntu 安裝 NFS 客戶端
sudo apt-get install -y nfs-common
# 查詢 NFS 服務器 信息
showmount -e 172.16.28.130
# 反饋正確信息
# 需要記錄下面路徑,掛載時需要原文復制
Export list for 172.16.28.130:
/data/NFS-Folder 172.16.28.*
# 創建 NFS 掛載文件夾
mkdir -p /data/NFS-Folder
# 映射 NFS 文件夾
# 路徑必須是絕對路徑
mount -t nfs 172.16.28.130:/data/NFS-Folder /data/NFS-Folder
# 測試 NFS
cd /data/NFS-Folder
ls
# 反饋信息(此處直接映射NFS遠程文件夾為本地文件夾,沒有嵌套關系)
readme.txt
# 卸載 NFS 存儲
umount /data/NFS-Folder
# 測試 NFS 存儲性能
time dd if=/dev/zero of=/data/NFS-Folder/text-file bs=100k count=1000
Ubuntu 掛載
性能測試
# 掛載時報錯的返還錯誤信息,關閉 防火墻 解決
clnt_create: RPC: Port mapper failure - Unable to receive: errno 113 (No rou
rpc mount export: RPC: Unable to receive; errno=No route to host
# # 掛載時報錯的返還錯誤信息,強制卸載后重新掛載解決
mount.nfs: /data/NFS-Folder is busy or already mounted
防火墻端口開放不夠會報錯
已經掛載過會報錯
# 獲取 mount 命令 幫助
mount --help
用法:
mount [-lhV]
mount -a [選項]
mount [選項] [--source] <源> | [--target] <目錄>
mount [選項] <源> <目錄>
mount <操作> <掛載點> [<目標>]
選項:
-a, --all 掛載 fstab 中的所有文件系統
-c, --no-canonicalize 不對路徑規范化
-f, --fake 空運行;跳過 mount(2) 系統調用
-F, --fork 對每個設備禁用 fork(和 -a 選項一起使用)
-T, --fstab <路徑> /etc/fstab 的替代文件
-h, --help 顯示此幫助并退出
-i, --internal-only 不調用 mount.<類型> 助手程序
-l, --show-labels 列出所有帶有指定標簽的掛載
-n, --no-mtab 不寫 /etc/mtab
-o, --options <列表> 掛載選項列表,以英文逗號分隔
-O, --test-opts <列表> 限制文件系統集合(和 -a 選項一起使用)
-r, --read-only 以只讀方式掛載文件系統(同 -o ro)
-t, --types <列表> 限制文件系統類型集合
--source <源> 指明源(路徑、標簽、uuid)
--target <目標> 指明掛載點
-v, --verbose 打印當前進行的操作
-V, --version 顯示版本信息并退出
-w, --rw, --read-write 以讀寫方式掛載文件系統(默認)
-h, --help 顯示此幫助并退出
-V, --version 輸出版本信息并退出
源:
-L, --label <標簽> 同 LABEL=<label>
-U, --uuid <uuid> 同 UUID=<uuid>
LABEL=<標簽> 按文件系統標簽指定設備
UUID=<uuid> 按文件系統 UUID 指定設備
PARTLABEL=<標簽> 按分區標簽指定設備
PARTUUID=<uuid> 按分區 UUID 指定設備
<設備> 按路徑指定設備
<目錄> 綁定掛載的掛載點(參閱 --bind/rbind)
<文件> 用于設置回環設備的常規文件
操作:
-B, --bind 掛載其他位置的子樹(同 -o bind)
-M, --move 將子樹移動到其他位置
-R, --rbind 掛載其他位置的子樹及其包含的所有掛載
--make-shared 將子樹標記為 共享
--make-slave 將子樹標記為 從屬
--make-private 將子樹標記為 私有
--make-unbindable 將子樹標記為 不可綁定
--make-rshared 遞歸地將整個子樹標記為 共享
--make-rslave 遞歸地將整個子樹標記為 從屬
--make-rprivate 遞歸地將整個子樹標記為 私有
--make-runbindable 遞歸地將整個子樹標記為 不可綁定
更多信息請參閱 mount(8)。
umount --help
用法:
umount [-hV]
umount -a [選項]
umount [選項] <源> | <目錄>
選項:
-a, --all 卸載所有文件系統
-A, --all-targets 卸載當前名字空間內指定設備
對應的所有掛臷點
-c, --no-canonicalize 不對路徑規范化
-d, --detach-loop 若掛臷了回環設備,也釋放該回環設備
--fake 空運行;跳過 umount(2) 系統調用
-f, --force 強制卸載(遇到不響應的 NFS 系統時)
-i, --internal-only 不調用 umount.<類型> 輔助程序
-n, --no-mtab 不寫 /etc/mtab
-l, --lazy 立即斷開文件系統,所有清理以后執行
-O, --test-opts <列表> 限制文件系統集合(和 -a 選項一起使用)
-R, --recursive 遞歸卸載目錄及其子對象
-r, --read-only 若卸載失敗,嘗試以只讀方式重新掛臷
-t, --types <列表> 限制文件系統集合
-v, --verbose 打印當前進行的操作
-h, --help 顯示此幫助并退出
-V, --version 輸出版本信息并退出
# 傳說中,只有專業版以上版本支持NFS功能,由于我從不用家庭版,所以沒測試
# 查詢 NFS 服務器 信息
showmount -e 172.16.28.130
# 反饋正確信息
# 需要記錄下面路徑,掛載時需要原文復制
導出列表在 172.16.28.130:
/data/NFS-Folder 172.16.28.*
# 將上述信息轉譯成 Windows 可以識別的格式
# \\{IP地址或主機名}\{共享絕對路徑}
\\172.16.28.130\data\NFS-Folder
# 獲取 mount 幫助
mount /help
用法: mount [-o options] [-u:username] [-p:<password | *>] <\\computername\sharename> <devicename | *>
-o rsize=size 設置讀取緩沖區的大小(以 KB 為單位)。
-o wsize=size 設置寫入緩沖區的大小(以 KB 為單位)。
-o timeout=time 設置 RPC 調用的超時值(以秒為單位)。
-o retry=number 設置軟裝載的重試次數。
-o mtype=soft|hard 設置裝載類型。
-o lang=euc-jp|euc-tw|euc-kr|shift-jis|big5|ksc5601|gb2312-80|ansi
指定用于文件和目錄名稱的編碼。
-o fileaccess=mode 指定文件的權限模式。
這些模式用于在 NFS 服務器上創建的
新文件。使用 UNIX 樣式模式位指定。
-o anon 作為匿名用戶裝載。
-o nolock 禁用鎖定。
-o casesensitive=yes|no 指定在服務器上執行區分大小寫的文件查找。
-o sec=sys|krb5|krb5i|krb5p
Linux 、windows相互共享磁盤或文件夾
磁盤、目錄共享、掛載一般使用iSCSI、smb、NFS、NAS、NSA等服務方式向客戶端提供服務。如下等。。
① 存儲,為各服務器提供磁盤或目錄(客戶端為windows server ,centos、Redhat等服務器)
② windows 作為服務器,設立共享文件夾,外部系統作為客戶端訪問服務器的共享文件夾(外部設備可以是windows系統,linux 系統,macOS系統,ipad,iphone ,Android電視等)
③ linux作為服務器,設立共享目錄,其他外部系統訪問、掛載共享目錄(外部系統可為linux、windows、macOS 等)
一、windows smb共享,linux掛載
通過SMB協議可以實現主設備共享文件夾,及外部設備訪問共享文件夾。
外部設備可以是windows系統,linux 系統,macOS系統,ipad,iphone ,Android電視等。
1:[windows]開啟SMB協議
方法一:打開控制面板---程序---添加windows 功能。安裝SMB/CIFS文件共享支持,安裝完重啟計算機。
2:[windows]創建新的用戶賬號
目的:該用戶賬號是其他設備后續登錄并查看共享文件需要使用的。
打開控制面板->點擊“用戶賬戶”->點擊“管理其他賬戶”
3:[windows]共享文件夾
屬性-共享-共享-選擇要共享的賬號
找到你想要共享的文件夾,右鍵屬性,點擊“共享”選項卡,再點下面的“共享”按鈕
然后將剛剛創建的新的用戶賬號添加進去,并且可以修改用戶權限為“讀取”或者“讀取/寫入”,然后點擊共享,再點擊完成。
屬性-共享-高級共享
對共享的文件夾,右鍵屬性,點擊“共享”選項卡,再點擊“高級共享”,設置共享賬號的權限。
4、[windows]查看共享文件的主機在局域網內的IP地址
windows系統在命令行輸入ipconfig查看ip地址
5、[ipad]打開文件,連接主設備(服務器)
首先必須確保ipad和主設備在同一個局域網內。
然后在ipad中打開文件,點擊”連接服務器“
在連接服務器中輸入smb://步驟4得到的IP地址(如果外部設備是windows系統,則不需要帶smb),并點擊連接
6、[linux]掛載共享文件夾
yum install cifs-utils #安裝cifs工具包,cifs是liunx上的smb服務的客戶端。
創建被掛載的目錄:
mkdir windows
共享文件夾掛載到windows文件夾
mount -t cifs -o username=ankar,password=123456,vers=1.0,sec=ntlm //192.168.133.1/share windows
vi /etc/fstab #添加以下內容讓操作系統啟動后自動掛載windows機器上的共享文件夾到掛載點,/etc/.smbpasswd中寫用戶smb服務用戶名密碼
//192.168.133.1/share /data/windows cifs rw,credentials=/etc/.smbpasswd 0 0
mount -a #(讓系統重新掛載所有在/etc/fstab文件里面定義的掛載點)
二、linux nfs共享,windows 掛載
1、Linux安裝nfs服務,并配置/etc/exports,設置要共享的目錄,共享給哪些主機,及相關配置。
開啟NFS服務,防火墻相關配置。
rxportfs -r 刷新共享配置。
rxportfs -v 查看恭喜配置
exportfs命令:
功能說明 :NFS共享管理
server上執行此命令時,讀取/etc/exports中的信息,并將有關的directories(或filesystems)分享給NFS clients.
語法格式
exportfs [必要參數][選擇參數][目錄]
功能描述
exportfs 命令:用于管理NFS(Network File System)文件系統,在不直接編輯/etc/exports文件的情況下,可用exportfs來操作 命令屬性 磁盤管理 命令屬權限 超級用戶 普通用戶
-a 遞增式更新,對/etc/exports 增加或修改的部分進行掛載和卸載
-i<文件> 指定配置文件
-r 更新配置,重新讀取/etc/exports
-u 卸載指定目錄
-o 使用指定參數
-v 顯示共享詳細情況
【NFS共享的常用參數】/etc/exports
ro 只讀訪問
rw 讀寫訪問
sync 所有數據在請求時寫入共享
async NFS在寫入數據前可以相應請求
secure NFS通過1024以下的安全TCP/IP端口發送
insecure NFS通過1024以上的端口發送
wdelay 如果多個用戶要寫入NFS目錄,則歸組寫入(默認)
no_wdelay 如果多個用戶要寫入NFS目錄,則立即寫入,當使用async時,無需此設置。
hide 在NFS共享目錄中不共享其子目錄
no_hide 共享NFS目錄的子目錄
subtree_check 如果共享/usr/bin之類的子目錄時,強制NFS檢查父目錄的權限(默認)
no_subtree_check 和上面相對,不檢查父目錄權限
all_squash 共享文件的UID和GID映射匿名用戶anonymous,適合公用目錄。
no_all_squash 保留共享文件的UID和GID(默認)
root_squash root用戶的所有請求映射成如anonymous用戶一樣的權限(默認)
no_root_squash root用戶具有根目錄的完全管理訪問權限
anonuid=xxx 指定NFS服務器/etc/passwd文件中匿名用戶的UID
anongid=xxx 指定NFS服務器/etc/passwd文件中匿名用戶的GID
2、在Windows系統中,首先需要開啟NFS服務。打開控制面板,選擇“程序”,再選擇“打開或關閉Windows功能”。在Windows功能界面中,找到“適用于NFS的文件服務”選項,并勾選之。點擊“確定”按鈕,等待系統安裝NFS服務。
在此電腦上添加網絡映射共享磁盤。
需要讀寫權限的需要修改注冊表
通過修改注冊表將windows訪問NFS時的UID和GID改成0即可,步驟如下
1、在運行中輸入regedit,打開注冊表編輯器;
2、進入HKEY_LOCAL_MACHINE\SOFTWARE\Microsoft\ClientForNFS\CurrentVersion\Default條目;
3、選擇新建----QWORD值,新建AnonymousUid,AnonymousGid兩個值,值為0;
4、重啟電腦 注冊表才會生效;重啟后修改共享目錄讀寫屬性。