N1刷入Armbian后保护emmc–禁止varlog日志因为emmc存储是闪存存储技术,写入寿命非常有限,所以尽量避免数据在系统操作写。如果我们不安装任何特殊程序,一般来说数据主要写入的是/var/log目录下的日志,每天还有几十MB。armbian的现状armbian其实已经考虑到了这个问题,因为armbian是为arm架构定制的debian发行版,所以默认创建一个内存盘(zram文件系统)挂载到/var/log目录:root@AML:/var/log#df-h文件系统大小可用,使用UDEV469M上安装的%0469m0%/devtmpfs184m22m163m163m12%/run/dev/dev/dev/mmcblk1p26.4g2.1g2.1g4.3g4.3g33%/tmpfs920m920m920m920m920m920m920m920m0920M0%/dev/shmTMPS5.0m4.0k5.0m1%/运行/锁定TMPFS920M0920m0%/SYS/FS/CGROUPTMPFS920M8.0K920m1%/DEV/MMCBLK1122M64M48M48%/启动/dev/zram049M15M31M32%/var/logtmpfs184M0184M0%/run/user/0如此频繁的日志写入不会对emmc造成直接伤害。但是这个zram盘只有49MB,基本上1~2天就满了,那么armbian是怎么处理的呢?经过我的研究,我发现系统做了1个systemd启动任务+2个cron任务来解决这个问题。我简单说明一下原理。详细分析当然是定期删除日志,所以有魔法。root@aml:/var/log#cat/etc/cron.d/armbian-truncate-logsPATH=/usr/local/sbin:/usr/local/bin:/sbin:/bin:/usr/sbin:/usr/bin*/15****root/usr/lib/armbian/armbian-truncate-logs每15分钟就会执行一次truncate日志,这个脚本内容如下:treshold=75#%[-f/etc/default/armbian-ramlog]&&。/etc/default/armbian-ramlog["$ENABLED"!=true]&&exit0logusage=$(df/var/log/--output=pcent|tail-1|cut-d"%"-f1)如果[$logusage\-ge$treshold];然后#写入SD/usr/lib/armbian/armbian-ramlogwrite>/dev/null2>&1#在“磁盘”上轮换日志chownroot.root-R/var/log.hdd/usr/sbin/logrotate--force/etc/logrotate.conf#truncate/usr/bin/find/var/log-name'*.log'-or-name'*.xz'-or-name'lastlog'-or-name'messages'-或-name'debug'-或-name'syslog'|xargstruncate--size0/usr/bin/find/var/log-name'btmp'-or-name'wtmp'-or-name'faillog'|xargs截断--size0#删除/usr/bin/find/var/log-name'*.[0-9]'-or-name'*.gz'|xargsrm>/dev/null2>&1fi其实是在查看/var/日志的zram磁盘的使用率是否超过75%,一旦超过,扫描/var/log下的各种日志文件进行截断另外,我们还看到它调用了:/usr/lib/armbian/armbian-ramlogwrite>/dev/null2>&1这个脚本的write命令会将/var/log内存盘的数据rsync到/var/log.hdd/目录,而/var/log.hdd目录是emmc的一部分。所以,我们理解为在truncatelog之前,会将当前最新的日志持久化到emmc,然后截断zram内存中的日志。此外,该脚本还调用logrotate程序进行日志轮转。详细查看了logrotate的配置文件,发现它把日志文件归档在/var/log.hdd中。它的根本目的是配合zram->emmc做rsync,此时可以结合rsync–delete选项删除归档的旧日志文件来控制emmc的容量。(不明白的可以无视这个逻辑。)所以这个cron会导致每隔15分钟向emmc同步一次数据,减少zram磁盘的占用容量。这无疑是对emmc的频繁损坏。另外还有一个天级的cron是执行写同步的,也是调用下面的同步命令:/usr/lib/armbian/armbian-ramlogwrite>/dev/null2>&1因此,最简单的方法就是让这个写操作失败,不把日志数据同步到emmc不是很好吗?解决方法打开/usr/lib/armbian/armbian-ramlog脚本,实际上执行的是这个shell方法:syncToDisk(){isSafeecho-e"\n\n$(date):Syncinglogsfrom$LOG_TYPEtostorage\n"|$LOG_OUTPUT如果["$USE_RSYNC"=true];然后${NoCache}rsync\-aXWv\--delete\--excludearmbian-ramlog.log\--links$RAM_LOG$HDD\_LOG2\>&1|$LOG_OUTPUTelse${NoCache}cp\-rfup$RAM_LOG-T$HDD\_LOG2\>&1|$LOG_OUTPUTfisync}只需要在函数头部返回即可避免rsync:syncToDisk(){#nosynctoprotectemmcreturn0isSafeecho-e"\n\n$(date):Syncinglogsfrom$LOG_TYPE存储\n"|$LOG_OUTPUT如果["$USE_RSYNC"=true];然后${NoCache}rsync\-aXWv\--delete\--excludearmbian-ramlog.log\--links$RAM_LOG$HDD\_LOG2\>&1|$LOG_OUTPUTelse${NoCache}cp\-rfup$RAM_LOG-T$HDD\_LOG2\>&1|$LOG_OUTPUTfisync}可以再次观察/var/log和/var/log.hdd,会发现/var/log.hdd不再有后续的数据更新,而/var/log依然会在75自动更新使用过程中的日志拦截最后,armbian做了一个systemd服务:/lib/systemd/system/armbian-ramlog.service,启动时会创建一个zram磁盘,然后从emmc的/var/log.hdd加载数据到zram的/var/中日志路径,启动初始化完成。来源鱼儿的博客:PhicommN1-armbian保护emmc-禁止/var/log日志
