家里ADSL上网无固定外网IP的群晖NAS安全实现与公网MySQL服务器主从同步

家里 ADSL 上网,没有办法分配固定外网 IP ,现在想使用群晖自带的MariaDB 安全实现与公网 MySQL 服务器主从同步。

最大的问题实际上是如果暴漏 MySQL 服务器的端口,但是不限制来源 IP 地址的话,会造成非常大的安全隐患。

但是, ADSL 恰恰不能提供固定的 IP 地址,我们需要解决这个问题。如果通过在公网数据库服务器上搭建 OpenVPN 服务器的方式,我们恰恰可以把内外网的设备影射到同一个子网中,而且 OpenVPN 提供的加密服务支持,刚刚好满足我们的安全需求。

注意一旦配置主从同步,磁盘的休眠会被MySQL的同步写入打断,导致磁盘不能正常休眠,毕竟正常情况下数据库是持续写入的,不存在很长时间的停顿。这样会导致磁盘周期性的咔咔寻道声,尤其是晚上。

噪声问题,参考 群晖(Synology) DS718+希捷酷狼(Seagate IronWolf)12TB空闲发出持续噪声

1. 参考 Ubuntu架设OpenVPN实现内网穿透 搭建整个的 OpenVPN 服务器。映射完成后,设备上会新增一个名为 tun0 的网卡设备。同时所有连接到 VPN 服务器的设备都被被影射到 10.8.0.X 的网段。 公网服务器的地址默认是 10.8.0.1,本文中, 群晖NAS的地址被设定为 10.8.0.7

2. 配置防火墙规则,许可来自指定网卡指定地址的设备的访问。注意,此处一定要指定网卡为 OpenVPN 创建的虚拟网卡,否则造成安全隐患。

3. 参照 ubuntu 16.04配置基于SSL的MySQL主从同步 配置服务器

4. 接下来是群晖NAS的配置

首先是群晖服务器上没有 MySQL,需要安装 MariaDB ,如下图:
继续阅读家里ADSL上网无固定外网IP的群晖NAS安全实现与公网MySQL服务器主从同步

解决macOS Mojave(10.14.6) SSH连接断开问题

在使用SSH客户端进行连接管理的时候如果长时间不输入命令, 服务器会自动断开连接, macOS Mojave(10.14.6) 系统上问题比较严重,即时服务端一直发送数据,也会出现连接中断的情况,导致长时间执行的远程 Shell 会大概率失败。


然后在配置文件尾部,增加如下内容:

同时,对于超长时间的SSH监控,需要设置屏幕关闭时不要让电脑休眠,否则依旧会断开,原因在于对端发送数据的时候,电脑休眠,对于长时间的空连接是没问题的,但是对于数据频繁发送的情况,是必须阻止电脑休眠的。如下图:
继续阅读解决macOS Mojave(10.14.6) SSH连接断开问题

iMaker 3D打印机使用最新的Ultimaker Cura 4.2.1

iMaker 3D打印机本质上是一台 Ultimaker v1.5.7 硬件的机器,当时买的时候,使用的软件还是早期的 Cura 13.06.4

随着 Ultimaker 官方软件的更新,提供了更加方便的操作,以及更加稳定高效的打印能力。从实际打印效果来看,最新的软件明显优于之前的版本,升级软件是非常值得的。

但是当时的硬件厂家已经不提供技术支持了,幸好是开源的软硬件,因此只要自己动手能力足够,还是比较方便操作的。

首先参考 iMaker 3D打印机Marlin固件编译以及故障排除 升级固件到最新的Marlin版本。

接着根据原来的厂家说明书,我们在最新版本的 Ultimaker Cura 4.2.1 上进行如下操作:

继续阅读iMaker 3D打印机使用最新的Ultimaker Cura 4.2.1

iMaker 3D打印机Marlin固件编译以及故障排除

几年之前买的一台 iMaker 3D打印机,已经在角落里面落灰许久了,本质上是一台  Ultimaker v1.5.7硬件的机器,因此使用 Ultimaker 的软件跟固件都是没有问题的。貌似这家公司现在已经快不行了的样子。 官网都已经打不开了。
继续阅读iMaker 3D打印机Marlin固件编译以及故障排除

群晖DSM 6.2增加zgrep命令

群晖 DSM 6.2 系统上执行 zgrep 命令的时候提示找不到命令,其他平台系统(ARM ),需要手工编译安装ZUtils,来提供。但是如果是 X86 系统的话(比如 DS718+ ),可以直接使用交叉编译环境里的工具,直接拷贝到系统即可。

首先参考 搭建群晖交叉编译环境(DS718+/ubuntu 16.04.6/DSM 6.2.1-23824 Update 6) 搭建群晖 DSM 6.2 的编译环境。

DS718+ 执行如下:

 

 

需要编译的(ARM 芯片版本),执行如下命令编译:

对于编译好的程序,复杂的可以自己制作安装包,简单的可以直接通过SSH推送到设备的/usr/local/bin目录下即可。

比如本次编译结果:

参考链接


Debian旧版本源同步脚本

最近 Debian Wheezy/Jessie 源被官方归档了,使得许多来不及更新系统的服务器没源可用,http://archive.debian.org  访问速度太慢, 不得以自己写个脚本同步 Wheezy/Jessie 源。

Debian 官方推荐使用 debmirror 同步源,但是在群晖等设备上不方便使用,因此还是用 rsync 同步通用一些。

主要是自己的 WD MyCloud Gen1 在编译软件的时候,依赖 WheezyJessie 版本的软件包,又没办法升级系统,只能是自己建立软件源,保存一下,免得日后麻烦。

由于 Debian 源的结构,要单独分版本来同步很不方便,包都集中在 /pool 目录下,故此脚本主要根据索引文件来生成该版本的包列表ARCH_EXCLUDE 用来过滤不同架构的包的dists 用来过滤不同版本的同步完成后,整个 Wheezy/Jessie 源(i386,  amd64, arm,  source) 共 96G

Wheezy Archive 源设置

同步脚本代码

更多 debian-archive 源,见: http://www.debian.org/distrib/archive

参考链接


Debian系统启动非常耗时,屏幕显示“A start job is running for /dev/disk/by-uuid/...a71b-4040-9b53-e92525f6803e”,错误“Timed out waiting for device /dev/disk/by-uuid/197c3d31-a71b-4040-9b53-e92525f6803e”

最近Debian 系统启动非常耗时,每次启动都要等待1分30秒的任务超时才能启动,屏幕显示“A start job is running for /dev/disk/by-uuid/...a71b-4040-9b53-e92525f6803e”,如下图:

继续阅读Debian系统启动非常耗时,屏幕显示“A start job is running for /dev/disk/by-uuid/...a71b-4040-9b53-e92525f6803e”,错误“Timed out waiting for device /dev/disk/by-uuid/197c3d31-a71b-4040-9b53-e92525f6803e”

Debian:如何从Jessie升级为Buster(Debian 8.0 升级到Debian 10.0)

Debian 10(代号为Buster)已经正式发布,可以开始尝鲜Debian 10了。 需要逐版本升级,不要跨版本升级,目前的尝试来看,跨版本升级会出现问题。

1. 更新Debian Jessie到最新版

2. 将软件源改为Stretch安装源

3. 升级系统版本

4. 重启

5. 更新Debian Stretch到最新版

6. 将软件源改为Buster安装源

7. 升级系统版本

8. 重启

9. 清理安装包

参考链接


Poppy:开源3D打印人形机器人

由Inria Flower实验室(位于法国波尔多)研究小组创建的 Poppy,是一台经济实惠、易于安装的人形机器人,拥有强大而灵活的硬件配置。使用现成部件(电机及电子元件)和 3D打印的肢体,降低创客自制门槛。

继续阅读Poppy:开源3D打印人形机器人

快速排序算法(QSort,快排)及C语言实现

上节介绍了如何使用起泡排序的思想对无序表中的记录按照一定的规则进行排序,本节再介绍一种排序算法——快速排序算法(Quick Sort)。

C语言中自带函数库中就有快速排序——qsort函数 ,包含在 <stdlib.h> 头文件中。

快速排序算法是在起泡排序的基础上进行改进的一种算法,其实现的基本思想是:通过一次排序将整个无序表分成相互独立的两部分,其中一部分中的数据都比另一部分中包含的数据的值小,然后继续沿用此方法分别对两部分进行同样的操作,直到每一个小部分不可再分,所得到的整个序列就成为了有序序列。

例如,对无序表{49,38,65,97,76,13,27,49}进行快速排序,大致过程为:

  1. 首先从表中选取一个记录的关键字作为分割点(称为“枢轴”或者支点,一般选择第一个关键字),例如选取 49;
  2. 将表格中大于 49 个放置于 49 的右侧,小于 49 的放置于 49 的左侧,假设完成后的无序表为:{27,38,13,49,65,97,76,49}
  3. 以 49 为支点,将整个无序表分割成了两个部分,分别为{27,38,13}{65,97,76,49},继续采用此种方法分别对两个子表进行排序;
  4. 前部分子表以 27 为支点,排序后的子表为{13,27,38},此部分已经有序;后部分子表以 65 为支点,排序后的子表为{49,65,97,76}
  5. 此时前半部分子表中的数据已完成排序;后部分子表继续以 65为支点,将其分割为{49}{97,76},前者不需排序,后者排序后的结果为{76,97}
  6. 通过以上几步的排序,最后由子表{13,27,38}{49}{49}{65}{76,97}构成有序表:{13,27,38,49,49,65,76,97}

整个过程中最重要的是实现第 2 步的分割操作,具体实现过程为:

  • 设置两个指针 low 和 high,分别指向无序表的表头和表尾,如下所示:
  • 先由 high 指针从右往左依次遍历,直到找到一个比 49 小的关键字,所以 high 指针走到 27 的地方停止。找到之后将该关键字同 low 指向的关键字进行互换:
  • 然后指针 low 从左往右依次遍历,直到找到一个比 49 大的关键字为止,所以 low 指针走到 65 的地方停止。同样找到后同 high 指向的关键字进行互换:
  • 指针 high 继续左移,到 13 所在的位置停止(13<49),然后同 low 指向的关键字进行互换:
  • 指针 low 继续右移,到 97 所在的位置停止(97>49),然后同 high 指向的关键字互换位置:
  • 指针 high 继续左移,此时两指针相遇,整个过程结束;

该操作过程的具体实现代码为:

该方法其实还有可以改进的地方:在上边实现分割的过程中,每次交换都将支点记录的值进行移动,而实际上只需在整个过程结束后(low==high),两指针指向的位置就是支点记录的准确位置,所以无需每次都移动支点的位置,最后移动至正确的位置即可。

所以上边的算法还可以改写为:

快速排序的完整实现代码(C语言)

运行结果:

总结

快速排序算法的时间复杂度为O(nlogn),是所有时间复杂度相同的排序方法中性能最好的排序算法。

参考链接