我正在 Debian Stretch 上编译 Linux 内核:
cd linux-4.9.59/
make menuconfig
make
到目前为止,一切都很好。
通常,我会发出make modules_install
, 将模块复制到/lib/modules/
.
但这个内核是为另一台机器准备的,所以我不想在本地复制模块。此外,我不是以 root 身份编译的,所以写入/lib/modules/
无论如何也行不通。
export INSTALL_MOD_PATH="../MY_NEW_KERNEL"
mkdir -vp "${INSTALL_MOD_PATH}
make modules_install
上面将新编译的模块复制到目录中../MY_NEW_KERNEL/lib/modules/
。但它不会生成modules.dep和map文件../MY_NEW_KERNEL/lib/modules/
通常,如果当前正在运行内核,我可以运行depmod
以在/lib/modules/
.但我没有在当前机器上运行这个内核。
即使当我将 bzImage 和模块复制到目标机器时,我也必须先重新启动到新内核,然后运行depmod
.
但问题是,内核将无法启动,因为它找不到模块,因为我没有运行depmod
.
depmod
当内核当前未运行时,如何运行内核模块?
答案1
为了回答你的问题,这应该有效。 System.map是在刚刚构建的源目录中创建的,并且是必需的:
$ depmod -b "$INSTALL_MOD_PATH" -F System.map 4.9.59
其中 4.9.59 是新的非运行内核版本。
现在,即使是普通的 Linux 内核源代码也允许构建 debian 软件包。
$ make help|grep deb
deb-pkg - Build both source and binary deb kernel packages
bindeb-pkg - Build only the binary kernel deb package
e,g:代替make
and make modules_install
(作为普通用户,不需要 root):
stretch-amd64:~/linux-source-4.13.10$ make bindeb-pkg -j4
[……很久以后……]
stretch-amd64:~/linux-source-4.13.10$ $ ls -1 ../*4.13.10*deb
../linux-headers-4.13.10_4.13.10-1_amd64.deb
../linux-image-4.13.10_4.13.10-1_amd64.deb
../linux-libc-dev_4.13.10-1_amd64.deb
当然,这可能需要一些额外的 debian 软件包,例如dpkg-dev
和fakeroot
一些相关的软件包,但如果目标也是 debian,那么在那里安装它可能会更容易。