Lan Tian @ Blog

(自建 NTP)在 Tinker Board 上使用 PPS

在前一篇文章中,我使用 Tinker Board 和 ATGM336H GPS/北斗模块自建了 NTP 服务器,以 GPS 作为时间基准。GPS 模块除了提供传统的串口输出 NMEA 语句之外,还额外提供了一个 PPS 信号,这个信号会每秒变化一次。原本 gpsd 需要不断解析 GPS 模块传来的 NMEA 语句,需要耗费不短的时间,并且容易被其它程序抢占运行时间,产生 delay(延迟)和 jitter(波动)。而 PPS 信号可以直接触发 CPU 的中断,运行一个简单的处理程序,让操作系统以高优先级处理,不会被其它程序影响。 一般而言,在 Linux 中,PPS 由内核直接提供驱动支持。但是在前文中...

自建基于 GPS 的 NTP 服务端

NTP 是什么 NTP(Network Time Protocol)是目前使用最广泛的互联网时间同步协议。我们常用的 Windows、macOS、Linux 等都自带了 NTP 客户端,可以连接远程服务器获取当前的时间。例如,Windows 的 Internet 时间同步功能就是基于 NTP: (图片来自网络) Windows 默认会连接到 time.windows.com 这台由微软维护的 NTP 服务器同步时间。但是,默认的这台服务器在国内并不好用。这台服务器位于美国,到国内的延迟很大并且容易波动,因此 NTP 客户端也很难得出准确的时间。 那么中国大陆有没有 NTP 服务器呢?有,但是不多: cn...

使用 GPP 预处理 Dockerfile,实现 #include、#if 等功能

由于我有多种架构的设备运行 Docker(包括 x86_64 的电脑和服务器,ARM32v7 的 Tinker Board 和 ARM64v8 的树莓派 3B),我的每个 Docker 镜像都要构建多种版本。最初我给每个架构单独写一份 Dockerfile,但是很明显这样难以统一管理,在软件更新修改 Dockerfile 时经常漏改文件。之后,我用的是 Docker 的构建参数功能,即 --build-arg 参数,根据参数来调用不同的基础镜像、下载不同文件。 但是这样还是有很大的局限性。首先,不同项目对不同架构的称呼是不一样的。例如,我们平时说的 x86 32 位架构,i386,就被 Go 以及众多使用 Go 的项目叫做 386...

在 DN42 中使用 Docker 建立 Anycast DNS 服务

什么是 Anycast? 互联网上常用的路由协议 BGP 是这样工作的:我在 DN42 拥有 IP 段 172.22.76.104/29,我通过 BIRD 等 BGP 软件,“宣告”这台服务器上可以访问到 172.22.76.104/29 这个 IP 段。与我有 Peering 的其它服务器记录下这一条消息:“通过某条路径,走 1 格可以访问到 172.22.76.104/29”,并且向与它们有 Peering 的服务器继续宣告:“这台服务器距离 172.22.76.104/29 只有 1 格距离”。以此类推,其余服务器也通过类似的流程,宣布自己与 172.22.76.104/29 有 2 格,3 格,4 格距离……所有服务器也都通过距离最短的路径,将数据发送到我的服务器...

Typecho 主题性能优化和缓存

为了实现 Lightbox、代码高亮等功能,我在我的博客主题中写了一些后处理代码,对 Typecho Markdown 输出后的 HTML 代码再进行一层处理。但是因为我的博客历史文章较多,我在不同时期也用了不同的编辑器(WordPress 编辑器,百度 UEditor 等等),为了尽可能保证历史文章也能正常显示,我的处理逻辑比较复杂。再加上我用的廉价 VPS 性能本就不怎么样,相应的网页加载时间也较长。 我在 nginx 配置中添加了这样一行,以在 HTTP 头中输出网页在服务器端处理的用时: add_header LT-Latency $request_time; 最初,这个值是 0.25 左右,代表着每个网页需要在服务器端处理 250ms 之久...

Go 语言实现的 Bird-lg(Bird Looking Glass)

什么是 BIRD?什么是 Bird-lg? BIRD 是 Linux 上常用的一款 BGP 路由软件。我主要在 DN42 网络内使用 Bird,与其它用户建立连接。 Bird-lg 是 GitHub 用户 sileht 开发的一款基于 Python 2 的程序。它提供了一个网页面板,可以显示各个服务器上的 BIRD 路由软件的状态,以及查询到指定 IP 的路由。 为什么我要用 Go 语言重写? Bird-lg 基于 Python 2 以及 Flask,因此占用内存较大(20-30 MB)。 Bird-lgproxy 内存占用量也差不多 20 MB,并且每台服务器上都要运行一个。本站所在的 512 MB 内存的 VPS 已经出现过多次由于内存耗尽外加 SWAP 所在硬盘读写缓慢...

BuyPass GO SSL 证书试用

BuyPass 是挪威的一家 CA,提供数字证书、安全认证产品等多种服务。最近 BuyPass 上线了基于 ACME 的自动签发证书服务,类似于 Let's Encrypt,这项服务称为 BuyPass GO。与 Let's Encrypt 主要的不同点在于他们的证书每次签发有效期是 180 天,比 Let's Encrypt 的长一倍。所以如果你需要给你的服务手动换证书,BuyPass 的证书会好一些。另外 BuyPass 暂不支持签发泛域名证书(俗称野卡?),只能将需要的域名一个个列出来。 (不过我觉得如果需要手动换证书,还是申请 TrustAsia 之类的一年有效期的好一点) 申请证书 我使用 acme.sh 这个工具来申请证书...

使用 Docker 构建参数,多架构共享一份 Dockerfile

由于我有多种架构的设备运行 Docker(包括 x86 服务器,树莓派,Tinker Board),对于每个常用的软件,我需要为每种不同架构都构建一份镜像。之前,我采用的方式是每个架构都有一个独立的 Dockerfile,类似于这样: 可以看到每份 Dockerfile 除了 FROM 调用的镜像不一样,其它几乎完全相同。用这种方式管理,好处是写构建脚本(travis.yml)的时候简单,直接一个个 docker build 过去即可,但是坏处也很明显,每次软件有版本更新,或者我决定添加或删除一个功能,我都要改好几份 Dockerfile。 前两天我查资料时,发现了 Docker 的一个功能:构建参数(Build args),就是可以填入一些参数供构建过程使用...

pfSense 配置 IPv6 多 WAN 自动切换

就在几天前,HE.NET Tunnelbroker 的法国服务器出了一次故障。因为我在配置 Kimsufi 服务器时,将 Kimsufi 原生的 IPv6 分给了 ESXi 单独使用(见这篇文章),pfSense 只具有原生 IPv4 并通过 Tunnelbroker 获取 IPv6 地址,所以这次服务器上的所有虚拟机都失去了 IPv6 连接。更严重的是,由于我在服务器上也参照这篇文章搭了个 NAT64 服务,为了优先使用 IPv6,我设置了 pfSense 的 DNS 解析优先使用 Google DNS 的 NAT64 解析服务器,就是 2001:4860:4860::64 和 2001:4860:4860::6464 这两个,只在这两个 DNS 全部失效后才去使用 IPv4 解析...

nginx 配置 LDAP 认证

我的各台服务器上安装了各种不同的服务,都有各自的用户名密码体系,难以统一管理。假设未来某天我的密码泄露了,一个个修改就会非常累人。因此,我希望用一个服务来专门管理用户名密码,其它服务都从它上面获取认证信息。 LDAP 是常用的认证协议之一,不仅有许多软件原生支持它的认证(包括 Jenkins,pfSense 等),而且通过插件可以使得 nginx 支持它,为任何基于网页的服务加上统一管理的认证。 添加插件 如果你的 nginx 已经是源代码编译的,添加 nginx 的 LDAP 插件只需要三步: apk add openldap-dev git clone https://github.com/kvspb/nginx-auth-ldap...