通過NFS共享文件
NFS的全稱:網絡文件系統
此服務主要是用于 linux 和linux之間;unix 和 unix之間的網絡文件傳輸;
這個服務器相對來說比較簡單,但是難度在于如何配置它的端口號。
工作原理:
NFS提供很多功能,如:rpc.nfs;rpc.mount;rpc.lockd不同的功能由不同的daemon來完成。
NFS使用的端口是2049端口;
RPC使用的端口是111端口;(遠程過程調用)
NFS服務器默認是安裝好的,我們現在給重新啟動一下:
# service nfs restart
當我在啟動NFS的時候,NFS會把它的一些daemon發送到RPC去注冊,RPC會隨機的給這些daemon隨機的去分配一些端口
可以使用如下命令查看隨機分配的端口號有哪些:
# rpcinfo –p localhost 這里看到的隨機分配的端口,只要一重新啟動NFS,端口就又會重新分配,和現在看到的端口就不會是一樣的了。
這里的隨機分配的端口號是一個大問題,當我們在寫防火墻的時候,就不容易寫端口號了,因為這些端口號在每次重新啟動NFS服務器的時候,都會重新分配不一樣的端口號,那這些端口號是否可以固定呢?可以的,如下:
# vim /etc/sysconfig/nfs
找到如下端口號,把它改一下:
找到這些行,如下:
# LOCKD_TCPPORT=32803
# LOCKD_UDPPORT=32769
# MOUNTD_PORT=892
# STATD_PORT=662
找到上面這些行,然后把這些行前面的“#”給去掉,把后面的端口號給改一下,并且用雙引號給引起來,如下:
LOCKD_TCPPORT=”4001”
LOCKD_UDPPORT=”4001”
MOUNTD_PORT=”4002”
STATD_PORT=”4003”
重啟NFS之后,發現上面的端口號已經被固定下來,如下:
# service nfs restart
# rpcinfo –p localhost
然后就可以通過防火墻來控制其端口了。
# iptables –I INPUT 1 –p tcp –dport 111 –j ACCEPT
# iptables –I INPUT 1 –p udp –dport 111 –j ACCEPT
# iptables –I INPUT 1 –p tcp –dport 2049 –j ACCEPT
# iptables –I INPUT 1 –p udp –dport 2049 –j ACCEPT
# iptables –I INPUT 1 –p tcp –dport 4001:4003 –j ACCEPT
# iptables –I INPUT 1 –p udp –dport 4001:4003 –j ACCEPT
防火墻配置好之后一定要保存一下,如下:
# service iptables save
下面就開始配置網絡共享了,如下:
先創建一個文件夾,然后通過NFS把這個文件共享出去:
# mkdir /xx
然后編輯一個文件:
# vim /etc/exports
語法:共享目錄 共享的范圍(屬性1,屬性2,……)
/xx 192.168.80.0/24(rw,sync)
“rw”為可讀可寫;
“ sync”為同步;同步的意思就是說,當用戶把這個共享目錄掛載到本地時,用戶往這個掛載目錄里寫東西,其實就往/xx里寫東西,兩者保持一個同步。
在另外一臺linux機器上查看服務器上的共享,方法:
# showmount –e 192.168.80.88
然后將服務器上共享目錄掛載到本地上,如下:
# mount 192.168.80.88:/xx /tmp
當往這個掛載的目錄里寫文件的時候,發現權限不夠,原因如下:
# cd /tmp/
# touch xx
Touch: 無法創建“xx”:權限不夠
權限不夠的原因是:是因為服務器里有一個設置,我們只寫了兩個(rw,sync),但實際上它還有一個隱藏的選項,我們沒有看到而已,那這個隱藏選項叫 root_squash,意思是權限的壓縮,這個權限是默認權限,并沒有顯示在這里面。意思是說,我現在共享了一個目錄,在客戶端上面如果掛載了我的共享目錄的話,在客戶端上如果使用root來登錄的話,使用root來訪問我的nfs共享的時候,NFS服務器會把它當成一個匿名用戶(NFS nobody),所以當客戶端使用root來往NFS里面寫東西,由于服務器那邊做了root_squash,所以當客戶端使用root來往NFS共享里寫東西時,服務器會認為客戶端使用的是NFS nobody用戶(匿名用戶)。
為什么這么說?我們來看一個配置文件,如下:
# cat /var/lib/nfs/etab
/xx 192.168.80.0/24(rw,sync,wdelay,hide,nocrossmnt,secure,root_squash,no_all_squash,no_subtree_check,secure_locks,acl,anonuid=65534,anongid=65534)
這里我只設置了rw,sync,其實后面還有很多東西;
后面有寫到,root_squash,意思是權限的壓縮,壓縮為ID為65534的用戶。可以看下這個ID為什么用戶,如下:
[root@server ~]# id nfsnobody
uid=65534(nfsnobody) gid=65534(nfsnobody) ?=65534(nfsnobody)
這里就顯示這個ID為nfsnobody用戶(也就是匿名用戶)
我們再來看一下這個共享目錄的權限(在服務器上)
[root@server ~]# ll -d /xx/
drwxr-xr-x. 2 root root 4096 9? 17 23:18 /xx/
所屬用戶為root,所屬組為root ,那么nfsnobody應該屬于其它,權限這里的其它只有一個X權限
然后我們可以給其它加一個w權限,如下:
# chmod o+w /xx
這個時候客戶端就可以往這個掛載里面寫東西了,如下:
# cd /nfs/
# touch xx
[root@www nfs]# touch x
[root@www nfs]# ll
-rw-r--r--. 1 root root 0 9月 17 23:18 88888
-rw-r--r--. 1 nfsnobody nfsnobody 0 9月 17 23:45 sdo
-rw-r--r--. 1 nfsnobody nfsnobody 0 9月 17 23:47 wen
-rw-r--r--. 1 nfsnobody nfsnobody 0 9月 17 23:49 x
[root@www nfs]#
這個時候就會看下面三個文件的所有者和所屬組都是屬于nfsnobody了。
我們可以不做權限的壓縮,如下:
在后面的括號里加上一句 no_root_squash意思是:不做權限的壓縮
# vim /etc/exports
/xx 192.168.80.0/24(rw,sync,no_root_squash)
然后執行下面的命令(重新輸出),如下;
# exportfs –arv
“a”所有
“r”重新掛載
“v”顯示過程
“u”卸載
然后再在客戶端上的NFS共享里創建一個文件,會顯示所有者和所屬組都為root了。
注意:不推薦大家反復多次的重啟NFS服務,因為每次重新NFS服務的時候,NFS服務器都會到/var/lib/nfs/etab文件里去注冊,會花很長時間,那時在創建文件的時候,會用掉很長時間才能創建出來。所以推薦大家,不要重啟NFS服務,而是直接使用exportfs –arv命令。
如果只允許一臺主機有寫的權限,其它的不能有寫的權限,可以寫成如下:
# vim /etc/exports
/xx 192.168.80.88/32(rw,sync) 192.168.80.0/24(ro,sync)
前面的子網掩碼不能寫成24,如果你寫成24的話,系統還會認為是這個網段,所以要寫成32,另外上面的寫法還可以寫成:這里給分成兩行來寫的。
/xx 192.168.80.88/32(rw,sync)
/xx 192.168.80.0/24(rw,sync)
如果有多個共享的話,可以一一把系統中的共享文件全部寫入到這里,如果有幾百個,可以使用for 循環來做。