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

相关推荐
bosins2 小时前
WSL 迁移指南:如何将 Linux 环境完整复制到另一台电脑
linux·运维·服务器
企鹅的蚂蚁3 小时前
LubanCat RK3588 实时 Linux 开发(六):启用 gs_usb 驱动并完成 USB-CAN 收发
linux·rk3588·linux驱动·socketcan·gs_usb·usb-can
2601_962299884 小时前
Linux执行Python脚本方法
linux·python·脚本·解释器·shebang
snow@li4 小时前
服务器运维:Linux命令速查手册(全景梳理)
linux·服务器·网络
handler014 小时前
【Linux】线程与虚拟内存的底层世界
linux·运维·服务器·c++·线程·虚拟地址空间·共享内存
新时代牛马4 小时前
实时 Linux:PREEMPT_RT、延迟来源与观测
linux·运维·服务器
微露清风5 小时前
# Linux 进程全景:从 PCB 到 O(1) 调度队列
linux·服务器
H_oRIZoN_5 小时前
Linux入门DAY38(手写 HTTP 客户端抓取天气 + 简易 HTTP 服务器实现元器件 Web 系统)
linux·linux应用编程
fangjianj5 小时前
windows环境反弹shell
linux·windows·web安全
明月不会写代码5 小时前
Ubuntu 下 Kitty 终端配置记录
linux·ubuntu