Linux-overlay啟動掛載為只讀或寫檔案異常
阿新 • • 發佈:2018-12-21
背景
路由器在使用過程中,偶像啟動掛載檔案系統異常,檢視列印後發現掛載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非空就刪除檔案並重啟進行恢復,方法簡單但是有副作用導致二次重啟;
2、在啟動掛載overlay時,發現work目錄非空也強制進行刪除,work目錄下存放的時中間檔案,可以直接刪除的;
解決
網上搜索發現有網友遇到此問題,並通過核心補丁解決此問題,這個問題應該算是overlay的bug,在後面高版本的核心已經解決了此問題,所以問題很簡單了,找到補丁或者對比高版本核心,合入清除work程式碼;
總結
需要對overlay檔案系統工作方式熟悉,並跟蹤程式碼發現問題和解決問題。