在Cloudflare实现DDNS的Python脚本

最近经常需要通过 VPN 连接到家里的网络,但由于 IP 地址的动态变化,每次都手工查 IP 再连接太麻烦了,所以用到了域名动态解析。

用 Python 写了个最小实现,记录下:

一,首先,得有个域名,并将它托管在 cloudflare.com 管理,DDNS 有个二级域名就可以了。在 cloudflare 的管理面板中获取该域名的 API 访问令牌,拿到对应的 DNS zone id 和 Token,过程很简单这里就略过了。

二,其次,在家中服务器上写个 Python 脚本,代码不过百行,逻辑也简单:

  • 用 DNS zone id 和 Token 访问,拿到指定域名的 DNS record id
  • 根据 DNS record id ,读取 DNS 记录里的 IP 地址
  • 获取当前家用网络的公网 IP 地址
  • 对比这两个 IP 地址,如果不同,就更新 DNS record 设置。

完整代码我放在 Github 上了,有需自取:
https://github.com/limingx/ddns_cloudflare

三,最后,设置一个定时任务即可。例如:

*/30 * * * * /usr/bin/python3 ddns.py
//每30分钟检查一次。

完成之后,连接 VPN 时只需指定域名即可,不必再操心 IP 变化的事了。

Lightsail 虚拟机 CPU 占用率100%的问题

Amazon Lightsail 的服务器各方面都挺好的,但最近遇到几次 CPU 占用率过高,甚至持续高达100%并导致服务器无法响应,只能关机重启的情况。

翻找一通之后,发现原因是 MySQL 服务的内存消耗较大,当峰值消耗超出内存上限后,最终导致 CPU 占用率异常。

解决办法有两个,一是直接升级内存配置;二是低成本的,不改变硬件配置的情况下,划分一部分磁盘空间来充当内存不足时的交换空间来解决。

好在这个问题不经常出现,服务器硬盘又是SSD,性能还可以,所以这里采用第二种方法先顶上。在默认配置下,Lightsail 服务器的硬盘分区里并没有划出 swap 分区,只能手工添加 swap 文件了。

操作步骤:


# 创建一个交换文件,大小自定,推荐内存*2
sudo fallocate -l 2G /swapfile

# 设置权限
sudo chmod 600 /swapfile

# 设置交换分区为此文件
sudo mkswap /swapfile

# 启用
sudo swapon /swapfile

# 查看是否生效
sudo swapon -s

# 设置开机自动挂载交换文件
sudo cp /etc/fstab /etc/fstab.bak
echo '/swapfile swap swap defaults 0 0' | sudo tee -a /etc/fstab
linux 设置 swapfile 交换文件
linux 设置 swapfile 交换文件

其它参考:

全文完

Linux虚拟机读写exFat格式USB移动硬盘

这两天面临一个特定需求,遇到些问题,记录下。

需求:

我有一台安装了 ESXi 的服务器,其上运行了若干虚拟机,其中一台是 Ubuntu,我需要通过 USB 挂载一块新的硬盘到该虚拟机中,并分区格式化到 exFat 格式,最后将 Ubuntu 某特定文件夹的内容,完全同步到该硬盘中。

要解决的问题:

1,在 ESXi 下如何连接 USB 设备到虚拟机;
2,在 Linux 下对新硬盘的分区、格式化、挂载;
3,文件夹的同步过程及简单数据校验。

过程与小坑:

1,在ESXi下连接USB设备到虚拟机。

正常情况下,据官方文档讲只需将USB设备连接到服务器上,在ESXi的管理界面中,找到要使用这个USB设备的虚拟机,不必关机的情况下,直接编辑。

先检查虚拟机是否添加了USB控制器,若无请添加。然后添加其它设备,选中如下图所示的“USB设备”,从中选择具体的设备名称即可。

ESXi向虚拟机添加USB设备示例
图:ESXi向虚拟机添加USB设备示例

这里踩到第一个小坑,如上图所示,在我的虚拟机中,USB设备居然显示灰色无法添加,翻看官方文档,在这一篇中提到:

原因
出现此问题的原因是默认情况下不可引导的USB设备为虚拟机预留。该设备并不显示在主机的文件系统中,尽管lsusb可以看到设备。
解决方案
停止 usbarbitrator 服务:
/etc/init.d/usbarbitrator stop
断开 USB 设备的物理连接然后再重新进行连接。
默认情况下,设备位置是:/vmfs/devices/disks/mpx.vmhbaXX:C0:T0:L0。
重新连接设备后,重新启动 usbarbitrator 服务:
/etc/init.d/usbarbitrator start
重新启动 hostd 和任何运行中的虚拟机,以还原对虚拟机中直通设备的访问权限。

注意:这需要通过SSH连接到ESXi主机进行操作,而不是ESXi上运行的Ubuntu虚拟机。默认情况下ESXi主机的SSH服务是关闭的,可以在管理界面菜单开启,不复赘述。在完成了上述操作后,就可以成功将USB设备添加到Ubuntu虚拟机了。

2,在Linux下对新硬盘的分区、格式化、挂载;

SSH登录到虚拟机,用 fdisk -l 命令查看一下当前连接的设备,找到其中的硬盘,例如:/dev/sdc

输入 gdisk /dev/sdc 进行分区操作:
先按 o 创建一个空的GPT分区表。
再按 n 创建一个新的分区,参数自定,exFat格式的代码是0700
再按 p 显示当前分区信息,检查一下。
再按 w 写入,使上述操作生效。

输入 mkfs.exfat /dev/sdc1 格式化该分区。

我将整个硬盘只分了一个区,结果如图:

linux硬盘分区示例
图:linux硬盘分区示例

接下来挂载该磁盘:
创建一个挂载点。
mkdir /mnt/usb
挂载磁盘
mount -t exfat /dev/sdc1 /mnt/usb

一切正常的话,已经可以通过 /mnt/usb 访问该磁盘了。
如果要拔掉USB设备的话,安全起见,需要先停止读写任务,并卸载磁盘:
umount /dev/sdc1
最后再拔线。

3,文件夹同步及数据校验。

一般情况下,只需要简单的 cp -r 命令复制文件夹即可。但如果文件夹内的数据过于庞大,需要长时间复制万一中断也方便恢复,或者有可能定期增量更新的话,还是应该用 rsync 命令来同步。

rsync -r --size-only /source /destination

这会将 /source 目录中所有的子目录和文件,都同步到 /destination 目录中。在多次运行该命令时,若遇到相同大小的文件会跳过,而不同大小的文件会复制。

我这次需要同步的文件夹相当庞大,数据大约有3TB左右,为了避免一直保持SSH连接,所以需要让任务在后台运行,这就需要用到 nohup 命令

nohup rsync -r --size-only /source /destination &> /dev/null & echo $! > pid.txt

这会使 rsync 任务在后台运行,同时在当前目录下生成一个 pid.txt 文件记录这个任务的pid,方便后续 kill job

在漫长的同步过程中,如果想看 rsync 是否还在进行中,可以用 iotop 命令

iotop -o

这会显示当前有 I/O 操作的所有任务及其读写速率,如图:

ubuntu系统iotop命令示例
图:Linux Ubuntu系统 iotop 命令示例

这里显示 rsync 还在以 106M/s 的速度读写磁盘。

任务正常结束后,rsync 会确保文件夹内容的一致性,但如果中途中断或有其它异常情况,想要确认一下的话,可以使用 du 命令

du -s --apparent-size /source

这会以字节为单位,显示 /source 目录下所有文件大小之和。
同样的方法查看一下 /destination 目录的大小,对比即可。

注意:这里的 --apparent-size 参数特别说明下,如果不加这个参数的话,统计的就是文件占用磁盘的字节数,当两个磁盘有着不同的簇大小时,这会导致即使文件完全相同而显示的数字却不同。整体而言,用 du 命令对比目录字节数,是一种简单高效而不甚严谨的方法。

全文完。

引用:

  1. ESXi文档:将 USB 设备从 ESXi 主机添加到虚拟机
  2. ESXi文档:无法将数据从 ESXi 主机复制到连接到该主机的 USB 设备

《坚定不移》(保罗·沃尔克)

刚刚讲完《坚定不移》(保罗·沃尔克),仅从内容组织上来说这本书表现一般,跳跃性比较大,读的时候需要不时回顾当时的历史事件(维基百科帮了不少忙),才能比较具体的理解他的意思。

几十年前保罗·沃尔克以强硬手段解决了当时的经济通胀问题,这本书里描绘的当年,又与今天何其相似,也许历史的轨迹能够帮我们窥到一些未来的方向。

虽然有点散落,但这本书的闪光点在于,经常有一些闪光点。 :)

推荐度 75/100,以下是引用:

Continue reading "《坚定不移》(保罗·沃尔克)"

大意了买了本哲学小史

前段时间去海边玩的时候,在书店随手买了本《哲学小史》打发时间,这两天差不多快看完了。

它的副标题是:西方哲学四十讲。其实看到现在,依我看书名和标题都写的名不副实,它应该叫:《哲学“家”小史》——西方哲学家(部分)生平简介

(手工笑哭……)

不过作为一本普及向的入门读物,这本小书还算不错,至少不枯燥。

哲学小史-西方哲学四十讲

技术与就业、经验与学习

“我深信,用机器代替人力往往会大大损害劳动者阶层的利益。”
——1821年,李嘉图。

再伟大的学者都有其历史局限性,李嘉图的故事与马尔萨斯的故事如出一辙,本质而言,这是同一个错误。

马尔萨斯的陷阱理论简而言之是:“因为资源是有限的,人口却一直在增长,所以到达某个平衡点之后,必然就陷入崩溃和衰退。” 这是对农耕时代的精确洞察和总结,但看似简洁优雅的推论,也假定了两个重要变量:生产效率是基本不变的、人口生育率也是差不多恒定的。随后的工业革命彻底改变了社会分工和之前两千年的经济规律,马尔萨斯就悲剧了。

Continue reading "技术与就业、经验与学习"

Ubuntu安装MySQL设置密码死循环的问题

遇到这个BUG,修复过程备忘一下:

正常情况下,在 Ubuntu 中安装 MySQL 数据库是非常简单的事:

$sudo apt update
$sudo apt install mysql-server

在 MySQL 安装成功之后,应该通过其附带的安全脚本:

Continue reading "Ubuntu安装MySQL设置密码死循环的问题"

公司转型与文化形成

刚开始读《刷新:重新发现商业与未来》(萨提亚·纳德拉),一个小事例体现出来三个要点:

1, 纳德拉的价值导向里,客户需求大于公司传统文化。这可能也是他为什么是硅谷最成功经理人之一的重要特点。也是微软为什么在近几年,能够如此的开放的拥抱开源社区的原因。

2, 科技公司的发展过程中,转型是必然,越大就越难。在大型科技公司里,微软算一个转型成功的,亚马逊、Google 勉强算半个,苹果、特斯拉、Facebook、Netflix、Intel、AMD 都还没有实现。

Continue reading "公司转型与文化形成"

诸善之争中的平衡

以下是引用:

不平等问题非常复杂,它有A面,也有B面。《小丑》中的悲惨世界叙事、受害者叙事、阶级战争叙事,虽然逻辑很平滑,但套到现实中,却有很多“不合身”之处。可能有人会说,把问题说得严重点有何不可?这有助于社会形成改革共识,不是好事吗?其实,这就又回到我们在前面讲到过的,不成比例的悲观主义或许满足知识分子改造世界的激情,却可能带来错误的解题思路。

如果更重要的问题是贫困而不仅仅是贫富差距本身,那么解题思路就应该注重激励投资和就业,也就是创造财富,而不仅仅是再分配财富。

Continue reading "诸善之争中的平衡"

读《可能性的艺术》

在读《可能性的艺术:比较政治学30讲》(刘瑜),刘瑜不愧是公共写作领域经验丰富的作家,作者流畅的使用浅显易懂的比喻来解释学术概念,为这本科普向的作品增添了许多亮点。

学术有路线之分,民间也有观念之争,大多数时候网络上的争论之所以低效可笑,正是因为对基本概念的理解参差不齐鸡同鸭讲,甚至干脆就是菜鸡互啄,没有“讨论”只不过分立场站定,试图争个我对你错。

Continue reading "读《可能性的艺术》"