
在Linux内核编译与安装流程 中,make modules_install和make install是两个职责明确、互补但完全不同的命令 ,核心区别在于操作对象和目标 :前者负责安装内核模块 (.ko文件),后者负责安装内核核心镜像及引导相关文件。
1. 核心作用
| 命令 | 核心作用 |
|---|---|
make modules_install |
将编译好的内核模块 (.ko文件)复制到系统的模块目录(如/lib/modules/<kernel-version>/),并生成模块依赖关系(modules.dep等)。 |
make install |
将内核核心文件 (镜像、符号表、配置)复制到/boot目录,并更新引导加载程序(如GRUB/U-Boot)的配置,使新内核可启动。 |
2. 前置依赖
两者都需要先完成内核编译,但依赖的具体步骤不同:
-
make modules_install:必须先执行make modules(编译所有内核模块); -
make install:必须先执行make <image>(编译内核镜像,如make bzImage(x86)、make Image(ARM64/ZynqMP)或make zImage)。
3. 具体操作细节
(1)make modules_install:安装内核模块
-
操作对象 :编译生成的内核模块 (位于各子目录的
*.ko文件,如drivers/video/*.ko、net/wireless/*.ko); -
关键动作:
-
将所有
.ko文件复制到/lib/modules/<kernel-version>/kernel/下的对应子目录(如drivers/、fs/); -
运行
depmod -a <kernel-version>,生成模块依赖文件 (modules.dep、modules.alias等),确保modprobe能正确查找模块; -
部分架构/发行版会额外安装固件文件 (
firmware/)到/lib/firmware/<kernel-version>/(如无线网卡固件)。
-
-
示例(ZynqMP ARM64):
假设内核版本为
5.15.0-xilinx-v2022.1,则模块会被安装到/lib/modules/5.15.0-xilinx-v2022.1/kernel/,并通过depmod生成依赖。
(2)make install:安装内核核心与引导
-
操作对象 :内核镜像文件 、符号表 、配置文件;
-
关键动作(以ARM64/ZynqMP为例):
-
复制内核镜像 :将
arch/arm64/boot/Image(ZynqMP的未压缩镜像)或arch/arm64/boot/Image.gz(压缩版)复制到/boot,命名为vmlinuz-<version>(如vmlinuz-5.15.0-xilinx-v2022.1); -
复制符号表 :将
System.map复制到/boot,命名为System.map-<version>(用于调试内核Oops); -
复制配置文件 :将
.config复制到/boot,命名为config-<version>(记录内核编译选项); -
生成initramfs (可选但常见):通过
update-initramfs -c -k <version>生成初始内存文件系统(包含启动必需的驱动,如ZynqMP的PS端外设驱动),并链接为/boot/initrd.img-<version>; -
更新引导配置:
-
若用GRUB(x86/服务器):运行
update-grub,自动添加新内核的启动项到/boot/grub/grub.cfg; -
若用U-Boot(嵌入式/ZynqMP):需手动更新U-Boot环境变量(如
bootcmd),指向新内核镜像和initramfs的位置(如SD卡的/boot分区)。
-
-
4. 对系统的影响
-
仅执行
make modules_install:模块被安装到
/lib/modules/,但无新内核镜像 ------系统仍用旧内核启动,新模块可能因版本不匹配 (vermagic字段)无法加载(旧内核的vermagic与新模块不一致)。 -
仅执行
make install:新内核可启动,但无对应模块------大部分硬件驱动(如ZynqMP的HDMI、网口、摄像头)无法加载,系统功能缺失。
-
正确流程 :先
make modules_install,再make install(或合并为make modules_install install,但建议分步执行以便排查问题)。
5. 常见误区
-
❌ 误以为
make install会安装模块:不会 !模块必须由make modules_install单独处理; -
❌ 忽略
depmod:make modules_install会自动运行depmod,但如果手动复制模块,需手动执行depmod -a; -
❌ 混淆镜像类型:ZynqMP用ARM64架构 ,内核镜像是
arch/arm64/boot/Image(而非x86的bzImage),make install会正确识别并复制。
总结
| 维度 | make modules_install |
make install |
|---|---|---|
| 操作对象 | 内核模块(.ko) | 内核镜像、System.map、config、initramfs |
| 目标 | 让系统能加载新模块 | 让系统能启动新内核 |
| 必要前置 | make modules |
make <image>(如make Image) |
| 关键输出 | /lib/modules/<version>/ | /boot/vmlinuz-<version>、initrd.img-<version> |
| 对引导的影响 | 无 | 更新GRUB/U-Boot配置 |
一句话结论 :make modules_install是"装零件"(模块),make install是"装发动机+钥匙"(内核+引导)------两者结合才能让新内核正常工作。
