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

相关推荐
HLC++11 小时前
Linux的进程间通信
android·linux·服务器
华清远见IT开放实验室13 小时前
实验室建设案例 | 石家庄科技信息职业学院嵌入式实验室——从底层硬件到系统应用,一所应用型高校的嵌入式人才培养这样落地
linux·arm开发·stm32·嵌入式硬件·高校·实验室建设
groundhappy15 小时前
idalib安装和codex ida-mcp配置
linux·开发语言·python
通信小小昕16 小时前
Ubuntu 26.04 中文输入法安装
linux·运维·ubuntu
张小姐的猫17 小时前
【Linux】网络编程 —— HTTP协议(上)
linux·运维·服务器·网络·http·单例模式·策略模式
栩栩云生17 小时前
AI 写代码犯的错,早被写进了错题集
linux·安全·ai编程
imc.1118 小时前
linux基础IO
linux·运维·服务器
BelongPanda20 小时前
Linux Nginx 纯手动 Let‘s Encrypt 泛域名证书配置教程
linux·nginx
酷可达拉斯21 小时前
Linux操作系统-shell编程(0)
linux·运维·服务器·python·云计算
2301_7779983421 小时前
Linux中断机制:操作系统如何高效运行
linux·运维·服务器