在 Linux 上构建廉价的家庭 NAS 系统

在 Linux 上构建廉价的家庭 NAS 系统

我和许多其他 MacBook Pro 用户一样,面临着内存不足的问题。 更准确的来说,我日常使用的rMBP配备的SSD容量只有256GB,自然不够用很长一段时间。

最重要的是,当我开始在飞行期间录制视频时,情况只会变得更糟。 这样的飞行后拍摄的素材量达到了 50+ GB,而我那可怜的 256GB SSD 很快就被填满了,迫使我购买了一个外部 1TB 硬盘。 然而,一年后,它无法再处理我生成的数据量,更不用说缺乏冗余和备份使其不适合托管重要信息。

因此,有一次我决定构建一个大型 NAS,希望这个系统能够持续至少几年而不需要再次升级。

我写这篇文章主要是为了提醒我到底做了什么以及我是如何做的,以防我需要再次这样做。 如果您决定这样做,我希望它对您也有用。

也许更容易购买?

所以,我们知道我们想要得到什么,问题仍然是:如何得到?

我首先考虑了商业解决方案,特别是 Synology,它应该提供市场上最好的消费级 NAS 系统。 然而,这项服务的成本却相当高。 最便宜的 4 盘位系统售价超过 300 美元,并且不包括硬盘驱动器。 此外,这样的套件本身的内部填充并不是特别令人印象深刻,这让人质疑它的真实性能。

后来我想:为什么不自己搭建一个NAS服务器呢?

寻找合适的服务器

如果您要组装这样的服务器,那么首先您需要找到合适的硬件。 使用过的服务器应该非常适合此构建,因为我们不需要太多的性能来执行存储任务。 在必要的东西中,我们应该注意大量的 RAM、多个 SATA 连接器和良好的网卡。 由于我的服务器将在我的永久居住地工作,因此噪音水平也很重要。

我开始在 eBay 上搜索。 虽然我在那里发现了很多价格低于 410 美元的二手 Dell PowerEdge R210/R100,但由于有在服务器机房工作的经验,我知道这些 1U 设备噪音太大,不适合家庭使用。 一般来说,塔式服务器通常噪音较小,但不幸的是,eBay 上的塔式服务器很少,而且要么价格昂贵,要么性能不足。

下一个要去的地方是 Craiglist,我发现有人以 40 美元的价格出售二手 HP ProLiant N75L! 我很熟悉这些服务器,即使使用它们通常也要花费 300 美元左右,所以我给卖家发了电子邮件,希望广告仍然有效。 得知这种情况后,我毫不犹豫地前往圣马特奥购买了这台服务器,乍一看确实让我很满意。 它的磨损很小,除了一点灰尘之外,其他一切都很好。

在 Linux 上构建廉价的家庭 NAS 系统
购买后立即看到的服务器照片

以下是我购买的套件的规格:

  • 中央处理器:AMD Turion(tm) II Neo N40L 双核处理器(64 位)
  • 内存:8 GB 非 ECC RAM(由前任所有者安装)
  • Flash:4 GB USB 驱动器
  • SATA 连接器:4+1
  • 网卡:1 Gbps 板载 NIC

不用说,尽管已经有好几年了,该服务器的规格仍然优于市场上大多数 NAS 选项,尤其是在 RAM 方面。 稍后,我什至升级到 16 GB ECC,增加了缓冲区大小并增强了数据保护。

选择硬盘

现在我们已经有了一个优秀的工作系统,剩下的就是为其选择硬盘了。 显然,我花了 75 美元只得到了服务器本身,没有硬盘,这并不让我感到惊讶。

经过一番研究后,我发现 WD Red HDD 最适合运行 NAS 系统 24/7。 为了购买它们,我转向亚马逊,在那里我购买了 4 份,每份 3 TB。 基本上,您可以连接任何您喜欢的硬盘,但要确保它们具有相同的容量和速度。 从长远来看,这将帮助您避免可能出现的 RAID 性能问题。

系统设置

我认为许多人会使用该系统来构建 NAS FreeNAS的,这并没有什么问题。 然而,尽管可以在我的服务器上安装这个系统,但我更喜欢使用 CentOS,因为 Linux 系统上的 ZFS 最初是为生产环境准备的,一般来说,管理 Linux 服务器对我来说更熟悉。 此外,我对 FreeNAS 提供的花哨界面和功能不感兴趣 - RAIDZ 阵列和 AFP 共享对我来说已经足够了。

在 USB 上安装 CentOS 非常简单 - 只需指定 USB 作为启动源,启动后安装向导将引导您完成所有阶段。

RAID构建

成功安装 CentOS 后,我还在 Linux 上安装了 ZFS,如下所示 步骤在这里.

此过程完成后,我加载了 ZFS 内核模块:

$ sudo modprobe zfs

并使用命令创建 RAIDZ1 阵列 zpool:

$ sudo zpool create data raidz1 ata-WDC_WD30EFRX-68AX9N0_WD-WMC1T0609145 ata-WDC_WD30EFRX-68AX9N0_WD-WMC1T0609146 ata-WDC_WD30EFRX-68AX9N0_WD-WMC1T0609147 ata-WDC_WD30EFRX-68AX9N0_WD-WMC1T0609148
$ sudo zpool add data log ata-SanDisk_Ultra_II_240GB_174204A06001-part5
$ sudo zpool add data cache ata-SanDisk_Ultra_II_240GB_174204A06001-part6

请注意,这里我使用的是硬盘驱动器的 ID,而不是它们的显示名称(sdx)以减少由于字母更改而导致启动后无法安装的可能性。

我还添加了在单独的 SSD 上运行的 ZIL 和 L2ARC 缓存,将该 SSD 分为两个分区:5GB 用于 ZIL,其余用于 L2ARC。

至于RAIDZ1,它可以承受1个磁盘故障。 许多人认为不应使用此池选项,因为第二个磁盘可能在 RAID 重建过程中发生故障,从而导致数据丢失。 我忽略了这个建议,因为我定期在远程设备上备份重要数据,即使整个阵列发生故障也只会影响数据的可用性,而不会影响其安全性。 如果您没有能力进行备份,那么最好使用 RAIDZ2 或 RAID10 等解决方案。

您可以通过运行以下命令来验证池创建是否成功:

$ sudo zpool status

и

$ sudo zfs list
NAME                               USED  AVAIL  REFER  MOUNTPOINT
data                               510G  7.16T   140K  /mnt/data

默认情况下,ZFS 将新创建的池直接挂载到 /,这通常是不希望的。 您可以通过运行以下命令来更改此设置:

zfs set mountpoint=/mnt/data data

从这里您可以选择创建一个或多个数据集来存储数据。 我创建了两个,一个用于时间机器备份,一个用于共享文件存储。 我将 Time Machine 数据集的大小限制为 512 GB 的配额,以防止其无限增长。

优化

zfs set compression=on data

此命令启用 ZFS 压缩支持。 压缩使用最少的 CPU 功率,但可以显着提高 I/O 吞吐量,因此始终建议使用。

zfs set relatime=on data

通过此命令,我们可以减少更新次数 atime以减少访问文件时产生的 IOPS。

默认情况下,Linux 上的 ZFS 将 50% 的物理内存用于 ARC。 就我而言,当文件总数很小时,可以安全地增加到 90%,因为服务器上不会运行其他应用程序。

$ cat /etc/modprobe.d/zfs.conf 
options zfs zfs_arc_max=14378074112

然后在帮助下 arc_summary.py 您可以验证更改是否已生效:

$ python arc_summary.py
...
ARC Size:				100.05%	11.55	GiB
	Target Size: (Adaptive)		100.00%	11.54	GiB
	Min Size (Hard Limit):		0.27%	32.00	MiB
	Max Size (High Water):		369:1	11.54	GiB
...

设置重复任务

我用了 systemd-zpool-scrub 配置 systemd 计时器每周执行一次清理,并且 zfs 自动快照 每 15 分钟、1 小时和 1 天自动创建快照。

安装 Netatalk

网聊 是 AFP 的开源实现(苹果归档协议)。 下列的 CentO官方安装说明S,我实际上在短短几分钟内就收到了一个组装并安装的 RPM 包。

配置设置

$ cat /etc/netatalk/afp.conf
[datong@Titan ~]$ cat /etc/netatalk/afp.conf 
;
; Netatalk 3.x configuration file
;

[Global]
; Global server settings
mimic model = TimeCapsule6,106

; [Homes]
; basedir regex = /home

; [My AFP Volume]
; path = /path/to/volume

; [My Time Machine Volume]
; path = /path/to/backup
; time machine = yes

[Datong's Files]
path = /mnt/data/datong
valid users = datong

[Datong's Time Machine Backups]
path = /mnt/data/datong_time_machine_backups
time machine = yes
valid users = datong

请注意, vol dbnest 对我来说这是一个重大改进,因为默认情况下 Netatalk 将 CNID 数据库写入文件系统的根目录,这根本不是可取的,因为我的主文件系统在 USB 上运行,因此速度相对较慢。 正在开启 vol dbnest 导致将数据库保存在卷根中,在本例中属于 ZFS 池,并且生产力已经提高了一个数量级。

在防火墙中启用端口

$ sudo firewall-cmd --permanent --zone=public --add-service=mdns
$ sudo firewall-cmd --permanent --zone=public --add-port=afpovertcp/tcp

sudo 防火墙-cmd --permanent --zone=public --add-port=afpovertcp/tcp
如果一切配置正确,您的机器应该显示在 Finder 中,并且 Time Machine 也应该可以工作。

其他设置
智能监控

建议监视磁盘的状态以防止磁盘故障。

$ sudo yum install smartmontools
$ sudo systemctl start smartd

UPS 守护进程

监控 APC UPS 的电量,并在电量严重不足时关闭系统。

$ sudo yum install epel-release
$ sudo yum install apcupsd
$ sudo systemctl enable apcupsd

硬件升级

设置系统一周后,我开始越来越关心服务器的非ECC内存。 此外,对于 ZFS,用于缓冲的额外内存将非常有用。 因此,我回到亚马逊,以每条 2 美元的价格购买了 3 条金士顿 DDR8 80GB ECC 内存,并更换了前任所有者安装的台式机内存。 系统第一次启动没有任何问题,并且我确保 ECC 支持已激活:

$ dmesg | grep ECC
[   10.492367] EDAC amd64: DRAM ECC enabled.

导致

我对结果非常满意。 现在,我可以通过复制文件来不断保持服务器的 1Gbps LAN 连接繁忙,并且 Time Machine 可以完美运行。 所以,总的来说,我对这个设置很满意。

总费用:

  1. 1 * HP ProLiant N40L = 75 美元
  2. 2 * 8 GB ECC 内存 = 174 美元
  3. 4 * WD Red 3 TB HDD = 440 美元

在总 = $ 689

现在我可以说这个价格是值得的。

你们自己制作 NAS 服务器吗?

在 Linux 上构建廉价的家庭 NAS 系统

在 Linux 上构建廉价的家庭 NAS 系统

来源: habr.com

添加评论