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