编译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的任何子目录下!

Logo

更多推荐