NAS - 玩点有意思的



对本文有任何问题,可加我的个人微信询问:kymjs666

NAS是什么

其实就是一个私有的云存储,你也可以理解为你自己独享的功耗很低的小型linux服务器,这个服务器通常用来做存储相关的事情,里面可以放很多很大的硬盘。
比如我就放了两块10T的硬盘,组了个冗余存储阵列,感觉10T已经够用了,等快装满的时候可以再买两块。

冗余存储

群晖系统对存储有多个支持类型(其实所有的NAS,都有类似的能力)。
最常用的存储就是RAID了,RAID(独立磁盘冗余阵列)是将多个独立的硬盘整合成一个存储单元的数据存储技术。
因为我们的物理机上是有多块硬盘的,但实际系统使用的时候,不可能每次都我们自己指定要存在哪块硬盘上(我一直不能理解Windows为什么要反过来,把完整的磁盘分不同的盘符)。RAID就是用来把多个硬盘的感受对使用者屏蔽,让使用者觉得用到的就是一块硬盘。

RAID 又分很多类型,Basic、RAID 0、RAID 1、RAID 5、RAID 6 …

Basic其实就是最普通的方式,众所周知,玩NAS,最贵的就是买硬盘了。假如你买不起,只有一块硬盘,那你只能组 Basic,它就是单个硬盘构成独立的单位。也不具备数据安全,如果硬盘坏了,那数据就丢了。

再进一步,还是那个原因,由于硬盘贵,并且相比其他电子元器件更容易坏,你只买了两块,这时候你有两种选择。牺牲存储来保障数据的安全性,同一份数据存两遍;或者不在乎数据的安全性,直接把两块拼起来,有多大的硬盘就存多少东西。这就对应了RAID 0和RAID 1 。

RAID 0 组合了两个或更多硬盘以提高性能和容量,但没有容错保护功能。单个硬盘出现故障将导致阵列中的的所有数据丢失。RAID 0 对于需要高性能比的非关键系统非常有用。

RAID 1 通常为两个硬盘来执行。硬盘中的数据被映射,在硬盘出现故障时提供容错保护功能。读取性能得到提高,而写入性能将与单个硬盘类似。单个硬盘出现故障时可得以维持而不会丢失数据。在容错保护非常关键而空间和性能不那么重要时,往往使用 RAID 1。

如果又过了一段时间,你觉得硬盘不够又买了几块硬盘,这时候你就又多一些选择。依然是牺牲存储来保障数据的安全性,或者更在乎能存的数据量,我要存更多东西但数据还得相对安全一点。这就对应了RAID 5和RAID 6。

RAID 5 提供容错保护功能并提高了读取性能。至少需要三个硬盘。RAID 5 可在单个硬盘丢失时得以维持运行。在硬盘出现故障的情况下,故障硬盘上的数据将从其余硬盘上延展的奇偶校验进行重建。因此,在 RAID 5 阵列处于降级状态时,读写性能受到严重影响。当存储空间和成本的重要性高于性能时,RAID 5 最为理想。

RAID 6 与 RAID 5 相似,但其提供了另一层区块延展功能,并在 2 个硬盘出现故障时得以维持。至少需要四个硬盘。RAID 6 的性能因其额外的容错保护功能而低于 RAID 5。在存储空间和成本较为重要且需要在多个硬盘出现故障得以维持的情况下,RAID 6 最为理想。


联通的公网IP

既然都是个服务器了,没有公网岂不是很没意思,只能在自己局域网玩有什么用。
先看一下我家的网络结构。

拨号靠联通光猫,然后路由器再分一个子网。这样子普通用户使用肯定没有问题,但是作为服务器肯定是不行的。
第一联通光猫性能极差,靠他去调度大流量指不定能把你卡成狗,所以一定得干掉那个性能极差的联通光猫,让自己的高性能路由器直接拨号上网,如果你的路由器更烂那你还是花几十块钱买个好点的吧。
第二个问题就是这种网络得做两次内网穿透,两次端口转发,光猫一次、路由器一次,太麻烦了。

接下来就是详细配置步骤:

  1. 首先本地通过wifi连上联通光猫的网段,然后访问管理页:http://192.168.1.1/cu.html
  2. 账号密码都是 CUAdmin,CU的意思是 China Unicom。
  3. 进去以后把IPV4和V6都打开,然后把模式选成桥接模式。
  4. 再进自己路由器设置,把路由器改成拨号上网。
  5. 拨号的账号可以在联通APP->首页右上角切宽带账号->我的->宽带专区->查宽带账号
  6. 密码不知道给10010打电话重置就行了。
  7. 能正常拨号上网以后,再给10010打电话,让他开公网IP,这一步不一定能成功,根据所在地联通的公网IP数量决定的,上海还挺多,二话没说就给我打开了。
  8. 至此已经有一个可变公网IP了,再配合腾讯云的DDNS,就得到一个公网可以访问的域名了。
  9. 记住,公网还是比较危险的,全世界各种端口扫描暴力破解的都在搞,路由器最好设置一下,把默认端口改了,把ssh密码校验关掉。

腾讯云免费 DDNS 服务看这个链接:腾讯云DDNS链接

以下是改进后的拓扑结构,NAS直连路由器,路由器直连公网:


配个nexus

作为一个移动端开发,最先想到的在服务端占用硬盘的服务,也就是nexus了。
有一个属于自己的Nexus代理,以后拉依赖可就快多了。

群晖是自带docker的,写一个compose.yml,直接拉镜像了,这种事当然不能我来写:

反正一路让GPT教我,分分钟就搞好了。

以下是我的 nexus,想用你也可以直接用,反正也就只是占我一点公网IP,没啥大影响。

repositories {
    maven { url 'https://nas.therouter.cn:8443/repository/maven-public/' }
    google()
    mavenCentral()
}


nginx 端口转发

你可能已经看到了,上面配nexus的时候,GPT 是帮我配置的8081端口,而且只支持 http 协议。但是新版本的Gradle默认是不允许 http 访问的,所以要么改Gradle 添加仓库时的代码,要么就从服务端直接支持 https。
你可以这样子添加一个 maven 仓库地址,手动声明允许 http 协议拉依赖,但最标准的做法当然还是让服务端支持。

maven {
    allowInsecureProtocol = true
    url "http://nas.therouter.cn/xxxx"
}

Nexus 要启用 https 还挺麻烦,搜了网上的各种教程照着配,也让GPT帮我改了很多次,依然没办法解决。最后是直接在 nginx 上做了一次端口转发,直接把外部的 https 请求,都打到 nginx 上,然后 nginx 再全转到内部的 8081 端口,也能达到目的。

server {
    listen 8443 ssl;
    server_name nas.therouter.cn;

    ssl_certificate /xxxxx/ssl/nas.therouter.cn.pem;
    ssl_certificate_key /xxxxx/nas.therouter.cn.key;

    location / {
        proxy_pass http://localhost:8081;
        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;
    }
}

网盘当然是用来存数据的


把 Mac 备份到 NAS 上

把 Mac 的时间机器备份到 NAS 上。
照着官网教程一步一步来,很简单
群晖官网链接

注:教程里面的这一句很重要,【进入 高级 选项卡,然后选择 启用通过SMB进行 Bonjour Time Machine 播送】如果没有勾选,不会报任何错,但是在 mac 的时间机器里面,NAS 始终挂载不上,最后不停在连接 smb。

把 iPhone 备份到 NAS 上

垃圾 iOS 系统真的是封闭,我试了网上能搜到的几乎全部的方案,始终没有一个能够无感把iPhone数据直接备份到 NAS 上的办法。
后来我换了个思路,既然 iOS 封闭,那就在 Apple 的体系理解解决这个事。
通过我的 Mac,把 iPhone 的数据备份到 Nas 上。可能唯一麻烦的就是手机得连着电脑。

备份还是用 Apple 默认的备份方式,连上手机就能看到了。

Mac 默认是把手机的数据备份到电脑上,并且这个备份的路径是完全不告诉你的,费了点时间查到了,备份目录是在~/Library/Application\ Support/MobileSync/Backup
既然找到了备份目录就简单了。

  • 最简单也最傻的办法,备份好了以后,直接手动把数据再转到NAS上。

很显然程序员是不会这么干的,直接一步到位,把手机数据直接丢到 NAS 上。

  1. 先通过smb在本地挂一个网络存储卷。
  2. 命令行进到存储目录,直接把原本的Backup目录删了。这一步会报Operation not permitted
  3. 进 System setting -> Privacy -> Full Disk Access -> 把终端勾上

  1. 重新再进命令行,ln -s建一个软链,把 NAS 的存储目录链接到 Backup目录就行了。
  2. 这样再备份就自动备份到 NAS 上了。

把 Android 备份到 NAS 上

是的,一个移动端开发,手上只有一个手机是不是有点丢人。
Android 也没有什么好的同步软件,但是 Android 有个好处,遇事不求人,自己动手上。
无非就是读文件、读通话记录、读联系人、读短信,读完通过 smb 往NAS上写数据。自己写的自己也放心一点,省的第三方指不定读完顺手同步到哪去了。


对象存储

既然都公网IP了,NAS又本来就是做存储的,那拿来做对象存储太合适了。
还是老方法,docker 部一个 apache,把独立的文件夹映射出来做存储。nginx 再把跨域header限制一下,只能我自己的kymjs.com调用,顺带就又解决了盗链问题,剩下的被恶意刷流量更是无所谓了,反正联通公网IP,我交的是宽带费又不是服务器一样按流量计费。

再下一步就是把我的博客都给部署到 NAS 上了,这样每年的服务器费用也可以省下来买硬盘和交电费了,只不过好像运营商都是把80和443端口封了,所以可能访问起来会有些影响。