斐讯N1 – armbian保护emmc – 禁止/var/log日志

因为emmc存储是一种flash存储技术,其写入寿命非常有限,所以系统运行中应尽量避免数据写入。

如果我们没有装什么特殊程序的话,通常来说数据的主要写入就是/var/log目录的日志了,一天几十MB还是有的。

armbian现状

armbian其实已经考虑了这个问题,因为armbian就是给arm架构订制的debian发行版嘛,所以它默认是创建了一个内存盘(zram文件系统)挂载到了/var/log目录:

所以频繁的日志写入并不会直接伤害到emmc。

但是这块zram盘只有49MB,基本上1~2天就会写满,所以armbian是如何处理的呢?

经过我的研究,发现系统做了1个systemd启动任务+2个cron任务用来解决这个问题,下面简单说一下原理。

详细分析

当然是定期删除日志了,难不成还有魔法嘛。

每15分钟就会执行一次truncate日志,这个脚本内容如下:

其实就是看一下/var/log的zram盘是否利用率超过75%,一旦超过就扫描/var/log下面各种日志文件进行截断。

另外,我们还看到它调用:

/usr/lib/armbian/armbian-ramlog write >/dev/null 2>&1

这个脚本的write命令会把/var/log内存盘的数据rsync到/var/log.hdd/目录,而/var/log.hdd目录是emmc上的一部分。因此,我们明白在truncate日志之前会先把当前最新日志持久化到emmc上,然后再把zram内存里的日志截断掉。

另外,这个脚本还调用了logrotate程序进行日志滚动,我详细看了一下logrotate配置文件,发现它归档的是/var/log.hdd里面的日志文件,其根本目的是为了配合zram -> emmc做rsync的时候可以结合rsync –delete选项删除掉归档的老日志文件,起到控制emmc容量的目的。(大家不理解可以不关心这一段逻辑)

所以呢,这个cron会导致每15分钟就会向emmc同步一次数据,并且缩小zram盘占用容量,这无疑是对emmc的频繁伤害。

另外还有一个天级cron是进行一次write同步,也是调用的如下同步命令:

/usr/lib/armbian/armbian-ramlog write >/dev/null 2>&1

因此,最简单的就是让这个write操作失灵,不向emmc同步日志数据不就好了嘛。

解决方法

打开/usr/lib/armbian/armbian-ramlog脚本,它实际执行的是这个shell方法:

只需要在函数头部返回即可避免rsync:

可以再观察一下/var/log与/var/log.hdd,会发现/var/log.hdd已经不再有后续数据更新,而/var/log仍旧会自动在75使用率的时候进行日志截断。

最后补充,armbian做了一个systemd服务:/lib/systemd/system/armbian-ramlog.service,它开机会创建zram盘,然后从emmc的/var/log.hdd中load数据到zram的/var/log路径下,完成开机初始化。

如果文章帮助您解决了工作难题,您可以帮我点击屏幕上的任意广告,或者赞助少量费用来支持我的持续创作,谢谢~