make modules_install和make install的区别

在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);

  • 关键动作:

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

    2. 运行depmod -a <kernel-version>,生成模块依赖文件 (modules.dep、modules.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单独处理;

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

相关推荐
东城居士1 小时前
Linux驱动阻塞与非阻塞访问的理解
linux·嵌入式系统
..Dauntless..1 小时前
【Linux】进程地址空间初步理解
linux·运维·服务器
Julien20041 小时前
Docker 网络(一)
linux·运维·服务器·ssh·学习方法
杨云龙UP2 小时前
一次数据库查询缓慢故障复盘:大表数据增长、SQL全表扫描导致系统响应异常
linux·运维·服务器·数据库·sql·mysql
PellyKoo2 小时前
【linux运维】ubuntu+samba 用户组独占目录权限配置踩坑记
linux·运维·ubuntu
AR-26710-3 小时前
Linux Day15——系统管理复习
linux·运维
高山有多高3 小时前
【Linux笔记】Linux自定义Shell
linux·c++
姜鱼问生3 小时前
HTTPS 部署实战:未备案域名 + 非标端口的完整方案
linux·https
jackletter4 小时前
linux:安装 ubuntu 26.04.1
linux·ubuntu·ubuntu26.04.1
2401_869769594 小时前
make 进度条
linux