Skip to content
New issue

Have a question about this project? Sign up for a free GitHub account to open an issue and contact its maintainers and the community.

By clicking “Sign up for GitHub”, you agree to our terms of service and privacy statement. We’ll occasionally send you account related emails.

Already on GitHub? Sign in to your account

luci-app-zerotier 不应将运行时文件存放在 /etc #363

Closed
CrazyBoyFeng opened this issue Nov 13, 2023 · 3 comments
Closed

luci-app-zerotier 不应将运行时文件存放在 /etc #363

CrazyBoyFeng opened this issue Nov 13, 2023 · 3 comments
Labels
invalid This doesn't seem right

Comments

@CrazyBoyFeng
Copy link

zerotier 是用来内网穿透的工具,应该不用过多介绍。

在使用 luci-app-zerotier 的过程中,我发现它将运行时文件存放在 /etc/config/zero 中,导致 flash 被频繁读写、大量占用空间。
研究代码发现是这两句将运行时文件的存储位置定义在了 /etc/config/zero 中:

[ -d /etc/config/zero ] || mkdir -p /etc/config/zero
config_path=/etc/config/zero

这里的 $config_path 变量虽然名为配置,但实际存储的内容主要为:各节点信息、与各节点通信的密钥、统计数据、PID 进程锁、PORT 端口锁。
这其中的大多数据都是变动的,有的还会不断增加。因此并不适合持久化存储,尤其是在低配置的路由器上。
zerotier 官方软件包的服务项文件默认是将它们存放在 /var/lib/zerotier-one 里,也就是存储在 RAM 里。

我追溯了一下这段代码,最早是 lean 添加上去的。我没有找到他做这个改动的原因,也许是为了调试?我也没有在代码中找到别处调用了这个路径。

此外这个服务项的另一个问题就是初始化服务时没有清理旧的运行时文件。
zerotier 官方在初始化时清理了 /var/lib/zerotier-one_sample_config

我认为应当参考 zerotier 官方软件包的服务项文件 将这两句代码换为

config_path=${CONFIG_PATH}_$cfg  # 将运行时文件路径定义为 /var/lib/zerotier-one_sample_config
rm -rf $config_path  # 清理旧的运行时文件
mkdir -p $config_path  # 创建运行时文件目录

其实最好是将整个start_instance() 函数换成 zerotier 官方软件包的代码。那样不仅上述问题能够得到解决,还能够支持用户在 /etc/config/zerotier 配置文件中自定义运行时文件的路径、端口等设置。

@1715173329
Copy link
Member

这是预期行为,否则配置文件、设备信息、密钥等重启之后直接丢失。不知道哪种规模的 zerotier 网络可以造成“频繁读写”与“大量占用空间”。

@1715173329 1715173329 closed this as not planned Won't fix, can't repro, duplicate, stale Sep 19, 2024
@1715173329 1715173329 added the invalid This doesn't seem right label Sep 19, 2024
@CrazyBoyFeng
Copy link
Author

CrazyBoyFeng commented Sep 19, 2024

“预期行为”这结论令人意外。

首先,我要解释一下为什么避免频繁写 flash 非常重要:
很多低端路由器的 flash 的 UBI 驱动十分简陋,没有磨损平均,甚至有的连 UBI 驱动都没有,直接 MTD 操作存储。而大多数路由器都是便宜的 TLC 颗粒(尤其是低端路由),寿命只有千次。那么对着一个块频繁写入,很快就会将寿命消耗完了。

/etc/config/zero/ 里面大部分都是运行时文件,它们的大多数变动都是在更新密钥,这其实并没有持久化的必要。应避免这样价值较低的对 flash 的频繁擦写。luci-app-zerotier 直接在 /etc/ 里存储运行时文件的行为需要改进。

删除 /etc/config/zero/ 这个运行时目录并不会导致运行所必要的配置文件在重启之后丢失。真正用来存储 zerotier 静态配置(包含加入网络的 id 和 secret)的文件位于 /etc/config/zerotier,这也是 luci-app-zerotier 所操作的配置文件。/etc/config/zero/ 里面并不是配置文件,而是运行时文件。它之所以在 /etc/config/ 这个位置,是咱们的 luci-app-zerotier 从官方包定义的 /var/lib/zerotier-one*/ 改过去的。官方包每次服务启动时都会删除这个目录。删除后,除了要与节点重新握手获得密钥会慢一点之外,在其它体验上并没有什么影响。

@CrazyBoyFeng
Copy link
Author

我搜索了一些有关该问题的 issue。发现使用官方包默认配置的情况下时,使用自定义 moon 和 planet 的用户无法将 moon 和 planet 配置持久化。这确实是我没想到的,因为我并不使用 moon 和 planet。

不过我也并不认为我的反馈是无价值的。因为 luci-app-zerotier 频繁读写 flash 的情况也确实存在。这里有另外一个评论也提到了这个问题:

因为 zerotier 会每分钟更新一下 networks.d 里的网络配置文件。如果配置文件在 /etc 目录内,对于 spi 芯片的路由器是灾难级的。长期运行 zerotier 后,会引发 spi 芯片报错日志刷屏,同时会出现无法修改配置的问题。

官方库对于使用 moon 的指导也是将运行时目录持久化,并提供了自定义目录位置的选项。同时它还提供一个 option copy_config_path 开关,启用后 zerotier 将在启动时从 /etc/zerotier/ 复制文件到 /var/,然后从 /var/ 启动。这样既能满足自定义 moon 的需求,又能避免对 flash 的频繁读写。

luci-app-zerotier 如果想要改进的话可以借鉴这个做法:每次启动时,将包含 moon 配置的 /etc/config/zero/ 复制到 /var/ 里,然后从 /var/ 启动。
不过因为我并不使用 moon,这样修改是否影响 moon 的使用,还需要使用 moon 的用户进行测试。

Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment
Labels
invalid This doesn't seem right
Projects
None yet
Development

No branches or pull requests

2 participants