背景

产品实验室出现一例日志转储问题,经定位发现当前版本号没有提供nice命令,而cron拉起定时任务时,却调用了nice命令,对定时任务做优先级调整。

毫无疑问兴许版本号须要提供nice命令,可是是否能在之前的版本号升级到兴许版本号时。将该nice命令copy一份到升级前的版本号里,先做日志转储。再升级呢?

Linux 兼容性

当前版本号的nice命令,是否能在低版本号上正常执行。这属于二进制兼容性的范畴。

Linux领域有个二进制规范标准,称为LSB(Linux Standards Base),这个组织专门制订Linux二进制接口的标准(当前最新公布标准为LSB 5.0),不论什么影响二进制接口变化的因素,她都须要考虑。

当然LSB支持的二进制兼容性是向后兼容(backwards compatibility),这是什么意思呢?简单地说就是:

  1. 在低版本号Linux编译的二进制,能够直接执行在高版本号上
  2. 在高版本号Linux编译的二进制,不能保证一定能够执行在低版本号上

其实,我们遇到的兼容性问题都是第2类。而非第1类。在这样的场景上(特别是开源软件)。从技术上是无法做保证100%兼容的。

为什么会有LSB,大家想过吗?仅仅要API兼容,大不了编译一把出一个新的二进制,不就能够解决这个二进制兼容性问题了么?

那是由于Linux发行版许多(几百种不在话下,著名者如Redhat。SUSE和Ubuntu)。站在软件供应商的角度试想一下,比方Linux防火墙(Checkpoint)软件供应商。他们就须要在每一个发行版上公布一个二进制软件,并且同一发行版不同版本号(比方Ubuntu 12.4和14.4)都得公布不同的二进制软件。对谁来说都听吃不消。

二进制兼容。在业界其实算不上什么新奇的事情,各种场景下根本无法重编和重出版本号(由于老版本号压根就没有这个东西,重出版本号解决不了升级场景。由于他影响不了老版本号)

LSB就是来解决这个事情的,仅仅需公布一个二进制程序,就能通吃全部的公布版。

nice命令依赖分析

前面提及,LSB或者一般软件,仅仅能保证向后兼容,无法保证向前兼容。如今遇到的问题是有限版本号的向前兼容问题,仅仅须要正向分析一下曾经全部版本号是否OK就能够了。

当前全部历史版本号,kernel和glibc的版本号号是没有发生变化的,他们遵守的LSB版本号也是同样的,从这个角度来说。应该是兼容的。

除非nice依赖glibc/kernel二进制中的新增接口。造成新软件老法在老版本号上执行。

nice命令库依赖分析

通过ldd命令可一目了然知道nice命令依赖那些执行库:

  1. $ ldd /usr/bin/nice
  2. linux-vdso.so.1 => (0x00007ff5761000)
  3. libc.so.6 => /lib64/libc.so.6 (0x00007fd4c2268000)
  4. /lib64/ld-linux-x86-64.so.2(0x00007fd4c25c6000)

咋一看nice依赖3个执行库,各自是 linux-vdso, libc以及ld-linux。

  1. linux-vdso.so.1是Linux kernel提供的虚拟库,不是nice二进制明白依赖的。
  2. libc.so.6正是 glibc执行库,nice依赖于它
  3. ld-linux-x86-64.so.2是86-64 Linux的动态链接器

综上。仅仅需之前全部版本号都提供libc.so.6和ld-linux-x86-64.so.2这两个库。并且SONAME保持一致就可以。

经分析,满足。

nice命令函数依赖分析

通过readelf可查看nice命令所调用的外部定义函数和变量:

  1. $ readelf -s /usr/bin/nice | grep UND | grep -v NOTYPE
  2. 1:0000000000000000 0 FUNC GLOBAL DEFAULT UND memset@GLIBC_2.2.5 (2)
  3. 2:0000000000000000 0 FUNC GLOBAL DEFAULT UND mbrtowc@GLIBC_2.2.5 (2)
  4. 3:0000000000000000 0 FUNC GLOBAL DEFAULT UND abort@GLIBC_2.2.5 (2)
  5. 4:0000000000000000 0 FUNC GLOBAL DEFAULT UND __fprintf_chk@GLIBC_2.3.4 (3)
  6. 6:0000000000000000 0 FUNC GLOBAL DEFAULT UND textdomain@GLIBC_2.2.5 (2)
  7. 7:0000000000000000 0 FUNC GLOBAL DEFAULT UND execvp@GLIBC_2.2.5 (2)
  8. 8:0000000000000000 0 FUNC GLOBAL DEFAULT UND exit@GLIBC_2.2.5 (2)
  9. 9:0000000000000000 0 FUNC GLOBAL DEFAULT UND __assert_fail@GLIBC_2.2.5 (2)
  10. 10:0000000000000000 0 FUNC GLOBAL DEFAULT UND __printf_chk@GLIBC_2.3.4 (3)
  11. 11:0000000000000000 0 FUNC GLOBAL DEFAULT UND bindtextdomain@GLIBC_2.2.5 (2)
  12. 12:0000000000000000 0 FUNC GLOBAL DEFAULT UND malloc@GLIBC_2.2.5 (2)
  13. 13:0000000000000000 0 FUNC GLOBAL DEFAULT UND __libc_start_main@GLIBC_2.2.5 (2)
  14. 14:0000000000000000 0 FUNC GLOBAL DEFAULT UND getpriority@GLIBC_2.2.5 (2)
  15. 15:0000000000000000 0 FUNC GLOBAL DEFAULT UND _exit@GLIBC_2.2.5 (2)
  16. 16:0000000000000000 0 FUNC GLOBAL DEFAULT UND __cxa_atexit@GLIBC_2.2.5 (2)
  17. 17:0000000000000000 0 FUNC GLOBAL DEFAULT UND free@GLIBC_2.2.5 (2)
  18. 18:0000000000000000 0 FUNC GLOBAL DEFAULT UND strlen@GLIBC_2.2.5 (2)
  19. 19:0000000000000000 0 FUNC GLOBAL DEFAULT UND opterr@GLIBC_2.2.5 (2)
  20. 20:0000000000000000 0 FUNC GLOBAL DEFAULT UND __ctype_get_mb_cur_max@GLIBC_2.2.5 (2)
  21. 21:0000000000000000 0 FUNC GLOBAL DEFAULT UND __vfprintf_chk@GLIBC_2.3.4 (3)
  22. 22:0000000000000000 0 FUNC GLOBAL DEFAULT UND __ctpe_b_loc@GLIBC_2.3.4 (3)
  23. 23:0000000000000000 0 FUNC GLOBAL DEFAULT UND fputs_unlocked@GLIBC_2.2.5 (2)
  24. 24:0000000000000000 0 FUNC GLOBAL DEFAULT UND setpriority@GLIBC_2.2.5 (2)
  25. 25:0000000000000000 0 FUNC GLOBAL DEFAULT UND __fpending@GLIBC_2.2.5 (2)
  26. 26:0000000000000000 0 FUNC GLOBAL DEFAULT UND strtol@GLIBC_2.2.5 (2)
  27. 27:0000000000000000 0 FUNC GLOBAL DEFAULT UND memcpy@GLIBC_2.2.5 (2)
  28. 28:0000000000000000 0 FUNC GLOBAL DEFAULT UND strchr@GLIBC_2.2.5 (2)
  29. 29:0000000000000000 0 FUNC GLOBAL DEFAULT UND getopt_long@GLIBC_2.2.5 (2)
  30. 30:0000000000000000 0 FUNC GLOBAL

posted on
2017-07-21 09:35 
slgkaifa 
阅读(...) 
评论(...) 
编辑 
收藏

nice命令兼容性分析实例的更多相关文章

  1. Oracle dbms_lock.sleep()存储过程使用技巧-场景-分析-实例

    <Oracle dbms_lock.sleep()存储过程使用技巧>-场景-分析-实例 摘要:今天是2014年3月10日,北京,雾霾,下午组织相关部门开会.会议的结尾一名开发工程师找到了我 ...

  2. sodu 命令场景分析

    摘自:http://www.cnblogs.com/hazir/p/sudo_command.html sudo 命令情景分析   Linux 下使用 sudo 命令,可以让普通用户也能执行一些或者全 ...

  3. ELK 日志分析实例

    ELK 日志分析实例一.ELK-web日志分析二.ELK-MySQL 慢查询日志分析三.ELK-SSH登陆日志分析四.ELK-vsftpd 日志分析 一.ELK-web日志分析 通过logstash ...

  4. 使用python 模仿mybinlog 命令 二进制分析mysql binlog

    出处:黑洞中的奇点 的博客 http://www.cnblogs.com/kelvin19840813/ 您的支持是对博主最大的鼓励,感谢您的认真阅读.本文版权归作者所有,欢迎转载,但请保留该声明. ...

  5. 基于linux与busybox的reboot命令流程分析

    http://www.xuebuyuan.com/736763.html 基于Linux与Busybox的Reboot命令流程分析 ********************************** ...

  6. 利用Python进行异常值分析实例代码

    利用Python进行异常值分析实例代码 异常值是指样本中的个别值,也称为离群点,其数值明显偏离其余的观测值.常用检测方法3σ原则和箱型图.其中,3σ原则只适用服从正态分布的数据.在3σ原则下,异常值被 ...

  7. php开发面试题---游戏面向对象设计与分析实例

    php开发面试题---游戏面向对象设计与分析实例 一.总结 一句话总结: 不要光空想,多看几个实例就知道自己的游戏该怎么设计了 根据实例去理解面向对象编程的的六大原则 1.英雄种类分别有:战士.法师. ...

  8. Uboot命令U_BOOT_CMD分析

    其中U_BOOT_CMD命令格式如下: U_BOOT_CMD(name,maxargs,repeatable,command,"usage","help") 各 ...

  9. sudo 命令情景分析

    Linux 下使用 sudo 命令,可以让普通用户也能执行一些或者全部的 root 命令.本文就对我们常用到 sudo 操作情景进行简单分析,通过一些例子来了解 sudo 命令相关的技巧. 情景一:用 ...

随机推荐

  1. ubuntu安装jdk<服务器>

    服务器 阿里云服务器Ubuntu安装jdk7 2014-08-25 16:44 |  coding云 |  5825次阅读 | 6条评论   一.下载jdk 可以先下载到本地,然后ftp到服务器 官方 ...

  2. linux tomcat安装(二)

    安装步骤: 1.下载 Tomcat 下载 apache-tomcat-7.0.69.tar.gz(官方网址:http://tomcat.apache.org/) 2.解压 Tomcat 解压 apac ...

  3. inux读取ISO文件或是光驱的方法--挂载

    inux读取ISO文件或是光驱的方法--挂载 首先在虚拟机选项的设置里设置CD/DVD选项,勾选:Connect at power on 再在连接中选择:Use ISO image file即选择镜像 ...

  4. spring-boot项目MapperScan注解包含多个包

    单个包 @MapperScan("com.mysiteforme.admin.dao") 多个包 @MapperScan({"com.mysiteforme.admin. ...

  5. 通过设置chrome浏览器解决跨域问题,在本地进行开发工作

    后端跨域权限无法打开,于是去网上找了下我这边能不能解决 现在的浏览器出于安全策略的限制,都是不允许跨域的,但是开发的时候经常需要一些别的域的接口,特别是一些接口不是自己能控制的时候,往往会造成开发困难 ...

  6. 34深入理解C指针之---通过字符串传递函数

    一.通过字符串传递函数 1.定义:可以使用函数名(字符串)调用函数,也可以使用函数指针调用函数,将两者结合 2.特征: 1).在函数声明时使用函数指针 2).调用函数时使用函数名称(字符串) 3).可 ...

  7. Python基础数据类型补充及深浅拷贝

    本节主要内容:1. 基础数据类型补充2. set集合3. 深浅拷贝主要内容:一. 基础数据类型补充首先关于int和str在之前的学习中已经讲了80%以上了. 所以剩下的自己看一看就可以了.我们补充给一 ...

  8. 树讲解——紧急集合(lca)

    大视野    1787: [Ahoi2008]Meet 紧急集合 Time Limit: 20 Sec  Memory Limit: 162 MBSubmit: 3067  Solved: 1365[ ...

  9. Xamarin XAML语言教程对象元素的声明方式

    Xamarin XAML语言教程对象元素的声明方式 XAML的对象元素的声明有两种形式,分别为包含属性的特性语法形式以及对象元素语法形式.在1.4小节中,我们看到了其中一种对XAML对象元素的声明方式 ...

  10. java常用组件

    一.Jpanel 1.面板:容器类组件 2.用途:与Layout配合使用,JFrame—>JPanel—>Layout 二.JTextField 1.文本框 2.JPasswordFiel ...