我正在尝试构建 ksmbd 内核模块。我尝试了标签版本:
$ wget https://github.com/namjaejeon/ksmbd/archive/refs/tags/3.2.1.tar.gz
$ tar xvfz 3.2.1.tar.gz
$ cd ksmbd-3.2.1
$ make
[...]
CC [M] /tmp/ksmbd-3.2.1/transport_tcp.o
/tmp/ksmbd-3.2.1/transport_tcp.c: In function ‘create_socket’:
/tmp/ksmbd-3.2.1/transport_tcp.c:484:10: error: incompatible type for argument 4 of ‘sock_setsockopt’
(char __user *)iface->name,
^~~~~~~~~~~~~~~~~~~~~~~~~~
以及来自 git/master 的版本:
$ git clone [email protected]:namjaejeon/ksmbd.git
$ cd ksmbd
$ make
make -C /lib/modules/5.10.0-0.bpo.7-amd64/build M=/tmp/ksmbd modules
make[1]: Entering directory '/usr/src/linux-headers-5.10.0-0.bpo.7-amd64'
make[3]: *** No rule to make target '/tmp/ksmbd/ksmbd_spnego_negtokeninit.asn1.c', needed by '/tmp/ksmbd/ksmbd_spnego_negtokeninit.asn1.o'. Stop.
make[2]: *** [/usr/src/linux-headers-5.10.0-0.bpo.7-common/Makefile:1845: /tmp/ksmbd] Error 2
make[1]: *** [/usr/src/linux-headers-5.10.0-0.bpo.7-common/Makefile:185: __sub-make] Error 2
make[1]: Leaving directory '/usr/src/linux-headers-5.10.0-0.bpo.7-amd64'
make: *** [Makefile:47: all] Error 2
生成这些 *.asn1.c 文件的技巧是什么?
以供参考:
$ cat Makefile
[...]
$(obj)/asn1.o: $(obj)/ksmbd_spnego_negtokeninit.asn1.h $(obj)/ksmbd_spnego_negtokentarg.asn1.h
$(obj)/ksmbd_spnego_negtokeninit.asn1.o: $(obj)/ksmbd_spnego_negtokeninit.asn1.c $(obj)/ksmbd_spnego_negtokeninit.asn1.h
$(obj)/ksmbd_spnego_negtokentarg.asn1.o: $(obj)/ksmbd_spnego_negtokentarg.asn1.c $(obj)/ksmbd_spnego_negtokentarg.asn1.h
答案1
在 Fedora 和 RHEL 上,ksmbd
外部模块构建可以正常工作,因为kernel-devel
软件包附带了所有相关工具,特别是asn1_compiler
.
Debian 中没有等效的软件包,因此构建的唯一方法ksmbd
是使用完整的内核源代码,简单的选择是在内核树中构建它:
sudo apt install linux-source-5.10
cd $(mktemp -d)
tar xf /usr/src/linux-source-5.10.tar.xz
cd linux-source-5.10/fs
git clone https://github.com/namjaejeon/ksmbd
fs/Kconfig
对和进行必要的更改fs/Makefile
,然后
cd ..
make allmodconfig
make fs/ksmbd/ksmbd.ko