几个月前跟风买了矿难之后的蜗牛星际来当NAS,目前已经稳定运行了几个月了,在这里记录一下。
硬件
- 蜗牛星际A款单口,265包邮(2019.03的价格),包括以下配置。(就这个价格来说,等于不要钱了。)
- 主板+ J1900 CPU(单网口,千兆)
- DDR3L内存4G(注意是笔记本用的内存条)
- 杂牌固态硬盘16G
- 机箱、电源
- 4个盘位
- 西部数据紫盘6TB * 3,单块盘980,硬盘好贵!
- AC Arctic F8 PWM 8厘米机箱风扇+减速线
- 超频三风扇调速器
之所以要买机箱风扇和调速器,是因为这个NAS的主板的风扇是3针的,不支持调速,所以一开始就是全速转,声音有点吵。
换一个静音点的风扇,加上手动调速,可以把噪音降到一个合理的范围。
软件
我对于NAS的需求是:
1. 大容量的安全的存储(主要是照片+视频)
2. 24小时开机+下载
以上两点是必需的
3. 方便的照片、视频管理
4. 远程访问
以上两点是不是必要的需求,尤其是远程访问,还是有被黑的风险。
卖星际蜗牛的店铺都直接写这个东东可以装黑群辉,不过这个不是我的菜。我还是用Ubuntu吧。
稍微研究了一番各种RAID和类RAID技术,最后选定了如下的方案。
- Ubuntu 18.04,这个仅仅是个人喜好,换任何一个Linux应该都可以。
- SnapRAID,这是一个”软“RAID,是基于文件的RAID,比较轻量,相比RAID5来说,优点在于方便(不需要全盘RAID)安全,唯一的缺点是,这个不是实时的RAID,而是要定期sync的RAID。不过对于家庭用途来说,完全够用了——最坏情况,也只是损失了某一天新备份的内容。
- Aufs,这个是Ubuntu的kernel自带的,别的OS可能需要编kernel module。
- 之所以需要aufs,是为了把多块硬盘的目录”合并“成一个目录,这样对于NAS来说,只要操作一个目录就可以了。aufs会负责根据配置把文件写入某块硬盘。
- smartmontools,这个是为了监控硬盘的状态,并发送邮件通知。
- hdparm,这个是为了在空闲的时候把硬盘spin down,省电。(当然,可能的负作用是影响硬盘寿命。。。)
- cron,定时跑一些脚本,完成定期做snapraid sync,scrub等工作。
- samba,方便共享,也方便别的设备备份数据。
- FolderSync,这个是Android上的软件,把手机里的照片备份到NAS上。
- aria2c,这个是著名的下载软件了,支持HTTP,BT,等等,配合nginx反向代理,方便远程管理。
以上的配置可以完美地解决我的需求1,2,而需求3,4,放在以后再想吧。
具体的配置
(注:以下内容基本参考Setting up SnapRAID on Ubuntu to Create a Flexible Home Media Fileserver这篇文章,细节上有一些区别,比如说安装snapraid的方法、选用的unionfs等)
SnapRAID
上面引用的文章里是自己编译snapraid,其实没有必要,因为已经有PPA了!
所以安装很简单:
sudo apt install software-properties-common sudo add-apt-repository ppa:tikhonov/snapraid sudo apt update sudo apt install snapraid
给每一块硬盘分区(注意我只有3块硬盘,sdb, sdc, sdd)
# 下面用parted工具给/dev/sdb分区 parted -a optimal /dev/sdb GNU Parted 2.3 Using /dev/sdb Welcome to GNU Parted! Type 'help' to view a list of commands. (parted) mklabel gpt (parted) mkpart primary 1 -1 (parted) align-check alignment type(min/opt) [optimal]/minimal? optimal Partition number? 1 1 aligned (parted) quit # 下面和sgdisk工具备份/dev/sdb的分区情况,并应用到另外两块硬盘上 sgdisk --backup=table /dev/sdb sgdisk --load-backup=table /dev/sdc sgdisk --load-backup=table /dev/sdd
格式化硬盘
# 数据盘预留2%的空间 mkfs.ext4 -m 2 -T largefile4 /dev/sdb1 mkfs.ext4 -m 2 -T largefile4 /dev/sdc1 # 校验盘使用全部的空间 mkfs.ext4 -m 0 -T largefile4 /dev/sdd1
创建目录准备mount这些硬盘
mkdir -p /mnt/data/{disk1,disk2} mkdir -p /mnt/parity/parity1
配置fstab,来自动mount
# 数据盘 /dev/disk/by-id/ata-WDC_WD60EJRX-89MP9Y1_WD-WX31D88R41HT-part1 /mnt/data/disk1 ext4 defaults 0 2 /dev/disk/by-id/ata-WDC_WD60EJRX-89MP9Y1_WD-WX31D88AEC9Z-part1 /mnt/data/disk2 ext4 defaults 0 2 # 校验盘 /dev/disk/by-id/ata-WDC_WD60EJRX-89MP9Y1_WD-WX31D88AERKL-part1 /mnt/parity/parity1 ext4 defaults 0 2
配置snapraid
$ cat /etc/snapraid.conf parity /mnt/parity/parity1/snapraid.parity content /var/snapraid/snapraid.content # 这个目录是可选的 content /mnt/data/disk1/snapraid.content content /mnt/data/disk2/snapraid.content data d1 /mnt/data/disk1/ data d2 /mnt/data/disk2/ exclude *.unrecoverable exclude /tmp/ exclude /lost+found/ exclude *.bak exclude .AppleDouble exclude ._AppleDouble exclude .DS_Store exclude .Thumbs.db exclude .fseventsd exclude .Spotlight-V100 exclude .TemporaryItems exclude .Trashes exclude .AppleDB
创建需要的目录,然后开始愉快的sync吧
mkdir -p /var/snapraid/ snapraid sync
SnapRAID配置好了,现在如果在/mnt/data/disk[1|2]/
目录里写数据,在snapraid sync
之后,这些数据就会有额外的parity来保护,即使坏了一块盘,数据也能找回来。
接下来,要配置AUFS,把这两个目录合并成一个目录,方便使用。
AUFS
之所以选用aufs,是因为Ubuntu默认支持它,并且性能还不错。
$ cat /etc/rc.local mount -t aufs -o br:/mnt/data/disk1=rw:/mnt/data/disk2=rw,sum,create=mfs,udba=reval none /mnt/storage
上面的命令把/mnt/data/disk1
,/mnt/data/disk2
这两个目录“merge”成/mnt/storage
目录,以后所有的读写都在这个目录里操作就好了。
其中:
br
: 定义了两个目录作为branch,都是rwsum
: 告诉df要显示所有的branch的block/inode的总和create=mfs
: 创建新文件的时候,选择free space最多的那个branch,这样两块硬盘的空间会比较均衡udba=reval
: 这个定义了aufs如何对待”绕过aufs”直接操作branch里的文件,一般来说我们尽量不直接去操作/mnt/data/disk[1|2]
,只操作mount point/mnt/storage
,就不会有问题。- 参考:http://manpages.ubuntu.com/manpages/cosmic/man5/aufs.5.html
smartmontools
假设配置好了SMTP服务,下面的smartd.conf配置会在硬盘出问题的时候发邮件通知。
不过,smartd的配置有点复杂,下面的配置是抄来的,并不是特别了解它到底作了哪些测试。
如果仅仅想测试能否收到邮件,用下面那行注释掉的配置,重启smartd,应该就能收到邮件了。
参考:is-smartd-properly-configured-to-send-alerts-by-email
$ cat /etc/smartd.conf DEVICESCAN -S on -o on -a -I 194 -m <my-email-address> -s (S/../.././02|L/../../6/03) -n standby,q # Enable below to test if email is sent or not #DEVICESCAN -M test -S on -o on -a -m <my-email-address>-s (S/../.././02|L/../../6/03)
enable smartd,让它开机自动启动
$ cat /etc/default/smartmontools # uncomment to start smartd on system startup start_smartd=yes # uncomment to pass additional options to smartd on startup smartd_opts="-q never -i 7200"
hdparm
这个工具可以配置硬盘空闲时spin down。
$ cat /etc/hdparm.conf quiet /dev/disk/by-id/ata-WDC_WD60EJRX-89MP9Y1_WD-WX31D88R41HT { apm = 127 keep_features_over_reset = on spindown_time = 242 } /dev/disk/by-id/ata-WDC_WD60EJRX-89MP9Y1_WD-WX31D88AEC9Z { apm = 127 keep_features_over_reset = on spindown_time = 242 } /dev/disk/by-id/ata-WDC_WD60EJRX-89MP9Y1_WD-WX31D88AERKL { apm = 127 keep_features_over_reset = on spindown_time = 242 }
其中spindown_time = 242表示如果一块硬盘idle了1个小时之后,会把它spindown
cron
上面介绍了,SnapRAID不是一个实时的RAID,所以可以配置crontab让它每天夜里做sync,然后每周做一次scrub,把结果通过邮件发到我的邮箱
MAILTO="<your-email-address>" # SnapRAID sync every day at 02:00 and check temperatures 0 2 * * * /usr/bin/flock /tmp/snapraid.lock /usr/bin/snapraid sync; /home/mine/bin/cputemp.sh; /home/mine/bin/hddtemp.sh # SnapRAID scrub every Sunday at 02:30 30 2 * * 0 /usr/bin/flock /tmp/snapraid.lock /usr/bin/snapraid scrub
其中,cputemp.sh
和hddtemp.sh
是两个check CPU/HDD温度的小脚本:
$ cat /home/mine/bin/cputemp.sh #!/bin/sh echo Mine NAS CPU Info. echo --------------------- MHZ0=$(cat /sys/devices/system/cpu/cpu0/cpufreq/scaling_cur_freq) TEMP0=$(cat /sys/class/thermal/thermal_zone0/temp) MHZ1=$(cat /sys/devices/system/cpu/cpu1/cpufreq/scaling_cur_freq) TEMP1=$(cat /sys/class/thermal/thermal_zone1/temp) echo Hardware: echo CPU0 Speed $(($MHZ0/1000)) Mhz "|" CPU Temp $(($TEMP0/1000)) C echo CPU1 Speed $(($MHZ1/1000)) Mhz "|" CPU Temp $(($TEMP1/1000)) C $ cat /home/mine/bin/hddtemp.sh #!/bin/sh echo Mine NAS HDD Info. echo --------------------- /usr/sbin/hddtemp /dev/sd[a-d]
samba
通过samba,把NAS上的文件共享出去,方便小米盒子之类的播放视频,也方便用手机来备份照片。
首先,创建两个不同的帐户,一个用来写(备份照片,文件等),一个用来读。
sudo adduser --home /mnt/storage/ --no-create-home --shell /usr/sbin/nologin --ingroup sambashare nas # 这个是用来写的帐户,把它添加到sambashare这个group里 sudo smbpasswd -a nas # 设置密码 sudo adduser --no-create-home --disabled-password --disabled-login ent #这个是用来读的帐户 sudo smbpasswd -a ent # 设置密码
配置samba的config,这里创建了3个共享:
- 一个是用来备份数据的,只要在@sambashare这个group里就都有写权限;
- 一个是专门用来共享
/mnt/storage/Videos/
这个目录,主要是给盒子播放视频用的; - 还有一个是用来共享
/mnt/storage/aria2Download/
目录,这个目录是给aria2下载用的,方便共享下载完,还没有整理的视频。
$ cat /etc/samba/smb.conf [NAS_Home] comment = Home_NAS path = /mnt/storage/ browseable = yes read only = no wide links = yes valid users = @sambashare @sadmin [Videos] comment = NAS_Videos path = /mnt/storage/Videos/ browseable = yes read only = yes wide links = yes valid users = ent [Aria2Downloads] comment = Aria2Downloads path = /mnt/storage/aria2Download/ browseable = yes read only = yes wide links = yes valid users = ent
aria2c
aria2c是一个支持多数协议的下载软件(不支持电驴),并且支持RPC方便远程管理。
它自己的配置这里就不贴了,网上到处都能找到。
为了方便远程管理下载,比如说,贴一个link给NAS,让它下载东西,可以用webui-aria2这个webui,配合nginx来使用。
server { listen 80 default_server; listen [::]:80 default_server; root /var/www/html/webui-aria2-master/docs; index index.html index.htm; location / { try_files $uri $uri/ /index.html; } }
上面这个最简单的配置在80端口上enable了aria2的webui。
如果放到公网上,建议换个端口,并且enable https证书。
比如说,我的网络环境里,网络的出口是树莓派,NAS只接在内网里,所以在树莓派的nginx配置里,要有类似这样的配置
server { listen <custom-port> server_name <your server name> ssl on; ssl_certificate <your crt> ssl_certificate_key <your key> ... proxy_set_header Host $host; proxy_set_header X-Real-IP $remote_addr; proxy_set_header X-Forwarded-For $proxy_add_x_forwarded_for; proxy_set_header X-Forwarded-Proto $scheme; location /jsonrpc/ { proxy_pass http://192.168.1.90:6800/jsonrpc; # aria2c的rpc端口 } location / { proxy_pass http://192.168.1.90/; # aria2-webui的网页端口 } }
这样访问树莓派的特定的端口,就可以在外面通过HTTPS来访问到NAS上的aria2了。
其它
MergerFS
参考的文章里提到他最终用了MergerFS来作union fs,这个一开始也试了。
因为是用户态的文件系统,使用起来是很方便,/etc/fstab
里加上下面的配置就行。
# Mergerfs /mnt/data/* /mnt/storage fuse.mergerfs defaults,allow_other,use_ino,category.create=lfs,moveonenospc=true,minfreespace=20G,fsname=DiskPool 0 0
然而,因为是用户态的文件系统,性能实在是,一言难尽。用dd,fio等工具测试下来,写入性能只有10几MiB/s,实在是太慢太慢了。
所以放弃了MergerFS。
ownCloud
之前的所有配置,只是在NAS上用了Samba,然后配置一些备份工具(如FolderSync)来作备份,太过简单,所以也想找一些开源的私有云来尝试一下。
找了一圈,决定试用ownCloud,一方面是开源,另一方面,支持docker,所以用起来也很方便。
参考owncloud的github就可以很方便的使用了。
然而——配合ownCloud的手机app,用起来很不方便:
- 没有导入已有图片的功能(或者说这个功能太难找?)所以硬盘里已有的照片没办法轻松的导入进去;
- 手机上预览图片,竟然是要下载的本地的!?(这还cloud啥啊。。。)
相比起来,还是FolderSync的同步功能要好用多了,完美地完成了备份照片的功能,只缺少了图片管理的功能——这个功能以后再慢慢找开源软件来搞定吧。
WebDAV
FolderSync现在的设置是通过samba来同步,而samba服务是只在内网里能用的,所以得人在家里才能同步照片。
那人在外面,能否利用FolderSync来同步呢?答案是可以的,比如说,用WebDAV。
Nginx默认不支持WebDAV,需要编译才行,有点麻烦。幸好,我们有docker,并且找到了可用的dockerfile(虽然有bug)。
我fork了一份,把明显的错误改正之后,放在了https://github.com/mine260309/docker-nginx-webdav
用docker跑起来之后,测试的过程中发现了一些没解决的问题:
- 虽然用curl测试没问题,但是通过FolderSync的WebDAV来跑,总是有奇怪的错误,也许和FolderSync发的WebDAV请求有关。但是FolderSync不开源,所以也不知道具体的情况。
- 即使用FolderSync没问题,这个配置用的用户名、密码是放在HTTP请求里的,每次请求都会带;虽然跑在https里,但安全性总是觉得不够。。。
所以对于WebDAV也就浅尝辄止了。