Linux就这个范儿 第19章 团结就是力量 LSB是Linux标准化基地(Linux Standards Base)的简称

Linux就这个范儿 第19章 团结就是力量  LSB是Linux标准化基地(Linux Standards Base)的简称

html

 

这个图片好可爱,它是LSB组织的图标。你确定会问:“图标这么设计必定有说法吧?”回答:“YES”。
LSB是Linux标准化基地(Linux Standards Base)的简称,目前是FSG(Free Standards Group)中最为活跃的一个工做组。它诞生的目的是为了推动Linux二进制兼容性,即二进制程序不须要从新编译,就能够在其余发行版上运行。一直以来,Linux都试图遵照POSIX标准,所以在源代码级上已具备很好的兼容性,然而对于Linux来讲,仅仅保证源码级的兼容性仍是不能彻底知足要求的。软件开发商不得不面临在不一样硬件平台上移植应用程序的问题。若是系统生命周期长,还要投入足够资源进行技术支持。就连咱们最熟悉的x86平台,发行版也多如牛毛,软件开发商不可能为每一个发行版都发布一个二进制文件。这便致使了常常会有软件用户问:“这个软件运行在哪一个Linux上?”的状况发生。
上面的目标根形象地描绘了LSB的使命。它的使命就是给表明自由的小企鹅量体裁衣。在给特定企鹅的体形和三维标准以后,软件开发者就能够设计并裁减出各色花样的衣服(应用程序),这样无论穿在哪只企鹅身上,都会很是合身。
为了保证应用软件开发者所开发的应用不管是在不一样发行版本之间,仍是同一版本的升级系统上都能正确运行,LSB在跟各大发布商咨询后,公布了描述必须支持的最小API的集合。在这个标准基础上LSB还提供了测试和工具方面的支持,使应用开发者目标一致,防止在不一样的版本之间存在没必要要的差别,减小在不一样系统上作开发和维护的苦恼。linux


19.1 标准的前世此生
LSB以POSIX和SUS(Single UNIX Specification)标准为基础,并对其余领域(例如图形)中源代码的一些标准进行了扩充,还增长了对二进制可执行文件格式规范的定义,以确保Linux应用程序的源码和二进制文件的兼容性。既然LSB和POSIX有关,咱们就先来看看POSIX标准的前世此生吧。c++


19.1.1 一场拆分引起的标准
AT&T公司的拆分一直被看成反垄断的著名案例而被研究者们所津津乐道。拆分以前的AT&T几乎垄断了美国的州内、州际和国际电话业务。因为拆分引来了竞争和进步,新兴电信运营商如雨后春笋般地相继出现,带给美国电信市场极大的繁荣,也给消费者带来了不少的实惠。在这个背景下,AT&T借着这个机会进入了计算机领域。当时Unix社区在忙着Unix大战,贝尔实验室的全部AT&T公司手持UNIX的版权,它和伯克利的BSD是这场大战中两个最主要的版本,这而位大侠在技术和文化方面分歧很大,应用程序根难在两个系统上平滑地移植因而在群众们要求兼容的强烈的呼声中,IEEE(Institute of Electical and Electronic Engineers)的1003委员开始出面解决这个问题,制定了一系列的标准,造成了后来的POSIX(Portable Operationg System Interface for UNIX)标准。其目的是为兼容各类UNIX变种的应用程序而制定应用程序的编程接口(API)规范,从而确保这些应用程序的兼容性。好东西老是有人爱,这些标准后来被ISO/IEC采纳,成为ISO/IEC9945标准。
POSIX在15份不一样的文档中对操做系统与用户软件的接口进行了规范,主要内容包括3个部分:
· POSIX 系统调用
· POSIX 命令和工具
· POSIX 兼容测试
同时还提供了一套POSIX兼容性测试工具,成为PCTS(POSIX Conformance一致性 Test Suite)。后来POSIX标准又进行了不少扩充,主要包括:
· POSIX.1:核心服务:主要集成了ANSIC标准,包括进程建立和控制、信号、浮点异常、段错误、非法指令、总线错误、定时器、文件和目录操做、管道、C标准库、I/O端口和控制。
· POSIX.1b:实时扩展:包括优先级调度、实时信号、时钟和定时器、信号量、消息传递、共享内存、异步和同步I/O、内存锁。
· POSIX.lc:线程扩展:包括线程建立和控制、线程调度、线程同步、信号处理。
POSIX最初的设计目标是为Unix System V 和BSD Unix等Unix系统上的特性制定规范,使其能够实现更好的可移植性。不知不觉地愈来愈多的系统兼容POSIX标准,例如RTOS(LynxOS rea-time operating system)等。连Linux的老对手微软也开始支持POSIX,它的Windows NT就兼容POSIX标准的实时部分(POSIX.1b)。Windows上还能够经过安装Windows的Services for UNIX或Cygwin来加强对POSIX标准的兼容度。数据库


19.1.2 站在POSIX肩膀上的LSB
在POSIX标准基础上,LSB制定了应用程序与运行环境之间的二进制接口,这主要是基于如下标准:
· Single UNIX Specification(SUS)
· System V Interface Definition(SVID)
· Compilers for the Intel Itanium processor
· C++ABI
· System V Application Binary Interface(ABI)
LSB充分吸收了UNIX标准化努力所取得的经验和教训,不像POSIX仅仅定义了编程接口标准,并且还包含了一个二进制兼容层。它对各个库提供的接口以及与每一个接口相关的数据结构和常量进行了定义,主要包含如下三个方面的内容:
1.规范:一系列兼容应用和发行版本必须达到的内容;
2.工具:一系列工具,测试和信息系统,以一种写做的方式帮助开发LSB兼容应用和Linux发行版本,并能帮助完成自动认证过程。
3.认证:使用工具和规范保证平台/应用兼容的双向承诺的过程。
LSB是Linux操做系统的一个核心标准,它鼓励应用和平台之间的互操性。没有规矩不成方圆,有了规范才有了参考依据。规范定义了跨多个Linux发行版本的公关元素,其中包括:
· 打包和安装指导
· 共享库和他们的接口
· 配置文件
· 文件放置(文件系统分层标准)
· 系统命令
由于是二进制规范,LSB分别为普通和特定处理器定义相应的组件。目前支持下面的计算架构:
· x86(IA32)
· x86-64(AMD64/EM64T)
· Intel IA64(Itanium)
· IBM PPC 32
· IBM PPC 64
· IBM 31-bit S/390
· IBM64-bit zSeries
经过一个典型的Linux发行版本就能够提供兼容保证,这样LSB为应用程序开发商们消除了支持跨系统开发的压力,使他们编写的应用能够最终用户在本身喜欢的发行版本上使用。
图19.1给出了LSB环境中所包含的组件。这些组件包括开发者所须要的共享库(包括C++),文件系统层次结构(FHS)、对象文件格式、命令和工具、应用程序包、用户和组、系统初始化等所采用的规范。apache

19.1.3 工做组
为了更好地推进和制定LSB规范,项目又分红了几个子项目(也称为工做组),分别有不一样的职责范围。LSB老大的头衔叫主席,他和各个子项目的领导人,以及对LSB项目有重大贡献的人组成了执行委员会。执行委员会负责LSB总体规划和推广工做。几个子项目的简介以下:
1. 规范组(Specification SubGroup)
负责LSB规范的开发与维护以及ISO/IEC23360(即ISO LSB标准的)维护。具体职责以下:
· 维护LSB规范数据库
· 编写LSB规范
· 开发并维扩生成规范文档所须要的工具
2.工具组(LSB Tools SubGroup)
负责如下子项目的开发和实现:
· SI (Sample Implementation):完成遵照LSB规范的一个参考实现。
· Development Environment:开发符合LSB规范的应用程序的开发环境。
· Application Bmetry:符合LSB规范的样例应用程序,例如Isb-apache。
3.测试组(LSB Test SubGroup)
负责按照LSB规范的定义,开发一些测试套件,验证用户环境和应用程序是否符合LSB规范,主要包括:
· LSB Runtime Tests:包括ANSI、POSIX、LSB-OS、线程、用户和组、FHS、国际化、PAM(可插入认证模块)等测试套件。
· LSB VSW4/XTS5 Test:Xlib11及其扩展库的测试套件。
· LSB C++ Test:C++测试套件。
4.桌面组(LSB Desktop SubGroup)
负责开发与桌面有关的规范的测试套件,用来验证用户环境和应用程序是否符合LSB的规范,主要包括:
· GTK库
· OpenGL库
· PNG12库
· JPEG库
· Fomconfig库
· GTK+Stack库
· QT3/4库
· XML2库
5.新领域组(LSB Future SubGroup)
负载开拓LSB的新领域,将已经发展比较成熟能够进行标准化但LSB还没有涉及的领域归入LSB标准范围。编程


19.1.4 标准化流程
Linux崇尚自由的精神,因此在推广LSB的时候项目组也不会违背这个大原则,没有强追业界人士必须接受这个标准。你们都本着自愿的原则加入LSB认证。若是一个新领域要想归入LSB标准的范畴,通常须要通过3个步骤提交到项目组:
1. 鉴定:确认这个领域是否已经足够成熟,是否具备稳定ABI/API,是否须要进行标准化,以及是否依赖于还没有标准化的领域。
2. 调研:调查上游软件维护者是否还在积极维护软件是否稳定,是否具备很好的向后兼容性。
3. 实现:将该领域加入LSB数据库、编写规范、编写测试套件,并将其加入开发环境,SI和APPBAT。
通过以上3个步骤以后,新领域组(LSB Future SubGmp)就会将其提交给LSB项目组,将其包含到LSB的下一个版本中进行发布,而后对外提供认证服务。浏览器

 


19.2 认证
在制定好标准开发出测试套件以后,为了区分系统或应用程序是否兼容LSB标准,FSG提供了LSB标准认证服务。任何Linux发行版厂商和应用程序开发商均可以进行Linux认证,目前提供的认证有两种:
· LSB运行环境:为平台供应商提供的LSB标准认证。
· LSB应用程序:为应用程序开发商提供的LSB标准认证。
对于平台供应商来讲,通过LSB认证以后,就能够确保本身的系统所提供的服务都是标准的,任何遵照LSB标准的应用程序均可以在本身的系统上很好地运行;而对于应用程序开发商来讲,意义恰好相反,即不须要担忧本身的应用程序在遵照LSB标准的系统上出现可移植性问题。不只平台供应商和应用开发者从中受益,最终的用户也尝到了甜头,他们能够根据本身的喜爱来选择发行版和应用而不用锁定供应商。在LSB驱动下,Linux生态系统就这样自动催化造成了。服务器

你能够在你的测试系统上运行LSB提供的测试工具,并对结果进行分析,确保你的系统和应用程序遵照LSB规范。认证最好的开始方法是使用checkers,平台供应商使用LSB Distribution Checker,应用程序开发商使用Linux Application Checker。一旦解决了由工具发现的任何问题,chercker就上传测试数据到认证系统开始认证流程,认证系统会让你登记公司名和要认证的产品。数据结构

 

在准暑好正式提交测试结果以后,须要先签署LSB认证协议和LSB商标许可协议,并向FSG支付认证所须要的费用。而后FSG会有专人对测试结果进行审计,若是一切正常的话,那恭喜你经过了LSB认证。经过LSB认证的产品都会在Linux Foundation上公开发布,LSB组织还为开发者提供认证产品的市场宣传材料。经过LSB认证以后,所认证的产品就能够贴上“LSB Certified”的标签进行销售了。架构

19.3 工具
LSB项目组提供了一些工具支持模范,能够参看图19.5所示的LSB工具概貌。

19.3.1 LSB SDK
LSB SDK容许开发者在一个特殊的环境里创建应用以此来保证生成的二进制的全部依赖达到LSB要求。LSB SDK的头文件里包含LSB定义的函数和数据类型,只输出LSB定义的符号的根库,以及启动使用了特殊的头文件和根库的GCC相关组件的编译器包装(lsbce和lsbc++)
LSB SDK使用起来很是简单。在gcc调用处用编译器包装来代替。例如改变CC/CXX变量。LSB SDK还为使用pkg-config的开发者提供了特殊.pc文件。除此以外,经过LSB Eclipse插件的形式支持Eclipse SDK的集成。插件给Eclipse环境增长了额外的项目类型(LSB Eclipse执行文件,LSB动态和静态库),而且容许以可视化的形式管理全部的配置。
可经过各版本本身带有的软件安装方式下载和安装LSB相关的套件。例如使用SUSE的YaST2安装LSB,参考图19.6。
另外一种方法是从LSB官方网站上下载LSB SDK包,倒如x86 64bits系统的压缩包是lsb-sdk-4.1.3-l.x86_64.tar.gz。

#tar xvzf lsb-dist-testkit-manager-4.1.3-1.x86_64.tar.gz
#cd lsb-sdk
#./install.sh

This system appears to be a RMP-based distribution,such as those from Red Hat,SuSE/Novell,Mandriva,Asianux,etc.
7 Is this correct?y
9 Installing packages…

19.3.2 App Checker
应用软件开发商能够用Linux App Checker来检查其应用的跨多版本Linux的可移植性。工具不但限于检查是否达到LSB要求,还能够在版本内容的内部知识库上作移植性的分析。目前知识库包含关于70多种版本的信息。App Cbecke把一组应用包做为输入,应用包里包含二进制以及在不一样目录下的.so文件,也许还有.rpm或者.deb或者tar.gz。分析结果在内联的HTML网页报告中显示。报告不会显示租金的内部依赖,但会很清晰完整地显示应用的外部依赖(库和接口),而且带有每一个依赖的移植性程度的信息以及如何改进移植性的建议。App Checker工具还具有区分标准要求的库(在ELF格式中注册成DT_NEEDED)和应用程序本身的库。
固然能够经过各版本本身带有的软件安装方式下载和安装LSB相关的套件。另外一种方法是从LSB官方网站上下载lsb-app-checker包,例如x86 64bits系统的压缩包是lsb-app-checker-4.1.3-x86_.tar.gz。

#tar xvzflsb-app-checker-4.1.3-1.x86_64.tar.gz
#cd lsb-app-testkit
#./install.sh

This system appears to be a RPM-based distribution,such as those from Red Hat,SuSE/Novell,Mandriva,Asianux,etc.
Is this correct?y
Installing packages…
安装完后使用app-checker-start.pl命令启动App Checker,App Checker的测试选项页荷测试结果页如图19.7和图19.8所示:

19.3.3 Distribution Checker
LSB Distribution Checker是为平台供应商提供的用以检查他们系统与LSB一致性的工具。它其实是一整套软件组件。最底层包括真实的测试,检查测试中的目标系统时特殊组件的具体要求。这些测试大部分是实时的单元测试,可是也有包括静态验证机制的具体检查。中间层是控制测试执行和结果收集的框架。最上层是全部组件的用户界面。基于浏览器的界面支持“一键”执行全部认证测试。固然,用户也能够选择执行具体的测试,这个功能对只对特定组件感兴趣的上游开发者来说是颇有用的。咱们注意到LSB Distribution Checker不只能够用来检查LSB的一致性,还能够用来做为一个通用的QA测试框架。在测试和正规执行的过程当中,LSE工做组已经在发行版本和上游组件中识别出百余处错误。这些错误已汇报交给上游和执行版开发者等待确认。
固然能够经过各版本本身带有的软件安装方式下载和安装LSB相关的套件。另外一种方法是从LSB官网网站上下载lsb-diat-testkit-manager包,例如x86_64bits系统的压缩包是lsb-dist-testkit-manager-4.1.3-1.x86_64.tar.gz。

# tar xvzflsb-dist-testkit-manager-4.1.3-1.x86_64.tar.gz
# cd lsb-dist-testkit-manager
# ./install.sh

This system appears to be a RPM-based distribution,such as those from Red Hat,SuSE/Novell,Mandriva,Asianux,etc.
7 Is this correct?y
9 Installing packages…
安装后使用dist-checker-start.pl命令启动Distribution Checker,Distribution Checker首页,测试项目选择页荷测试结果页分别如图19.九、图19.10和图19.11所示:

 

 

Distribution checker测试项目选择页:

 

Distribution Checker测试结果页:

19.3.4 LSB Navigator
LSB Navigator是集成的线上信息系统。其相应数据库持有关于LS元素、Linux生态系统,以及标准化分析和决策的服务结构化数据。
交互式LSB规范的线上版本,捉供了纯文本的实用信息。这些信息可搜索、可浏览,包括标准和非标准的Linux模块、库、接口以及类型等。给定的接口名字后,你能够敲两次键就获得如下信息:
· 接口是否在LSB里?
· 是推荐的接口仍是替代品?
· 直接与接口文档连接查看接口的具体描述。
· 是发行版本中的哪一个库提供的接口?
· 已经有多少个注册的应用使用了这个接口?
· 是哪一个开源测试检查这个接口。气势这个开源测试能够用来做为接口的使用例子。
· 接口的声望列表,每一个接口的应用个数(LSB和非LSB接口分开统计)。
· 须要多少个外部库和接口,哪些是被流行应用实际使用的了?
· 在现代Linux发行版本(在不一样硬件平台上的特定版本)中须要包含哪些元素?
· 分析和比较发行版本(每一个发行版本Linux元素的统计,包括发行版提供或缺失的组件库命令和接口等)。
Navigator集成了全部工具。在导航里有应用和发行版checkers的连接。checkers又和认证系统集成在一块儿,容许在checkers里直接向Linux foundation提交测试数据。


19.3.5 lsb_release的规范定义和实现
LSB规范中增长了对lsb_release接口及其输出格式的定义,使用户能清楚地了解本身使用的系统有关LSB的各类信息。lsb_release的功能是打印与发行版本相关的信息,必须实现如下选项:

表  19-1

选项

功能

输出格式

-v,--version

现实发行版所兼容的LSB规范版本号

LSB Version:\tLSBSpec Version(其中多个LSBSpece Version 以冒号分隔)

-I,--id

显示发行版的字符串id信息

Distributor ID:\tDistributorID

-d,--description

显示发行版的单行文本描述

Description:\tDescription

-r,--release

显示发行版的版本号

Release:\tRelease

-c,-codename

显示该发行版的代码号

Codename:\tCodename

选项

功能

输出格式

-a,--all

显示以上全部信息

各个选项遵照以上规定

-s,--short

以简短形式显示以上信息

文本,格式无具体要求

-h,--help

显示帮助信息

文本,格式无具体要求

 

 

下面就是咱们在命令中执行lsb-release-a命令后获得的返回信息:

LSB Version:
Core-2.0-noarch:core-3.2-noarch:core-4.0-noarch:core-2.0-x86_64:core-3.2-x86_64:core-4.0-x86_64:desktop-4.0-amd64:desktop-4.0-noarch:graphics-2.0-amd64:graphics-2.0-noarch:graphics-3.2-amd64:graphics-3.2-noarch:graphics-4.0-amd64:graphics-4.0-noarch
Distributor ID:SUSE LINUX
Description:openSUSE 11.4(x86_64)
Release:11.4
Codename:Celadon

 


系统中提供的大部分应用程序都是连接到了ld-linux.so.2上,可是兼容LSB标准的应用程序均可以连接到ld-lsb.so.3上。咱们能够经过ls-al/lib/ld-ls*命令查看ld-lsb连接库的指向,例如咱们获得以下的命令返回结果:
Lrwxrwxrwx 1 root root 13 Apr 15 07:10 /lib/ld-lsb.so.2→ld-linux.so.2
Lrwxrwxrwx 1 root root 13 Apr 15 07:10 /lib/ld-lsb.so.3→ld-linux.so.2

 

 

LSB对glibc再进行封装,兼容LSB标准的应用程序要连接到ld-lsb-x86-64.so,调用ld-lsb-x86-64.so提供的API,而ld-lsb-x86-64.so实际上又是最终调用glibc的ld-2.12.so
这样兼容LSB标准的应用程序就不会有兼容问题  

ll /lib64/ld-*
-rwxr-xr-x 1 root root 154664 Feb 17 02:37 /lib64/ld-2.12.so
lrwxrwxrwx 1 root root     10 Feb 22 17:55 /lib64/ld-linux-x86-64.so.2 -> ld-2.12.so
lrwxrwxrwx 1 root root     20 Feb 22 17:57 /lib64/ld-lsb-x86-64.so -> ld-linux-x86-64.so.2


rpm -qa glibc
glibc-2.12-1.166.el6_7.7.x86_64

rpm -ql glibc
/etc/gai.conf
/etc/ld.so.cache
/etc/ld.so.conf
/etc/ld.so.conf.d
/etc/localtime
/etc/nsswitch.conf
/etc/rpc
/lib64/ld-2.12.so
/lib64/ld-linux-x86-64.so.2
/lib64/libBrokenLocale-2.12.so
/lib64/libBrokenLocale.so.1
/lib64/libSegFault.so
/lib64/libanl-2.12.so
/lib64/libanl.so.1
/lib64/libc-2.12.so
/lib64/libc.so.6 (/lib/libc.so.6 -> libc-2.12.so)  http://blog.sina.com.cn/s/blog_75acbe0b0101596n.html

/lib64/libcidn-2.12.so
/lib64/libcidn.so.1
/lib64/libcrypt-2.12.so
/lib64/libcrypt.so.1
/lib64/libdl-2.12.so
/lib64/libdl.so.2
/lib64/libm-2.12.so
/lib64/libm.so.6
/lib64/libnsl-2.12.so
/lib64/libnsl.so.1
/lib64/libnss_compat-2.12.so
/lib64/libnss_compat.so.2
/lib64/libnss_dns-2.12.so
/lib64/libnss_dns.so.2
/lib64/libnss_files-2.12.so
/lib64/libnss_files.so.2
/lib64/libnss_hesiod-2.12.so
/lib64/libnss_hesiod.so.2
/lib64/libnss_nis-2.12.so
/lib64/libnss_nis.so.2
/lib64/libnss_nisplus-2.12.so
/lib64/libnss_nisplus.so.2
/lib64/libpthread-2.12.so
/lib64/libpthread.so.0
/lib64/libresolv-2.12.so
/lib64/libresolv.so.2
/lib64/librt-2.12.so
/lib64/librt.so.1
/lib64/libthread_db-1.0.so
/lib64/libthread_db.so.1
/lib64/libutil-2.12.so
/lib64/libutil.so.1
/lib64/rtkaio
/lib64/rtkaio/librt.so.1
/lib64/rtkaio/librtkaio-2.12.so
/sbin/ldconfig
/sbin/sln
/usr/lib64/gconv
/usr/lib64/gconv/ANSI_X3.110.so
/usr/lib64/gconv/ARMSCII-8.so
/usr/lib64/gconv/ASMO_449.so
/usr/lib64/gconv/BIG5.so
/usr/lib64/gconv/BIG5HKSCS.so
/usr/lib64/gconv/BRF.so
/usr/lib64/gconv/CP10007.so
/usr/lib64/gconv/CP1125.so
/usr/lib64/gconv/CP1250.so
/usr/lib64/gconv/CP1251.so
/usr/lib64/gconv/CP1252.so
/usr/lib64/gconv/CP1253.so
/usr/lib64/gconv/CP1254.so
/usr/lib64/gconv/CP1255.so
/usr/lib64/gconv/CP1256.so
/usr/lib64/gconv/CP1257.so
/usr/lib64/gconv/CP1258.so
/usr/lib64/gconv/CP737.so
/usr/lib64/gconv/CP775.so
/usr/lib64/gconv/CP932.so
/usr/lib64/gconv/CSN_369103.so
/usr/lib64/gconv/CWI.so
/usr/lib64/gconv/DEC-MCS.so
/usr/lib64/gconv/EBCDIC-AT-DE-A.so
/usr/lib64/gconv/EBCDIC-AT-DE.so
/usr/lib64/gconv/EBCDIC-CA-FR.so
/usr/lib64/gconv/EBCDIC-DK-NO-A.so
/usr/lib64/gconv/EBCDIC-DK-NO.so
/usr/lib64/gconv/EBCDIC-ES-A.so
/usr/lib64/gconv/EBCDIC-ES-S.so
/usr/lib64/gconv/EBCDIC-ES.so
/usr/lib64/gconv/EBCDIC-FI-SE-A.so
/usr/lib64/gconv/EBCDIC-FI-SE.so
/usr/lib64/gconv/EBCDIC-FR.so
/usr/lib64/gconv/EBCDIC-IS-FRISS.so
/usr/lib64/gconv/EBCDIC-IT.so
/usr/lib64/gconv/EBCDIC-PT.so
/usr/lib64/gconv/EBCDIC-UK.so
/usr/lib64/gconv/EBCDIC-US.so
/usr/lib64/gconv/ECMA-CYRILLIC.so
/usr/lib64/gconv/EUC-CN.so
/usr/lib64/gconv/EUC-JISX0213.so
/usr/lib64/gconv/EUC-JP-MS.so
/usr/lib64/gconv/EUC-JP.so
/usr/lib64/gconv/EUC-KR.so
/usr/lib64/gconv/EUC-TW.so
/usr/lib64/gconv/GB18030.so
/usr/lib64/gconv/GBBIG5.so
/usr/lib64/gconv/GBGBK.so
/usr/lib64/gconv/GBK.so
/usr/lib64/gconv/GEORGIAN-ACADEMY.so
/usr/lib64/gconv/GEORGIAN-PS.so
/usr/lib64/gconv/GOST_19768-74.so
/usr/lib64/gconv/GREEK-CCITT.so
/usr/lib64/gconv/GREEK7-OLD.so
/usr/lib64/gconv/GREEK7.so
/usr/lib64/gconv/HP-GREEK8.so
/usr/lib64/gconv/HP-ROMAN8.so
/usr/lib64/gconv/HP-ROMAN9.so
/usr/lib64/gconv/HP-THAI8.so
/usr/lib64/gconv/HP-TURKISH8.so
/usr/lib64/gconv/IBM037.so
/usr/lib64/gconv/IBM038.so
/usr/lib64/gconv/IBM1004.so
/usr/lib64/gconv/IBM1008.so
/usr/lib64/gconv/IBM1008_420.so
/usr/lib64/gconv/IBM1025.so
/usr/lib64/gconv/IBM1026.so
/usr/lib64/gconv/IBM1046.so
/usr/lib64/gconv/IBM1047.so
/usr/lib64/gconv/IBM1097.so
/usr/lib64/gconv/IBM1112.so
/usr/lib64/gconv/IBM1122.so
/usr/lib64/gconv/IBM1123.so
/usr/lib64/gconv/IBM1124.so
/usr/lib64/gconv/IBM1129.so
/usr/lib64/gconv/IBM1130.so
/usr/lib64/gconv/IBM1132.so
/usr/lib64/gconv/IBM1133.so
/usr/lib64/gconv/IBM1137.so
/usr/lib64/gconv/IBM1140.so
/usr/lib64/gconv/IBM1141.so
/usr/lib64/gconv/IBM1142.so
/usr/lib64/gconv/IBM1143.so
/usr/lib64/gconv/IBM1144.so
/usr/lib64/gconv/IBM1145.so
/usr/lib64/gconv/IBM1146.so
/usr/lib64/gconv/IBM1147.so
/usr/lib64/gconv/IBM1148.so
/usr/lib64/gconv/IBM1149.so
/usr/lib64/gconv/IBM1153.so
/usr/lib64/gconv/IBM1154.so
/usr/lib64/gconv/IBM1155.so
/usr/lib64/gconv/IBM1156.so
/usr/lib64/gconv/IBM1157.so
/usr/lib64/gconv/IBM1158.so
/usr/lib64/gconv/IBM1160.so
/usr/lib64/gconv/IBM1161.so
/usr/lib64/gconv/IBM1162.so
/usr/lib64/gconv/IBM1163.so
/usr/lib64/gconv/IBM1164.so
/usr/lib64/gconv/IBM1166.so
/usr/lib64/gconv/IBM1167.so
/usr/lib64/gconv/IBM12712.so
/usr/lib64/gconv/IBM1364.so
/usr/lib64/gconv/IBM1371.so
/usr/lib64/gconv/IBM1388.so
/usr/lib64/gconv/IBM1390.so
/usr/lib64/gconv/IBM1399.so
/usr/lib64/gconv/IBM16804.so
/usr/lib64/gconv/IBM256.so
/usr/lib64/gconv/IBM273.so
/usr/lib64/gconv/IBM274.so
/usr/lib64/gconv/IBM275.so
/usr/lib64/gconv/IBM277.so
/usr/lib64/gconv/IBM278.so
/usr/lib64/gconv/IBM280.so
/usr/lib64/gconv/IBM281.so
/usr/lib64/gconv/IBM284.so
/usr/lib64/gconv/IBM285.so
/usr/lib64/gconv/IBM290.so
/usr/lib64/gconv/IBM297.so
/usr/lib64/gconv/IBM420.so
/usr/lib64/gconv/IBM423.so
/usr/lib64/gconv/IBM424.so
/usr/lib64/gconv/IBM437.so
/usr/lib64/gconv/IBM4517.so
/usr/lib64/gconv/IBM4899.so
/usr/lib64/gconv/IBM4909.so
/usr/lib64/gconv/IBM4971.so
/usr/lib64/gconv/IBM500.so
/usr/lib64/gconv/IBM5347.so
/usr/lib64/gconv/IBM803.so
/usr/lib64/gconv/IBM850.so
/usr/lib64/gconv/IBM851.so
/usr/lib64/gconv/IBM852.so
/usr/lib64/gconv/IBM855.so
/usr/lib64/gconv/IBM856.so
/usr/lib64/gconv/IBM857.so
/usr/lib64/gconv/IBM860.so
/usr/lib64/gconv/IBM861.so
/usr/lib64/gconv/IBM862.so
/usr/lib64/gconv/IBM863.so
/usr/lib64/gconv/IBM864.so
/usr/lib64/gconv/IBM865.so
/usr/lib64/gconv/IBM866.so
/usr/lib64/gconv/IBM866NAV.so
/usr/lib64/gconv/IBM868.so
/usr/lib64/gconv/IBM869.so
/usr/lib64/gconv/IBM870.so
/usr/lib64/gconv/IBM871.so
/usr/lib64/gconv/IBM874.so
/usr/lib64/gconv/IBM875.so
/usr/lib64/gconv/IBM880.so
/usr/lib64/gconv/IBM891.so
/usr/lib64/gconv/IBM901.so
/usr/lib64/gconv/IBM902.so
/usr/lib64/gconv/IBM903.so
/usr/lib64/gconv/IBM9030.so
/usr/lib64/gconv/IBM904.so
/usr/lib64/gconv/IBM905.so
/usr/lib64/gconv/IBM9066.so
/usr/lib64/gconv/IBM918.so
/usr/lib64/gconv/IBM921.so
/usr/lib64/gconv/IBM922.so
/usr/lib64/gconv/IBM930.so
/usr/lib64/gconv/IBM932.so
/usr/lib64/gconv/IBM933.so
/usr/lib64/gconv/IBM935.so
/usr/lib64/gconv/IBM937.so
/usr/lib64/gconv/IBM939.so
/usr/lib64/gconv/IBM943.so
/usr/lib64/gconv/IBM9448.so
/usr/lib64/gconv/IEC_P27-1.so
/usr/lib64/gconv/INIS-8.so
/usr/lib64/gconv/INIS-CYRILLIC.so
/usr/lib64/gconv/INIS.so
/usr/lib64/gconv/ISIRI-3342.so
/usr/lib64/gconv/ISO-2022-CN-EXT.so
/usr/lib64/gconv/ISO-2022-CN.so
/usr/lib64/gconv/ISO-2022-JP-3.so
/usr/lib64/gconv/ISO-2022-JP.so
/usr/lib64/gconv/ISO-2022-KR.so
/usr/lib64/gconv/ISO-IR-197.so
/usr/lib64/gconv/ISO-IR-209.so
/usr/lib64/gconv/ISO646.so
/usr/lib64/gconv/ISO8859-1.so
/usr/lib64/gconv/ISO8859-10.so
/usr/lib64/gconv/ISO8859-11.so
/usr/lib64/gconv/ISO8859-13.so
/usr/lib64/gconv/ISO8859-14.so
/usr/lib64/gconv/ISO8859-15.so
/usr/lib64/gconv/ISO8859-16.so
/usr/lib64/gconv/ISO8859-2.so
/usr/lib64/gconv/ISO8859-3.so
/usr/lib64/gconv/ISO8859-4.so
/usr/lib64/gconv/ISO8859-5.so
/usr/lib64/gconv/ISO8859-6.so
/usr/lib64/gconv/ISO8859-7.so
/usr/lib64/gconv/ISO8859-8.so
/usr/lib64/gconv/ISO8859-9.so
/usr/lib64/gconv/ISO8859-9E.so
/usr/lib64/gconv/ISO_10367-BOX.so
/usr/lib64/gconv/ISO_11548-1.so
/usr/lib64/gconv/ISO_2033.so
/usr/lib64/gconv/ISO_5427-EXT.so
/usr/lib64/gconv/ISO_5427.so
/usr/lib64/gconv/ISO_5428.so
/usr/lib64/gconv/ISO_6937-2.so
/usr/lib64/gconv/ISO_6937.so
/usr/lib64/gconv/JOHAB.so
/usr/lib64/gconv/KOI-8.so
/usr/lib64/gconv/KOI8-R.so
/usr/lib64/gconv/KOI8-RU.so
/usr/lib64/gconv/KOI8-T.so
/usr/lib64/gconv/KOI8-U.so
/usr/lib64/gconv/LATIN-GREEK-1.so
/usr/lib64/gconv/LATIN-GREEK.so
/usr/lib64/gconv/MAC-CENTRALEUROPE.so
/usr/lib64/gconv/MAC-IS.so
/usr/lib64/gconv/MAC-SAMI.so
/usr/lib64/gconv/MAC-UK.so
/usr/lib64/gconv/MACINTOSH.so
/usr/lib64/gconv/MIK.so
/usr/lib64/gconv/NATS-DANO.so
/usr/lib64/gconv/NATS-SEFI.so
/usr/lib64/gconv/PT154.so
/usr/lib64/gconv/RK1048.so
/usr/lib64/gconv/SAMI-WS2.so
/usr/lib64/gconv/SHIFT_JISX0213.so
/usr/lib64/gconv/SJIS.so
/usr/lib64/gconv/T.61.so
/usr/lib64/gconv/TCVN5712-1.so
/usr/lib64/gconv/TIS-620.so
/usr/lib64/gconv/TSCII.so
/usr/lib64/gconv/UHC.so
/usr/lib64/gconv/UNICODE.so
/usr/lib64/gconv/UTF-16.so
/usr/lib64/gconv/UTF-32.so
/usr/lib64/gconv/UTF-7.so
/usr/lib64/gconv/VISCII.so
/usr/lib64/gconv/gconv-modules
/usr/lib64/gconv/gconv-modules.cache
/usr/lib64/gconv/libCNS.so
/usr/lib64/gconv/libGB.so
/usr/lib64/gconv/libISOIR165.so
/usr/lib64/gconv/libJIS.so
/usr/lib64/gconv/libJISX0213.so
/usr/lib64/gconv/libKSC.so
/usr/lib64/libmemusage.so
/usr/lib64/libpcprofile.so
/usr/libexec/getconf
/usr/libexec/getconf/POSIX_V6_LP64_OFF64
/usr/libexec/getconf/POSIX_V7_LP64_OFF64
/usr/sbin/glibc_post_upgrade.x86_64
/usr/sbin/iconvconfig
/usr/sbin/iconvconfig.x86_64
/usr/share/doc/glibc-2.12
/usr/share/doc/glibc-2.12/BUGS
/usr/share/doc/glibc-2.12/CONFORMANCE
/usr/share/doc/glibc-2.12/COPYING
/usr/share/doc/glibc-2.12/COPYING.LIB
/usr/share/doc/glibc-2.12/FAQ
/usr/share/doc/glibc-2.12/INSTALL
/usr/share/doc/glibc-2.12/LICENSES
/usr/share/doc/glibc-2.12/NEWS
/usr/share/doc/glibc-2.12/NOTES
/usr/share/doc/glibc-2.12/PROJECTS
/usr/share/doc/glibc-2.12/README
/usr/share/doc/glibc-2.12/README.hesiod
/usr/share/doc/glibc-2.12/README.libm
/var/cache/ldconfig
/var/cache/ldconfig/aux-cache

 


19.4 LSB的前世此生[① 本节参考:Linux Standard Base:state of affairsJeff Licquia,Stew Benediet,Rubanov,Alexey Khoroshilov.]①
LSB项目最初发起于1998年5月,其项目启动宣言获得了Linus Torvalds,Bruce Perens、Eric Raymond等牛人的签名支持,当时的目标是创建一系列构建Linux发行版所采用的源代码应该遵循的标准,并提供一个参考平台。2000年5月,LSB成为Free Standards Croup(FSG)的一个工做组。FSG是一个独立的非盈利组织,专一于经过开发和促进标准来加速开源软件的发展。
详细路线图及各个主要版本的特性如图19.12所示:

 

19.4.1 吃一堑,长一智
LSB工做组从2000年开始推广Linux生态系统,在推广过程当中也碰到这样和那样的问题。我把总结的经验教训与你们分享一下。
1.一个好的标准依赖一个好的定义元素的文档
LSB在库接口的上游文档方面很薄弱。这也是一些很好的接口没有归入标准的缘由。LSb鼓励上游开发者主义组建文档质量,这样能帮助软件工程师开发一致性的应用。
2.测试你文档上所写的内容
上游组建应该有很好的功能测试。根据文档的要求检查组建实现的正确性。理想的一致性测试是特定的测试检查项和文档的特定要求有清洗的连接,在测试中可跟踪。
3.研究开发接口标准的新方法
LSB是世界上最大的接口标准,会有上万千元素。其余的标准接口没有这么多,例如POSIX只有1800个接口。这么庞大数目的元素就必须使用特殊的方法和工具支持。LSB和ISPRAS(俄罗斯科学院)一块儿开发了一些前沿的方法和工具使标准的开发更加系统化和可管理。这些方法和工具包括自动产生部分的LSB规范和工具,对加入LSB候选者的识别过程系统化和工具化,加快了经过标准化的处理流程。
4.持续测试,及早发现问题
随着时间推移,测试方法也在变换。在过去,仅限于在本身软件上作点对点的QA测试以及从用户测试来的审计结果。如今LSB开始为企业和社区的发行版本以及开发中间版进行平常的测试,对发现的问题向发行商和上游项目进行汇报备案。这些版本在公布于众以前就通过测试,推动了发行版的发展。

 


19.4.2 “哥只是个传说”
民间关于LSB的有些传说被许多人认为是真的。那咱们来看看究竟是不是真的呢?
传说一:LSB要求全部兼容发行版都使用RPM包管理器。
实际上,LSB要求发行版必须支持应用以PRM包格子集的形式进行安装。发行站可使用本身喜欢的任何包管理方式来达到这个母的。例如基于Debian的发行版利用原始dpkg包管理器安装,使用“外星”工具将RPM包转换DEB格式也何尝不可。
传说二:LSB只为想要作LSB认证的团体服务。
LSB提供了用于认证和其余目的的一系列工具和测试。在Linux世界里,应用软件开发商工具中包含讲述关于稳定接口的特有的知识库。这个知识库能够帮助应用开发者减小支出多Linux发行版中出现的问题。平台供应商工具能够帮助发行版开发者不用考虑LSB一致性问题来建造本身的QA系统。
有这么一个例子:Monta Nista在只用LSB工具进行内部QA时,发如今libstdc++-4.2.1处有ABI意外退出。他们汇报给libstdc++上游,问题在libstdc++-4.2.2中获得解决了。不然,这个退出将被包含在发行版里传递给最终用户。实际状况呢,在Linux平台上的提供C++应用的许多发行版的平台供应营商和应用软件开发商都由于这个退出的尽早发现而受益。
传说三:LSB告诉发行供应商作什么。
尽管在一些状况下,LSb可能会影响上游和发行版开发者的一些决策,可是LSB的职责是使已经跨全部Linux发行版的部署标准化。对于出现的矛盾,LSb鼓励各团体本身协商解决。若是须要Linux Foundation的帮助,它能够为你们提供一个中立的场所。
传说四:LSB只对二进制兼容有用。
LSB是ABI标准,同时也是API标准。它收集在跨版本中行为一致的稳定库的稳定接口。这些信息对许多应用开发者是颇有帮助的。甚至是因为某些缘由你不得不为不一样发行版从新创建你的应用的时候.LSB接口也帮助你减小源码的变化。知道哪些接口是稳定和一致的,对你决定是否在应用开发中采用这个接口是大有帮助的。另外,LSB导航为你对替换不稳定接口提供了推荐方案,提供比LSB规范自己更多的信息。
LSB另外一个重要的财富是提供了关于哪一个接口是通用(与结构无关)的,哪些是与硬件有关的。LSB包括了七个硬件结构。针对不一样的结构,接口是不一样的。你在开发过程当中尽可能使用LSB通用子集,这样作能够减小你的应用在多个结构创建时的源码的变化。
传说五:LSB为全部的应用服务。
LSB不是“超人”。一些应用确实须要低层次系统的不稳定接口功能,对这些不稳定接口的兼容已经超出了LSB的能力范围,因此一些应用可能永远与LSB无缘。

 


19.4.3 意气风发的LSB5.0
LSB5.0即将问世,它包含了下面一些重要变化:
1. 前一版本同时支持Qt3和Qt4。Qt3已经衰落了,是把它剔除LSB标准的时候了。
2. LSB的重要部分是文件分层标准,描述了如何像Unix系统同样组织文件。尽管Linux比其余Unix变种更看重这个部分的标准,可是由于它对Linux来说不是特殊的,因此长期以来也无人打理,最近LSB工做组决定开始行动对这部分进行更新管理,并思考这个标准是否应该独立于Linux。
3. LSB是一个尾随标准,主要目标客户是当前流行时企业发行版。新技术通常须要通过根长时间才能加入到企业版,也就意味着要通过很长时间才能归入到LSB里。可是用户为了追求新的功能每每会牺牲移植性,触犯不兼容条件来使用拥有最新功能的非企业发行版。为了适应这个变化,LSB会超前企业版,加入主要的企业版中的社区版的技术。固然也不是随便加入的,是根据流行程度和路线图,一个案例一个案例地评估。只有那些有清晰将来的功能才有机会加入。
咱们已经拥有了很强大的Linux application Checker,不只提供了版本和LSb范围的报告,还有中间层的可移植性报告。LSB正致力于发展LSB Distribution Checker和SDK,使它们和Application Checker拥有一样的灵活性。下面一些项目可能会成为LSB将来版本的候选者:
· D-Bus:这个标准很成功地完成了Linux进程间的通讯,对于软件更新和硬件管理等技术来说是至关重要的组件。
· SANE:打印机供应商成为LSB一个重要的用户。他们但愿一个打印驱动能够在不一样版本上创建。他们的驱动针对扫描/打印设备包括了统一的驱动。在LSB中加入SANEAPI无疑增长了这些供应商的价值。
· CTK+3:下一代桌面环境有GNOME三、Unity和KDE4。在拥抱Qt4的同时,LSB同时也欢迎GTK+3。
· ARM:ARM是嵌入式平台,常常由于环境限制,移植性很差。时过境迁,因为ARM在笔记本电脑甚至服务器上的逐步应用,Linux发行版的财团已经开始了跨版本的ARM二进制标准的工做。咱们拭目以待吧。

 


19.5 结束语
“团结就是力量,这力量是铁,这力量是钢…”让咱们在这首雄壮的歌声中结束本节的学习。经过上面的讲述,你已经明白了LSB所推行的Linux生态系统、它的历史意义和所作的主要工做。为了进一步地推广标准,LSB组织也但愿更多的有志之士以及团体件一块儿努力,为Linux平台的成功发展献计献策。

 

 

 

 

f

相关文章
相关标签/搜索