NAS 入门
NAS, 是 Network Attached Storage 的简称,翻译为中文就是网络附属存储. 简单的说就是连接在网络上,具备资料存储功能的设备,因此也叫作"网络存储服务器". 它通常为个人或企业单独使用而构建,部署在个人或企业内部防火墙内,对数据的安全性,能有效的把控,也被称为私有云服务器。
什么是 NAS
- NAS(Network Attached Storage: 网络附属存储);
- 专用网络数据存储服务器;
- 支持 SMB、iSCSI、NFS、FTP、WebDev 等方式通过网络共享数据。
NAS 用来做什么
- 家庭数据中心: 家庭存储照片、音视频, 通过不同设备均可访问, 避免数据相互传输费力费时;
- 数据备份自动化: 手机照片直接自动同步到 NAS 中, 并且个人工作中的一些文件直接上传到 NAS, 这样就会节省出大量的手机空间. 以后购买手机就不用在因为内存而焦虑了, 直接买最小内存就够了
- 重要数据存储: NAS 提供高可用的数据存储服务, 磁盘阵列相比于单盘存储有更高的安全性;
- AlO(All in One): 利用虚拟机、Docker 等技术提供在线串流、软路由、BT 下载、家庭相册等功能。
常见 NAS
群晖和威联通只在其品牌的 nas 上有搭载,自己 DIY 的机器上安装的都是盗版,俗称黑群、黑威。
- 优点:相较另外三个系统上手更容易、有相对完整功能体验的同时不需要很多折腾即可使用 (只是相对来讲,对新手来说还是挺折腾的)、有配套开发的手机 APP 可以配合使用。
- 缺点:硬件配置较低、扩展性较差、价格昂贵。一句话来概括就是买系统送硬件。
unraid 是一个对新人比较友好的 nas 系统。
- 优点:国内玩的人很多,相关教程资源非常丰富、出了问题也比较好通过搜索引擎解决、原生支持 docker、硬件直通也简单。
- 缺点:系统需要付费且根据硬盘数量收费、正版系统引导和验证需要通过 u 盘 (有开心版即盗版,另外 unraid 官方时不时会打折,之前还有过对中国用户 5 折优惠)、正版验证 U 盘每年有安装次数限制、硬件的虚拟化效率较低。
omv, 全称 openmediavault, 是一个基于 Linux 系统比较大的分支之一的 Debian 的 nas 系统。
- 优点:免费、稳定性高、对硬件配置要求很低、原生支持 docker、可以通过修改内核的方法支持 zfs. 最新的 omv6, 也可以通过自带的插件安装 filebrowser(文件管理)、PhotoPrism(照片自动识别和管理)
- 缺点:系统在国内比较小众、相关教程资源较少、出了问题自己解决、喜欢享受折腾过程的可以考虑。
truenas, 过去叫 freenas, 目前有三个分支 core、scale、enterprise(enterprise 这个分支是面向企业用户的,这里就不过多介绍了).
core 这个分支,沿用了过去 freenas 时期使用的 FreeBSD 内核。
- 优点:稳定性极强 (运行好几年不出问题)
- 缺点:原生不支持 docker 也就是说安装应用比较麻烦。硬件兼容性也比较差,很多硬件没有对于 FreeBSD 的驱动。
scale 这个分支是基于 Linux 内核新开发出来的分支。
- 优点:由于是 Linux 内核,原生支持 docker, 稳定性在最近的几次更新后也可以接受了。
- 缺点:对虚拟机支持一般。另外,truenas 上使用 zfs 的话,对硬件配置要求较高。
入门阶段硬件配置
CPU
NAS 对 CPU 性能要求较低,一般选择低功耗处理器。
- 平台选择方面,个人更推荐英特尔平台,AMD 平台虽然主板便宜,但是低端 u 太少,选择余地不大,玩的人和支持软件太少,出了问题不好解决。
- 性能上,从嵌入式方案的 j1900 开始选取,到赛扬、奔腾为止。如 J4125 等 (TDP10W)、赛扬/奔腾 T 系列 (TDP35W)
- 年代上,六代以后 cpu 即可,之前的虽然 CPU 便宜,但是主板时间太久,可靠性太差,另外制程太老,功耗也不行。
- 功耗选择上,不需要特别选择带 T 的低功耗型号,因为很多 up 主都测过。在待机和低负载情况下,带不带 T 对 cpu 功耗影响很小。无论是单核、多核性能上,带 T 低功耗的 cpu 性能要远低于普通 cpu, 价格还比正常的要高,很不划算。
- 如有视频串流,显卡硬件解码需求,重点关注核显解码支持。Intel 核显参考 Intel GPU Decoder Device Information (bluesky-soft.com), 一般最低需支持 HEVC 解码。
主板
nas 主板对主板 bios 功能和供电要求不高,更多是对扩展性和接口要求上要高一些,包括 m.2 硬盘位、PCI-E 插槽及通道数、SATA 接口数量,软路由需要多网口。
- 主板尺寸上,选择跟机箱支持的版型走,优先选择 matx 主板。这样能在保持一定扩展性的情况下,价格最低。性价比高。itx 主板价格普遍偏贵,而且选择余地很少,不是那么推荐。
- 品牌和成色方面,新手选择的话,选择正规板厂的全新主板即可,如果选择嵌入式方案的话,退一步选择正规大厂制造的也可以。这样可以尽量避免因为硬件问题,影响咱们使用 nas 的体验。
散热
CPU 散热器根据机箱选择合适高度,不建议使用水冷。
- 低端 u: Intel 原装散热器等入门下压式风冷散热器就足够;
- 其它:塔式散热器。
品牌上,利民、雅浚、九州风神之类的大厂出品的散热都是不错的选择。
内存
- 根据主板选择 DDR3 或 DDR4
- ECC(Error Checking and Correcting) 提高数据安全性,但家用非必需,仅服务器主板支持
- 两根内存组建双通道,提高性能
- 根据系统不同,内存容量 4-16G 或更高,可选择低频率节省成本
固态硬盘/系统盘
- 颗粒分为 SLC MLC TLC QLC(寿命太短)
- 支持协议 SATA 或 NVME(B.Key M.Key B&M.Key)
- 一般用作系统盘,16G/32G 以上即可
- 作为缓存,缓存热数据,提高访问速度,多多益善
机械硬盘
容量与成本:
- NAS 常用 3.5 寸硬盘,1T-22T
- 目前 4T 监控盘性价比较高
- 大容量企业级硬盘容量越大性价比越高,常用 16T
- 企业级硬盘长时间稳定运行,转速高、性能强、温度高、噪音大
- NAS 专用盘转速较低,稳定性好,价格昂贵
- 矿盘不保证可靠性,售后难以保障,不建议用于 NAS
垂直 (CMR) 与叠瓦 (SMR) 技术
- 垂直硬盘为传统结构
- 叠瓦技术可以提升磁盘密度
- 牺牲了写入性能与可靠性,寿命差,长期使用可能会有数据损坏
- 7/9mm 厚度 2.5 寸机械硬盘
- 希捷酷鱼、西数蓝盘、东芝 P300 等低端产品线
- 超大容量硬盘也存在叠瓦盘,可在官网查询
空气盘与氦气盘
- 氦气密度与阻力比空气小,碟片间距更小,单盘可使用更多碟片
- 大容量硬盘 (10T 及更高) 基本为氦气盘
- 氨气盘目前最高可单盘 10 碟,常见大容量空气盘为 4-6 碟
- 氨气盘功耗一般更低,希捷 ExosX2020T 闲置功耗 5.4W, 希捷 7E1010T 限制功耗 7.8W
- 氦气盘新增死法:漏气
SATA 与 SAS 接口
- SAS 常用于企业存储,家用需主板支持
电源
电源建议选择半模组或全模组,便于硬盘供电,根据机箱选择 ATX、SFX 或 1U 电源。
- 质量上,电源必须有国家的 3C 强制认证 (譬如某嘉的电源,连个 3c 认证都没用), 最好选择带 80 plus 认证的电源。但是不必迷信 80plus 金牌、白金这些认证。要求 3C 强制认证、80plus 认证是对做工和质量上的最基本要求。但是 80plus 金牌、白金这些认证只是转换效率方面的等级认证,电源的纹波、保持时间等参数并不能通过 80 plus 认证中从体现出来。
- 电源模组选择上,由于入门新手硬件预算低就不推荐全模组电源了,不差钱的话强烈推荐上。而常规电源,需要注意的就一点,如果 sata 接口不够用,不推荐新手自己用刺破头加装 sata 接口,没有做好接口非常容易烧硬盘。
- 另外,如果要是使用的硬盘多请注意启动时的瞬时电流。选择 +12V、+5V 电流大一些的,避免损坏硬盘。计算方法可以自行在 chh 上找。电源型号的推荐,可以参考翼王的电源图 (图非常老了)、超能网、FCP 大魔王的评测。
机箱
机箱根据需求选择,足够的硬盘位和拓展性。
塔式机箱。
- 优点:性价比高、散热好、防尘好、扩展性强。
- 缺点:笨重、造型一般。
专门的 nas 机箱
- 优点:体积小、造型美观、支持热插拔。
- 缺点:价格昂贵、做工一般、没有现货需要预订、散热不好、防尘功能差、电源大多只能选择 1u、主板大多只能选择 itx 主板。
机箱风道,要为硬盘进行散热延长寿命,散热注意机箱风道,不要装反风扇,温度过高会影响硬盘寿命
自用 NAS
黑群晖
群晖 DS920+
关键参数与亮点
- CPU 为四核处理器的 J4125, 这颗 U 属于 X86 架构,除了兼顾高性能与低功耗
- 内置 4GB DDR4 内存,不过还预留了另外一个内存卡槽用来扩展,DS920+ 官方配有 4 GB DDR4 板载内存,可以通过添加一个可选的 DDR4 非 ECC 4 GB SO-DIMM 来支持高达 8 GB 的存储容量。
- 两个千兆网口,支持链路聚合
- 4 个硬盘插槽,除了容量更大,组 Raid 阵列也有更多的选择;前面板有 4 个带锁的硬盘托架,可以将硬盘托锁死,防止硬盘被误操作拔出;右侧是 5 个 LED 指示灯,分别用来显示系统工作状态以及硬盘工作状态,右下角有一个 USB3.2 Gen1 接口和一个电源按钮,并且电源按钮和指示灯是一体的。
- 一个 eSATA 接口,有了它我们连接外置硬盘或者挂载硬盘柜之后数据传输能力大大增强 (这款 NAS 其实也是通过它来达到最大 9 盘位的支持的);
- 电源,生产商是翌胜电子,最大输出功率 100W
- 两个超大的散热风扇,且支持安静、低温、最大三种转速设定。不同于常见的散热风道,采用的是前面板进风、后面板出风的风道设计,这样的好处在一定程度上可以达到防尘的效果。背部的左下角是两个千兆网线接口,红色的是的 eSATA 扩展接口,以及群晖 NAS 特有的 4 针电源接口;右下角则是一个安全锁孔和一个 USB3.2 Gen1 接口。
- 两个 m.2 2280 规格的 SSD 扩展口,可以用作固态缓存加速,目的是提高硬盘的 4K 性能,改善日常 NAS 的 I/O 读写体验。
群晖 DS920+ SSD 缓存支持两种模式:
- 单根 SSD: 仅只读缓存运行, 也就是在读取文件的时候享受缓存加速;
- 两根 SSD: 读写双向缓存运行, 需要注意的是最好安装两个同类型, 同容量的 SSD 体验更好的缓存加速.
系统初始化安装
- 直接在浏览器中输入:
https://find.synology.com或http://synologynas:5000, 回车之后系统就会自行搜索局域网中的群晖(或者通过群晖官方提供的群晖助手 Synology Asistant, 下载安装好之后, 该软件便会自动搜索局域网中的群晖设备) - 连接需要操作的群晖设备,连接后会下载安装 DSM 系统 (此过程会重新格式化硬盘!!!)
- 大概几分钟的样子,系统下载完成之后,机器就会自动重启
- 重启之后,进入群晖 DSM 系统的安装环节
- 登录/注册 群晖账户
- 创建存储池和存储空间,个人选择 basic 模式 (看自己需求,我没做 RAID, 定期自动备份硬盘重要数据)
「磁盘阵列」其实就是图中显示的 RAID ( Redundant Array of Independent Disks ), 直接翻译就是"独立磁盘构成的具有冗余能力的阵列". 简单理解就是用多个独立的磁盘组成在一起形成一个大的磁盘系统,从而实现比单块磁盘更好的存储性能和更高的可靠性。
磁盘阵列 (Redundant Arrays of Independent Disks, RAID), 有"独立磁盘构成的具有冗余能力的阵列"之意。磁盘阵列是由很多价格较便宜的磁盘,组合成一个容量巨大的磁盘组,利用个别磁盘提供数据所产生加成效果提升整个磁盘系统效能。利用这项技术,将数据切割成许多区段,分别存放在各个硬盘上。
简而言之,RAID 可以提供安全性、读写性能、存储池容量,具体根据阵列类型而定!
| 模式 | 介绍 |
|---|---|
| basic | basic 模式就是最基础的模式,每个硬盘互不相干,都是独立的,就像电脑上面的硬盘一样。具有低成本、高读写性能、100% 的高存储空间利用率等优点,但是它不提供数据冗余保护,一旦数据损坏,将无法恢复。因此,RAID0 一般适用于对性能要求严格但对数据安全性和可靠性不高的用户。basic 模式还支持升级 raid1 或者 raid5, 比如你现在一个盘设置的是 basic 模式,以后多加一个硬盘,可以和旧硬盘组成一个 raid1 模式,如果再多加一个硬盘,可以升级成 raid5 模式 (raid5 至少三块硬盘). |
| shr | 这个是群晖的阵列模式,比较"智能", 如果你选了这种模式,只有一个硬盘的情况下,就相当于 basic 模式。如果放两个盘就相当于 raid1 模式,三块或三块以上硬盘就是 raid5 模式。好处当然就是"智能"了,自动帮你选择模式。不好的地方就是不能按自己实际需求来,如果你不需要做备份的就千万不要选这个 shr 模式。 |
| raid1 | 其原理就是把一块硬盘的数据以相同位置指向另一块硬盘的位置. RAID1 又称为 Mirror 或 Mirroring, 它的宗旨是最大限度的保证用户数据的可用性和可修复性. 它只支持 2 块硬盘. 存储池容量只有单块硬盘容量大小, 不能提高存储性能, 硬盘可以允许随机损坏一块. 其高数据安全性, 尤其适用于存放重要数据, 如服务器和数据库存储等领域. 使两块磁盘数据呈现完全镜像, 从而达到安全性好、技术简单、管理方便. RAID1 拥有完全容错的能力, 但实现成本高. 需要 ≥ 两个硬盘做 raid1, 磁盘个数为偶数. 譬如: 500G, 500G→500G, 系统中磁盘显示 500G 举个例子, 两块 4T 硬盘, 其中一块当镜像, 就是做备份用, 两块硬盘数据完全一样. 你往硬盘 1 存东西, 会自动把它复制到硬盘 2. 所以不管哪块硬盘坏掉, 你的数据在另外一块硬盘上面一样是完整无损的. 但很明显, 不好的地方就是可用容量只有一半, 两个 4T 硬盘只能用 4T 的空间. 如果是不同容量的两个硬盘做 raid1, 可用容量取决于容量小的那块. 比如一块 4T, 一块 2T, 可用容量就只有 2T. |
| jbod | 就是把所有硬盘绑定成一个大硬盘,管理简单方便。但不好的一点就是其中一个盘坏了,数据全部没有。所以一般都不建议用这个模式,既不能保护数据安全,也没有提升读写性能。 |
| raidO | 简单举例说,就是把一份文件撕碎成几份,分别丢到不同的硬盘上去,理论上传输速度会提升,但实际上 nas 是软阵列,速度并没有什么提升,所以不建议做 raid0, 而且如果你有一个盘坏了,全部数据都会丢失。 |
| raid5 | 简单举例说,你有 3 个 2t 的盘,那么其中 2 个盘放数据,1 个盘当备份,这样不管你哪个盘坏了数据都还在。可用空间就是少了 1 个盘的容量。安全性比 basic 好,可用容量比 raid1 高,是比较折中的一种模式。如果有大量数据需要做备份的,可以使用这种模式,性价比 raid1 更高。 |
手机群晖管家安装
使用
Docker
portainer
version: '3.2'
services:
agent:
image: portainer/agent:2.16.2
volumes:
- /var/run/docker.sock:/var/run/docker.sock
- /var/lib/docker/volumes:/var/lib/docker/volumes
networks:
- agent_network
deploy:
mode: global
placement:
constraints: [node.platform.os == linux]
portainer:
image: portainer/portainer-ce:2.16.2
command: -H tcp://tasks.agent:9001 --tlsskipverify
ports:
- "9443:9443"
- "9000:9000"
- "8000:8000"
volumes:
- portainer_data:/data
networks:
- agent_network
deploy:
mode: replicated
replicas: 1
placement:
constraints: [node.role == manager]
networks:
agent_network:
driver: overlay
attachable: true
volumes:
portainer_data:
docker stack deploy -c portainer-agent-stack.yml portainer
docker ps
# login https://localhost:9443
alist
version: "3"
services:
alist:
image: xhofe/alist:v3.4.0 # https://hub.docker.com/r/xhofe/alist
container_name: alist
restart: unless-stopped
volumes:
- ./alist-data:/opt/alist/data
ports:
- "15244:15244"
aria2
version: "3"
services:
Aria2:
image: p3terx/aria2-pro:202209060423 # https://hub.docker.com/r/p3terx/aria2-pro
container_name: aria2
restart: unless-stopped
environment:
- PUID=${UID}
- PGID=${GID}
- UMASK_SET=022
- RPC_SECRET=ZkgWXtJ7aHajaHqGZi2f
- RPC_PORT=16800
- LISTEN_PORT=16888
- DISK_CACHE=64M
- IPV6_MODE=false
- UPDATE_TRACKERS=true
- CUSTOM_TRACKER_URL=https://cf.trackerslist.com/all.txt
- TZ=Asia/Shanghai
volumes:
- ./aria2-config:/config
- ./aria2-downloads:/downloads
ports:
- "16800:16800"
- "16888:16888"
- "16888:16888/udp"
network_mode: host # bridge
logging:
driver: json-file
options:
max-size: 1m
## AriaNg is just a static web page, usually you only need to deploy on a single host.
# AriaNg:
# container_name: ariang
# image: p3terx/ariang
# command: --port 6880 --ipv6
# network_mode: host
# # network_mode: bridge
# # ports:
# # - 6880:6880
# restart: unless-stopped
# logging:
# driver: json-file
# options:
# max-size: 1m
caddy
version: "3"
services:
caddy:
image: caddy:2.6.2-alpine # https://hub.docker.com/_/caddy
container_name: caddy
restart: unless-stopped
volumes:
# - ./caddy:/usr/bin/caddy # Your custom build of Caddy.
- ./Caddyfile:/etc/caddy/Caddyfile:ro
- ./caddy-config:/config
- ./caddy-data:/data
environment:
- DOMAIN=www.xxx.com # Your domain.
- EMAIL=xxx@outlook.sg # The email address to use for ACME registration.
- LOG_FILE=/data/access.log
clash
version: '3'
services:
clash:
image: dreamacro/clash:v1.12.0 # https://hub.docker.com/r/dreamacro/clash
container_name: clash
volumes:
- ./config.yaml:/root/.config/clash/config.yaml
# - ./ui:/ui
ports:
- "7890:7890"
- "7891:7891"
restart: unless-stopped
network_mode: "host"
ifile
version: "3"
services:
ifile:
image: lgs821/ifile:2.1.7 # https://hub.docker.com/r/lgs821/ifile
container_name: ifile
restart: unless-stopped
volumes:
- ./conf:/ifile/conf # 映射配置文件目录
- ./files:/ifile/files # 映射宿主机文件夹为默认存储空间
- ./data:/ifile/data # 映射数据库文件夹
- ./assets:/ifile/assets # 映射自定义相关文件夹
- ./tmp:/ifile/tmp # 分片上传临时文件夹
- ./thumb:/ifile/thumb # 图片缩略图缓存目录
- ./logs:/ifile/logs # 日志保存目录
ports:
- "13030:3030"
mailserver
version: "3"
services:
mailserver:
image: analogic/poste.io:2.3.10 # https://hub.docker.com/r/analogic/poste.io
container_name: mailserver
restart: unless-stopped
hostname: mail.example.com # This is the hostname that will be used to access the mail server.
volumes:
- /etc/localtime:/etc/localtime:ro
- ./data:/data
- ./logs:/var/log/nginx/
ports:
- "25:25"
- "110:110"
- "143:143"
- "465:465"
- "587:587"
- "993:993"
- "995:995"
- "4190:4190"
umami
version: "3"
services:
umami:
image: ghcr.io/mikecao/umami:postgresql-v1.32.1 # https://github.com/mikecao/umami/blob/master/docker-compose.yml
container_name: umami
restart: unless-stopped
environment:
DATABASE_URL: postgresql://souffle:5432?u=novena&p=8qqPH5oUReB4E5v4tisxvHkAhjseh9&d=souffle
DATABASE_TYPE: postgresql
HASH_SALT: replace-me-with-a-random-string
ports:
- "13000:3000"
depends_on:
umami-postgres:
condition: service_healthy
umami-postgres:
image: postgres:14.4-alpine # https://hub.docker.com/_/postgres
container_name: umami-postgres
restart: unless-stopped
volumes:
- ./sql/schema.postgresql.sql:/docker-entrypoint-initdb.d/schema.postgresql.sql:ro
- umami-db-data:/var/lib/postgresql/data
environment:
POSTGRES_DB: souffle
POSTGRES_USER: novena
POSTGRES_PASSWORD: 8qqPH5oUReB4E5v4tisxvHkAhjseh9
healthcheck:
test: pg_isready -U "$$POSTGRES_USER" -d "$$POSTGRES_DB"
interval: 10s
timeout: 2s
retries: 10
volumes:
umami-db-data:
unblock-netease-music
version: '3'
services:
neteasemusic:
image: pan93412/unblock-netease-music-enhanced:latest # https://hub.docker.com/r/pan93412/unblock-netease-music-enhanced
container_name: neteasemusic
restart: unless-stopped
ports:
- "9898:8080"
entrypoint: 'node app.js -s -o kugou kuwo bilibili'
uptime-kuma
version: '3'
services:
uptime-kuma:
image: louislam/uptime-kuma:1.17.1
container_name: uptime-kuma
restart: unless-stopped
ports:
- "3001:3001"
volumes:
- ./uptime-kuma:/app/data
vaultwarden
version: "3"
services:
vaultwarden:
image: vaultwarden/server:1.26.0 # https://hub.docker.com/r/vaultwarden/server
container_name: vaultwarden
restart: unless-stopped
volumes:
- ./vw-data:/data
environment:
- WEBSOCKET_ENABLED=true # Enable WebSocket notifications.
- ADMIN_TOKEN=${WARDEN_ADMIN_TOKEN} # The initial root token.
- SIGNUPS_ALLOWED=${WARDEN_SIGNUPS_ALLOWED} # Allow signups.
- INVITATIONS_ALLOWED=${WARDEN_INVITATIONS_ALLOWED} # Allow invitations.
- ROCKET_WORKERS=${WARDEN_ROCKET_WORKERS} # Number of workers to use.
- SHOW_PASSWORD_HINT=${WARDEN_SHOW_PASSWORD_HINT} # Show password hint.
- LOG_FILE=/data/vaultwarden.log # Log file.
- LOG_LEVEL=warn # Log level.
- EXTENDED_LOGGING=true # Enable extended logging.
caddy:
image: caddy:2
container_name: caddy
restart: unless-stopped
ports:
- "9696:80"
- "9697:443"
volumes:
- ./caddy:/usr/bin/caddy # Your custom build of Caddy.
- ./Caddyfile:/etc/caddy/Caddyfile:ro
- ./caddy-config:/config
- ./caddy-data:/data
environment:
- DOMAIN=${CADDY_DOMAIN} # Your domain.
- EMAIL=${CADDY_EMAIL} # The email address to use for ACME registration.
- LOG_FILE=/data/access.log
watchtower
version: "3"
services:
watchtower:
image: containrrr/watchtower:1.5.1 # https://hub.docker.com/r/containrrr/watchtower
container_name: watchtower
volumes:
- /var/run/docker.sock:/var/run/docker.sock
# - ./docker-login-config.json:/config.json
command: --interval 3600 # clash neteasemusic
restart: unless-stopped