Reading view

There are new articles available, click to refresh the page.

Unraid 上 Nextcloud 的部署问题

之前我写过一篇文章来吐槽 Nextcloud 的性能问题。当时我是尝试在群晖上试用 Nextcloud。考虑到我使用的群晖服务器的 CPU 性能比价差,因此我尝试在 Unraid 上部署 Nextcloud。但是性能差的问题仍然没有改观。不过近期在 Unraid 发布了 6.12.0 版本以后这个问题得到了很大的改观。

1 问题分析

问题出在 shfs 这个进程上。在 Unraid 中,这个进程负责将分散在各个 Disk 上的文件夹内容聚合成一个统一的目录库,这意味着如果我们要访问任何文件都需要通过 shfs 来查找文件,这也使得 shfs 成文高吞吐率场景下的一个性能瓶颈。之前我经常可以看到 shfs 的 CPU 占用飙升到 100% 甚至 200%。在新版的 Unraid 中提供了 exclusive access 的特性。 Exclusive 的是排他性,独占的意思。Exclusive Access 是指固定将一个目录放在一个 Disk 中,这样我们在访问这个目录下的文件时,就不需要通过 shfs 来检索目录,而是可以直接访问磁盘上的目录系统,从而降低开销。

另一方面,Exclusive 也意味着这个目录无法有效的利用磁盘阵列提供的存储池,而只能利用单磁盘空间。因此,Nextcloud 的数据文件夹是不能使用 Exclusive Access 的。不过好在数据文件的访问其实并不是主要瓶颈,造成 Nextcluod 卡顿的主要原因在对容器挂载的配置文件(也就是 appdata)里面的众多小文件的高频读写。

另一个需要指出的是,在 Unraid 中,尽管缓存有多个 SSD,但是这些 SSD 会预先通过 Raid 机制聚合成一个统一的缓存磁盘,对于 Shfs 来说这个缓存池就是一个单一的磁盘,因此对缓存池的访问可以启用 Exclusive Access

2 如何使用

要是用 Exclusive Access,首先需要再 Settings --> Global Share Settings 下打开(如下图,将 Permit exclusive shares 设置为 yes)。

但是在共享目录使用时,Exclusive Access 的含义是比较模糊的。因为 Share 的管理界面并不会提供一个可以由用户可以直接控制的选项来为具体的 Share 开启 Exclusive Access。事实上,Exclusive Access 是否会起作用是系统根据目录的状态来自动确定的。如前文所述,Exclusive Access 作用的前提是数据只位于一个磁盘中。因此,在 Permit exclusive shares 启用的前提下,如果某个 Share 的文件只可能位于一个磁盘中,那么 Exclusive Access 将自动启用。

要实现 Share 的文件只属于一个磁盘中,需要满足一下条件:

  1. Share 只启用了一个 Storage,没有 Secondary Storage
  2. 如果 Share 是存储在 Array 中的,在设置 Include disks 时只能选择一个磁盘;
  3. 如果是事先已经存在的目录,那么在满足上两条的情况下,还需要通过适当的 Mover 动作,将数据迁移到单一磁盘中。(注意如果之前 Share 是存在多个磁盘中时,做前两条修改,并不会自动将数据迁移到目标磁盘)

在本文的场景中,我们需要在 appdata 这个共享目录上启用 Exclusive Access,就可能需要进行必要的 Mover 操作。如果你看到 appdata 的 Share settings 页面中显示了如下 Exclusive access: no 的文字,进行如下操作:

  1. 出现这个状态,说明你的 appdata 并不完全位于缓存中,有一部分是位于阵列中的,此时我们需要让 Mover 将数据从阵列中移动到缓存中。注意:
    1. 如果在现在的状态下,你的 appdata 是 Cache only 的,但是你仍然看到 Exclusive access: no,这是因为曾经某个时刻你为 appdata 设置了阵列存储的选项(以老版本的术语来说,就是 use cache 不是 only,而是 yes 和prefer 的选项),那么在那个时间段内,shfs 可能会将数据文件调度到阵列上。此时即便你讲 appdata 设置为 cache only,Mover 也不会自动将文件从阵列迁移到缓存。修改共享目录的这些相关设置只会影响新文件,而不会直接影响已有文件。
    2. 在上面这种情况下,你需要首先恢复缓存-阵列两级缓存架构,然后将 Mover 行为设置为 prefer cache(在 6.12,0 的属于下,是将 Mover action 设置为 Array -> Cache。然后运行 Mover 完毕。这时 Mover 会将还停留在阵列上文件移动到缓存(当然前提是的缓存的空间要够)。
    3. 完成上面的操作之后,我们再将 appdata 设置为 cache only 的形式(Primiary Storage 为缓存,无 Secondary Storage),这时我们应该能够看到 Exclusive access 变成了 yes。

3 结语

上面的这套操作,能够极大改善 Nextcloud 在 Unraid 上的表现。其他的应用也会有很大的改观(例如 Jellyfin 的打开和搜索速度会有质的提升)。

使用群晖唤醒局域网内其他设备

之前我写了一篇用树莓派唤醒内网设备的文章,现在再写一篇通过群晖唤醒内网设备的。当然还是要你稍微了解 Linux 系统才可以。用的代码和之前文章的一样。

代码目录

首先在群晖套件中心安装 Web Station 和 Node.js v8(v12 的 npm 安装会提示 zlip 有问题的)。通常 Node.js 会在你安装某些应用时候就会装上的,如果没有装你需要先安装一下。

安装好之后打开 File Station 左边的列表应该就会出现一个 Web 文件夹,在文件夹里建一个 node 文件夹作为存放相关代码文件用,并且在 node 文件夹中再新建一个 logs 文件夹存放日志用。

群晖 Web Station 目录

然后修改一下之前树莓派文章的代码,主要是 pm2_config.json 文件改为绝对路径。一般 Web 文件夹绝对路径是 /volume1/web/,其中 volume1 是储存池的目录,如果你装了多个硬盘或者组阵列的话就需要你自己在终端查一下你 Web 文件夹的目录了。

{
    "apps" : [{
        "name"        : "nodewol",
        "script"      : "/volume1/web/node/index.js",
        "cwd"		 :	"/volume1/web/node/",
	"instances"  : "1",
	"log_date_format"  : "YYYY-MM-DD HH:mm Z",
	"log_file"   : "/volume1/web/node/log/wol.log",
	"error_file" : "/volume1/web/node/log/wol-err.log",
	"out_file"   : "/volume1/web/node/log/wol-out.log",
        "watch"      : true
    }]
}

群晖唤醒方式

群晖上不能安装 waleonlan,所以我们需要使用 nodejs 的 wol 包来实现唤醒设备。

/**
 * Post请求执行 shell 命令
 * 只要向这个地址提交 {"mac":"设备 MAC 地址"}
 * kaiyuan Hsie
 * https://boxks.com
 * */

//1. 导入express
var express = require('express');
// 解析器 需要安装 npm install -g body-parser
var bodyParser = require('body-parser');

// WOL 包 npm install wol
var wolfun = require('wol');

// 时间模块
var sd = require('silly-datetime');
var nowTime=sd.format(new Date(), 'YYYY-MM-DD HH:mm:ss');

// 创建 application/x-www-form-urlencoded 编码解析
var urlencodedParser = bodyParser.urlencoded({ extended: false });

// 创建服务器
var router = express.Router();

router.post("*", urlencodedParser, function (request, response) {
	//
	if (!request.body) {
		response.send("请提交设备 MAC 地址");
	} else {
		var thisMAC = request.body.mac;
		wolfun.wake(thisMAC, function(error, postText){
			if (error !== null) {
				console.log('-wol- exec error: ' + error+' '+nowTime);
				response.send('exec error: ' +error);
			} else {
				console.log("-wol- "+thisMAC+' '+postText+' '+nowTime);
				response.send('已经叫咗电脑开机!');
			}
		});
		  
	}
});

module.exports = router;

安装 PM2

开启群晖 SSH

在群晖控制面板的「终端机和 SNMP」中勾选「打开 SSH」然后应用。

接着打开你电脑上的终端,Windows 上按 Win+R 然后输入 CMD,或者在开始菜单按钮上右键,选择打开 CMD。

终端 SSH 连接

打开只会输入 ssh user@192.168.2.117 这样的命令,其中 192.168.2.117 替换为你群晖的 IP。通常在群晖页面右下角的系统状况可以看到。而 user 替换为你群晖的账号名。然后会提示你输入密码,这个时候你输入任何内容都不会显示出来的,你不用管,直接输入密码只会按 Enter 就好了。

如果你 nodejs 默认是 v12,则先输入 nvm set 8.9.4 切换回 v8 才能正常使用 npm!

然后安装 PM2

npm install pm2 -g

等待安装好只会会直接显示 pm2 的路径的,注意记下来,因为后面我们要用绝对路径来运行 pm2 的。这个路径一般都是在 Node.js 目录下面。

/volume1/@appstore/Node.js_v8/usr/local/bin/pm2
or
/volume1/@appstore/Node.js_v8/usr/local/lib/node_modules/pm2/bin/pm2

你可以测试一下运行上传的代码。

/volume1/@appstore/Node.js_v8/usr/local/bin/pm2 start /volume1/web/node/pm2_config.json

如果没有提示红色错误,直接显示表格运行状态的话就 OK 了。然后现在关掉这个测试。因为我们要用群晖的任务计划让他开机自动启动。

/volume1/@appstore/Node.js_v8/usr/local/bin/pm2 stop /volume1/web/node/pm2_config.json

设置开机启动

打开群晖的控制面板,选择任务计划,新增>触发的任务>用户定义的脚本。

设置群晖开启启动命令

任务名称随便你填写一个,用户账号选择 root。然后在任务设置页面「用户定义的脚本」上面测试的那段代码,然后按确定。

设置群晖开机启动命令

保存好只会记得勾选刚新建的项目前面的勾,然后右键>运行。这样就完成了。

设置反向代理

在控制面板中的「应用程序门户」里面的「反响代理服务」新增一项。

设置群晖反向代理

描述随便填,协议选择 Https,端口就是你想用来访问的端口,例如 10505(填5位数可以防止和常用端口冲突),勾选「启动 HTTP/2」,下面的「目的地」就是填 node.js 应用的信息,地址就是 127.0.0.1,端口就是应用的端口 5050。然后确定。

这样就可以把 mac 地址通过 post 发给 https://192.168.2.117:10505/wol 这个地址来唤醒局域网内的设备了。

至于 https 证书问题,如果你用群晖的 DDNS 就不需要额外操作,如果你是用自己的域名就需要用 acme 申请Let’s Encrypt证书了。

当然你要在外网访问还要在路由器上设置端口映射。我之前的文章有写,这这里就不重复了。


给群晖加一个UPS

UPS——不间断电源,就是一个大型的充电宝,能在停电后给你的机器提供几分钟的供电时间,让你有时间思考一下是不是得换个小区住了。
——五花肉肉。

在一个月时间内家里连续停电两次,都是发生在夜间,停电后又恢复。第一次由于没有给群晖NAS设置停电后来电重启,导致我到了公司却连不上家里的NAS,耽误了些事。那次就决定买一个UPS不间断电源了,结果双十二忘记了,第二次发生在前天,起床后蹲马桶上就下了一单。

我知道现在的UPS都无法在停电后提供很长时间的供电,我想要的是停电后能自动关机,确保数据不会因为自动断电而损坏就行了,在这个基础上UPS的体积越小越好。

首先在群晖官网的兼容性列表里查我的918+兼容的UPS型号,大概考虑购买渠道、价钱、体积、外观几个因素后选定了Santak的TG-BOX 600,到底是不是最适合我的那些条件的,我也不知道,毕竟马桶不能蹲太久。

别废话,先看东西。

包装很简单,附送一条USB数据线和一张说明书就完了。说实话虽然选的最小号的UPS,但实物之大还是超乎我的想象,比我的脚大多了。需要注意的是左侧这一排是不间断电源,而右侧这一排则是普通防雷电源。

电源的顶部开关,保险,两个USB充电口(都说是个充电宝了嘛),还有一个USB通讯口,可以和NAS连接。背部还可以拆卸电池,如果内置电池寿命到了可以自行更换。

连接NAS

电源接入家里的电源插座,NAS电源插入UPS”不间断电源“这一排插座,附赠的USB数据线连接UPS的通讯口和NAS的USB接口就行了。

NAS设置

在群晖系统设置-电源-不断电系统里勾选“启用UPS支持”,应用即可。因为我购买的是群晖兼容性列表里提供的UPS型号,所以没什么其它设置了,如果不是的话可能还要选择UPS的型号。

”Diskstation进入安全模式之前的等待时间”选项是说当停电时不会马上关机,而是达到你设置的时间或者电池用完后才关机。

“设备信息”则可以查看UPS的状况。如下图

另外还要在电源-常规里勾选“电力故障排除后自动重启启动”,这样来电后就会自动开机了。

祝大家玩得开心。

威联通还是群晖

一年前入坑玩NAS买了台威联通(QNAP)的TS-453B mini,一年后我换了台群晖918+,如果上网搜的话会感觉到群晖的用户远多于威联通用户,是不是群晖就一定比威联通的好呢?

我的答案

不是

为何要换群晖

没用过,想试试,仅此而已。

凭记忆来聊聊两个机器的印象

因为我的威联通已经咸鱼出掉了,所以只能凭记忆尬聊。

以下比较仅限于威联通TS-453B mini和群晖918+,两台设备实际入手价相差一千多元,所以有些东西看看就好。

硬件

  1. 群晖做工略好,虽然都是塑料壳子,但群晖摸起来明显高档,不过两台机器相差一千多元所以也不具备可比性。
  2. 群晖散热略好,从系统读取的数据来看硬盘温度35°左右,而威联通基本都在38°~40°。
  3. 群晖风扇声音较小,但硬盘声音比较大,两台设备都只能放在客厅,绝对不能放在写字桌旁,都是无法忽略的吵。
  4. 两台机器都有双千兆网口,都可以链路聚合,但我家其他硬件不支持所以没试过效果。
  5. 两台机器都有两个内存插槽,威联通可以在机器外部更换,较为方便,而群晖必须拆掉硬盘才能更换。威联通随机配的是两条2G频率1677的内存,群晖随机配的是单条4G频率1866的内存,最后都换成了我自己买的两条8G频率1677的,目前使用没问题。(不玩虚拟机的话4G足够用了)
  6. 威联通的很多机型都有HDMI接口,可以方便地直接接电视使用,但至少我用的这款TS-453Bmini不推荐这样使用,它并不是在电脑上管理NAS后台,而是用虚拟机另外虚拟了一个系统,有专用的app,太卡了,别说播放4k电影了,操作个界面我都想把机器砸了,随便买个几百块的电视盒子都比它流畅。另外,如果用了这套虚拟系统后,就无法再安装其他虚拟机了。
  7. 群晖918+没有HDMI接口,但是有两个ssd缓存插槽(仅能做缓存使用),目前我还未使用,网上看了一下,一般情况下对文件传输没有太大影响,但如果经常需要传输大量小文件的话速度提升非常明显。我一个人使用的话没有必要,啥时候捡到便宜的ssd了再插。
  8. 同样的网络环境里,两台机器都能跑满我家的千兆网,传输速度都在100M/s以上,但威联通的传输速度略好一些,可以达到113M/s,而群晖只能达到110M/s,传输大文件的时候威联通的稳定性也要好一些几乎不掉速,群晖就不那么稳定了。两台机器的硬盘我都是采用的基本模式,没有组raid。
  9. 两台机器对于3.5寸硬盘都可以做到免工具拆装,对于硬盘槽群晖略好,有弹簧助力还可以上锁,进一步防止意外,两台机器都支持硬盘的热插拔。
  10. 群晖的开关机速度明显快于威联通,尤其是开机速度,提升明显。

系统

网上说的比较多的应该是这部分,基本都说群晖系统好,但我不太同意。

  1. 外观界面群晖显得更精致,字体啊,图标啊,都更漂亮,整体布局比较土。
  2. 大家都称赞群晖系统易用,这个我觉得是最大的误解,对于没接触过NAS且网络相关知识不太熟悉的人来说也许是对的,但我是先接触的威联通再换的群晖,我的感觉是群晖不是“简易”,是“简陋”,比如web服务器,你得单独安装一个套件,webdav你得单独安装一个套件等等,而每个功能显示的内容,可设定的选项都要远少于威联通,所以你可以说这是易用,但对于喜欢掌控自己机器的人来说威联通会更好。
    再举一个例子,创建虚拟机时威联通会直接显示出各虚拟网关,物理网关的拓扑图,而群晖只有纯文字显示。
  3. 两台机器的cpu是一样的,系统响应速度感觉上也差不多,后台管理都很流畅,稳定性上感觉威联通好一点,例如第一方的网盘功能群晖偶尔会重启,威联通从未遇过,当然也可能有只是我不知道;而第三方的功能已经碰到好几次emby停止服务要手动重启了,威联通一次都没碰到,当然也可能是软件本身的问题。
  4. 手机软件,界面仍然是群晖的美观,但登录方面还是威联通的方便,威联通设置好账号,局域网地址,外网地址后会自动根据你上网的环境切换登录方式,只要网络没问题肯定有一种方式能连接后台,但群晖不行,如果你登录的是局域网,到了外网后还得手动退出再切换一下外网登录方式才行。而使用功能上我觉得对于后台系统管理威联通比较详细,群晖太简陋,其他功能差不多,下载,网盘,这些两者差不多。(影音,相片这些功能我并未使用,所以不太清楚)

软件

  1. 第一方软件,威联通数量较多,但常用的两者都差不多,这方面不用纠结,而下载速度上群晖优势明显。
  2. 第一方软件我常用的网盘,网站服务器,这些都是群晖较好,但网络连接各种协议的设定威联通比较集中也更清晰。虚拟机,docker这方面也是威联通的更清楚。
  3. 最近群晖系统升级后与迅雷合作推出“玩物下载”,其实就是官方的迅雷远程下载,速度还行,但也跑不满我家300Mb带宽,使用这项服务需要迅雷会员,没有白金以上会员的话会限速。目前这个可能是群晖独享,不知威联通上以后会不会有。
  4. 第三方软件,群晖的使用群体大,所以软件质量也好一点,各种社区也比威联通的要活跃,大多数时候下载速度也会快一点。有些第三方开发商也会直接提供下载源,这样就不用去网站下载app了,在群晖套件中心就能更新,例如emby。但这其实未必是好事,国内的互联网说不能访问就不能访问了。

综上

  1. 硬件配置,系统稳定性上威联通略好。
  2. 系统美观性,易用性(针对普通用户)群晖略好。
  3. 第一方软件,群晖略好。
  4. 喜欢折腾,玩虚拟机,熟悉各种网络协议的,威联通更好。
  5. 外观、做工,一分钱一分货。

群晖使用Docker安装MQTT服务端 mosquitto


以下方法经本人验证通过,环境如下:

群晖 DS918+ DSM 6.2.4

mosquitto version 2.0.11

MQTTBox Version 0.2.3


前言:MQTT(Message Queuing Telemetry Transport)是一种基于发布/订阅(publish/subscribe)模式的”轻量级”通讯协议。客户端的发布者不直接将消息传递给订阅者,而是服务端(MQTT Broker)进行分发,一个客户端既可以是发布者,也可以是订阅者,更多介绍请参看维基百科上的词条 。以智能家居的情形简单举例,人体感应器(发布者)感应到有人时发布主题为”有人“的消息到服务端,而由于摄像头订阅了该主题,因此收到消息,开始录像,此时摄像头角色为(接收者),同时摄像头也作为(发布者)发布”监控异动“消息到服务器,而我们手机订阅了此主题,作为(接收者)便可收到消息。

目前有很多机构提供MQTT Broker服务,有免费的也有收费的。作为个人用户用于智能家居服务,我决定用已有NAS服务器自己搭建一个。参考了网上的一些文章,但大都写得有些复杂,对一般小白不是很友好,因此我尝试自创了一个极简的方法来实现,并记录下来供由需要的朋友学习。

第一步:管理员账号登陆群晖,在Docker中选择 “注册表”,搜索 “eclipse-mosquitto”,搜索结果中选择第一个,点击下载,选择标签latest。此时系统开始下载,可在“映像”中查看下载进度

第二步:下载完毕后,在“映像”里选择已下载的 eclipse-mosquitto 映像 ,点击启动按钮打开创建容器窗口。点击高级设置按钮,打开高级设置页面。

在高级设置中,勾选“启动自动重新启动”

在卷中,点击添加文件夹,在docker目录下新建文件夹 “mosquitto”并选择该文件夹,装载路径填写”/mosquitto/config”

在网络中,勾选“使用与 Docker Host 相同的网络”

确认应用后点击下一步,取消”向导完成后运行此容器“,然后应用

第三步:新建一个mosquitto.conf文件,并将该文件上传到 docker目录的 “mosquitto” 文件夹内。文件内容如下:

persistence true
listener 18831
allow_anonymous true
  • listener 为端口号,默认是1883,我机器上该端口被占用了,所以自己改了一个
  • allow_anonymous true 表示支持匿名用户,此次为了教程简单因此开启匿名用户

文件上传后,再docker容器中启动第二步添加的 eclipse-mosquitto 容器

第四步:测试mosquitto服务

mqtt测试工具很多,我选择的是MQTTBox ,用chrome打开下列地址,添加应用后打开

https://chrome.google.com/webstore/detail/mqttbox/kaajoficamnjijhkeomgfljpicifbkaf?hl=zh-CN

点击”Create MQTT Client”,取一个名字,Protocol 选mqtt/tcp ,Host 填写你的主机地址和 mosquitto 服务端口 ,保存后可看到显示为Connected 表示已经正确连接上我们新建的mosquitto服务端

接着,添加一个订阅,主题随便写一个,我这里填FEEUS.COM,点击”Subscribe“完成订阅

在发布端发布一个订阅端一样的主题,这里也是 FEEUS.COM ,然后输入发布的消息,点击”Publish“后完成发布,该主题的订阅者即可收到该条消息


如果您喜欢这篇文章,或者它给您带来了帮助,您可以请我们喝一杯咖啡,我们将非常感谢您的支持!

❌