起因:
log4j日志滾動失敗,debug發現jvm調用native方法rename失敗,也就是系統調用rename失敗。
自己寫c程序系統調用rename,證實確實是這個問題。
日志打在容器里,日志目錄通過docker掛載到宿主機上,而對日志目錄設置了quota磁盤限額。掛載目錄下的文件rename會失敗,而它的子目錄下的文件rename不會失敗。
幾經排查定位到quata設置引起的,在容器更新或重啟后,目錄的quotaId和文件的quotaId就會對不上。
而 Invalid cross-device link 原意就是,文件在不同的文件系統下,rename系統調用失敗報這個錯誤碼。
查詢quota
#/usr/bin/lsattr -p -d /home/admin/logs/antdnsfilter/
設置quota
/usr/bin/chattr -p 16777675 +P /home/admin/logs/antdnsfilter/
取消quota
/usr/bin/chattr -p 0 -P /home/admin/logs/antdnsfilter/