Skip to content
月份: 2020 年 1 月
安裝
- 建議考量若有實務上的需求再安裝它。
- 伺服器端/server:sudo apt install nfs-kernel-server(也會自動安裝用戶端)
- 用戶端/client:sudo apt install nfs-common
伺服器端的設置
- 筆者實驗上打算使用 virtualbox 內的 nfs server。
- 在 virtualbox 虛擬機下做安裝與設置,一樣要做 port forwarding,port 是 2049。另外一個是 111。
(port 111 又要再重導向一次,請見前文關於 virtualbox port forwarding:sudo socat TCP4-LISTEN:111,fork TCP4:localhost:1030 &) - Port 2049 是給 NFS server 使用的,port 111 是給 rpcbind 使用的。另外虛擬機內,及實體主機上都將有機會當為 client。不過,以實體主機為 client 而言,若實體主機也有安裝 nfs server,則 port 將被佔用,因此需將該 services 停用,實體主機上:sudo systemctl stop nfs-server; sudo systemctl stop rpcbind;
重點是,停用 rpcbind 會不會影響實體主機上的 nfs client 的行為目前筆者不清楚。(實驗結果仍可存取) - 以下實驗的,nfs server 和 nfs client 都在虛擬機上。
- NFS 各版本其設置不盡相同,於此,只針對 v4 來設置。
- 因為只要是檔案系統便涉及權限模式,同步/鎖定,檔案啟/閉,實體裝置等複雜問題。但並非教學文章都有提及,故我們假定以下以最簡單的方式來設置,使用上也是無慮的。
- 我們先建立一個 NFS 的主目錄 NFSv4,目的是將若要分享出來的其他資料夾掛載繫結到此主目錄底下
- 接著我們再建立一個範例目錄 sudo mkdir -p /srv/NFSv4/shared_pub
- 做個比較,FTP 和 SFTP 都需要使用伺服器上既存在的使用者名稱密碼來登入,管理上比較複雜。使用 NFS 是任何人都有機會登入(只要 nfs server 有設定允許)且不需密碼。但是登入後的使用者名稱會是延用該登入者的名稱,其可能在 nfs server 主機上並沒有此名稱,或者有該相同名稱但實際卻不是已指派的同一人(詳見鳥哥的文章)。故為了簡化管理,我們將所有 nfs 登入者都視為同一人(䁥名者)。權限部份再由 nfs 組態來配置(以及由檔案/目錄本身取決)。
- 因此,我們使用 nobody:nogroup 作為唯一的 nfs 使用者與群組。
- 接著會在 server 上掛載繫結某一個資料夾到 ./shared_pub,我們假定是 /home/kenny/Download/the_shared_folder,那麼在 ./Download/the_shared_folder 底下的所有東西便會出現在 ./shared_pub 底下,./shared_pub/ 底下原本存在的東西也暫時不可見。往後,以此方式我們可以實時地繫結任一個(將要暫時開放分享出去的)server 主機上的資料夾。
- sudo mkdir -p /srv/NFSv4/shared_pub
- mkdir -p /home/kenny/Download/the_shared_folder
- touch /home/kenny/Download/the_shared_folder/example1.txt(不可寫)
- touch /home/kenny/Download/the_shared_folder/example2.txt(可寫)
- sudo chown nobody:nogroup /srv/NFSv4
- sudo chown nobody:nogroup /srv/NFSv4/shared_pub
- sudo chown nobody:nogroup /home/kenny/Download/the_shared_folder
- sudo chown nobody:nogroup /home/kenny/Download/the_shared_folder/example2.txt
- # 因為我們想要分享出去的檔案/資料夾有其原本的權限,繫結掛載後,權限不變。導致登入者可能無法存取之。故必須由讀者取決權限模式變更與否。
- sudo mount –bind /home/kenny/Download/the_shared_folder /srv/NFSv4/shared_pub(注意是 – -b)
- 若要每次開機都會啟用此掛載,就要編輯 /etc/fstab,加入這一行:
- /home/kenny/Download/the_shared_folder /srv/NFSv4/shared_pub none bind 0 0
- 編輯 /etc/default/nfs-kernel-server,加入這一行,其目的是取消安全性相關的設定:
- NEED_SVCGSSD=no # no is default
- 接著,我們若要開放給區網的所有人使用,例如子網域是 192.168.1.* 我們編輯以下檔案以開放出來,/etc/exports,加入這兩行:
- /srv/NFSv4 192.168.1.0/24(ro,fsid=0,no_subtree_check,sync,all_squash,anonuid=65534,anongid=65534)
- /srv/NFSv4/shared_pub 192.168.1.0/24(rw,nohide,insecure,no_subtree_check,sync,all_squash,anonuid=65534,anongid=65534)
- 注意選項的括號和 NFS 客戶端的名稱之間不可以有空格。括號中的選項,也不能使用空格。
- 最後要重啟:
- sudo exportfs -r
- sudo service nfs-kernel-server restart
- 請注意,
- 設定主目錄 /srv/NFSv4 是必要的,因其指定了 fsid=0。而若 client 掛載了主目錄,則 /srv/NFSv4 底下若有宣告共享的那些目錄(此例是 shared_pub)也會按照(shared_pub)在 /etc/exports 內配置的方式被自動掛載。故盡量不要掛載主目錄,只要掛載其支目錄較單純。
登入/掛載時會對照 /etc/exports 的對應,如上例,也就是若從 /srv/NFSv4 登入將一直會是唯讀,若從 /srv/NFSv4/shared_pub 便一直可讀寫。但卻有例外!注意到,從 /srv/NFSv4 登入(唯讀),接著進入子目錄 shared_pub,因其有宣告在 /etc/exports,故會自動掛載,並且變成可讀寫了。
最後,一定要記得䁥名登入只限在所有人都是 nobody:nogroup 的身份。能夠存取的檔案或資料夾,就必須具備這樣的擁有者或權限模式。而對於存取時若下了 sudo 指令呢?筆者試了確實又可跳脫了䁥名者的身份。。。真是。。。 - 關於位址的設定,筆者嘗試的結果,
- 192.168.1.0/24 在虛擬機內是無效的,所以此例中,應將其改為 localhost,如此,不僅 VM 內(的 client 所要掛載的)主機名稱可以是 localhost/127.0.0.1/VM-name(例如 kenny-VirtualBox),實體主機(的 client)亦可用這些名稱掛載(筆者遇到不一定成功掛載,原因未知)。不過,全部僅限實體主機或此實機上的虛擬機的 client。今若在實際區網內的 nfs server(已沒有虛擬機),則用 192.168.1.0/24 是沒問題的。若要任何人都可存取,則謹慎使用 0.0.0.0/0.0.0.0(並且也適用於 VM 內的 nfs server)
用戶端的設置
- 掛載伺服器端所 export 出來的資料夾,我們先在本地(同樣是虛擬機上)建立資料夾以掛載於此處 mkdir -p /home/kenny/vm_shared
- sudo mount -t nfs4 -o proto=tcp,port=2049 nfs-server:/shared_pub /home/kenny/vm_shared
- 那麼,伺服端的 /srv/NFSv4/shared_pub/ 底下便會掛載到本地端的 /home/kenny/vm_shared/ 底下
- 要卸載的話,只要指定本地的掛載名稱即可:umount /home/kenny/vm_shared
- 讀者需將 nfs-server 換成 nfs server 的主機的名稱/網址/ip。於此,因使用虛擬機,故還能使用虛擬機名稱 kenny-VirtualBox。若同是本地端,則 localhost/127.0.0.1 也都可以使用。
- 若要在 /etc/fstab 中的設定:
- nfs-server:/shared_pub /home/kenny/vm_shared nfs4 _netdev,auto 0 0
結論
- 似乎使用 ln -s 或 mount –bind(注意 – -b)有同樣效果,於此列出一些差異:
- bind 存取速度較快
- 某些應用程式會禁止巡訪 symlink,但 mount/bind 的方式卻不受限。Symlink 像是 redirect,mount/bind 像是 mapping。
- 透過 mount/bind 可將既存的資料夾或檔案遮掩,其用途例如 /etc/mycfg.conf 的既存設定下,我想試用新的設定,我們可以以新的設定檔遮掩原先的。原先的並不會被覆寫,umount 後又會回復。Symlink 則無此能力。mount -o bind /path/to/test/newfile.conf /etc/mycfg.conf
- client 若在 /etc/fstab 掛載 nfs file system,可能會有等待時間使得開機時間變長。
- 須開啟防火牆及 ip 分享器的 port forwarding;111 是 tcp/udp,2049 是 tcp
- Client 端查詢:showmount [-ae] [hostname|IP]
- -a :顯示目前主機與用戶端的 NFS 連線分享的狀態;
- -e :顯示某部主機的 /etc/exports 所分享的目錄資料。
- rpcinfo -p <hostname> 查看有使用 rpc 的程式。可查看編號的對應程式在 /etc/rpc
- 一般來說, NFS 的服務僅會對內部網域開放,不會對網際網路開放的。然而,如果你有特殊需求的話, 那麼也可能會跨不同網域就是了。但是,NFS 的防火牆特別難搞,為什麼呢?因為除了固定的 port 111, 2049 之外, 還有很多不固定的埠口是由 rpc.mountd,rpc.rquotad 等服務所開啟的,所以,你的 iptables 就很難設定規則!
- 我們知道開機就掛載的掛載點與相關參數是寫入 /etc/fstab 中的,那 NFS 能不能寫入 /etc/fstab 當中呢?非常可惜的是,不可以呢!為啥呢?分析一下開機的流程,我們可以發現網路的啟動是在本機掛載之後,因此當你利用 /etc/fstab 嘗試掛載 NFS 時,系統由於尚未啟動網路,所以肯定是無法掛載成功的啦!那怎辦?簡單!就寫入 /etc/rc.d/rc.local 即可!
- 可不可以讓用戶端在有使用到 NFS 檔案系統的需求時才讓系統自動掛載?當 NFS 檔案系統使用完畢後,可不可以讓 NFS 自動卸載,以避免可能的 RPC 錯誤?能達到上述的功能,用的就是 autofs 這個服務啦!
- 筆者對 nfs 認識不深,以目前(以上)的功力,掌控度不佳故應不會慣用它。
- 參考資料
- http://linux.vbird.org/linux_server/0330nfs.php
- https://help.ubuntu.com/community/NFSv4Howto
- https://help.ubuntu.com/community/Autofs
- http://manpages.ubuntu.com/manpages/trusty/man4/nfsv4.4freebsd.html
- https://help.ubuntu.com/community/SettingUpNFSHowTo
- http://nfs.sourceforge.net/nfs-howto/index.html
- https://wiki.archlinux.org/index.php/NFS
- https://linux265.com/news/3771.html
- https://linuxize.com/post/how-to-install-and-configure-an-nfs-server-on-ubuntu-18-04/
- https://docstore.mik.ua/orelly/networking_2ndEd/nfs/ch05_03.htm
- https://serverfault.com/questions/776114/mount-nfs-failed-to-resolve-server
- https://www.howtoforge.com/high_availability_nfs_drbd_heartbeat
- https://wiki.archlinux.org/index.php/Diskless_system
Categories:
Linux 架設網站
Tags:
NFS