背景

    路由器在使用过程中,偶像启动挂载文件系统异常,查看打印后发现挂载overlay异常,打印错误代码-39,跟踪代码发现由于work目录非空导致清除失败,接下来分析原因。

overlay原理

    通过overlay挂载,可保护lower分区使其只读,对lower分区需改文件放在upper目录,workdir目录用于文件的原子性保证。

错误打印

overlayfs: cleanup of 'work/work' failed (-39)

Unable to handle kernel NULL pointer dereference at virtual address 00000030
pgd = ffffffc034282000
[00000030] *pgd=00000000343ca003, *pud=00000000343ca003, *pmd=000000003e1c6003, *pte=0000000000000000
Internal error: Oops: 96000007 [#1] PREEMPT SMP
Modules linked in:
CPU: 1 PID: 910 Comm: rm Not tainted 4.1.27 #1
Hardware name: Broadcom-v8A (DT)
task: ffffffc03e103100 ti: ffffffc033c7c000 task.ti: ffffffc033c7c000
PC is at ovl_do_remove+0x158/0x394
LR is at ovl_do_remove+0x150/0x394
pc : [<ffffffc00023c514>] lr : [<ffffffc00023c50c>] pstate: 20000145
sp : ffffffc033c7fcd0
x29: ffffffc033c7fcd0 x28: ffffffc033c7c000
x27: 0000000000000000 x26: 00000000ffffffec
x25: 00000000ffffffeb x24: 0000000000000000
x23: ffffffc03e5817d0 x22: ffffffc03423a7c0
x21: ffffffc03e581728 x20: 00000000fffffff4
x19: ffffffc03e57f0d8 x18: 0000000000000000
x17: 0000000000000000 x16: ffffffc00014541c
x15: 0000000000000000 x14: 0000003fffffffff
x13: 0000003fffffffff x12: 0000000000000000
x11: 0000000000000000 x10: 0000000000000000
x9 : 0000000000000000 x8 : 0000000000000000
x7 : ffffffc0007f7678 x6 : ffffffc03423a838
x5 : 0000000000000000 x4 : 0000000000000000
x3 : 0000000000000000 x2 : ffffffc03e1035c8
x1 : ffffffc03ea9f9c0 x0 : ffffffc03e55cd98 

解决思路

    1、最简单的方式在启动脚本种检查work非空就删除文件并重启进行恢复,方法简单但是有副作用导致二次重启;

dir="/xxx/work/work"

is_empty_dir(){
		return `/bin/ls -A $1|wc -w`
}

if [ -d $dir ]; then
		/bin/echo "$dir is dir"
		if is_empty_dir $dir
		then
				/bin/echo "$dir is empty"
		else
				/bin/echo "$dir is not empty, cleanup!"
				/bin/rm -rf $dir/*
				reboot
		fi
else
		echo "$dir is NULL!"
fi

    2、在启动挂载overlay时,发现work目录非空也强制进行删除,work目录下存放的时中间文件,可以直接删除的;

解决

    网上搜索发现有网友遇到此问题,并通过内核补丁解决此问题,这个问题应该算是overlay的bug,在后面高版本的内核已经解决了此问题,所以问题很简单了,找到补丁或者对比高版本内核,合入清除work代码;

    代码分析和补丁文件见另外一篇博客:https://mp.csdn.net/postedit/84069943

    网友问题解决链接:http://lists.infradead.org/pipermail/linux-mtd/2016-September/069148.html

总结

    需要对overlay文件系统工作方式熟悉,并跟踪代码发现问题和解决问题。

12-07 03:50