編譯Linux內核時出現“fatal error: linux/netfilter/xt_dscp: No such file or directory”。下面開始查找原因。
第一步:
找到編譯器報錯的.h和.c文件,發現linux-3.8.1/include/uapi/linux/netfilter下有2個類似的文件:
"xt_DSCP.h" 和 "xt_DSCP.h (Case Conflict 1)"
類似的問題還發生在xt_MARK.h, xt_CONNMARK.h, ipt_ECN.h等頭文件中。
第二步:
google了幾個小時,最終查到是case sensitive/insensitive filesystem 的問題,
也就是文件系統是否區分大小寫的問題,
比如:windows下的fat/ntfs文件系統是大小寫不敏感的,即“DSCP”和“dscp”是相同的字符串
linux下的ext3/ext4文件系統是大小寫敏感的,即“DSCP”和“dscp”是不同的字符串
這裏有一個相關的鏈接,是提交給內核netfilter部分開發人員的bug報告,要求處理文件名相同大小寫不同帶來的不方便的問題。
但是問題又來了:
我是在ext4文件系統下解壓內核壓縮包的,文件名相同大小寫不同應該是沒問題的,但是爲什麼出現"xt_DSCP.h (Case Conflict 1)"這樣名字的頭文件?
第三步:
於是突然想起來我的源碼包是放在Dropbox下的子文件夾的,也就是說linux-3.8.1會被同步到Dropbox的服務器,
而Dropbox的文件系統是case insensitive的,也就是說同步時Dropbox檢測到“xt_dscp.h”與"xt_DSCP.h"重名,於是改成了"xt_DSCP.h (Case Conflict 1)"。
結論:千萬別把linux內核源碼包解壓到Dropbox的任何子目錄下!