Linux就这个范儿 第19章 团结就是力量 LSB是Linux标准化基地(Linux Standards Base)的简称
这个图片好可爱,它是LSB组织的图标。你肯定会问:“图标这么设计一定有说法吧?”回答:“YES”。
LSB是Linux标准化基地(Linux Standards Base)的简称,目前是FSG(Free Standards Group)中最为活跃的一个工作组。它诞生的目的是为了推进Linux二进制兼容性,即二进制程序不需要重新编译,就可以在其他发行版上运行。一直以来,Linux都试图遵守POSIX标准,因此在源代码级上已具有很好的兼容性,然而对于Linux来说,仅仅保证源码级的兼容性还是不能完全满足要求的。软件开发商不得不面临在不同硬件平台上移植应用程序的问题。如果系统生命周期长,还要投入足够资源进行技术支持。就连我们最熟悉的x86平台,发行版也多如牛毛,软件开发商不可能为每个发行版都发布一个二进制文件。这便导致了经常会有软件用户问:“这个软件运行在哪个Linux上?”的情况发生。
上面的目标根形象地描绘了LSB的使命。它的使命就是给代表*的小企鹅量体裁衣。在给特定企鹅的体形和三维标准之后,软件开发者就可以设计并裁减出各色花样的衣服(应用程序),这样不管穿在哪只企鹅身上,都会非常合身。
为了保证应用软件开发者所开发的应用无论是在不同发行版本之间,还是同一版本的升级系统上都能正确运行,LSB在跟各大发布商咨询后,公布了描述必须支持的最小API的集合。在这个标准基础上LSB还提供了测试和工具方面的支持,使应用开发者目标一致,防止在不同的版本之间存在不必要的差异,减少在不同系统上做开发和维护的苦恼。
19.1 标准的前世今生
LSB以POSIX和SUS(Single UNIX Specification)标准为基础,并对其他领域(例如图形)中源代码的一些标准进行了扩充,还增加了对二进制可执行文件格式规范的定义,以确保Linux应用程序的源码和二进制文件的兼容性。既然LSB和POSIX有关,我们就先来看看POSIX标准的前世今生吧。
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)、对象文件格式、命令和工具、应用程序包、用户和组、系统初始化等所采用的规范。
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.-.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.-.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.-.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.9、图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:下一代桌面环境有GNOME3、Unity和KDE4。在拥抱Qt4的同时,LSB同时也欢迎GTK+3。
· ARM:ARM是嵌入式平台,经常因为环境限制,移植性不好。时过境迁,由于ARM在笔记本电脑甚至服务器上的逐步应用,Linux发行版的财团已经开始了跨版本的ARM二进制标准的工作。我们拭目以待吧。
19.5 结束语
“团结就是力量,这力量是铁,这力量是钢…”让我们在这首雄壮的歌声中结束本节的学习。通过上面的讲述,你已经明白了LSB所推行的Linux生态系统、它的历史意义和所做的主要工作。为了进一步地推广标准,LSB组织也希望更多的有志之士以及团体件一起努力,为Linux平台的成功发展献计献策。
f