构建自己的内核并加载它

building own kernel and loading it

我下载了官方 linux 内核并尝试在 ubuntu wsl2 中构建它但是 /mnt/c/Users/Ivan/Documents/linux-5.4.50.tar/linux-5.4.50/linux-5.4.50/net/ipv4/netfilter/ipt_ECN.c:26:46: 警告:'struct ipt_ECN_info' 声明在里面参数列表在这个定义或声明之外是不可见的 26 | set_ect_ip(struct sk_buff *skb, const struct ipt_ECN_info *einfo) | ^~~~~~~~~~~~ /mnt/c/Users/Ivan/Documents/linux-5.4.50.tar/linux-5.4.50/linux-5.4.50/net/ipv4/netfilter/ipt_ECN.c: 在函数‘set_ect_ip’中: /mnt/c/Users/Ivan/Documents/linux-5.4.50.tar/linux-5.4.50/linux-5.4.50/net/ipv4/netfilter/ipt_ECN.c:30:44: 错误:无效使用未定义类型 'const struct ipt_ECN_info' 30 |如果 ((iph->tos & IPT_ECN_IP_MASK) != (einfo->ip_ect & IPT_ECN_IP_MASK)) { | ^~ /mnt/c/Users/Ivan/Documents/linux-5.4.50.tar/linux-5.4.50/linux-5.4.50/net/ipv4/netfilter/ipt_ECN.c:37:21: 错误:无效使用未定义类型 'const struct ipt_ECN_info' 37 | iph->tos |= (einfo->ip_ect & IPT_ECN_IP_MASK); | ^~ /mnt/c/Users/Ivan/Documents/linux-5.4.50.tar/linux-5.4.50/linux-5.4.50/net/ipv4/netfilter/ipt_ECN.c:在顶层: /mnt/c/Users/Ivan/Documents/linux-5.4.50.tar/linux-5.4.50/linux-5.4.50/net/ipv4/netfilter/ipt_ECN.c:45:47: 警告:'struct ipt_ECN_info' 声明在里面参数列表在这个定义或声明之外是不可见的 45 | set_ect_tcp(struct sk_buff *skb, const struct ipt_ECN_info *einfo) | ^~~~~~~~~~~~ /mnt/c/Users/Ivan/Documents/linux-5.4.50.tar/linux-5.4.50/linux-5.4.50/net/ipv4/netfilter/ipt_ECN.c: 在函数‘set_ect_tcp’中: /mnt/c/Users/Ivan/Documents/linux-5.4.50.tar/linux-5.4.50/linux-5.4.50/net/ipv4/netfilter/ipt_ECN.c:55:14: 错误:无效使用未定义类型 'const struct ipt_ECN_info' 55 | if ((!(einfo->operation & IPT_ECN_OP_SET_ECE) || | ^~ /mnt/c/Users/Ivan/Documents/linux-5.4.50.tar/linux-5.4.50/linux-5.4.50/net/ipv4/netfilter/ipt_ECN.c:55:28: 错误:'IPT_ECN_OP_SET_ECE' 未声明(首先在此功能中使用);您是指“IPT_ECN_OP_MATCH_ECE”吗? 55 | if ((!(einfo->operation & IPT_ECN_OP_SET_ECE) || | ^~~~~~~~~~~~~~~~~~ | IPT_ECN_OP_MATCH_ECE /mnt/c/Users/Ivan/Documents/linux-5.4.50.tar/linux-5.4.50/linux-5.4.50/net/ipv4/netfilter/ipt_ECN.c:55:28:注意:每个函数只报告每个未声明的标识符一次它出现在 /mnt/c/Users/Ivan/Documents/linux-5.4.50.tar/linux-5.4.50/linux-5.4.50/net/ipv4/netfilter/ipt_ECN.c:56:25: 错误:无效使用未定义类型 'const struct ipt_ECN_info' 56 | tcph->ece == einfo->proto.tcp.ece) && | ^~ /mnt/c/Users/Ivan/Documents/linux-5.4.50.tar/linux-5.4.50/linux-5.4.50/net/ipv4/netfilter/ipt_ECN.c:57:14: 错误:无效使用未定义类型 'const struct ipt_ECN_info' 57 | (!(einfo->operation & IPT_ECN_OP_SET_CWR) || | ^~ /mnt/c/Users/Ivan/Documents/linux-5.4.50.tar/linux-5.4.50/linux-5.4.50/net/ipv4/netfilter/ipt_ECN.c:57:28: 错误:'IPT_ECN_OP_SET_CWR' 未声明(首先在此功能中使用);您是指“IPT_ECN_OP_MATCH_CWR”吗? 57 | (!(einfo->operation & IPT_ECN_OP_SET_CWR) || | ^~~~~~~~~~~~~~~~~~ | IPT_ECN_OP_MATCH_CWR /mnt/c/Users/Ivan/Documents/linux-5.4.50.tar/linux-5.4.50/linux-5.4.50/net/ipv4/netfilter/ipt_ECN.c:58:25: 错误:无效使用未定义类型 'const struct ipt_ECN_info' 58 | tcph->cwr == einfo->proto.tcp.cwr)) | ^~ /mnt/c/Users/Ivan/Documents/linux-5.4.50.tar/linux-5.4.50/linux-5.4.50/net/ipv4/netfilter/ipt_ECN.c:66:11: 错误:无效使用未定义类型 'const struct ipt_ECN_info' 66 | if (einfo->operation & IPT_ECN_OP_SET_ECE) | ^~ /mnt/c/Users/Ivan/Documents/linux-5.4.50.tar/linux-5.4.50/linux-5.4.50/net/ipv4/netfilter/ipt_ECN.c:67:20: 错误:无效使用未定义类型 'const struct ipt_ECN_info' 67 | tcph->ece = einfo->proto.tcp.ece; | ^~ /mnt/c/Users/Ivan/Documents/linux-5.4.50.tar/linux-5.4.50/linux-5.4.50/net/ipv4/netfilter/ipt_ECN.c:68:11: 错误:无效使用未定义类型 'const struct ipt_ECN_info' 68 | if (einfo->operation & IPT_ECN_OP_SET_CWR) | ^~ /mnt/c/Users/Ivan/Documents/linux-5.4.50.tar/linux-5.4.50/linux-5.4.50/net/ipv4/netfilter/ipt_ECN.c:69:20: 错误:无效使用未定义类型 'const struct ipt_ECN_info' 69 | tcph->cwr = einfo->proto.tcp.cwr; | ^~ /mnt/c/Users/Ivan/Documents/linux-5.4.50.tar/linux-5.4.50/linux-5.4.50/net/ipv4/netfilter/ipt_ECN.c: 在函数‘ecn_t ’: /mnt/c/Users/Ivan/Documents/linux-5.4.50.tar/linux-5.4.50/linux-5.4.50/net/ipv4/netfilter/ipt_ECN.c:81:11: 错误:无效使用未定义类型 'const struct ipt_ECN_info' 81 | if (einfo->operation & IPT_ECN_OP_SET_IP) | ^~ /mnt/c/Users/Ivan/Documents/linux-5.4.50.tar/linux-5.4.50/linux-5.4.50/net/ipv4/netfilter/ipt_ECN.c:81:25: 错误:'IPT_ECN_OP_SET_IP' 未声明(首先在此功能中使用);您是指“IPT_ECN_OP_MATCH_IP”吗? 81 | if (einfo->operation & IPT_ECN_OP_SET_IP) | ^~~~~~~~~~~~~~~~~ | IPT_ECN_OP_MATCH_IP /mnt/c/Users/Ivan/Documents/linux-5.4.50.tar/linux-5.4.50/linux-5.4.50/net/ipv4/netfilter/ipt_ECN.c:82:24:错误:传递 'set_ect_ip 的参数 2 ' 来自不兼容的指针类型 [-Werror=incompatible-pointer-types] 82 |如果 (!set_ect_ip(skb, einfo)) | ^~~~~ | | |构造结构 ipt_ECN_info * /mnt/c/Users/Ivan/Documents/linux-5.4.50.tar/linux-5.4.50/linux-5.4.50/net/ipv4/netfilter/ipt_ECN.c:26:60:注意:预期的'const struct ipt_ECN_info * ' 但参数的类型是 'const struct ipt_ECN_info *' 26 | set_ect_ip(struct sk_buff *skb, const struct ipt_ECN_info *einfo) | ~~~~~~~~~~~~~~~~~~~~~~~~~~~^~~~~ /mnt/c/Users/Ivan/Documents/linux-5.4.50.tar/linux-5.4.50/linux-5.4.50/net/ipv4/netfilter/ipt_ECN.c:85:11: 错误:无效使用未定义类型 'const struct ipt_ECN_info' 85 | if (einfo->operation & (IPT_ECN_OP_SET_ECE | IPT_ECN_OP_SET_CWR) && | ^~ /mnt/c/Users/Ivan/Documents/linux-5.4.50.tar/linux-5.4.50/linux-5.4.50/net/ipv4/netfilter/ipt_ECN.c:85:26: 错误:'IPT_ECN_OP_SET_ECE' 未声明(首先在此功能中使用);您是指“IPT_ECN_OP_MATCH_ECE”吗? 85 | if (einfo->operation & (IPT_ECN_OP_SET_ECE | IPT_ECN_OP_SET_CWR) && | ^~~~~~~~~~~~~~~~~~ | IPT_ECN_OP_MATCH_ECE /mnt/c/Users/Ivan/Documents/linux-5.4.50.tar/linux-5.4.50/linux-5.4.50/net/ipv4/netfilter/ipt_ECN.c:85:47: 错误:'IPT_ECN_OP_SET_CWR' 未声明(首先在此功能中使用);您是指“IPT_ECN_OP_MATCH_CWR”吗? 85 | if (einfo->operation & (IPT_ECN_OP_SET_ECE | IPT_ECN_OP_SET_CWR) && | ^~~~~~~~~~~~~~~~~~ | IPT_ECN_OP_MATCH_CWR /mnt/c/Users/Ivan/Documents/linux-5.4.50.tar/linux-5.4.50/linux-5.4.50/net/ipv4/netfilter/ipt_ECN.c:87:25:错误:传递 'set_ect_tcp 的参数 2 ' 来自不兼容的指针类型 [-Werror=incompatible-pointer-types] 87 |如果 (!set_ect_tcp(skb, einfo)) | ^~~~~ | | |构造结构 ipt_ECN_info * /mnt/c/Users/Ivan/Documents/linux-5.4.50.tar/linux-5.4.50/linux-5.4.50/net/ipv4/netfilter/ipt_ECN.c:45:61:注意:预期的'const struct ipt_ECN_info * ' 但参数的类型是 'const struct ipt_ECN_info *' 45 | set_ect_tcp(struct sk_buff *skb, const struct ipt_ECN_info *einfo) | ~~~~~~~~~~~~~~~~~~~~~~~~~~~^~~~~ /mnt/c/Users/Ivan/Documents/linux-5.4.50.tar/linux-5.4.50/linux-5.4.50/net/ipv4/netfilter/ipt_ECN.c: 在函数‘ecn_tg_check’中: /mnt/c/Users/Ivan/Documents/linux-5.4.50.tar/linux-5.4.50/linux-5.4.50/net/ipv4/netfilter/ipt_ECN.c:98:11: 错误:无效使用未定义类型 'const struct ipt_ECN_info' 98 | if (einfo->operation & IPT_ECN_OP_MASK) | ^~ /mnt/c/Users/Ivan/Documents/linux-5.4.50.tar/linux-5.4.50/linux-5.4.50/net/ipv4/netfilter/ipt_ECN.c:98:25: 错误:'IPT_ECN_OP_MASK' 未声明(首先在此功能中使用);您是指“IPT_ECN_IP_MASK”吗? 98 | if (einfo->operation & IPT_ECN_OP_MASK) | ^~~~~~~~~~~~~~~ | IPT_ECN_IP_MASK /mnt/c/Users/Ivan/Documents/linux-5.4.50.tar/linux-5.4.50/linux-5.4.50/net/ipv4/netfilter/ipt_ECN.c:101:11: 错误:无效使用未定义类型 'const struct ipt_ECN_info' 101 |如果 (einfo->ip_ect & ~IPT_ECN_IP_MASK) | ^~ /mnt/c/Users/Ivan/Documents/linux-5.4.50.tar/linux-5.4.50/linux-5.4.50/net/ipv4/netfilter/ipt_ECN.c:104:12: 错误:无效使用未定义类型 'const struct ipt_ECN_info' 104 | if ((einfo->operation & (IPT_ECN_OP_SET_ECE|IPT_ECN_OP_SET_CWR)) && | ^~ /mnt/c/Users/Ivan/Documents/linux-5.4.50.tar/linux-5.4.50/linux-5.4.50/net/ipv4/netfilter/ipt_ECN.c:104:27: 错误:'IPT_ECN_OP_SET_ECE' 未声明(首先在此功能中使用);您是指“IPT_ECN_OP_MATCH_ECE”吗? 104 | if ((einfo->operation & (IPT_ECN_OP_SET_ECE|IPT_ECN_OP_SET_CWR)) && | ^~~~~~~~~~~~~~~~~~ | IPT_ECN_OP_MATCH_ECE /mnt/c/Users/Ivan/Documents/linux-5.4.50.tar/linux-5.4.50/linux-5.4.50/net/ipv4/netfilter/ipt_ECN.c:104:46: 错误:'IPT_ECN_OP_SET_CWR' 未声明(首先在此功能中使用);您是指“IPT_ECN_OP_MATCH_CWR”吗? 104 | if ((einfo->operation & (IPT_ECN_OP_SET_ECE|IPT_ECN_OP_SET_CWR)) && | ^~~~~~~~~~~~~~~~~~ | IPT_ECN_OP_MATCH_CWR /mnt/c/Users/Ivan/Documents/linux-5.4.50.tar/linux-5.4.50/linux-5.4.50/net/ipv4/netfilter/ipt_ECN.c:在顶层: /mnt/c/Users/Ivan/Documents/linux-5.4.50.tar/linux-5.4.50/linux-5.4.50/net/ipv4/netfilter/ipt_ECN.c:116:23: 错误:'sizeof' 对不完整类型的无效应用'结构 ipt_ECN_info' 116 | .targetsize = sizeof(结构 ipt_ECN_info), | ^~~~~~ cc1:一些警告被视为错误 make[4]: *** [/mnt/c/Users/Ivan/Documents/linux-5.4.50.tar/linux-5.4.50/linux-5.4.50/scripts/Makefile.build:266: net/ipv4/netfilter/ipt_ECN .o] 错误 1 make[3]: *** [/mnt/c/Users/Ivan/Documents/linux-5.4.50.tar/linux-5.4.50/linux-5.4.50/scripts/Makefile.build:500: net/ipv4/netfilter ] 错误 2 make[3]: *** 等待未完成的工作.... make[2]: *** [/mnt/c/Users/Ivan/Documents/linux-5.4.50.tar/linux-5.4.50/linux-5.4.50/scripts/Makefile.build:500: net/ipv4 ] 错误 2 make[2]: *** 等待未完成的作业....

我在 virtualbox ubuntu 中成功构建了内核,但在 wsl2 中加载它时出错。所以,我的问题是,如何构建一个可以在 wsl2 中使用的自己的 linux 内核?

我解决了。第一个问题是我提取源代码的文件夹不区分大小写,如此处所述 Compiling Linux Kernel Error xt_CONNMARK.h 提取后,我使用了 WSL2 女士的配置文件并修改为包含内核虚拟机。现在它可以正确编译并运行。