前言

在ceph的研发群里看到一个cepher提出一个问题,编译的ceph的二进制文件过大,因为我一直用的打包好的rpm包,没有关注这个问题,重新编译了一遍发现确实有这个问题

本篇就是记录如何解决这个问题的

打rpm包的方式

用我自己的环境编译的时候发现一个问题,编译出来的rpm包还是很大,开始怀疑是机器的原因,换了一台发现二进制包就很小了,然后查询了很多资料以后,找到了问题所在

在打rpm包的时候可以通过宏变量去控制是否打出一个的debug的包,这个包的作用就是把二进制文件当中包含的debug的相关的全部抽离出来形成一个新的rpm包,而我的环境不知道什么时候在/root/.rpmmacros添加进去了一个

%debug_package      %{nil}

搜寻资料后确定就是这个的问题,这个变量添加了以后,在打包的时候就不会进行debug相关包的剥离,然后打出的包就是巨大的,可以这样检查自己的rpmbuild的宏变量信息

[root@host1 ceph-10.2.6]#  rpmbuild --showrc|grep debug_package
%{!?__debug_package:
%{?__debug_package:%{__debug_install_post}}
-14: _enable_debug_packages 1
-14: debug_package
%global __debug_package 1
-14: install %{?_enable_debug_packages:%{?buildsubdir:%{debug_package}}}

如果开启了debug包抽离(默认就是开启的),那么rpmbuild在打包的过程中会有个调用

/usr/lib/rpm/find-debuginfo.sh --strict-build-id -m --run-dwz --dwz-low-mem-die-limit 10000000 --dwz-max-die-limit 110000000 /root/rpmbuild/BUILD/ceph-10.2.5

这个就是rpmbuild过程中,进行抽离debug信息的操作,也就是缩小二进制的过程,这个并不能直接执行命令,需要用rpmbuild -bb ceph.spec 打包的时候内部自动进行调用的

上面是rpm打包过程中进行的二进制缩小,那么如果我们是源码编译安装时候,如何缩小这个二进制,答案当然是可以的

源码编译安装的方式

./configure 后make生成的二进制文件就在./src下面了

我们以ceph-mon为例进行抽离

这个-O3并没有影响到太多的生成的二进制的大小,--with-debug会有一定的影响,关键还是strip的这个操作

./configure --with-debug  CXXFLAGS=-O3 CFLAGS=-O3 CCASFLAGS=-O3

所以默认的就行

如果整体进行安装就使用make install-strip安装即可

[root@host1 ceph-10.2.6]# make install-strip
[root@host1 ceph-10.2.6]# ll /usr/local/bin/ceph-osd
-rwxr-xr-x 1 root root 14266576 Mar 23 17:57 /usr/local/bin/ceph-osd
[root@host1 ceph-10.2.6]# ll /usr/local/bin/ceph-osd -hl
-rwxr-xr-x 1 root root 14M Mar 23 17:57 /usr/local/bin/ceph-osd
[root@host1 ceph-10.2.6]# ll src/ceph-osd -hl
-rwxr-xr-x 1 root root 248M Mar 23 17:54 src/ceph-osd

关键的strip的用法

gcc编译的时候带上-g参数,就是添加了debug的信息

gcc -g -o

分离debug information

[root@host1 ceph-10.2.6]#objcopy --only-keep-debug src/ceph-osd src/ceph-osd.debug
[root@host1 ceph-10.2.6]# ll src/ceph-osd -hl
-rwxr-xr-x 1 root root 248M Mar 23 17:54 src/ceph-osd
[root@host1 ceph-10.2.6]# ll src/ceph-osd.debug -hl
-rwxr-xr-x 1 root root 235M Mar 23 18:08 src/ceph-osd.debug

另外一种方法:

[root@host1 ceph-10.2.6]# cp src/ceph-osd src/ceph-osd.debug
[root@host1 ceph-10.2.6]# strip --only-keep-debug src/ceph-osd.debug
[root@host1 ceph-10.2.6]# ll src/ceph-osd.debug -hl
-rwxr-xr-x 1 root root 235M Mar 23 18:10 src/ceph-osd.debug

从原始文件去掉 debug information

[root@host1 ceph-10.2.6]# objcopy --strip-debug src/ceph-osd
[root@host1 ceph-10.2.6]# ll src/ceph-osd -hl
-rwxr-xr-x 1 root root 18M Mar 23 18:11 src/ceph-osd
objcopy --strip-debug main

另外一种方法:

[root@host1 ceph-10.2.6]# strip --strip-debug --strip-unneeded src/ceph-osd
[root@host1 ceph-10.2.6]# ll src/ceph-osd -hl
-rwxr-xr-x 1 root root 14M Mar 23 18:12 src/ceph-osd

启用debuglink模式

[root@host1 ceph-10.2.6]# objcopy --add-gnu-debuglink  src/ceph-osd.debug src/ceph-osd
[root@host1 ceph-10.2.6]# gdb src/ceph-osd

或者

[root@host1 ceph-10.2.6]# gdb -s src/ceph-osd.debug -e src/ceph-osd

总结

二进制包里面包含了debug的一些相关信息,可以通过strip的方式将内部的debug内容清理掉,这样就可以得到比较小的二进制包了

变更记录

Why Who When
创建 武汉-运维-磨渣 2017-03-23

编译的Ceph二进制文件过大问题的更多相关文章

  1. 源码编译安装ceph

    标签(空格分隔): ceph,ceph安装,ceph运维 centos7系统,aarch64架构下安装最新版本的ceph(13.0.0),x86架构的环境无需修改脚本即可. 一,物理环境: 内核版本: ...

  2. ubuntu 下编译安装ceph

    git clone --recursive https://github.com/ceph/ceph.git  cd ceph/  sudo apt-get install libtool   sud ...

  3. Ceph编译安装教程

    Ceph官方版本目前支持的纠删码很有限,实验室这块希望能够整合我们自主开发的纠删码BRS(Binary Reed–Solomon encoding),所以需要编译Ceph环境.Ceph官方目前推荐的安 ...

  4. [翻译]Go与C#对比 第三篇:编译、运行时、类型系统、模块和其它的一切

    Go vs C#, Part 3: Compiler, Runtime, Type System, Modules, and Everything Else | by Alex Yakunin | S ...

  5. Ceph 管理和使用

    ceph 管理 上次介绍了Ceph集群架构并且搭建了ceph集群,本节介绍ceph用户认证流程和挂载.cephFS.ceph RBD以及ceph mds高可用 1. ceph 授权流程和用户权限管理 ...

  6. CEPH-2:rbd功能详解及普通用户应用ceph集群

    ceph集群rbd使用详解 一个完整的ceph集群,可以提供块存储.文件系统和对象存储. 本节主要介绍rbd存储功能如何灵活的使用,集群背景: $ ceph -s cluster: id: 53717 ...

  7. 学习 opencv---(6)玩转opencv源代码:生成opencv 工程解决方案与opencv 源码编译

    在这篇中,我们探讨如何通过已安装的opencv选择不同的编译器类型,生成高度还原的OpenCV开发时的解决方案工程文件,欣赏OpenCV新版本中总计 六十六多万行的精妙源代码.我们可以对其源代码进行再 ...

  8. 比特币Bitcoin源代码安装编译

    body{ font: 16px/1.5em 微软雅黑,arial,verdana,helvetica,sans-serif; }        比特币 (货币符号: ฿;英文名:Bitcoin;英文 ...

  9. 我的复杂的OpenCV编译之路(OpenCV3.1.0 + VS2010 + Win7)

    教程:www.cnblogs.com/jliangqiu2016/p/5597501.html 这里主要记载我编译遇到的错误及解决方法. OpenCV3.1软件下载:https://sourcefor ...

随机推荐

  1. c++程序设计实践——银行系统

    银行系统 本科大二程序设计实践的作业,算是一个比较简单的项目吧,主要使用的编程范式有面向对象编程 其中引入<multimap><map>头文件实现多映射输出存取记录 引入< ...

  2. Kibana详细入门教程

    Kibana详细入门教程   目录 一.Kibana是什么 二.如何安装 三.如何加载自定义索引 四.如何搜索数据 五.如何切换中文 六.如何使用控制台 七.如何使用可视化 八.如何使用仪表盘 一.K ...

  3. lvs搭建dr负载均衡集群

    一,查看本地centos的版本: [root@localhost lib]# cat /etc/redhat-release CentOS Linux release 8.1.1911 (Core) ...

  4. CentOS8平台nginx日志的定时切分

    一,编写bash脚本: [root@yjweb crontab]# vi split_nginx_logs.sh 代码: #!/bin/bash # 备份nginx的日志 # 昨天的日期 file_d ...

  5. Dokuwiki安装教程

    一. CentOS设置 1. 更换阿里源 curl -o /etc/yum.repos.d/CentOS-Base.repo http://mirrors.aliyun.com/repo/Centos ...

  6. Java实现:抛开jieba等工具,写HMM+维特比算法进行词性标注

    一.前言:词性标注 二.经典维特比算法(Viterbi) 三.算法实现 四.完整代码 五.效果演示: 六.总结 一.前言:词性标注 词性标注(Part-Of-Speech tagging, POS t ...

  7. Java基础系列-Lambda

    原创文章,转载请标注出处:https://www.cnblogs.com/V1haoge/p/10755338.html 一.概述 JDK1.8引入了函数式编程,重点包括函数式接口.lambda表达式 ...

  8. python抓取动态验证码,具体第几帧数的位置静态图片

    一.代码+注解 import os from PIL import Image import requests import io def save_img(): headers = { 'User- ...

  9. spring cloud gateway整合sentinel作网关限流

    说明: sentinel可以作为各微服务的限流,也可以作为gateway网关的限流组件. spring cloud gateway有限流功能,但此处用sentinel来作为替待. 说明:sentine ...

  10. 理解cookie

    Cookie的有效期 Cookie的maxAge决定着Cookie的有效期,单位为秒(Second).Cookie中通过getMaxAge()方法与setMaxAge(int maxAge)方法来读写 ...