把你的樹莓派家庭實驗室變成一個網路文件系統
共享文件系統是為家庭實驗室增加通用性和功能性的好方法。在實驗室中為客戶端共享一個集中的文件系統,使得組織數據、進行備份和共享數據變得相當容易。這對於在多個伺服器上進行負載均衡的 Web 應用和 Kubernetes 使用的持久化捲來說,尤其有用,因為它允許在任何數量的節點上用持久化數據來輪轉 Pod。
無論你的家庭實驗室是由普通計算機、多餘的企業伺服器,還是樹莓派或其他單板計算機(SBC)組成,共享文件系統都是一種有用的資產,而網路文件系統(NFS)伺服器是創建共享文件系統的好方法。
我之前寫過關於建立「家庭私有雲」的文章,這是一個由樹莓派或其他 SBC 組成的家庭實驗室,也許還有其他一些消費類硬體或台式 PC。NFS 伺服器是這些組件之間共享數據的理想方式。由於大多數 SBC 的操作系統是通過 SD 卡運行的,所以存在一些挑戰。尤其是在用作計算機的操作系統磁碟時,SD 卡的故障率會增加,它們並不是用來不斷地讀寫的。你實際需要的是一個真正的硬碟:它們通常比 SD 卡的每 GB 價格便宜,特別是對於較大的磁碟,而且它們不太可能持續發生故障。樹莓派 4 現在帶有 USB 3.0 介面,而 USB 3.0 硬碟無處不在,價格也很實惠。這是一個完美的搭配。在這個項目中,我將使用一個 2TB 的 USB 3.0 外置硬碟插入到運行 NFS 伺服器的樹莓派 4 中。
![Raspberry Pi with a USB hard disk](/data/attachment/album/202007/14/154429t2thazxk9tahkxlj.jpg "Raspberry Pi with a USB hard disk")
安裝 NFS 伺服器軟體
我在樹莓派上運行 Fedora 伺服器,但這個項目也可以在其他發行版上運行。要在 Fedora 上運行 NFS 伺服器,你需要 nfs-utils
包,幸運的是它已經安裝好了(至少在 Fedora 31 中是這樣)。如果你打算運行 NFSv3 服務,你還需要 rpcbind
包,但它不是 NFSv4 的嚴格要求。
如果你的系統中還沒有這些軟體包,請使用 dnf
命令安裝它們。
# 安裝 nfs-utils 和 rpcbind
$ sudo dnf install nfs-utils rpcbind
Raspbian 是另一個與樹莓派一起使用的流行操作系統,設置幾乎完全相同。軟體包名稱不同而已,但這是唯一的主要區別。要在運行 Raspbian 的系統上安裝 NFS 伺服器,你需要以下軟體包。
nfs-common
:這些文件是 NFS 伺服器和客戶端的通用文件。nfs-kernel-server
:主要的 NFS 伺服器軟體包。
Raspbian 使用 apt-get
來管理軟體包(而不是像 Fedora 那樣使用 dnf
),所以用它來安裝軟體包。
# 對於 Raspbian 系統,使用 apt-get 來安裝 NFS 軟體包
$ sudo apt-get install nfs-common nfs-kernel-server
準備一個 USB 硬碟作為存儲設備
正如我上面提到的,USB 硬碟是為樹莓派或其他 SBC 提供存儲的好選擇,尤其是用於操作系統磁碟鏡像的 SD 卡並不適合這個用途。對於家庭私有雲,你可以使用廉價的 USB 3.0 硬碟進行大規模存儲。插入磁碟,使用 fdisk
找出分配給它的設備 ID,就可以使用它工作了。
# 使用 fdisk 找到你的硬碟
# 無關的硬碟信息已經省略
$ sudo fdisk -l
Disk /dev/sda: 1.84 TiB, 2000398933504 bytes, 3907029167 sectors
Disk model: BUP Slim BK
Units: sectors of 1 * 512 = 512 bytes
Sector size (logical/physical): 512 bytes / 512 bytes
I/O size (minimum/optimal): 512 bytes / 512 bytes
Disklabel type: dos
Disk identifier: 0xe3345ae9
Device Boot Start End Sectors Size Id Type
/dev/sda1 2048 3907028991 3907026944 1.8T 83 Linux
為了清楚起見,在上面的例子輸出中,除了我感興趣的那個磁碟,我省略了所有其它磁碟的信息。你可以看到我想使用的 USB 磁碟被分配了設備 /dev/sda
,你可以看到一些關於型號的信息(Disk model: BUP Slim BK
),這有助於我識別正確的磁碟。該磁碟已經有了一個分區,它的大小也證實了它就是我要找的磁碟。
注意:請確保正確識別你的設備的磁碟和分區。它可能與上面的例子不同。
在驅動器上創建的每個分區都有一個特殊的通用唯一標識符(UUID)。計算機使用 UUID 來確保它使用 /etc/fstab
配置文件將正確的分區掛載到正確的位置。你可以使用 blkid
命令檢索分區的 UUID。
# 獲取該分區的塊設備屬性
# 確保你使用了合適的分區,它應該有所不同。
$ sudo blkid /dev/sda1
/dev/sda1: LABEL="backup" UUID="bd44867c-447c-4f85-8dbf-dc6b9bc65c91" TYPE="xfs" PARTUUID="e3345ae9-01"
在這裡,/dev/sda1
的 UUID 是 bd44867c-447c-4f85-8dbf-dc6b9bc65c91
。你的 UUID 會有所不同,所以要記下來。
配置樹莓派在啟動時掛載這個磁碟,然後掛載它
現在你已經確定了要使用的磁碟和分區,你需要告訴計算機如何掛載它,每次啟動時都要這樣做。現在就去掛載它。因為這是一個 USB 磁碟,可能會被拔掉,所以你還要配置樹莓派在啟動時如果磁碟沒有插入或有其它不可用情況時不要等待。
在 Linux 中,通過將分區添加到 /etc/fstab
配置文件中,包括你希望它被掛載的位置和一些參數來告訴計算機如何處理它。這個例子將把分區掛載到 /srv/nfs
,所以先創建這個路徑:
# 創建該磁碟分區的掛載點
$ sudo mkdir -p /srv/nfs
接下來,使用以下語法格式修改 /etc/fstab
文件:
<disk id> <mountpoint> <filesystem type> <options> <fs_freq> <fs_passno>
使用你之前確定的 UUID 作為磁碟 ID。正如我在上一步提到的,掛載點是 /srv/nfs
。對於文件系統類型,通常最好選擇其實際的文件系統,但是因為這是一個 USB 磁碟,所以使用 auto
。
對於選項值,使用 nosuid,nodev,nofail
。
關於手冊頁的一個旁白
其實,有很多可能的選項,手冊頁(man
)是查看它們的最好方法。查看 fstab
的手冊頁是一個很好的開始。
# 打開 fstab 的手冊頁
$ man fstab
這將打開與 fstab
命令相關的手冊/文檔。在手冊頁中,每個選項都被分解成了不同的內容,以顯示它的作用和常用的選擇。例如,「第四個欄位(fs_mntopts)」給出了該欄位中可用選項的一些基本信息,並引導你到 man 8 mount
中獲取 mount
選項更深入的描述。這是有道理的,因為 /etc/fstab
文件,本質上是告訴計算機如何自動掛載磁碟,就像你手動使用 mount
命令一樣。
你可以從 mount
的手冊頁中獲得更多關於你將使用的選項的信息。數字 8 表示手冊頁的章節。在這裡,第 8 章節是系統管理工具和守護進程。
你可以從 man
的手冊頁中得到標準章節的列表。
回到掛載磁碟,讓我們看看 man 8 mount
。
# 打開第 8 章節的 mount 手冊頁
$ man 8 mount
在這個手冊頁中,你可以查看上面列出的選項的作用。
nosuid
:不理會 suid/guid 位。不允許放在 U 盤上的任何文件以 root 身份執行。這是一個良好的安全實踐。nodev
:不識別文件系統中的字元或塊特殊設備,即不理會在 U 盤上的任何設備節點。另一個良好的安全實踐。nofail
:如果設備不存在,不要記錄任何錯誤。這是一個 U 盤,可能沒有插入,所以在這種情況下,它將被忽略。
回到你正在添加到 /etc/fstab
文件的那一行,最後還有兩個選項:fs_freq
和 fs_passno
。它們的值與一些過時的選項有關,大多數現代系統對這兩個選項都只用 0
,特別是對 USB 磁碟上的文件系統而言。fs_freq
的值與 dump
命令和文件系統的轉儲有關。fs_passno
的值定義了啟動時要 fsck
的文件系統及其順序,如果設置了這個值,通常根分區是 1
,其他文件系統是 2
,將該值設置為 0
以跳過在該分區上使用 fsck
。
在你喜歡的編輯器中,打開 /etc/fstab
文件,添加 U 盤上分區的條目,將這裡的值替換成前面步驟中得到的值。
# With sudo, or as root, add the partition info to the /etc/fstab file
UUID="bd44867c-447c-4f85-8dbf-dc6b9bc65c91" /srv/nfs auto nosuid,nodev,nofail,noatime 0 0
啟用並啟動 NFS 伺服器
安裝好軟體包,並將分區添加到你的 /etc/fstab
文件中,現在你可以開始啟動 NFS 伺服器了。在 Fedora 系統中,你需要啟用和啟動兩個服務:rpcbind
和 nfs-server
。使用 systemctl
命令來完成這項工作。
# 啟動 NFS 伺服器和 rpcbind
$ sudo systemctl enable rpcbind.service
$ sudo systemctl enable nfs-server.service
$ sudo systemctl start rpcbind.service
$ sudo systemctl start nfs-server.service
在 Raspbian 或其他基於 Debian 的發行版上,你只需要使用 systemctl
命令啟用並啟動 nfs-kernel-server
服務即可,方法同上。
RPCBind
rpcbind 工具用於將遠程過程調用(RPC)服務映射到其監聽的埠。根據 rpcbind 手冊頁:
「當一個 RPC 服務啟動時,它會告訴 rpcbind 它正在監聽的地址,以及它準備服務的 RPC 程序號。當客戶機想對給定的程序號進行 RPC 調用時,它首先與伺服器機器上的 rpcbind 聯繫,以確定 RPC 請求應該發送到哪裡的地址。」
在 NFS 伺服器這個案例中,rpcbind 會將 NFS 的協議號映射到 NFS 伺服器監聽的埠上。但是,NFSv4 不需要使用 rpcbind。如果你只使用 NFSv4 (通過從配置中刪除版本 2 和版本 3),則不需要使用 rpcbind。我把它放在這裡是為了向後兼容 NFSv3。
導出掛載的文件系統
NFS 伺服器根據另一個配置文件 /etc/exports
來決定與哪些遠程客戶端共享(導出)哪些文件系統。這個文件只是一個 IP(或子網)與要共享的文件系統的映射,以及一些選項(只讀或讀寫、root 去除等)。該文件的格式是:
<目錄> <主機>(選項)
在這個例子中,你將導出掛載到 /srv/nfs
的分區。這是「目錄」部分。
第二部分,主機,包括你要導出這個分區的主機。這些主機可以是單個主機:使用具有完全限定域名(FQDN)或主機名、主機的 IP 地址來指定;也可以是一組主機:使用通配符字元來匹配域(如 *.example.org)、IP 網路(如無類域間路由 CIDR 標識)或網組表示。
第三部分包括應用於該導出的選項。
ro/rw
:將文件系統導出為只讀或讀寫。wdelay
:如果即將進行另一次寫入,則推遲對磁碟的寫入,以提高性能(如果你使用的是固態 USB 磁碟,這可能沒有那麼有用)root_squash
:防止客戶機上的任何 root 用戶在主機上有 root 許可權,並將 root UID 設置為nfsnobody
作為安全防範措施。
測試導出你掛載在 /srv/nfs
處的分區到一個客戶端 —— 例如,一台筆記本電腦。確定你的客戶機的 IP 地址(我的筆記本是 192.168.2.64
,但你的可能會不同)。你可以把它共享到一個大的子網,但為了測試,請限制在單個 IP 地址上。這個 IP 的 CIDR 標識是 192.168.2.64/32
,/32
子網代表一個 IP。
使用你喜歡的編輯器編輯 /etc/exports
文件,寫上你的目錄、主機 CIDR 以及 rw
和 root_squash
選項。
# 像這樣編輯你的 /etc/exports 文件,替換為你的系統上的信息
/srv/nfs 192.168.2.64/32(rw,root_squash)
註:如果你從另一個地方複製了 /etc/exports
文件,或者用副本覆蓋了原文件,你可能需要恢復該文件的 SELinux 上下文。你可以使用 restorecon
命令來恢復。
# 恢復 /etc/exports 文件的 SELinux 上下文
$ sudo restorecon /etc/exports
完成後,重新啟動 NFS 伺服器,以接收對 /etc/exports
文件的更改。
# 重新啟動 NFS 伺服器
$ sudo systemctl restart nfs-server.service
給 NFS 服務打開防火牆
有些系統,默認不運行防火牆服務。比如 Raspbian,默認是開放 iptables 規則,不同服務打開的埠在機器外部立即就可以使用。相比之下,Fedora 伺服器默認運行的是 firewalld 服務,所以你必須為 NFS 伺服器(以及 rpcbind,如果你將使用 NFSv3)打開埠。你可以通過 firewall-cmd
命令來實現。
檢查 firewalld 使用的區域並獲取默認區域。對於 Fedora 伺服器,這是 FedoraServer
區域。
# 列出區域
# 出於簡潔省略了部分輸出
$ sudo firewall-cmd --list-all-zones
# R獲取默認區域信息
# 記下默認區域
$ sudo firewall-cmd --get-default-zone
# 永久加入 nfs 服務到允許埠列表
$ sudo firewall-cmd --add-service=nfs --permanent
# 對於 NFSv3,我們需要再加一些埠: nfsv3、 rpc-mountd、 rpc-bind
$ sudo firewall-cmd --add-service=(nfs3,mountd,rpc-bind)
# 查看默認區域的服務,以你的系統中使用的默認區域相應替換
$ sudo firewall-cmd --list-services --zone=FedoraServer
# 如果一切正常,重載 firewalld
$ sudo firewall-cmd --reload
就這樣,你已經成功地將 NFS 伺服器與你掛載的 U 盤分區配置在一起,並將其導出到你的測試系統中進行共享。現在你可以在你添加到導出列表的系統上測試掛載它。
測試 NFS 導出
首先,從 NFS 伺服器上,在 /srv/nfs
目錄下創建一個文件來讀取。
# 創建一個測試文件以共享
echo "Can you see this?" >> /srv/nfs/nfs_test
現在,在你添加到導出列表中的客戶端系統上,首先確保 NFS 客戶端包已經安裝好。在 Fedora 系統上,它是 nfs-utils
包,可以用 dnf
安裝。Raspbian 系統有 libnfs-utils
包,可以用 apt-get
安裝。
安裝 NFS 客戶端包:
# 用 dnf 安裝 nfs-utils 軟體包
$ sudo dnf install nfs-utils
一旦安裝了客戶端包,你就可以測試 NFS 的導出了。同樣在客戶端,使用帶有 NFS 伺服器 IP 和導出路徑的 mount
命令,並將其掛載到客戶端的一個位置,在這個測試中是 /mnt
目錄。在這個例子中,我的 NFS 伺服器的 IP 是 192.168.2.109
,但你的可能會有所不同。
# 掛載 NFS 伺服器的輸出到客戶端主機
# 確保替換為你的主機的相應信息
$ sudo mount 192.168.2.109:/srv/nfs /mnt
# 查看 nfs_test 文件是不是可見
$ cat /mnt/nfs_test
Can you see this?
成功了!你現在已經有了一個可以工作的 NFS 伺服器,可以與多個主機共享文件,允許多個讀/寫訪問,並為你的數據提供集中存儲和備份。家庭實驗室的共享存儲有很多選擇,但 NFS 是一種古老的、高效的、可以添加到你的「家庭私有雲」家庭實驗室中的好選擇。本系列未來的文章將擴展如何在客戶端上自動掛載 NFS 共享,以及如何將 NFS 作為 Kubernetes 持久卷的存儲類。
via: https://opensource.com/article/20/5/nfs-raspberry-pi
作者:Chris Collins 選題:lujun9972 譯者:wxy 校對:wxy
本文轉載來自 Linux 中國: https://github.com/Linux-CN/archive