構建完美、廉價的家庭使用網絡附加存儲 (NAS)

這是第一次出現在這裡的帖子的自動翻譯: https://blog.georgovassilis.com/2020/04/01/building-the-perfect-cheap-diy-nas/

這篇文章在 Hacker News 上得到了廣泛的討論。

這篇文章討論了硬件注意事項、安裝 Linux、設置軟件 RAID、穩健性和處理數據損壞。

我已經在家裡運行了十年的自建 NAS,所以我想我會寫下我的經驗,以便其他人可能會為我的許多失敗而幸災樂禍,並為我的幾次勝利而驚嘆不已。

HP Proliant 微服務器 gen8 價格實惠、結構緊湊,可在 Ubuntu 上運行

NAS 是完美的,因為它簡單、安全、模塊化和可擴展,而且價格便宜,因為它是由二手商品零件製成的。

NAS 主要將文件(文檔和媒體)存儲在軟件 RAID 6 上,並通過 Windows 共享將它們提供給本地網絡。 我遠離專有 NAS 解決方案,因為如果沒有完全相同的硬件更換,硬件故障會使數據恢復變得幾乎不可能。 在這十年裡,從硬盤到機箱和主板的每一塊硬件都被換成了別的東西,有時甚至不止一次,所以對模塊化的關注是有回報的。 由於長期數據完整性和穩健性是一個問題,NAS 應該運行某種冗餘 RAID 級別。

目標

目標描述解決方案
功能NAS作為家庭使用的網絡附加文件系統; NAS 每天運行幾個小時,大部分時間處於關閉或待機狀態商品硬件,開源軟件,模塊化,保持簡單
互操作性常用的計算機平台應該可以訪問 NAS 上的文件。 商品硬件應該能夠連接到 NAS。Ubuntu、USB、SATA 上的 Samba(又名 Windows 共享)。 將 LAN 連接到 Wifi 路由器,進行名稱解析和時間服務器。 使用 SSH 訪問和管理。
模塊化硬件和軟件組件應可互換,無需重新設計整個系統x86 PC平台、Linux、Docker
控制我想控制 NAS 上安裝了哪些軟件以及它的作用Ubuntu 18.04 LTS
數據的完整性任意大小(在合理範圍內)的文件和內容應存儲在 NAS 上,並且不會隨著時間的推移而腐蝕或失去完整性帶有 4 個硬盤的 RAID 6、帶有校驗和的 ext4fs、擦洗、手動組裝的 RAID、ECC RAM。 使用 par2 簽署檔案。
噪音噪音應低且可容忍HDD 處於備用狀態,SSD 作為主 OS 磁盤,主要寫入,大量 RAM,被動冷卻
成本使用商品硬件和免費的開源軟件二手商品硬件,硬盤代替 SSD
低維護避免時間緊迫的維護ufw 防火牆僅接受來自內部網絡的連接,沒有自動更新,有限的軟件,Docker,無法從 Internet 訪問。
數據安全在硬件丟失或被盜的情況下,未經授權的各方應該無法訪問數據dmcrypt 與外部設備上的密鑰
低功耗功耗應符合服務器功能組件大部分時間處於待機狀態,SSD、RAID 大部分時間處於寫入狀態
袖珍的物理 NAS 尺寸應該很小; 不浪費空間使用 HP proliant microserver gen8
要求及其實施

非目標 典型的媒體服務器任務:流式傳輸、編碼、轉碼等 比特幣挖礦 洪流 其他一切🙂

獲取硬件

獲得正確的硬件是最難(雙關語)的部分,因為它是模塊化、價格、能耗、尺寸和我感興趣的許多其他目標的平台。周圍有許多二手、廉價的專有 NAS 服務器 ,但我不喜歡封閉的硬件和軟件系統的想法。 例如,如果硬件 RAID 控制器以專有格式在硬盤驅動器上存儲數據,我將需要完全相同的替換控制器來在控制器發生故障時恢復該數據。

空間也是一個問題,因此服務器應該緊湊,同時允許在其上運行 Linux; 這很難找到,因為大多數緊湊型 NAS 都有專有系統,並且不允許安裝您自己的操作系統。 有很多二手 x86 PC 和服務器,但它們大多太大或沒有足夠的驅動器托架或 SATA 端口。 通過 USB 連接驅動器也不是一種選擇,因為速度低、功耗高和空間要求高。 我在 2010 年左右的前幾次 NAS 修訂版使用了緊湊的準系統,後來使用了一個迷你塔式機箱,周圍有 3 或 4 個硬盤托架,但我發現這些天來這些盒子格式更難獲得。 如果你能以實惠的價格買到一個,你會很幸運!

我遇到了一台二手的 HP proliant microserver gen8,從那以後我就沒有後悔過。 基本型號配備 2GB ECC RAM、Celeron 2 核 CPU 和無硬盤驅動器,價格約為 100 歐元。 Louwrentius 上有對該服務器的出色評論。 該服務器非常緊湊(每個尺寸約 26 厘米),待機時噪音相當低(雖然不是靜音),有一個被動冷卻 CPU,兩個 GBit 以太網端口,四個 3.5 英寸硬盤驅動器托架和一個有點隱藏的專有格式插槽,用於 我用於 SSD 的第五個低調 2,5 英寸磁盤。 驅動器托架可以直接接收 SATA 磁盤,而第 5 個插槽需要一個 4 針 FDD 公頭到 SATA 適配器和一根 SATA 電纜將 2.5 英寸 SSD 連接到主板。 作為額外的獎勵,該服務器具有 ILO 功能,允許使用 Web 瀏覽器遠程訪問服務器 – 因此無需鍵盤或屏幕!

我承認服務器不是 100% 的商品部件; 例如。 主板或 CPU 故障將需要訂購完全相同的備件(這可能會很昂貴)或在不同平台上構建全新的服務器。 然而,RAM、網絡和存儲是相當標準的,我在上面運行 Ubuntu,前面概述的好處足以承擔這個風險。 大約 6 年後,服務器仍然可以正常運行; 除非倖存者偏見,我認為這種方法效果很好。

我購買的服務器有 2014 年的固件,幸運的是,惠普最近開始免費發布更新,最後一個是 2019 年末的,我用它刷新了微服務器以獲得流暢的 HTML5 管理 UI。

該服務器多年來經歷了各種升級; 從三個 2TB 硬盤的 RAID5 陣列到當前設置的 3x6TB + 1x8TB + 1x 512MB SSD 以及 CPU 升級到 Xeon 型號和 RAM 升級到 16GB ECC。 我幾乎完全重新利用了比內部硬盤便宜的外部 USB 硬盤驅動器(在打開、提取硬盤和告別保修之後)……起初,考慮到額外的硬件(外殼、USB 到 SATA 適配器、電纜、電源),這令人驚訝 供應)他們來了; 然而,保修和技術規格明顯不如內部驅動器,這解釋了價格差異。 由於服務器運行 RAID 6(其全部目的是為了避免磁盤故障),我認為這是一個可以承擔的風險。

服務器通過以太網電纜連接到家庭 Wifi 路由器; 網絡速度接近 100mb/s 沒問題,USB3 端口可以達到 40mb/s 左右。

安裝

即使沒有物理鍵盤和屏幕,ILO 也可以輕鬆設置服務器。我從 Ubuntu 服務器 LTS 14.04 開始,切換到 16.04,目前正在運行 18.04。升級從未到位,在每種情況下都需要全新安裝。

我建議在您的工作站上安裝 VM(如 VirtualBox),從實時映像啟動 Ubuntu Server 18.04 並在 USB 硬盤上安裝 Ubuntu。我無法使用 UEFI 啟動 Proliant 微服務器,因此需要安裝傳統的 grub BIOS。

四個硬盤按照下面的模式進行分區:一個 1MB 的分區用於 GRUB 引導加載程序,一個 50GB 的分區用於 Ubuntu,一個 5.5TB 的分區用於 RAID。

我使用 Ubuntu Server 18.04 替代安裝程序將 Ubuntu 分區設置為 RAID 1,它將該分區鏡像到所有硬盤上。安裝程序能夠將 Ubuntu 安裝到該 RAID 1 中,並且 GRUB 能夠從中引導。如果硬盤出現故障,只需卸下該硬盤即可讓服務器再次啟動。

要使安裝程序正常工作,RAID 中至少需要有兩個磁盤。 以後可以添加更多磁盤。 只需確保在所有磁盤上安裝 GRUB 引導加載程序:

grub-install /dev/sdX

在我的第一個實驗中,Ubuntu 能夠正常啟動,但無法激活以太網卡。 這需要對netplan進行一些擺弄。

引導 RAID 注意事項

正如“安裝”中所討論的,Ubuntu 從 RAID 1 啟動。md 將更改鏡像到所有啟動分區,這太棒了。 引導 RAID 映射在 /dev/md0 下——我沒有找到為其分配名稱的方法,但我發現設備名稱是穩定的。 不幸的是,Ubuntu 在正常運行期間會不斷訪問引導驅動器,這在我的情況下意味著四個驅動器總是在旋轉。 我嘗試了各種方法,例如將日誌目錄重新映射到 ram 磁盤和預加載文件,但由此產生的腳本叢林無法維護。 破解後,解決方案變得非常簡單和優雅:我在第 5 個硬盤托架中安裝了一個 SSD,並將其添加到啟動 RAID 1。當鏡像工作時,Proliant (gen8) BIOS 無法從 第 5 個托架,如果它在其他地方找到硬盤。 解決方案是一個腳本,該腳本在啟動後運行並使 RAID 中的所有機械硬盤發生故障:

mdadm --manage /dev/md0 --fail /dev/sda2 /dev/sdb2 /dev/sdc2 /dev/sdd2

該腳本比那個複雜一些,因為設備名稱不穩定並且需要考慮各種錯誤情況(例如,如果硬盤出現故障,則不應觸及 RAID)——但這是一個不同的主題 郵政。 MD 在重新啟動後會忘記磁盤已被標記為失敗,這是一個有用的默認設置,因為它允許服務器從任何可用的硬盤啟動。

重要提示:正如我之前寫的,我很少更新服務器上的軟件,但有幾次需要更新時,需要將丟失的硬盤重新插入 RAID,以便將更新鏡像到所有引導分區。

數據 RAID 注意事項

服務器上運行的第二個軟件 RAID 也是重要的一個:數據 RAID。 我的存儲需求歷來與存儲技術的進步競爭,因此數據 RAID 經歷了從雙磁盤 RAID 1 到 3 磁盤 RAID 5 到 3 磁盤 RAID 1 到 4 磁盤 RAID 6 的各種轉變,目前是 .

如果您負擔得起,RAID 1 是最好的解決方案; 它管理最簡單,提供最高的數據一致性和可用性級別,最好的性能,並且作為一個令人愉快的副作用,也是最安靜的操作,這要歸功於寫入模式,它允許在數據存儲時關閉除一個磁盤之外的所有磁盤 只從數組中讀取。 可悲的是,我的數據需求超出了我使用 RAID 1 所能做的。有關“主要寫入模式”的更多信息。

RAID 5 是冗餘和存儲效率之間的一個很好的折衷方案,所以我多年來一直在這種模式下運行數據 RAID。 然而,這個設置有點冒險,正如一個實驗所證明的那樣:想像一個硬盤在半夜突然壞了。 當我注意到故障時,至少 2 天過去了,購買更換並安裝它,再加上 12 小時進行完全重新同步。 因此,陣列在 2.5 天內保持降級和不受保護的狀態——在該時間範圍內任何進一步的故障都會不可挽回地破壞所有數據。

RAID 6 目前是我的用例的選擇級別:它以兩倍的可用性提供一半的總容量,能夠承受雙磁盤故障。 唯一的缺點是 mdadm 的“主要寫入”模式不起作用,因此對 RAID 的任何訪問都需要四個活動磁盤並且噪音很大。

在使用 mdadm 創建 RAID 時,我確保為它分配了一個名稱,所以現在它映射到 /dev/md/data 下。

為了提高數據一致性,我讓 NAS 運行一個腳本來清理數據 RAID。 這是一個長時間運行、I/O 密集和嘈雜的過程,它會使磁盤保持忙碌,並且可能應該在不需要 NAS 時執行; 適用於工作日辦公時間的家庭 NAS。 Cron 是你的朋友。

關於分區的注意事項:您可以在沒有任何分區的情況下使用原始設備(/dev/sdb、/dev/sdc…),但不建議這樣做。 擁有分區(帶有 RAID_1 等標籤)可確保在重建或磁盤交換的情況下,驅動器不會意外安裝在不同的計算機上,並且數據不會被覆蓋(未分區的驅動器將始終顯示不包含任何數據,因此 “安全”用於格式化)。

RAID 加密

下一步是為數據 RAID 設置加密。 為此,我使用了 dmcrypt LUKS,將密鑰存儲在 U 盤上。 確保備份密鑰和 LUKS 標頭,否則在標頭損壞的情況下將無法訪問數據。 加密的好處是我可以移動服務器而不用擔心數據被盜,只要加密的 RAID 和密鑰通過不同的路線傳輸。

加密數據 RAID 是映射到 /dev/mapper/data 的塊設備

文件系統

選擇的文件系統是 ext4,有一些調整:

mkfs.ext4 -O metadata_csum -E lazy_itable_init=0,lazy_journal_init=0 /dev/mapper/data 

這些選項啟用元數據校驗和,從而提高數據一致性並禁用延遲初始化; 後者對於具有機械磁盤的大型陣列尤其重要,因為否則 inode 初始化將需要幾天時間。

本著模塊化的精神,數據 RAID 沒有安裝在 /etc/fstab 中,而是在引導期間通過腳本和 mdadm 安裝。 該腳本還使用 noatime、nodiratime 和 data=journal 選項掛載數據 RAID 文件系統,在掛載之前運行 fsck,調整 stripe_cache_size 並調整電源管理。

另請注意,對於大型 ext4 文件系統,第一次寫入訪問可能需要很長時間——因此請查看此“解決方法”。

Proliant 的 Celeron CPU 成為 dmcrypt 的瓶頸,因為它缺乏硬件輔助加密,但對同一插槽的 Xeon E3-1220L 進行廉價升級解決了這個問題,同時還將 TDP 減半至 17 瓦。

2020 年 9 月更新:我不記得這種情況是否一直如此,或者在更新後開始發生,但數據 RAID 硬盤即使空閒也永遠不會減速。 原因是 ext4 的“多掛載保護”不斷寫入文件系統。 可以使用 tune2fs 調整或禁用多掛載保護(這就是我所做的)。

更安全的數據!

不幸的是,在 2020 年,ext4 和 md 仍然無法有效地對抗默默地破壞文件的“位腐爛”。 我聽到並閱讀了關於 ZFS 的相互矛盾的證詞,據稱它可以更好地處理數據損壞,並且會在某個時候嘗試一下。 目前,我使用 md5sum 創建和驗證備份 .tar.gz 存檔的校驗和,並使用 parchive 創建錯誤恢復文件。 我以前寫過關於 parchive 的文章,直到今天我仍然是一個忠實的粉絲。

自動化

我已經在這里和那裡提到了不祥的“腳本”,但醜陋的事實仍然是當前的設置需要大量的腳本才能順利運行。 從好的方面來說,現在大部分的日常操作都是腳本化和自動化的,不需要人工干預:RAID 可以自行組裝,具有容錯性,即使一兩個硬盤發生故障,服務器也能正常運行。 備份會自動存檔和校驗和,並定期檢查有關損壞文件的警報,然後我手動(我喜歡參與這些事情……)糾正。 我的 github 存儲庫中提供了一些服務器腳本,很快就會有更多腳本。

網絡

服務器使用以下網絡組件:

 用於管理兩個板載以太網卡的 netplan(參見安裝)
 UFW 阻止所有傳入流量,但 SSH、samba 和 netbios
 netbios 向家庭路由器和其他計算機宣布服務器名稱
 samba 在本地網絡中共享文件

我在只讀模式下使用 samba; 一些目錄(如音樂和電影)與訪客訪問共享,其他一些包含個人文檔的目錄受密碼保護,但又是只讀的。 對數據文件系統的任何寫入操作都需要 SSH 訪問。 由於 ext4 不提供快照,我仍然擔心在喝完幾杯酒後的午夜後“誤刪”; 我還沒有找到一個好的解決方案。 對於大型目錄,在 Ubuntu nautilus 中瀏覽 samba 共享可能會很慢——如果處理太多,請考慮使用 CIFS 或 sshfs。

視頻和圖形

我從沒想過我會需要這個,但我需要將物理屏幕和鍵盤連接到 gen8 的那一天終於到來了——並且無法讓桌面環境運行。 gen8 有一個 Matrox g200 顯卡,Ubuntu 很久以前就放棄了對它的支持,但是有一種方法可以從中獲取一些圖形。

第一步:在服務器環境安裝桌面支持:

apt install ubuntu-desktop

重新啟動後,您會看到一個 640×480 的登錄屏幕。 顯示設置中沒有其他可用模式。 這條關於相關問題的評論 [1] 有助於:

# Install vesa xserver. Was not needed in my case.
apt-get install xserver-xorg-video-vesa  

# Boot into text mode
init 3
 
# Create new X-server configuration
X -configure 

# Install configuration. The original post says to replace mga with vesa; in my case, vesa was already pre-filled.

mv xorg.conf.new /etc/X11/xorg.conf

# Boot into graphics
init 5

公平警告:圖形加速不可用,最大分辨率為 1280×1024。

我在研究時發現了一個有趣的事實:gen8 在門後的前面有一個非標準的 DisplayPort 連接器。

Leave a Reply

Fill in your details below or click an icon to log in:

WordPress.com Logo

You are commenting using your WordPress.com account. Log Out /  Change )

Facebook photo

You are commenting using your Facebook account. Log Out /  Change )

Connecting to %s

This site uses Akismet to reduce spam. Learn how your comment data is processed.