make modules_install和make install的区别

Linux内核编译与安装流程 中,make modules_installmake 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/*.konet/wireless/*.ko);

  • 关键动作

    1. 将所有.ko文件复制到/lib/modules/<kernel-version>/kernel/下的对应子目录(如drivers/fs/);

    2. 运行depmod -a <kernel-version>,生成模块依赖文件modules.depmodules.alias等),确保modprobe能正确查找模块;

    3. 部分架构/发行版会额外安装固件文件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为例):

    1. 复制内核镜像 :将arch/arm64/boot/Image(ZynqMP的未压缩镜像)或arch/arm64/boot/Image.gz(压缩版)复制到/boot,命名为vmlinuz-<version>(如vmlinuz-5.15.0-xilinx-v2022.1);

    2. 复制符号表 :将System.map复制到/boot,命名为System.map-<version>(用于调试内核Oops);

    3. 复制配置文件 :将.config复制到/boot,命名为config-<version>(记录内核编译选项);

    4. 生成initramfs (可选但常见):通过update-initramfs -c -k <version>生成初始内存文件系统(包含启动必需的驱动,如ZynqMP的PS端外设驱动),并链接为/boot/initrd.img-<version>

    5. 更新引导配置

      • 若用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单独处理;

  • ❌ 忽略depmodmake 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是"装发动机+钥匙"(内核+引导)------两者结合才能让新内核正常工作。

相关推荐
HABuo2 小时前
【linux线程(二)】线程互斥、线程同步、条件变量详细剖析
linux·运维·服务器·c语言·c++·ubuntu·centos
墨^O^2 小时前
进程与线程的核心区别及 Linux 启动全过程解析
linux·c++·笔记·学习
福楠2 小时前
现代C++ | C++14甜点特性
linux·c语言·开发语言·c++
Lugas Luo2 小时前
Kernel 5.10 针对 eMMC 的 Detect、Power、Add 及深度优化解析
linux·嵌入式硬件
charlie1145141912 小时前
嵌入式C++教程实战之Linux下的单片机编程:从零搭建 STM32 开发工具链(4)从零构建 STM32 构建系统
linux·开发语言·c++·stm32·单片机·学习·嵌入式
刘瑜澄2 小时前
[邪修方法]ubuntu 25 wayland窗口协议下使用utools
linux·运维·ubuntu·wayland·utools
魔都吴所谓2 小时前
【Linux】Ubuntu22.04 Docker+四大数据库(挂载本地)一键安装脚本
linux·数据库·docker
木下~learning2 小时前
初学Linux之设备树的使用| RK3399上实操
linux·设备树·rk3568·rk3399·平台总线和外设总线
Yupureki3 小时前
《Linux系统编程》19.线程同步与互斥
java·linux·服务器·c语言·开发语言·数据结构·c++