使用 INSTALL_MOD_STRIP 在 modules_install 的时候 strip 驱动, 减少磁盘占用

2023-05-16

GitHubCSDNKernelShow知乎掘金
NACHENG JianNA3584592006977729781592915999

1 问题描述


最近自己编译内核安装内核的时候, 总是遇到 /lib/modules 下空间不够, 导致内核安装有问题. 所以就想裁剪下.
分析的时候发现, 系统原生内核 /lib/modules/uname -r` 目录驱动大小只有 100M 左右, 但是我自己编译的驱动目录 1.4G 左右.

2 问题分析


2.1 问题原因


如果我们内核开启了 CONFIG_DEBUG_INFO 选项, 那么我们编译的二进制会带上很多调试信息. 内核镜像 Image 都是经过裁剪和优化的. 但是驱动没有. 所以导致单个 KO 的大小就很大.

因此可以把每个 KO 都 strip 一下子.

make modules_install 安装驱动之后, strip 一下子.

find /lib/modules/XXX -name *.ko | xargs strip -g

2.2 INSTALL_MOD_STRIP 选项


内核难道没有提供现成的选项么:

https://elixir.bootlin.com/linux/v5.3.6/source/Documentation/kbuild/kbuild.rst#182

https://elixir.bootlin.com/linux/v5.3.6/source/Documentation/kbuild/makefiles.rst#L1481

The default kernel configuration is configured to support as many hardware as possible. A non-stripped kernel with default configuration resulted in a size of 1897996 kB (including kernel + modules). When stripping many unnecessary drivers and options, it resulted in a size of 892892 kB which is a size reduction of 53% compared to the stock kernel.

    When installing the kernel modules, append the INSTALL_MOD_STRIP=1 option. This will strip all debugging symbols and reduced the size by 92% for me (from 892892 kB to 69356 kB). Note this will only affects modules to be installed and not the kernel (vmlinuz) itself.


Use the INSTALL_MOD_STRIP option for removing debugging symbols:

# make INSTALL_MOD_STRIP=1 modules_install
Similarly, for building the deb packages:
# make INSTALL_MOD_STRIP=1 deb-pkg

2.3 INSTALL_MOD_STRIP 的实现


如果在 build and install ko 的时候(make modules_install) 的时候加上INSTALL_MOD_STRIP =1的话
则build ko的时候 会加上–strip-debug 这样会让build出的ko size大幅缩小.
具体是在 kernel 根目录下面 Makefile 中有对INSTALL_MOD_STRIP=1 进行处理

#
# INSTALL_MOD_STRIP, if defined, will cause modules to be
# stripped after they are installed. If INSTALL_MOD_STRIP is '1', then
# the default option --strip-debug will be used. Otherwise,
# INSTALL_MOD_STRIP value will be used as the options to the strip command.

ifdef INSTALL_MOD_STRIP
ifeq ($(INSTALL_MOD_STRIP),1)
mod_strip_cmd = $(STRIP) --strip-debug
else
mod_strip_cmd = $(STRIP) $(INSTALL_MOD_STRIP)
endif # INSTALL_MOD_STRIP=1
else
mod_strip_cmd = true
endif # INSTALL_MOD_STRIP
export mod_strip_cmd

可见

  • 如果设置了 INSTALL_MOD_STRIP 为 1, 那么 mod_strip_cmd = strip --strip-debug
  • 如果设置了 INSTALL_MOD_STRIP 为其他参数, 那么 mod_strip_cmd = strip $(INSTALL_MOD_STRIP)
  • 如果没设置 INSTALL_MOD_STRIP, mod_strip_cmd 只会设置为 true

最终会在 scripts/Makefile.modinst中用到mod_strip_cmd

# Don't stop modules_install if we can't sign external modules.
quiet_cmd_modules_install = INSTALL $@
      cmd_modules_install = \
    mkdir -p $(2) ; \
    cp $@ $(2) ; \
    $(mod_strip_cmd) $(2)/$(notdir $@) ; \
    $(mod_sign_cmd) $(2)/$(notdir $@) $(patsubst %,|| true,$(KBUILD_EXTMOD)) ; \
    $(mod_compress_cmd) $(2)/$(notdir $@)
# Modules built outside the kernel source tree go into extra by default
INSTALL_MOD_DIR ?= extra
ext-mod-dir = $(INSTALL_MOD_DIR)$(subst $(patsubst %/,%,$(KBUILD_EXTMOD)),,$(@D))

modinst_dir = $(if $(KBUILD_EXTMOD),$(ext-mod-dir),kernel/$(@D))

$(modules):
 $(call cmd,modules_install,$(MODLIB)/$(modinst_dir))

modules_install 中会用驱动拷贝到安装目录, 然后用 mod_strip_cmd 处理驱动.
如果设置了 INSTALL_MOD_STRIP, 就会对驱动做 strip, 否则就什么也不做.

3 参考资料


why-is-install-mod-strip-not-on-by-default

如何編譯(Compile) Linux的核心(Kernel)

本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)

使用 INSTALL_MOD_STRIP 在 modules_install 的时候 strip 驱动, 减少磁盘占用 的相关文章

  • Mac上使用clion基于cmake 开发gtk gtk+

    gtk gtk 43 度娘介绍 xff1a GTK 43 xff08 GIMP Toolkit 是一套源码以LGPL许可协议分发 跨平台的图形工具包 最初是为GIMP写的 xff0c 已成为一个功能强大 设计灵活的一个通用图形库 xff0c
  • Mac上使用clion基于cmake 开发qt

    安装软件 清华 在线安装的qt安装器 https mirror tuna tsinghua edu cn qt archive online installers 3 0 里面选择项如下 xff1a 红色区域必选一项 xff0c 紫色区域自
  • docker make

    FROM debian 10 RUN apt get update amp amp apt get install y no install recommends curl python3 vim python3 distutils sql
  • U-SEM体验模型——让游戏交互设计的维度更加清晰

    U SEM体验模型 让游戏交互设计的维度更加清晰 U SEM体验模型 让游戏交互设计的维度更加清晰游戏交互设计的定位游戏交互设计的场景游戏对玩家输出玩家对游戏输入 游戏交互体验的维度 U SEM体验模型游戏交互的复杂度游戏交互设计的应用 游
  • Android 12 WiFi 连接状态轮转

    WiFi 学习资料整理 gt nbsp nbsp Android WiFi 目录 WiFi 学习资料整理 gt nbsp nbsp Android WiFi 1 nbsp WifiClientModeImpl和WPA Supplicant状
  • 扩展卡尔曼滤波(EKF)算法详细推导及仿真(Matlab)

    扩展卡尔曼滤波 xff08 EKF xff09 算法详细推导及仿真 xff08 Matlab xff09 扩展卡尔曼滤波算法是解决非线性状态估计问题最为直接的一种处理方法 xff0c 尽管EKF不是最精确的 最优 滤波器 xff0c 但在过
  • Linux中线程的同步与互斥、生产者消费模型和读者写者问题、死锁问题

    线程的同步与互斥 线程是一个存在进程中的一个执行控制流 xff0c 因为线程没有进程的独立性 xff0c 在进程内部线程的大部分资源数据都是共享的 xff0c 所以在使用的过程中就需要考虑到线程的安全和数据的可靠 不能因为线程之间资源的竞争
  • 解决The following packages have unmet dependencies问题!!!

    1 安装包的时候出现如下情况 xff08 缺少依赖 xff09 xff1a 2 解决方案 xff1a 尝试多种方法无果 xff0c 最终借助一个强大的包管理工具 xff08 aptitude xff09 终于成功了 xff01 xff01
  • linux的开机过程

    1 主机加电自检 xff0c 加载 BIOS 硬件信息 2 读取 MBR 的引导文件 GRUB LILO 3 引导 Linux 内核 4 运行第一个进程 init 进程号永远为 1 5 进入相应的运行级别 6 运行终端 xff0c 输入用户
  • Ubunt 20.04 使用CDROM或ISO作为安装源

    有些项目由于安全性的要求 xff0c 需要部署在没有互联网环境的内网中 xff0c 那么如何在离线环境中给ubuntu安装相关的软件就是考验大家的linux基础知识的时候了 本文就带领大家利用CDROM或者挂载ISO镜像两种方式配置ubun
  • 关于Intellij idea 报错:Error : java 不支持发行版本5的问题

    在Intellij idea中新建了一个Maven项目 xff0c 运行时报错如下 xff1a Error java 不支持发行版本5 本地运行用的是JDK9 xff0c 测试Java的Stream操作 xff0c 报错应该是项目编译配置使
  • Spring之配置类源码深度解析

    这篇文章是继 Spring之启动过程源码解析之后 xff0c 对Spring启动过程中用到的几个重要的方法进行详细的解读 目录 一 invokeBeanFactoryPostProcessors xff0c 执行BeanFactoryPos
  • 20210702剑指Offer03(数组中重复数字)

    找出数组中重复的数字 输入 xff1a 2 3 1 0 2 5 3 输出 xff1a 2 或 3 span class token keyword class span span class token class name Solutio
  • react异步数据如ajax请求应该放在哪个生命周期?

    对于同步的状态改变 xff0c 是可以放在componentWillMount xff0c 对于异步的 xff0c 最好好放在componentDidMount 但如果此时有若干细节需要处理 xff0c 比如你的组件需要渲染子组件 xff0
  • RabbitMQ exchange交换机机制

    目录 RabbitMQ 概念exchange交换机机制 什么是交换机binding xff1f Direct Exchange交换机Topic Exchange交换机Fanout Exchange交换机Header Exchange交换机R
  • 解决open-vm-tools无法复制粘贴文件问题

    在使用vmware kali linux时一直忍受着一个情况 xff1a open vm tools Error when getting information for file 34 tmp VMwareDnD 3jTONh xxx N
  • mipmap 和 drawable 的区别

    Android 在 API level 17 加入了 mipmap 技术 xff0c 对 bitmap 图片的渲染支持 mipmap 技术 xff0c 来提高渲染的速度和质量 mipmap 是一种很早就有的技术了 xff0c 翻译过来就是纹
  • LSTM与GRU

    LSTM 与 GRU 一 综述 LSTM 与 GRU是RNN的变种 xff0c 由于RNN存在梯度消失或梯度爆炸的问题 xff0c 所以RNN很难将信息从较早的时间步传送到后面的时间步 LSTM和GRU引入门 xff08 gate xff0
  • Pytorch 实战RNN

    一 简单实例 span class token comment coding utf8 span span class token keyword import span torch span class token keyword as
  • Pytorch : Dataset和DataLoader

    一 综述 Dataset 对数据进行抽象 xff0c 将数据包装为Dataset类 DataLoader 在 Dataset之上对数据进行进一步处理 xff0c 包括进行乱序处理 xff0c 获取一个batch size的数据等 二 Dat

随机推荐

  • 特征工程

    一 数据读取 1 1 读取CSV文件 1 1 1 原文件内容 1 1 2 读取csv span class token keyword import span csv csv file span class token operator 6
  • 代码命名规范

    代码命名规范 现在是2016年12月30日中午12点35分 xff0c 这是我第一次写博客 xff0c 用的是markdown编辑器 xff0c 还不太会用 今天就先简单的写一下 xff0c 看看写出来的效果是什么样的 xff01 xff0
  • Ubuntu18.04 离线安装nginx

    由于服务器位于内网环境且无法访问互联网 xff0c 需要离线安装nginx xff0c ubuntu18 04离线安装软件也并不复杂 xff0c 只是需要较大的耐心去搜集所需的包 xff0c 不过大家不用担心 xff0c 我已经为大家准备好
  • easyui combobox动态绑定数据

    1 jsp上的写法 lt input span class hljs keyword class span 61 span class hljs string 34 easyui combobox 34 span id 61 span cl
  • Echarts(二、柱状图(各参数详细描述))

    1 jsp页面 span class hljs tag lt span class hljs title body span gt span span class hljs tag lt span class hljs title div
  • js中级脚本算法

    1区间求值算法挑战 span class hljs function span class hljs keyword function span span class hljs title sumAll span span class hl
  • 常用easyUI -icon 图标

    1 样式 代码 xff1a lt DOCTYPE html gt lt html lang 61 34 en 34 gt lt head gt lt meta charset 61 34 UTF 8 34 gt lt title gt Ea
  • vue与后台交互数据(vue-resource)

    需要引入库 xff1a vue resource lt script src 61 34 https cdn jsdelivr net vue resource 1 0 3 vue resource min js 34 gt lt scri
  • Tensorflow——jupyter notebook调用某个库时,出现找不到这个库情况的解决方案

    1 激活tensorflow环境 终端下输入 xff1a source activate tensorflow 2 进入jupyter notebook 出现如下问题 xff1a 没有找到matplotlib库 3 解决方法 在tensor
  • 组合排序题目汇总(排列组合、卡特兰数和递归思想)

    组合排序题目汇总 排列组合矩阵走法A必须在B左边站队互不相邻站队分糖果球放入桶吃糖 卡特兰数括号匹配进出栈顺序 售票顺序二叉树不同的结构数高矮排列 递归思想信封装信 排列组合 矩阵走法 在6 9的方格中 xff0c 以左上角为起点 xff0
  • java.lang.IllegalStateException 错误原因及解决方法小记

    java lang IllegalStateException Cannot perform this operation because the connection pool has been closed at android dat
  • 架构设计三原则

    1 简单原则 xff1b 分析完业务场景的结构复杂性和逻辑复杂性后 xff0c 从业务场景和解决问题的角度出发 xff0c 选择和设计能够满足需求的方案 在简单架构和复杂架构都能满足要求的时候 xff0c 优先选择简单架构 xff0c 因为
  • mybatis的resultMap property爆红

    span class token tag span class token tag span class token punctuation lt span resultMap span span class token attr name
  • Ubuntu20.04 rc-local 配置开机自启动脚本

    1 rc local服务简介 Linux中的rc local服务是一个开机自动启动的 xff0c 调用开发人员或系统管理员编写的可执行脚本或命令的 xff0c 它的启动顺序是在系统所有服务加载完成之后执行 ubuntu20 04系统已经默认
  • zynq7000 linux axi-gpio驱动:重置axi-gpio驱动方法

    linux gpio 从内核空间导出到用户空间 petalinux 在制作 Linux 系统时 xff0c 会自动的将 gpio 从内核空间导出到用户空间 xff0c 在用户空间下可以通过 sysfs 方式控制 gpio xff1b 用户空
  • AndroidManifest的理解

    最近做二次开发 xff0c 修改别人代码的时候发现清单文件中多了很多奇怪的属性和标签 xff08 自己以前没见过的 xff09 xff0c 在不明白的情况下直接开发出现了很多奇怪的问题 所以痛下决心 xff0c 重新复习下这些基础知识 以下
  • 使用 zsh 后HOME/END 键以及小键盘失效

    1 问题描述 zsh是一款超赞的shell工具 xff0c 但是配置复杂 xff0c 有个闲着没事的程序员 xff0c 弄了一个开源项目 robbyrussell oh my zsh 截止目前 xff0c 58 8k 43 star就知道有
  • 开启内核地址随机化KASLR后, qemu 调试 kernel 不能设置断点

    1 问题 gdb 断点异常 这几天更新了 qemu 然后在进行 gdb 调试的时候 发现断点断不住了 之前都是正常的 从来没有出现过这种情况啊 继续分析下看看是哪里出现的异常 2 原因分析 难道是 gdb 或者 QEMU 出现 BUG 了
  • 深入理解 Linux Load Average

    一直不解 xff0c 为什么io占用较高时 xff0c 系统负载也会变高 xff0c 偶遇此文 xff0c 终解吾惑 1 load average介绍 1 1 load average 指标介绍 uptime和top等命令都可以看到load
  • 使用 INSTALL_MOD_STRIP 在 modules_install 的时候 strip 驱动, 减少磁盘占用

    GitHubCSDNKernelShow知乎掘金NACHENG JianNA3584592006977729781592915999 1 问题描述 最近自己编译内核安装内核的时候 总是遇到 lib modules 下空间不够 导致内核安装有